2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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
9 // http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <Commons/Exception.h>
19 #include <CommonsJavaScript/JSDOMExceptionFactory.h>
20 #include <JavaScriptCore/JavaScript.h>
21 #include <JSTizenExceptionFactory.h>
22 #include <JSTizenException.h>
23 #include <SecurityExceptions.h>
25 #include "MessagingErrorMsg.h"
26 #include "MessagingController.h"
27 #include "JSMessagingService.h"
28 #include "ConverterMessage.h"
29 #include "EventSendMessagePrivateData.h"
30 #include "EventMessagingServicePrivateData.h"
31 #include "EventMessagingService.h"
32 #include "JSMessage.h"
33 #include "JSMessageAttachment.h"
34 #include "MessageAsyncCallbackManager.h"
36 #include <dpl/singleton_safe_impl.h>
39 IMPLEMENT_SAFE_SINGLETON(DeviceAPI::Messaging::MessagingController)
42 using namespace DeviceAPI::Messaging;
43 using namespace DeviceAPI::Common;
44 using namespace WrtDeviceApis::Commons;
45 using namespace WrtDeviceApis::CommonsJavaScript;
50 MessagingController::MessagingController() :
51 SendMessageAnswerReceiver(ThreadEnum::NULL_THREAD),
52 GetMessagingServiceReceiver (ThreadEnum::NULL_THREAD),
53 MessagingServiceReceiver (ThreadEnum::NULL_THREAD)
59 MessagingController::~MessagingController() {
64 MessagingController& MessagingController::getInstance()
66 static MessagingController instance;
70 void MessagingController::OnAnswerReceived(const EventGetMessagingServicePtr &event) {
73 WrtDeviceApis::CommonsJavaScript::JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
74 MessageAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
76 if (event->getExceptionCode() == ExceptionCodes::None)
78 std::vector<IMessagingServicePtr> messagingServices = event->getMessagingServices();
79 int count = messagingServices.size();
82 JSObjectRef jsMessagingServiceObject[count]; //make
84 LoggerD(" Service Count :" << count);
86 for (index = 0; index < count; index++)
88 jsMessagingServiceObject[index] = JSMessagingService::createJSObject(callbackManager->getContext(), messagingServices[index] );
90 JSObjectRef result = JSObjectMakeArray(callbackManager->getContext(), count, jsMessagingServiceObject, NULL);
92 callbackManager->callOnSuccess(result);
96 LoggerD("Operation failed. Exception code: " << event->getExceptionCode());
97 JSContextRef context = callbackManager->getContext();
98 JSValueRef errorObject = NULL;
100 WrtDeviceApis::Commons::ExceptionCodes::Enumeration exception = event->getExceptionCode();
102 case WrtDeviceApis::Commons::ExceptionCodes::InvalidArgumentException:
103 errorObject = JSTizenExceptionFactory::makeErrorObject(context,
104 JSTizenException::INVALID_VALUES_ERROR, JSMESSAGING_EXCEPTION_MSG_INVALID_ARGUMENT);
106 case WrtDeviceApis::Commons::ExceptionCodes::PlatformException:
107 errorObject = JSTizenExceptionFactory::makeErrorObject(context,
108 JSTizenException::IO_ERROR, JSMESSAGING_EXCEPTION_MSG_IO);
110 case WrtDeviceApis::Commons::ExceptionCodes::PlatformWrongStateException:
111 errorObject = JSTizenExceptionFactory::makeErrorObject(context,
112 JSTizenException::NOT_SUPPORTED_ERROR, JSMESSAGING_EXCEPTION_MSG_NOT_SUPPORTED);
115 errorObject = JSTizenExceptionFactory::makeErrorObject(context,
116 JSTizenException::UNKNOWN_ERROR, JSMESSAGING_EXCEPTION_MSG_UNKNOWN);
119 callbackManager->callOnError(errorObject);
125 void MessagingController::OnAnswerReceived(const EventMessagingServicePtr &event)
127 LoggerD(" <<< EventMessagingServicePtr >>> ");
129 EventMessagingServicePrivateDataPtr privateData =
130 DPL::StaticPointerCast<EventMessagingServicePrivateData>(event->getPrivateData());
132 WrtDeviceApis::CommonsJavaScript::JSCallbackManagerPtr callbackManager = privateData->getCallbackManager(); //get callback manager
133 MessageAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
135 JSContextRef globalContext = callbackManager->getContext();
137 int MessagingServiceEventType = event->getEventType();
138 LoggerD(" MessagingServiceEvent Type :" << MessagingServiceEventType);
140 ConverterMessageFactory::ConverterType converter =
141 ConverterMessageFactory::getConverter(globalContext);
143 if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_LOAD_MESSAGE_BODY)
145 LoggerD(" Message Load Body");
146 LoggerD("Operation ID : " << event->opId);
147 if ( event->m_messagingService)
148 event->m_messagingService->deleteOpId(event->opId);
150 if (event->getExceptionCode() == ExceptionCodes::None && event->m_message)
152 LoggerD(" Message Type :" << event->m_message->getMessageType());
153 JSValueRef msg = JSMessage::createJSObject(globalContext, event->m_message);
155 callbackManager->callOnSuccess(msg);
157 callbackManager->callOnError( JSTizenExceptionFactory::makeErrorObject(globalContext,
158 JSTizenException::UNKNOWN_ERROR, JSMESSAGING_EXCEPTION_MSG_UNKNOWN));
162 JSValueRef msg = privateData->getMessageJSValueRef();
163 callbackManager->callOnError(msg);
166 else if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_LOAD_MESSAGE_ATTACHMENT)
168 LoggerD(" Message load attachment");
169 LoggerD("Operation ID : " << event->opId);
170 if ( event->m_messagingService)
171 event->m_messagingService->deleteOpId(event->opId);
173 if (event->getExceptionCode() == ExceptionCodes::None && event->m_attachment)
175 LoggerD(" Message Type :" << event->m_message->getMessageType());
177 JSValueRef attachment = JSMessageAttachment::createJS(globalContext, event->m_attachment );
179 callbackManager->callOnSuccess(attachment);
181 callbackManager->callOnError( JSTizenExceptionFactory::makeErrorObject(globalContext,
182 JSTizenException::UNKNOWN_ERROR, JSMESSAGING_EXCEPTION_MSG_UNKNOWN));
186 callbackManager->callOnError();
189 else if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_SYNC)
191 LoggerD(" Message Sync :");
192 LoggerD("Operation ID : " << event->opId);
193 if ( event->m_messagingService)
194 event->m_messagingService->deleteOpId(event->opId);
196 if (event->getExceptionCode() == ExceptionCodes::None)
198 callbackManager->callOnSuccess();
202 callbackManager->callOnError();
205 else if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_SYNC_FOLDER)
207 LoggerD(" Message Sync Folder");
208 LoggerD("Operation ID : " << event->opId);
209 if ( event->m_messagingService)
210 event->m_messagingService->deleteOpId(event->opId);
211 if (event->getExceptionCode() == ExceptionCodes::None)
213 callbackManager->callOnSuccess();
217 callbackManager->callOnError();
220 else if (MessagingServiceEventType == MESSAGING_SERVICE_EVENT_TYPE_SEND_MESSAGE)
222 JSValueRef error = NULL;
223 WrtDeviceApis::CommonsJavaScript::JSCallbackManagerPtr recipientCallbackManager = privateData->getRecipientCallbackManager();
225 if (WrtDeviceApis::Commons::ExceptionCodes::None != event->getExceptionCode()) {
226 switch (event->getExceptionCode()) {
227 case WrtDeviceApis::Commons::ExceptionCodes::PlatformException:
228 case WrtDeviceApis::Commons::ExceptionCodes::ConversionException:
229 error = JSTizenExceptionFactory::makeErrorObject(globalContext,
230 JSTizenException::INVALID_VALUES_ERROR, JSMESSAGING_EXCEPTION_MSG_INVALID_ARGUMENT);
233 error = JSTizenExceptionFactory::makeErrorObject(globalContext,
234 JSTizenException::UNKNOWN_ERROR, JSMESSAGING_EXCEPTION_MSG_UNKNOWN);
239 ConverterMessage converter(globalContext);
241 //remove operation handle
242 if (event->m_messagingService)
244 LoggerD("Operation ID : " << event->opId);
245 event->m_messagingService->deleteOpId(event->opId);
247 if (WrtDeviceApis::Commons::ExceptionCodes::None == event->getExceptionCode())
249 LoggerD(" success size : " << event->m_successRecipients.size());
250 std::vector<JSValueRef> successRecipentList;
252 int cnt = event->m_successRecipients.size();
253 LoggerD( "success count : " << cnt);
255 for(int index = 0; index < cnt; index++)
257 LoggerD( "success recipent : " << event->m_successRecipients[index]);
258 successRecipentList.push_back(converter.toJSValueRef(event->m_successRecipients[index]));
261 JSObjectRef result = JSObjectMakeArray(globalContext, cnt, successRecipentList.data(), NULL);
262 callbackManager->callOnSuccess(result);
266 //JSValueRef params[] = { error, recipient };
267 //callbackManager->callOnError( params, sizeof(params) / sizeof(params[0]));
268 callbackManager->callOnError(error);
274 callbackManager->callOnError(JSValueMakeUndefined(globalContext));
278 void MessagingController::OnAnswerReceived(const EventSendMessagePtr& event)
282 JSValueRef error = NULL;
283 EventSendMessagePrivateDataPtr privateData =
284 DPL::StaticPointerCast<EventSendMessagePrivateData>(event->getPrivateData());
285 Assert(NULL != privateData);
287 WrtDeviceApis::CommonsJavaScript::JSCallbackManagerPtr callbackManager = privateData->getCallbackManager();
288 MessageAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
290 WrtDeviceApis::CommonsJavaScript::JSCallbackManagerPtr recipientCallbackManager = privateData->getRecipientCallbackManager();
292 JSContextRef context = callbackManager->getContext();
293 Assert(NULL != context);
295 if (WrtDeviceApis::Commons::ExceptionCodes::None != event->getExceptionCode()) {
296 switch (event->getExceptionCode()) {
297 case WrtDeviceApis::Commons::ExceptionCodes::PlatformException:
298 case WrtDeviceApis::Commons::ExceptionCodes::ConversionException:
299 error = JSTizenExceptionFactory::makeErrorObject(context,
300 JSTizenException::INVALID_VALUES_ERROR, JSMESSAGING_EXCEPTION_MSG_INVALID_ARGUMENT);
303 error = JSTizenExceptionFactory::makeErrorObject(context,
304 JSTizenException::UNKNOWN_ERROR, JSMESSAGING_EXCEPTION_MSG_UNKNOWN);
309 ConverterMessage converter(context);
310 //JSValueRef recipient = converter.toJSValueRef(event->getRecipient());
312 //remove operation handle
313 if (event->m_messagingService)
315 LoggerD("Operation ID : " << event->opId);
316 event->m_messagingService->deleteOpId(event->opId);
318 if (WrtDeviceApis::Commons::ExceptionCodes::None == event->getExceptionCode()) {
319 LoggerD(" success size : " << event->m_successRecipients.size());
321 //JSObjectRef result = JSObjectMakeArray(context, event->m_successRecipients.size(), jsMessagingServiceObject, NULL);
322 std::vector<JSValueRef> successRecipentList;
324 int cnt = event->m_successRecipients.size();
325 LoggerD( "success count : " << cnt);
328 for(int index = 0; index < cnt; index++)
330 LoggerD( "success recipent : " << event->m_successRecipients[index]);
331 successRecipentList.push_back(converter.toJSValueRef(event->m_successRecipients[index]));
334 JSObjectRef result = JSObjectMakeArray(context, cnt, successRecipentList.data(), NULL);
335 callbackManager->callOnSuccess(result);
339 //JSValueRef params[] = { error, recipient };
340 //callbackManager->callOnError( params, sizeof(params) / sizeof(params[0]));
341 callbackManager->callOnError(error);
344 #if 0 //old style code
345 if (!event->getSendCallbackPerRecipient()) {
346 //this is callback for whole operation, not single recipient
347 if (WrtDeviceApis::Commons::ExceptionCodes::None == event->getExceptionCode()) {
348 callbackManager->callOnSuccess();
350 callbackManager->callOnError(error);
352 } else if (recipientCallbackManager) {
353 //this is callback for single recipient
354 ConverterMessage converter(context);
355 JSValueRef recipient = converter.toJSValueRef(event->getRecipient());
356 if (WrtDeviceApis::Commons::ExceptionCodes::None == event->getExceptionCode()) {
357 recipientCallbackManager->callOnSuccess(recipient);
359 JSValueRef params[] = { error, recipient };
360 recipientCallbackManager->callOnError( params, sizeof(params) / sizeof(params[0]));