tizen 2.3.1 release
[framework/web/mobile/wrt-plugins-tizen.git] / src / DataSync / DataSyncResponseDispatcher.cpp
1 //
2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18
19 #include "DataSyncResponseDispatcher.h"
20 #include "DataSyncConverter.h"
21 #include "DataSyncMultiCallback.h"
22
23 #include <CommonsJavaScript/JSCallbackManager.h>
24 #include <JSWebAPIErrorFactory.h>
25 #include <Logger.h>
26 #include <GlobalContextManager.h>
27
28 using namespace WrtDeviceApis::Commons;
29 using namespace WrtDeviceApis::CommonsJavaScript;
30 using namespace DeviceAPI::Common;
31
32 namespace DeviceAPI {
33 namespace DataSync {
34
35 DataSyncResponseDispatcher& DataSyncResponseDispatcher::getInstance()
36 {
37     static DataSyncResponseDispatcher instance;
38     return instance;
39 }
40
41 DataSyncResponseDispatcher::DataSyncResponseDispatcher() :
42     OnDataSyncStateChangedListener(ThreadEnum::NULL_THREAD)
43 {
44 }
45
46 DataSyncResponseDispatcher::~DataSyncResponseDispatcher()
47 {
48 }
49
50 void DataSyncResponseDispatcher::onAnswerReceived(const OnDataSyncStateChangedPtr& event)
51 {
52     DataSyncStateChangeCallbackPrivateDataPtr multiCallbacks =
53         std::static_pointer_cast<DataSyncStateChangeCallbackPrivateData>(event->getPrivateData());
54     if (!multiCallbacks) {
55         LOGE("No listener callback!");
56         return;
57     }
58
59     Try
60        {
61         JSContextRef context = multiCallbacks->getOnProgress()->getContext();
62         if( !GlobalContextManager::getInstance()->isAliveGlobalContext(context)){
63             LOGW("Global context invalidated.");
64             return;
65         }
66
67         if (event->getResult()) {
68             DataSyncConverter converter(context);
69             JSValueRef profileId = converter.toJSValueRef(event->getProfileId());
70             if( OnDataSyncStateChanged::PROGRESS_STATUS==event->getSessionStatus() ) {
71                 LOGD("Sync progress: %d/%d",event->getSyncedPerService(),event->getTotalPerService());
72                 JSValueRef serviceType = converter.toJSValueRef(converter.toTizenValue(event->getServiceType()));
73                 JSValueRef isFromServer = converter.toJSValueRef(event->getIsFromServer());
74                 JSValueRef totalPerService = converter.toJSValueRef(event->getTotalPerService());
75                 JSValueRef syncedPerService = converter.toJSValueRef(event->getSyncedPerService());
76                 JSValueRef objParam[5] = {profileId, serviceType, isFromServer, totalPerService, syncedPerService};
77                 multiCallbacks->getOnProgress()->callOnSuccess(objParam, 5);
78             } else if ( OnDataSyncStateChanged::COMPLETE_STATUS==event->getSessionStatus() ) {
79                 LOGD("Sync completed.");
80                 multiCallbacks->getOnCompleted()->callOnSuccess(profileId);
81             } else if ( OnDataSyncStateChanged::STOP_STATUS==event->getSessionStatus() ) {
82                 LOGD("Sync stopped.");
83                 multiCallbacks->getOnStopped()->callOnSuccess(profileId);
84             } else if ( OnDataSyncStateChanged::FAIL_STATUS==event->getSessionStatus()) {
85                 LOGD("Sync failed with: %d",event->getExceptionCode());
86                 JSValueRef errorObject;
87                 if (ExceptionCodes::PlatformException==event->getExceptionCode()) {
88                     //errorObject = JSWebAPIErrorFactory::makeErrorObject(context, JSWebAPIErrorFactory::NETWORK_ERROR, event->getErrorMessage());
89                     errorObject = JSWebAPIErrorFactory::makeErrorObject(context, JSWebAPIErrorFactory::NETWORK_ERROR);
90                 } else {
91                     errorObject = JSWebAPIErrorFactory::makeErrorObject(context, JSWebAPIErrorFactory::UNKNOWN_ERROR);
92                 }
93                 JSValueRef objParam[2] = {profileId, errorObject};
94                 multiCallbacks->getOnFailed()->callOnSuccess(objParam, 2);
95             } else {
96                 LOGI("Undefined sync session state. Skip this.");
97             }
98         } else {
99             LOGW("Failed result received.");
100         }
101     }
102     Catch(Exception)
103     {
104         LOGE("Error during processing answer.");
105     }
106 }
107
108 }
109 }