Applied service state handling for app-communication 21/83221/1
authorkmook <kmook.choi@samsung.com>
Tue, 9 Aug 2016 13:04:53 +0000 (22:04 +0900)
committerkmook <kmook.choi@samsung.com>
Tue, 9 Aug 2016 13:04:53 +0000 (22:04 +0900)
Change-Id: I7f1c47eb150933872838f2bdbaddfbba5fc316c8
Signed-off-by: kmook <kmook.choi@samsung.com>
common/Types.h
daemon/DiscoveryManager.cpp
daemon/service_provider/AppCommServiceApplication.cpp
daemon/service_provider/AppCommServiceApplication.h
daemon/service_provider/AppCommServiceProvider.cpp

index 38b99d0..e9b4fd6 100644 (file)
@@ -135,6 +135,13 @@ enum request_type {
 #define CONV_JSON_DEVICE_TYPE                  CONV_DEVICE_TYPE
 #define CONV_JSON_DEVICE_ADDRESS               "host_address"
 
+enum application_state {
+       APP_COMM_STATE_NONE = 0,
+       APP_COMM_STATE_STARTED,
+       APP_COMM_STATE_STARTING,
+       APP_COMM_STATE_FAILED,
+};
+
 // smartview app to app communication service
 #define CONV_JSON_CHANNEL_ID                   "channel_id"
 #define CONV_JSON_URI                                  "uri"
index 33d849c..ea649be 100755 (executable)
@@ -199,7 +199,7 @@ int conv::DiscoveryManager::handleRequest(Request* requestObj)
                return CONV_ERROR_NONE;
        }
 
-       return CONV_ERROR_INVALID_OPERATION;;
+       return CONV_ERROR_INVALID_OPERATION;
 }
 
 int conv::DiscoveryManager::startDiscovery()
index 8265292..1de55cc 100755 (executable)
 
 #include "AppCommServiceApplication.h"
 
+conv::AppCommServiceApplication::AppCommServiceApplication()
+{
+       requestObj = NULL;
+       application = NULL;
+       state = APP_COMM_STATE_NONE;
+       isLocal = false;
+}
+
 conv::AppCommServiceApplication::~AppCommServiceApplication()
 {
        if (application != NULL)
@@ -41,10 +49,13 @@ void conv::AppCommServiceApplication::onStart(bool start_result)
 
                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;
+               }
        }
 }
 
@@ -71,10 +82,13 @@ void conv::AppCommServiceApplication::onStop(bool start_result)
 
                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;
+               }
        }
 }
 
@@ -86,6 +100,8 @@ void conv::AppCommServiceApplication::onConnect(Client client)
        if (!isLocal && application != NULL) {
                ((Application*)application)->start();
                _D("Application start requested");
+       } else {
+               state = APP_COMM_STATE_STARTED;
        }
 }
 
@@ -93,6 +109,7 @@ void conv::AppCommServiceApplication::onDisconnect(Client client)
 {
        _D("onDisconnect Called");
        publishResponse(CONV_ERROR_NONE, CONV_JSON_ON_DISCONNECT, &client);
+       state = APP_COMM_STATE_NONE;
 }
 
 void conv::AppCommServiceApplication::onClientConnect(Client client)
index 1cb77e6..c2bc4c4 100644 (file)
@@ -27,6 +27,7 @@ namespace conv {
        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;
@@ -35,6 +36,7 @@ namespace conv {
                        string channelId;
                        Service localService;
                        bool isLocal;
+                       application_state state;
 
                        void onStart(bool start_result);
                        void onStop(bool start_result);
index 1210755..de3b771 100755 (executable)
@@ -177,9 +177,8 @@ int conv::AppCommServiceProvider::startRequest(Request* requestObj)
        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");
@@ -197,6 +196,8 @@ int conv::AppCommServiceProvider::startRequest(Request* requestObj)
                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());
@@ -269,22 +270,28 @@ int conv::AppCommServiceProvider::stopRequest(Request* requestObj)
        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;
                }
        }
 
@@ -317,7 +324,7 @@ int conv::AppCommServiceProvider::readRequest(Request* requestObj)
        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);
 
@@ -412,7 +419,7 @@ int conv::AppCommServiceProvider::publishRequest(Request* requestObj)
        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;
@@ -438,7 +445,7 @@ int conv::AppCommServiceProvider::publishRequest(Request* requestObj)
        }
        _D("service is not started");
 
-       return CONV_ERROR_NONE;
+       return CONV_ERROR_INVALID_OPERATION;
 }
 
 int conv::AppCommServiceProvider::registerRequest(Request* requestObj)