Update change log and spec for wrt-plugins-tizen_0.4.66
[framework/web/wrt-plugins-tizen.git] / src / DataControl / SqlDataControlConsumer.cpp
index 1c30f06..eafb1c0 100644 (file)
 #include <vector>
 #include <aul/aul.h>
 #include <sstream>
-#include <package-manager.h>
 #include <app.h>
-// to get package name by appid
 #include <app_info.h>
-#include <app_manager.h>
 // To get ppid
 #include <unistd.h>
 #include <security-server.h>
 #include <sstream>
 #include "DataControlAsyncCallbackManager.h"
+#include "DataControlCallback.h"
+#include "DataControlPendingEvent.h"
 
 namespace DeviceAPI {
 namespace DataControl {
 
-
-namespace {
-
-static const char OSP_V_CALLER_TYPE_OSP[] = "osp";
-static const char OSP_V_LAUNCH_TYPE_LAUNCH[] = "launch";
-static const char OSP_V_LAUNCH_TYPE_APPCONTROL[] = "appcontrol";
-static const char OSP_V_LAUNCH_TYPE_DATACONTROL[] = "datacontrol";
-static const char OSP_V_LAUNCH_TYPE_CONDTION[] = "condition";
-static const char OSP_V_REQUEST_TYPE_SQL_QUERY[] = "sql_query";
-static const char OSP_V_REQUEST_TYPE_SQL_INSERT[] = "sql_insert";
-static const char OSP_V_REQUEST_TYPE_SQL_UPDATE[] = "sql_update";
-static const char OSP_V_REQUEST_TYPE_SQL_DELETE[] = "sql_delete";
-static const char OSP_V_REQUEST_TYPE_MAP_QEURY[] = "map_query";
-static const char OSP_V_REQUEST_TYPE_MAP_INSERT[] = "map_insert";
-static const char OSP_V_REQUEST_TYPE_MAP_UPDATE[] = "map_update";
-static const char OSP_V_REQUEST_TYPE_MAP_DELETE[] = "map_delete";
-static const char BUNDLE_KEY_WINDOW[] = "__APP_SVC_K_WIN_ID__";
-
-
-#define OSP_K_CALLER_TYPE   "__OSP_CALLER_TYPE__"
-#define OSP_K_LAUNCH_TYPE   "__OSP_LAUNCH_TYPE__"
-#define OSP_K_ARG           "__OSP_ARGS__"
-#define OSP_K_COND          "__OSP_COND_NAME__"
-#define OSP_K_APPID         "__OSP_APPID__"
-#define OSP_K_REQUEST_ID    "__OSP_REQUEST_ID__"
-#define OSP_K_APPCONTROL_PROVIDER   "__OSP_APPCONTROL_PROVIDER__"
-#define OSP_K_APPCONTROL_OPERATION  "__OSP_APPCONTROL_OPERATION__"
-#define OSP_K_APPCONTROL_CATEGORY   "__OSP_APPCONTROL_CATEGORY__"
-#define OSP_K_APPCONTROL_MIME       "__OSP_APPCONTROL_MIME__"
-#define OSP_K_APPCONTROL_URI        "__OSP_APPCONTROL_URI__"
-#define OSP_K_DATACONTROL_PROVIDER      "__OSP_DATACONTROL_PROVIDER__"
-#define OSP_K_DATACONTROL_REQUEST_TYPE  "__OSP_DATACONTROL_REQUEST_TYPE__"
-#define RESULT_TRUE_FROM_OSP "1"
-#define RESULT_FALSE_FROM_OSP "0"
-#define OSP_K_DATACONTROL_PROTOCOL_VERSION  "__OSP_DATACONTROL_PROTOCOL_VERSION__"
-#define OSP_K_DATACONTROL_PROTOCOL_VERSION_VALUE "ver_2.1.0.3"
-
-#define DATACONTROL_PROTOCOL_DIR_TOP  "/tmp/osp"
-#define DATACONTROL_PROTOCOL_DIR_MIDDLE  "/tmp/osp/data-control"
-#define DATACONTROL_PROTOCOL_DIR  "/tmp/osp/data-control/request"
-
-static std::vector<std::string> getDataArrayFromBundle(bundle *b, std::string key)
-{
-       std::vector<std::string> result;
-       const char **array;
-       int length = 0;
-       int index = 0;
-       
-       array = appsvc_get_data_array(b, key.c_str(), &length);
-
-       if (array == NULL || length == 0)
-       {
-               ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Get result data fail from datacontrol provider");
-       }
-       
-       for (index = 0; index < length; index++)
-       {
-               result.push_back(array[index]);
-       }
-
-       return result;
-}
-
-
-static void sqldataControlSelectCallback(bundle* b, int request_code, appsvc_result_val res, void* data)
-{
-       LoggerD("Enter");
-       
-       EventSelectPendingEvent *pendingEvent = NULL;
-       SQLDataControlConsumer *consumer = NULL;
-       EventSelectPtr event;
-       const char *bundleKey = NULL;
-       
-       try 
-       {
-               if (b == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Get result fail from datacontrol provider");
-               }
-               
-        bundleKey = appsvc_get_data(b, OSP_K_REQUEST_ID);
-
-               if (bundleKey == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Get key fail from datacontrol provider");
-               }
-
-               pendingEvent = (EventSelectPendingEvent *)DataControlAsyncCallbackManagerSingleton::Instance().removeSQLUserData(bundleKey);
-               consumer = (SQLDataControlConsumer*)pendingEvent->getThisObject();
-
-               if (DataControlAsyncCallbackManagerSingleton::Instance().isSQLDataControlGC((void*)consumer))
-               {
-                       LoggerD("private object is garbage collected");
-                       delete pendingEvent;
-                       return;
-               }
-               event = pendingEvent->getEvent();
-               
-               std::vector<std::string> result = getDataArrayFromBundle(b, OSP_K_ARG);
-
-               for (size_t index = 0; index < result.size(); index++)
-               {
-                       LoggerD(result[index]);
-               }
-
-               if (result.size() < 3)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid result from datacontrol provider");
-               }
-               
-               // 0 : result true or false??
-               if (RESULT_TRUE_FROM_OSP != result[0])
-               {
-                       // 1 : error msg 
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, result[1]);
-               }
-
-               event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::None);
-               // 2 : result set file path
-               event->setResultSetPath(result[2]);
-               
-       }
-       catch (const WrtDeviceApis::Commons::Exception& ex) 
-       {
-               LoggerE("Exception: " << ex.GetMessage());
-               
-               if (event.Get() == NULL)
-               {
-                       LoggerD("event removed, invalid cb");
-                       return;
-               }
-
-               event->setExceptionCode(ex.getCode());
-               event->setErrorMsg(ex.GetMessage());            
-       }
-       consumer->handlePendingEvent(event);
-
-       if (pendingEvent)
-       {
-               delete pendingEvent;
-       }
-
-}
-
-static void sqldataControlInsertCallback(bundle* b, int request_code, appsvc_result_val res, void* data)
-{
-       LoggerD("Enter");
-
-       
-       EventInsertPendingEvent *pendingEvent = NULL;
-       SQLDataControlConsumer *consumer = NULL;
-       EventInsertPtr event;
-       const char *bundleKey = NULL;
-
-       try 
-       {
-               if (b == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Get result fail from datacontrol provider");
-               }
-
-        bundleKey = appsvc_get_data(b, OSP_K_REQUEST_ID);
-
-               if (bundleKey == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Get key fail from datacontrol provider");
-               }
-
-               pendingEvent = (EventInsertPendingEvent *)DataControlAsyncCallbackManagerSingleton::Instance().removeSQLUserData(bundleKey);
-               consumer = (SQLDataControlConsumer*)pendingEvent->getThisObject();
-
-               if (DataControlAsyncCallbackManagerSingleton::Instance().isSQLDataControlGC((void*)consumer))
-               {
-                       LoggerD("private object is garbage collected");
-                       delete pendingEvent;
-                       return;
-               }
-               
-               event = pendingEvent->getEvent();
-
-               std::vector<std::string> result = getDataArrayFromBundle(b, OSP_K_ARG);
-
-               for (size_t index = 0; index < result.size(); index++)
-               {
-                       LoggerD(result[index]);
-               }
-
-               if (result.size() < 2)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid result from datacontrol provider");
-               }
-               
-               // 0 : result true or false??
-               if (RESULT_TRUE_FROM_OSP != result[0])
-               {
-                       // 1 : error msg 
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, result[1]);
-               }
-
-               // 2 : insertrowid
-               std::stringstream sstr(result[2]);
-               long insertRowid = 0;
-               sstr >> insertRowid;
-               LoggerD(result[2] << insertRowid);
-               event->setRowId(insertRowid);                   
-               event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::None);
-               
-       }
-       catch (const WrtDeviceApis::Commons::Exception& ex) 
-       {
-               LoggerE("Exception: " << ex.GetMessage());
-
-               if (event.Get() == NULL)
-               {
-                       LoggerD("event removed, invalid cb");
-                       return;
-               }
-                       
-               event->setExceptionCode(ex.getCode());
-               event->setErrorMsg(ex.GetMessage());            
-       }
-       consumer->handlePendingEvent(event);
-
-       if (pendingEvent)
-       {
-               delete pendingEvent;
-       }
-
-}
-
-static void sqldataControlDeleteCallback(bundle* b, int request_code, appsvc_result_val res, void* data)
-{
-       LoggerD("Enter");
-
-       EventDeletePendingEvent* pendingEvent = NULL;
-       SQLDataControlConsumer *consumer = NULL;
-       EventDeletePtr event;
-       const char* bundleKey = NULL;
-       
-       try 
-       {
-               if (b == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Get result fail from datacontrol provider");
-               }
-
-        bundleKey = appsvc_get_data(b, OSP_K_REQUEST_ID);
-
-               if (bundleKey == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Get key fail from datacontrol provider");
-               }
-
-               pendingEvent = (EventDeletePendingEvent *)DataControlAsyncCallbackManagerSingleton::Instance().removeSQLUserData(bundleKey);
-               consumer = (SQLDataControlConsumer*)pendingEvent->getThisObject();
-
-               if (DataControlAsyncCallbackManagerSingleton::Instance().isSQLDataControlGC((void*)consumer))
-               {
-                       LoggerD("private object is garbage collected");
-                       delete pendingEvent;
-                       return;
-               }
-
-               event = pendingEvent->getEvent();
-
-               std::vector<std::string> result = getDataArrayFromBundle(b, OSP_K_ARG);
-
-               for (size_t index = 0; index < result.size(); index++)
-               {
-                       LoggerD(result[index]);
-               }
-
-               if (result.size() < 2)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid result from datacontrol provider");
-               }
-               
-               // 0 : result true or false??
-               if (RESULT_TRUE_FROM_OSP != result[0])
-               {
-                       // 1 : error msg 
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, result[1]);
-               }
-
-               event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::None);
-
-               
-       }
-       catch (const WrtDeviceApis::Commons::Exception& ex) 
-       {
-               LoggerE("Exception: " << ex.GetMessage());
-
-               if (event.Get() == NULL)
-               {
-                       LoggerD("event removed, invalid cb");
-                       return;
-               }
-               
-               event->setExceptionCode(ex.getCode());
-               event->setErrorMsg(ex.GetMessage());            
-       }
-       consumer->handlePendingEvent(event);
-
-       if (pendingEvent)
-       {
-               delete pendingEvent;
-       }
-}
-
-static void sqldataControlUpdateCallback(bundle* b, int request_code, appsvc_result_val res, void* data)
-{
-       LoggerD("Enter");
-
-       EventUpdatePendingEvent* pendingEvent = NULL;
-       SQLDataControlConsumer *consumer = NULL;
-       EventUpdatePtr event;
-       const char *bundleKey = NULL;
-       
-       try 
-       {
-               if (b == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Get result fail from datacontrol provider");
-               }
-
-        bundleKey = appsvc_get_data(b, OSP_K_REQUEST_ID);
-
-               if (bundleKey == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "Get key fail from datacontrol provider");
-               }
-
-               pendingEvent = (EventUpdatePendingEvent *)DataControlAsyncCallbackManagerSingleton::Instance().removeSQLUserData(bundleKey);    
-               consumer = (SQLDataControlConsumer*)pendingEvent->getThisObject();
-
-               if (DataControlAsyncCallbackManagerSingleton::Instance().isSQLDataControlGC((void*)consumer))
-               {
-                       LoggerD("private object is garbage collected");
-                       delete pendingEvent;
-                       return;
-               }
-               
-               event = pendingEvent->getEvent();
-
-               std::vector<std::string> result = getDataArrayFromBundle(b, OSP_K_ARG);
-
-               for (size_t index = 0; index < result.size(); index++)
-               {
-                       LoggerD(result[index]);
-               }
-
-               if (result.size() < 2)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid result from datacontrol provider");
-               }
-               
-               // 0 : result true or false??
-               if (RESULT_TRUE_FROM_OSP != result[0])
-               {
-                       // 1 : error msg 
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, result[1]);
-               }
-
-               event->setExceptionCode(WrtDeviceApis::Commons::ExceptionCodes::None);
-               
-       }
-       catch (const WrtDeviceApis::Commons::Exception& ex) 
-       {
-               LoggerE("Exception: " << ex.GetMessage());
-
-               if (event.Get() == NULL)
-               {
-                       LoggerD("event removed, invalid cb");
-                       return;
-               }
-                               
-               event->setExceptionCode(ex.getCode());
-               event->setErrorMsg(ex.GetMessage());            
-       }
-       consumer->handlePendingEvent(event);
-
-       if (pendingEvent)
-       {
-               delete pendingEvent;
-       }
-}
-
-static void sqldataControlCommonCallback(bundle* b, int request_code, appsvc_result_val res, void* data)
-{
-       LoggerD("Enter");
-
-       if (b == NULL)
-       {
-               LoggerD("Bundle null, Error");
-               return;         
-       }
-
-       const char *reqType = appsvc_get_data(b, OSP_K_DATACONTROL_REQUEST_TYPE);
-       
-       if (reqType == NULL)
-       {
-               LoggerD("UnkownRequest");
-               return;
-       }
-
-       std::istringstream buffer(reqType);
-       int reqTypeInt = 0;
-
-       buffer >> reqTypeInt;
-
-
-       LoggerD(reqTypeInt);
-       
-       switch (reqTypeInt)
-       {
-               case _DATACONTROL_REQUEST_TYPE_SQL_QUERY:
-                       sqldataControlSelectCallback(b, request_code, res, data);
-                       break;
-               case _DATACONTROL_REQUEST_TYPE_SQL_INSERT:
-                       sqldataControlInsertCallback(b, request_code, res, data);
-                       break;
-               case _DATACONTROL_REQUEST_TYPE_SQL_DELETE:
-                       sqldataControlDeleteCallback(b, request_code, res, data);
-                       break;
-               case _DATACONTROL_REQUEST_TYPE_SQL_UPDATE:
-                       sqldataControlUpdateCallback(b, request_code, res, data);
-                       break;
-               default:
-                       LoggerD("Unknown Request");
-       }
-}
-
-}
-
 SQLDataControlConsumer::SQLDataControlConsumer(std::string& provId, std::string& dataId, std::string& type)
 {
        LoggerD("Enter");
@@ -480,63 +45,22 @@ SQLDataControlConsumer::SQLDataControlConsumer(std::string& provId, std::string&
        m_dataId = dataId;
        m_providerId = provId;
        
-       m_appId = getApplicationId(provId);     
+       m_appId = getProviderApplicationId(OSP_PKGINFO_SQL_TYPE, provId);       
        m_ProviderPkgId = getProviderPkgId(m_appId);
        security_server_app_give_access(m_ProviderPkgId.c_str(), -1);
 
        m_currentAppId = getCurrentApplicationId();
        createResultDir();
-       DataControlAsyncCallbackManagerSingleton::Instance().setSQLDataControlGC((void*)this, false);
+       DataControlAsyncCallbackManagerSingleton::Instance().setDataControlGC((void*)this, false);
 }
 
 SQLDataControlConsumer::~SQLDataControlConsumer() 
 {
        LoggerD("Enter");
-       DataControlAsyncCallbackManagerSingleton::Instance().setSQLDataControlGC((void*)this, true);
+       DataControlAsyncCallbackManagerSingleton::Instance().setDataControlGC((void*)this, true);
 }
 
 DPL::Mutex SQLDataControlConsumer::m_mutex;
-std::vector<unsigned int> SQLDataControlConsumer::m_currentReqIds;
-
-std::string SQLDataControlConsumer::getCurrentApplicationId()
-{
-       char *app_id = NULL;
-       std::string appId = "";
-       int parent_pid = getppid();
-       LoggerD("parent pid : " << parent_pid); 
-       int ret = app_manager_get_app_id(parent_pid, &app_id);  
-
-       if((ret != APP_ERROR_NONE) || (app_id == NULL))
-       {
-               LoggerE("Can not get app id from current pid (" << ret << ")");
-               ThrowMsg(WrtDeviceApis::Commons::PlatformException, "could not get information about application");
-       }
-       appId = app_id;
-       free(app_id);
-       return appId;           
-}
-
-void SQLDataControlConsumer::removeReqId(unsigned int reqId)
-{
-       bool remove = false;
-       
-       std::vector<unsigned int>::iterator it, found;
-       
-       for (it = m_currentReqIds.begin(); it != m_currentReqIds.end(); ++it)
-       {
-               if (*it == reqId)
-               {
-                       found = it;     
-                       remove = true;
-               }
-       }
-
-       if (remove)
-       {
-               DPL::Mutex::ScopedLock lock(&m_mutex);
-               m_currentReqIds.erase(found);
-       }
-}
 
 bool SQLDataControlConsumer::checkReqIdUniqueness(unsigned int reqId)
 {
@@ -564,81 +88,8 @@ std::string SQLDataControlConsumer::getType()
        return m_type;
 }
 
-std::string SQLDataControlConsumer::getProviderPkgId(const std::string& appId)
-{
-       char* pkgId = NULL;
-       app_info_h handle = NULL;
-
-       if (m_ProviderPkgId.length() != 0) 
-       {
-               return m_ProviderPkgId;
-       }
-       
-       int ret = app_manager_get_app_info(appId.c_str(), &handle);
-
-       if (ret != APP_ERROR_NONE) 
-       {
-               LoggerD("Fail to get appinfo");
-               ThrowMsg(WrtDeviceApis::Commons::PlatformException, "get appId error");
-       }
-
-       ret = app_info_get_package(handle, &pkgId);
-
-       if ((ret != APP_ERROR_NONE) || (pkgId == NULL)) 
-       {
-               LoggerD("Fail to get pkg_name");
-               ThrowMsg(WrtDeviceApis::Commons::PlatformException, "get pkdid error");
-       }
-       m_ProviderPkgId = pkgId;
-       app_info_destroy(handle);
-       free(pkgId);
-       return m_ProviderPkgId; 
-}
-
-std::string SQLDataControlConsumer::getApplicationId(const std::string& provId)
-{
-       std::string appIdStr = "";
-
-       char* appId = NULL;
-       char* access = NULL;
-       const char *passId = provId.c_str();
-       
-       if (m_appId.length() == 0)
-       {
-       
-               if(     pkgmgr_datacontrol_get_info(passId, OSP_PKGINFO_SQL_TYPE, &appId, &access) < 0)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "get appId error");
-               }
-               
-               if (appId)
-               {
-                       appIdStr = appId;
-                       free(appId);
-               }
-
-               if (access)
-               {
-                       free(access);
-               }
-               
-               m_appId = appIdStr;
-
-
-       }
-       return m_appId;
 
-}
 
-std::string SQLDataControlConsumer::generateFileName(unsigned int reqId)
-{
-       std::stringstream ssdata;
-       ssdata.str("");
-       ssdata << reqId;
-       std::string parent = DATACONTROL_PROTOCOL_DIR;
-       std::string filename = parent  + "/" + m_currentAppId + ssdata.str();
-       return filename;
-}
 
 void SQLDataControlConsumer::saveArrayToFile(std::string filename, RowData *rowData)
 {
@@ -667,34 +118,7 @@ void SQLDataControlConsumer::saveArrayToFile(std::string filename, RowData *rowD
        insertUpdateFile.close();               
        
 }
-void SQLDataControlConsumer::addArrayToBundle(bundle* passData, std::vector<std::string>& array)
-{
-       size_t arraySize = array.size();
-
-       if (arraySize == 0)
-       {
-               ThrowMsg(WrtDeviceApis::Commons::AlreadyInUseException, "size = 0");
-       }
-       
-       const char** arr = NULL;
-       arr = (const char**)calloc(sizeof(char*), arraySize);
-
-       if (arr == NULL)
-       {
-               ThrowMsg(WrtDeviceApis::Commons::AlreadyInUseException, "null");
-       }
 
-       for (size_t index = 0; index < arraySize; index++) 
-       {
-               arr[index] = array[index].c_str();
-       }
-
-       
-       bundle_add_str_array(passData, OSP_K_ARG, arr, arraySize);
-
-       free(arr);
-       arr = NULL;
-}
 
 void SQLDataControlConsumer::handleCommonErrorEvent(void* userData, unsigned int code, std::string msg)
 {
@@ -716,6 +140,7 @@ void SQLDataControlConsumer::handleCommonErrorEvent(void* userData, unsigned int
                        insertEvent->setErrorMsg(msg);          
                
                        WrtDeviceApis::Commons::EventRequestReceiver<EventInsert>::ManualAnswer(insertEvent); 
+                       
                }
                else if (dynamic_cast<EventUpdatePendingEvent*>(pEvent) != NULL)
                {
@@ -751,18 +176,19 @@ void SQLDataControlConsumer::handleCommonErrorEvent(void* userData, unsigned int
        }
 
 }
+
 void SQLDataControlConsumer::handlePendingEvent(const EventInsertPtr& event)
 {
        LoggerD("OK");
        WrtDeviceApis::Commons::EventRequestReceiver<EventInsert>::ManualAnswer(event); 
        CommonPendingEvent* userData = NULL;
-       
+       unsigned short currentJob = 0;
        try {
-               userData = (CommonPendingEvent*)DataControlAsyncCallbackManagerSingleton::Instance().getRemainingSQLOperation();
+               userData = (CommonPendingEvent*)DataControlAsyncCallbackManagerSingleton::Instance().getRemainingIpcOperation();
 
                if (userData)
                {
-                       SendAppControlLaunchToProvider(userData);
+                       SendAppControlLaunchToProvider(userData, currentJob);
                }
        }
        catch (const WrtDeviceApis::Commons::Exception& ex) 
@@ -785,13 +211,14 @@ void SQLDataControlConsumer::handlePendingEvent(const EventDeletePtr& event)
 {
        WrtDeviceApis::Commons::EventRequestReceiver<EventDelete>::ManualAnswer(event); 
        CommonPendingEvent* userData = NULL;
+       unsigned short currentJob = 0;
 
        try {
-               userData = (CommonPendingEvent*)DataControlAsyncCallbackManagerSingleton::Instance().getRemainingSQLOperation();
+               userData = (CommonPendingEvent*)DataControlAsyncCallbackManagerSingleton::Instance().getRemainingIpcOperation();
 
                if (userData)
                {
-                       SendAppControlLaunchToProvider(userData);
+                       SendAppControlLaunchToProvider(userData, currentJob);
                }
        }
        catch (const WrtDeviceApis::Commons::Exception& ex) 
@@ -815,13 +242,14 @@ void SQLDataControlConsumer::handlePendingEvent(const EventSelectPtr& event)
 {
        WrtDeviceApis::Commons::EventRequestReceiver<EventSelect>::ManualAnswer(event);
        CommonPendingEvent* userData = NULL;
-       
+       unsigned short currentJob = 0;
+
        try {
-               userData = (CommonPendingEvent*)DataControlAsyncCallbackManagerSingleton::Instance().getRemainingSQLOperation();
+               userData = (CommonPendingEvent*)DataControlAsyncCallbackManagerSingleton::Instance().getRemainingIpcOperation();
 
                if (userData)
                {
-                       SendAppControlLaunchToProvider(userData);
+                       SendAppControlLaunchToProvider(userData, currentJob);
                }
        }
        catch (const WrtDeviceApis::Commons::Exception& ex) 
@@ -847,13 +275,14 @@ void SQLDataControlConsumer::handlePendingEvent(const EventUpdatePtr& event)
 {
        WrtDeviceApis::Commons::EventRequestReceiver<EventUpdate>::ManualAnswer(event); 
        CommonPendingEvent* userData = NULL;
-       
+       unsigned short currentJob = 0;
+
        try {
-               userData = (CommonPendingEvent*)DataControlAsyncCallbackManagerSingleton::Instance().getRemainingSQLOperation();
+               userData = (CommonPendingEvent*)DataControlAsyncCallbackManagerSingleton::Instance().getRemainingIpcOperation();
 
                if (userData)
                {
-                       SendAppControlLaunchToProvider(userData);
+                       SendAppControlLaunchToProvider(userData, currentJob);
                }
        }
        catch (const WrtDeviceApis::Commons::Exception& ex) 
@@ -941,255 +370,6 @@ void SQLDataControlConsumer::createResultDir()
     ThrowMsg(WrtDeviceApis::Commons::PlatformException, "result dir could be error during checking status");
 }
 
-std::string SQLDataControlConsumer::convertIntToString(unsigned int data)
-{
-       std::stringstream ssbuffer;
-
-       ssbuffer.str("");
-       ssbuffer << data;
-       return ssbuffer.str();
-}
-
-void SQLDataControlConsumer::SendAppControlLaunchToProvider(void* event)
-{
-       LoggerD("OK");
-       bundle* passData = NULL;
-       std::string dataId = getDataId();
-       std::vector<std::string> queryItem;
-       std::stringstream ssBuffer;
-       std::string stringBuffer;
-       CommonPendingEvent* pEvent = (CommonPendingEvent*)(event);
-       std::string ipcFilename;
-       std::string where;
-       unsigned int reqId = 0;
-       unsigned int columnSize = 0;
-
-       try 
-       {
-               passData = bundle_create();
-               
-               if (passData == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "ipc memory allocation fail");
-               }
-
-               if (pEvent == NULL)
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "event null");              
-               }
-
-               appsvc_set_operation(passData, APPSVC_OPERATION_DEFAULT);               
-               appsvc_set_appid(passData, m_appId.c_str());
-
-               bundle_add(passData, OSP_K_CALLER_TYPE, OSP_V_CALLER_TYPE_OSP);
-               bundle_add(passData, OSP_K_LAUNCH_TYPE, OSP_V_LAUNCH_TYPE_DATACONTROL);
-               bundle_add(passData, OSP_K_DATACONTROL_PROVIDER, m_providerId.c_str());
-               bundle_add(passData, OSP_K_DATACONTROL_PROTOCOL_VERSION, OSP_K_DATACONTROL_PROTOCOL_VERSION_VALUE); // version
-               bundle_add(passData, AUL_K_CALLER_APPID, m_currentAppId.c_str());
-
-               if (dynamic_cast<EventInsertPendingEvent*>(pEvent) != NULL)
-               {
-                       EventInsertPendingEvent* pendingInsertEvent = (EventInsertPendingEvent*)pEvent;
-                       EventInsertPtr insertEvent = pendingInsertEvent->getEvent();
-                       
-                       reqId = insertEvent->getReqId();
-                       columnSize = insertEvent->getColumnSize();
-
-                       stringBuffer = convertIntToString(reqId);
-                       bundle_add(passData, OSP_K_REQUEST_ID, stringBuffer.c_str());   
-
-                       ipcFilename     = generateFileName(reqId);      
-                       stringBuffer = convertIntToString(columnSize);
-                       
-                       queryItem.push_back(dataId); 
-                       queryItem.push_back(stringBuffer); 
-                       queryItem.push_back(ipcFilename); 
-
-                       stringBuffer = convertIntToString(_DATACONTROL_REQUEST_TYPE_SQL_INSERT);
-                       bundle_add(passData, OSP_K_DATACONTROL_REQUEST_TYPE, stringBuffer.c_str());
-                               
-                       addArrayToBundle(passData, queryItem);
-               }
-               else if (dynamic_cast<EventUpdatePendingEvent*>(pEvent) != NULL)
-               {
-                       EventUpdatePendingEvent* pendingUpdateEvent = (EventUpdatePendingEvent*)pEvent;
-                       EventUpdatePtr updateEvent = pendingUpdateEvent->getEvent();
-                       
-                       reqId = updateEvent->getReqId();
-                       columnSize = updateEvent->getColumnSize();
-                       where = updateEvent->getWhere();
-                       
-                       stringBuffer = convertIntToString(reqId);
-                       bundle_add(passData, OSP_K_REQUEST_ID, stringBuffer.c_str());   
-
-                       stringBuffer = convertIntToString(_DATACONTROL_REQUEST_TYPE_SQL_UPDATE);
-                       bundle_add(passData, OSP_K_DATACONTROL_REQUEST_TYPE, stringBuffer.c_str());
-
-                       ipcFilename     = generateFileName(reqId);      
-                       stringBuffer = convertIntToString(columnSize);
-
-                       queryItem.push_back(dataId); 
-                       queryItem.push_back(stringBuffer); 
-                       queryItem.push_back(ipcFilename); 
-
-                       if (where.size() == 0)  // where
-                       {
-                               queryItem.push_back("NULL");
-                       }
-                       else 
-                       {
-                               queryItem.push_back(where);
-                       }
-               
-                       addArrayToBundle(passData, queryItem);
-
-               }
-               else if (dynamic_cast<EventSelectPendingEvent*>(pEvent) != NULL)
-               {
-                       EventSelectPendingEvent* pendingSelectEvent = (EventSelectPendingEvent*)pEvent;
-                       EventSelectPtr selectEvent = pendingSelectEvent->getEvent();
-                       
-                       reqId = selectEvent->getReqId();
-                       std::vector<std::string> columns = selectEvent->getColumns();
-                       columnSize = columns.size();            
-                       where = selectEvent->getWhere();
-                       std::string order = selectEvent->getOrder();
-                       std::string page = selectEvent->getPage();
-                       std::string numberPerPage = selectEvent->getNumerPerPage();
-
-                       stringBuffer = convertIntToString(reqId);
-                       bundle_add(passData, OSP_K_REQUEST_ID, stringBuffer.c_str());   
-
-                       stringBuffer = convertIntToString(_DATACONTROL_REQUEST_TYPE_SQL_QUERY);
-                       bundle_add(passData, OSP_K_DATACONTROL_REQUEST_TYPE, stringBuffer.c_str());
-
-                       queryItem.push_back(dataId); 
-
-                       if (columnSize == 0)
-                       {
-                               queryItem.push_back("NULL");
-                       }
-                       else 
-                       {
-                               stringBuffer = convertIntToString(columnSize);
-                               queryItem.push_back(stringBuffer);
-
-                               for (size_t index = 0; index < columnSize; index++)
-                               {
-                                       queryItem.push_back(columns[index]);
-                               }
-                       }
-
-                       if (where.size() == 0) 
-                       {
-                               queryItem.push_back("NULL");
-                       }
-                       else 
-                       {
-                               queryItem.push_back(where);
-                       }
-
-                       if (order.size() == 0)
-                       {
-                               queryItem.push_back("NULL"); 
-                       }
-                       else
-                       {
-                               queryItem.push_back(order);
-                       }
-
-                       if (page.size() == 0) // page
-                       {
-                               queryItem.push_back("1"); 
-                       }
-                       else
-                       {
-                               queryItem.push_back(page);
-                       }
-
-                       if (numberPerPage.size() == 0) // numberOfPage
-                       {
-                               queryItem.push_back("20");
-                       }
-                       else
-                       {
-                               queryItem.push_back(numberPerPage);
-                       }
-
-                       addArrayToBundle(passData, queryItem);
-               }
-               else if (dynamic_cast<EventDeletePendingEvent*>(pEvent) != NULL)
-               {
-                       EventDeletePendingEvent* pendingDeleteEvent = (EventDeletePendingEvent*)pEvent;
-                       EventDeletePtr deleteEvent = pendingDeleteEvent->getEvent();
-                       reqId = deleteEvent->getReqId();
-                       stringBuffer = convertIntToString(reqId);
-                       bundle_add(passData, OSP_K_REQUEST_ID, stringBuffer.c_str());   
-
-                       stringBuffer = convertIntToString(_DATACONTROL_REQUEST_TYPE_SQL_DELETE);
-                       bundle_add(passData, OSP_K_DATACONTROL_REQUEST_TYPE, stringBuffer.c_str());
-
-                       queryItem.push_back(dataId); // dataid
-                       where = deleteEvent->getWhere();
-
-                       if (where.size() == 0)  // where
-                       {
-                               queryItem.push_back("NULL");
-                       }
-                       else 
-                       {
-                               queryItem.push_back(where);
-                       }
-                       
-                       addArrayToBundle(passData, queryItem);
-               }
-               else 
-               {
-                       // never happen
-                       ThrowMsg(WrtDeviceApis::Commons::PlatformException, "no type request type");            
-               }
-
-               int pid = 0;
-
-               for (int index = 0; index < 3; index++)
-               {
-                       pid = appsvc_run_service(passData, reqId, sqldataControlCommonCallback, (void*)NULL);
-                       
-                       if (pid >= 0) 
-                               break;
-
-                       usleep(300 * 1000);
-                       LoggerD("Launch Retry" << (index + 1));
-               }
-
-
-               if (pid < 0) 
-               {
-                       ThrowMsg(WrtDeviceApis::Commons::AlreadyInUseException, "Launch Error");
-               }
-
-               LoggerD("Launch OK : pid(" << pid << "), reqid : (" << reqId << ")");
-       }
-       catch (const WrtDeviceApis::Commons::Exception& ex) 
-       {       
-               LoggerE("Exception: " << ex.GetMessage());
-               if (passData)
-               {
-                       bundle_free(passData);
-                       passData = NULL;
-               }
-               ThrowMsg(WrtDeviceApis::Commons::PlatformException, ex.GetMessage());
-
-       }
-
-       if (passData)
-       {
-               bundle_free(passData);
-               passData = NULL;
-       }
-       
-}
-
 void SQLDataControlConsumer::OnRequestReceived(const EventInsertPtr& event)
 {
        LoggerD("Enter");
@@ -1198,9 +378,10 @@ void SQLDataControlConsumer::OnRequestReceived(const EventInsertPtr& event)
        {
                RowData* rowData = event->getRowData();
                unsigned int reqId = event->getReqId();
-               std::string ipcFilename = generateFileName(reqId);
+               std::string ipcFilename = generateFileName(reqId, m_currentAppId);
                std::string reqIdStr = convertIntToString(reqId);
-               
+               unsigned short currentJob = 0;
+
                if (checkReqIdUniqueness(reqId) == false)
                {
                        ThrowMsg(WrtDeviceApis::Commons::AlreadyInUseException, "Duplicated requested id");
@@ -1214,11 +395,13 @@ void SQLDataControlConsumer::OnRequestReceived(const EventInsertPtr& event)
                saveArrayToFile(ipcFilename, rowData);          
                delete rowData;
                
-               EventInsertPendingEvent* pendingEvent = new EventInsertPendingEvent((void*)this, event);
+               EventInsertPendingEvent* pendingEvent = new EventInsertPendingEvent((void*)this, m_dataId,
+                       m_appId, m_providerId, m_currentAppId, event);
                
-               if (DataControlAsyncCallbackManagerSingleton::Instance().checkDoSQLOperation())
+               
+               if (DataControlAsyncCallbackManagerSingleton::Instance().checkRequestIpcOperation())
                {
-                       SendAppControlLaunchToProvider(pendingEvent);
+                       SendAppControlLaunchToProvider(pendingEvent, currentJob);
                }
                event->switchToManualAnswer();
                DataControlAsyncCallbackManagerSingleton::Instance().addSQLUserData(reqIdStr, (void*)pendingEvent);
@@ -1243,17 +426,19 @@ void SQLDataControlConsumer::OnRequestReceived(const EventDeletePtr& event)
        {
                unsigned int reqId = event->getReqId();
                std::string reqIdStr = convertIntToString(reqId);
+               unsigned short currentJob = 0;
 
                if (checkReqIdUniqueness(reqId) == false)
                {
                        ThrowMsg(WrtDeviceApis::Commons::AlreadyInUseException, "Duplicated requested id");
                }
 
-               EventDeletePendingEvent* pendingEvent = new EventDeletePendingEvent(this, event);
+               EventDeletePendingEvent* pendingEvent = new EventDeletePendingEvent(this, m_dataId,
+                       m_appId, m_providerId, m_currentAppId, event);
                
-               if (DataControlAsyncCallbackManagerSingleton::Instance().checkDoSQLOperation())
+               if (DataControlAsyncCallbackManagerSingleton::Instance().checkRequestIpcOperation())
                {
-                       SendAppControlLaunchToProvider(pendingEvent);
+                       SendAppControlLaunchToProvider(pendingEvent, currentJob);
                }
                event->switchToManualAnswer();
                DataControlAsyncCallbackManagerSingleton::Instance().addSQLUserData(reqIdStr, (void*)pendingEvent);
@@ -1279,17 +464,19 @@ void SQLDataControlConsumer::OnRequestReceived(const EventSelectPtr& event)
        {
                unsigned int reqId = event->getReqId();
                std::string reqIdStr = convertIntToString(reqId);
+               unsigned short currentJob = 0;
 
                if (checkReqIdUniqueness(reqId) == false)
                {
                        ThrowMsg(WrtDeviceApis::Commons::AlreadyInUseException, "Duplicated requested id");
                }
-               
-               EventSelectPendingEvent* pendingEvent = new EventSelectPendingEvent(this, event);
 
-               if (DataControlAsyncCallbackManagerSingleton::Instance().checkDoSQLOperation())
+               EventSelectPendingEvent* pendingEvent = new EventSelectPendingEvent(this, m_dataId,
+                       m_appId, m_providerId, m_currentAppId, event);
+
+               if (DataControlAsyncCallbackManagerSingleton::Instance().checkRequestIpcOperation())
                {
-                       SendAppControlLaunchToProvider(pendingEvent);
+                       SendAppControlLaunchToProvider(pendingEvent, currentJob);
                }
                
                event->switchToManualAnswer();
@@ -1312,8 +499,9 @@ void SQLDataControlConsumer::OnRequestReceived(const EventUpdatePtr& event)
        {
                unsigned int reqId = event->getReqId();
                RowData* rowData = event->getRowData();
-               std::string ipcFilename = generateFileName(reqId);
+               std::string ipcFilename = generateFileName(reqId, m_currentAppId);
                std::stringstream ssReqId;
+               unsigned short currentJob = 0;
                ssReqId << reqId;
 
                if (checkReqIdUniqueness(reqId) == false)
@@ -1329,11 +517,12 @@ void SQLDataControlConsumer::OnRequestReceived(const EventUpdatePtr& event)
                saveArrayToFile(ipcFilename, rowData);
                delete rowData;
 
-               EventUpdatePendingEvent* pendingEvent = new EventUpdatePendingEvent(this, event);
+               EventUpdatePendingEvent* pendingEvent = new EventUpdatePendingEvent(this, m_dataId, 
+                       m_appId, m_providerId, m_currentAppId, event);
                
-               if (DataControlAsyncCallbackManagerSingleton::Instance().checkDoSQLOperation())
+               if (DataControlAsyncCallbackManagerSingleton::Instance().checkRequestIpcOperation())
                {
-                       SendAppControlLaunchToProvider(pendingEvent);
+                       SendAppControlLaunchToProvider(pendingEvent, currentJob);
                }
                event->switchToManualAnswer();
                DataControlAsyncCallbackManagerSingleton::Instance().addSQLUserData(ssReqId.str(), (void*)pendingEvent);