#include "AppCommServiceApplication.h"
+conv::AppCommServiceApplication::AppCommServiceApplication()
+{
+ requestObj = NULL;
+ application = NULL;
+ state = APP_COMM_STATE_NONE;
+ isLocal = false;
+}
+
conv::AppCommServiceApplication::~AppCommServiceApplication()
{
if (application != NULL)
result.set(NULL, CONV_JSON_DESCRIPTION, description);
result.set(NULL, CONV_JSON_PAYLOAD, payload);
- if (start_result)
+ if (start_result) {
(*requestObj)->publish(CONV_ERROR_NONE, result);
- else
+ state = APP_COMM_STATE_STARTED;
+ } else {
(*requestObj)->publish(CONV_ERROR_INVALID_OPERATION, result);
+ state = APP_COMM_STATE_FAILED;
+ }
}
}
result.set(NULL, CONV_JSON_DESCRIPTION, description);
result.set(NULL, CONV_JSON_PAYLOAD, payload);
- if (start_result)
+ if (start_result) {
(*requestObj)->publish(CONV_ERROR_NONE, result);
- else
+ state = APP_COMM_STATE_NONE;
+ } else {
(*requestObj)->publish(CONV_ERROR_INVALID_OPERATION, result);
+ state = APP_COMM_STATE_FAILED;
+ }
}
}
if (!isLocal && application != NULL) {
((Application*)application)->start();
_D("Application start requested");
+ } else {
+ state = APP_COMM_STATE_STARTED;
}
}
{
_D("onDisconnect Called");
publishResponse(CONV_ERROR_NONE, CONV_JSON_ON_DISCONNECT, &client);
+ state = APP_COMM_STATE_NONE;
}
void conv::AppCommServiceApplication::onClientConnect(Client client)
class AppCommServiceApplication : public OnConnectListener, public OnDisconnectListener, public OnClientConnectListener, public OnClientDisconnectListener,
public OnMessageListener, public OnErrorListener, public OnStartAppListener, public OnStopAppListener, public OnPublishListener {
public:
+ AppCommServiceApplication();
virtual ~AppCommServiceApplication();
conv::Request** requestObj;
string channelId;
Service localService;
bool isLocal;
+ application_state state;
void onStart(bool start_result);
void onStop(bool start_result);
for (ApplicationInstanceList::iterator iter = svcInfo->applicationInstanceList.begin(); iter != svcInfo->applicationInstanceList.end(); ++iter) {
_D("iteration");
if ( (*iter) != NULL && !(*iter)->uri.compare(uri) && !(*iter)->channelId.compare(channelId) ) {
- if ( (*iter)->application != NULL ) {
- _D("already started");
- // check if it's connected and re-try if it's not
+ if ( (*iter)->state == APP_COMM_STATE_STARTED || (*iter)->state == APP_COMM_STATE_STARTING ) {
+ _D("already started or now starting");
return CONV_ERROR_INVALID_OPERATION;
} else {
_D("appInfo exists but no application instance");
appInfo->channelId = channelId;
}
+ appInfo->state = APP_COMM_STATE_STARTING;
+
// if it's local -> server application
if ( svcInfo->isLocal ) {
_D("COMMUNCATION_START : local channel. channel_id : %s", channelId.c_str());
for (ApplicationInstanceList::iterator iter = svcInfo->applicationInstanceList.begin(); iter != svcInfo->applicationInstanceList.end(); ++iter) {
_D("%s, %s", (*iter)->uri.c_str(), (*iter)->channelId.c_str());
if ( (*iter) != NULL && !(*iter)->uri.compare(uri) && !(*iter)->channelId.compare(channelId) ) {
- AppCommServiceApplication *appInfo = *iter;
+ if ( (*iter)->state == APP_COMM_STATE_STARTED ) {
+ _D("stopping the application");
+ AppCommServiceApplication *appInfo = *iter;
- _D("COMMUNCATION_STOP : uri : %s, channel_id : %s", uri.c_str(), channelId.c_str());
+ _D("COMMUNCATION_STOP : uri : %s, channel_id : %s", uri.c_str(), channelId.c_str());
- if ( *iter == NULL ) {
- _D("iter is NULL");
- }
+ if ( *iter == NULL ) {
+ _D("iter is NULL");
+ }
- if ( svcInfo->isLocal ) {
- appInfo->application->disconnect();
- svcInfo->applicationInstanceList.erase(iter);
+ if ( svcInfo->isLocal ) {
+ appInfo->application->disconnect();
+ svcInfo->applicationInstanceList.erase(iter);
+ } else {
+ ((Application*)appInfo->application)->stop();
+ svcInfo->applicationInstanceList.erase(iter);
+ }
+ return CONV_ERROR_NONE;
} else {
- ((Application*)appInfo->application)->stop();
- svcInfo->applicationInstanceList.erase(iter);
+ _D("service is not started");
+ return CONV_ERROR_INVALID_OPERATION;
}
- return CONV_ERROR_NONE;
}
}
for (ApplicationInstanceList::iterator iter = svcInfo->applicationInstanceList.begin(); iter != svcInfo->applicationInstanceList.end(); ++iter) {
_D("iteration");
if ( (*iter) != NULL && !(*iter)->uri.compare(uri) && !(*iter)->channelId.compare(channelId) ) {
- if ( (*iter)->application != NULL ) {
+ if ( (*iter)->state == APP_COMM_STATE_STARTED ) {
_D("appInfo exists and application instance exists");
appInfo = (*iter);
for (ApplicationInstanceList::iterator iter = svcInfo->applicationInstanceList.begin(); iter != svcInfo->applicationInstanceList.end(); ++iter) {
_D("iteration");
if ( (*iter) != NULL && !(*iter)->uri.compare(uri) && !(*iter)->channelId.compare(channelId) ) {
- if ( (*iter)->application != NULL ) {
+ if ( (*iter)->state == APP_COMM_STATE_STARTED ) {
_D("publishing payload");
Json payload;
}
_D("service is not started");
- return CONV_ERROR_NONE;
+ return CONV_ERROR_INVALID_OPERATION;
}
int conv::AppCommServiceProvider::registerRequest(Request* requestObj)