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.
19 * @file ContactManagerController.cpp
20 * @author Kisub Song (kisubs.song@samsung.com)
25 #include <CommonsJavaScript/JSCallbackManager.h>
26 #include <JSTizenExceptionFactory.h>
27 #include <JSTizenException.h>
28 #include "AddressBookController.h"
29 #include "ContactConverter.h"
30 #include "JSAddressBookChangeCallbackManager.h"
31 #include "ContactAsyncCallbackManager.h"
32 #include "ContactQueue.h"
38 using namespace DeviceAPI::Common;
39 using namespace WrtDeviceApis::Commons;
40 using namespace WrtDeviceApis::CommonsJavaScript;
42 AddressBookController::AddressBookController(JSContextRef context, AddressBookPtr addressBook) :
43 EventAddressBookAddBatchEventAnswerReceiver(ThreadEnum::NULL_THREAD),
44 EventAddressBookUpdateBatchEventAnswerReceiver(ThreadEnum::NULL_THREAD),
45 EventAddressBookRemoveBatchEventAnswerReceiver(ThreadEnum::NULL_THREAD),
46 EventAddressBookFindEventAnswerReceiver(ThreadEnum::NULL_THREAD),
47 EventAddressBookChangeListenerListener(ThreadEnum::NULL_THREAD),
48 AddressBookPrivObject(context, addressBook)
50 LoggerD("AddressBookController constructed : " << this);
52 LoggerW("controller has no addressBook object");
56 AddressBookController::~AddressBookController()
58 LoggerD("AddressBookController destructed : " << this);
61 void AddressBookAsyncAnswerHandler::addBatch(const EventAddressBookAddBatchPtr &event)
64 ContactQueueManagerSingleton::Instance().decreaseQueueList();
65 bool isEmpty = ContactQueueManagerSingleton::Instance().empty();
67 ContactQueueManagerSingleton::Instance().pop();
70 JSCallbackManagerPtr callbackManager =
71 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
72 if (!callbackManager) {
73 LoggerE("no callback manager");
77 ContactAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
79 if(event->checkCancelled()) {
80 LoggerD("Operation cancelled");
84 JSContextRef gContext = callbackManager->getContext();
86 JSValueRef error = NULL;
87 if (ExceptionCodes::None != event->getExceptionCode())
89 switch (event->getExceptionCode())
91 case ExceptionCodes::PlatformException:
92 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
94 case ExceptionCodes::InvalidArgumentException:
95 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Invalid value error");
97 case ExceptionCodes::ConversionException:
98 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong argument");
101 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
105 callbackManager->callOnError(error);
110 if (!event->getResult())
111 ThrowMsg(PlatformException, "No result.");
113 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
114 ContactArrayPtr contacts = event->getContacts();
116 JSValueRef result = converter->toJSValueRef(contacts);
118 callbackManager->callOnSuccess(result);
121 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
122 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
124 callbackManager->callOnError(error);
129 void AddressBookAsyncAnswerHandler::updateBatch(const EventAddressBookUpdateBatchPtr &event)
132 ContactQueueManagerSingleton::Instance().decreaseQueueList();
133 bool isEmpty = ContactQueueManagerSingleton::Instance().empty();
135 ContactQueueManagerSingleton::Instance().pop();
138 JSCallbackManagerPtr callbackManager =
139 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
140 if (!callbackManager) {
141 LoggerE("no callback manager");
145 ContactAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
147 if(event->checkCancelled()) {
148 LoggerD("Operation cancelled");
152 JSContextRef gContext = callbackManager->getContext();
154 JSValueRef error = NULL;
155 if (ExceptionCodes::None != event->getExceptionCode())
157 switch (event->getExceptionCode())
159 case ExceptionCodes::PlatformException:
160 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
162 case ExceptionCodes::NotFoundException:
163 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR, "record not found");
165 case ExceptionCodes::InvalidArgumentException:
166 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Invalid value error");
168 case ExceptionCodes::ConversionException:
169 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong argument");
172 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
176 callbackManager->callOnError(error);
180 callbackManager->callOnSuccess();
183 void AddressBookAsyncAnswerHandler::removeBatch(const EventAddressBookRemoveBatchPtr &event)
186 ContactQueueManagerSingleton::Instance().decreaseQueueList();
187 bool isEmpty = ContactQueueManagerSingleton::Instance().empty();
189 ContactQueueManagerSingleton::Instance().pop();
192 JSCallbackManagerPtr callbackManager =
193 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
194 if (!callbackManager) {
195 LoggerE("no callback manager");
199 ContactAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
201 if(event->checkCancelled()) {
202 LoggerD("Operation cancelled");
206 JSContextRef gContext = callbackManager->getContext();
208 JSValueRef error = NULL;
209 if (ExceptionCodes::None != event->getExceptionCode())
211 switch (event->getExceptionCode())
213 case ExceptionCodes::PlatformException:
214 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
216 case ExceptionCodes::NotFoundException:
217 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR, "record not found");
219 case ExceptionCodes::InvalidArgumentException:
220 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Invalid value error");
222 case ExceptionCodes::ConversionException:
223 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong argument");
226 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
229 callbackManager->callOnError(error);
233 callbackManager->callOnSuccess();
236 void AddressBookAsyncAnswerHandler::find(const EventAddressBookFindPtr &event)
239 JSCallbackManagerPtr callbackManager =
240 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
241 if (!callbackManager)
243 LoggerE("no callback manager");
247 ContactAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
249 if(event->checkCancelled()) {
250 LoggerD("Operation cancelled");
254 JSContextRef gContext = callbackManager->getContext();
256 JSValueRef error = NULL;
257 if (ExceptionCodes::None != event->getExceptionCode())
259 switch (event->getExceptionCode())
261 case ExceptionCodes::PlatformException:
262 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_SUPPORTED_ERROR, "Not support such a filter");
264 case ExceptionCodes::InvalidArgumentException:
265 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Invalid value error");
267 case ExceptionCodes::ConversionException:
268 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong argument");
271 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
275 callbackManager->callOnError(error);
280 if (!event->getResult())
281 ThrowMsg(PlatformException, "No result.");
283 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
284 ContactArrayPtr contacts = event->getContacts();
286 JSValueRef result = converter->toJSValueRef(contacts);
288 callbackManager->callOnSuccess(result);
291 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
292 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
294 callbackManager->callOnError(error);
299 void AddressBookAsyncAnswerHandler::changeListenerError(const EventAddressBookChangeListenerPtr &event)
302 JSValueRef errorObject;
304 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
307 LoggerE("no callback manager");
311 JSContextRef gContext = cbm->getContext();
313 if (event->getExceptionCode() == ExceptionCodes::NotFoundException)
314 errorObject = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR, "Not found error");
316 errorObject = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
318 cbm->callOnError(errorObject);
321 void AddressBookAsyncAnswerHandler::changeListenerContactAdded(const EventAddressBookChangeListenerPtr &event)
324 JSAddressBookChangeCallbackManagerPtr cbm =
325 DPL::StaticPointerCast<JSAddressBookChangeCallbackManager>(event->getPrivateData());
328 LoggerE("no callback manager");
332 EventInfoAddressBookChangePtr _eventInfo = event->getEventInfo();
333 if(_eventInfo->getCallbackType() != EventInfoAddressBookChange::OnContactsAdded)
335 LoggerE("wrong type");
339 EventInfoAddressBookChangeAddedPtr eventInfo = DPL::DynamicPointerCast<EventInfoAddressBookChangeAdded>(_eventInfo);
341 if (!eventInfo->getContactsIsSet())
343 LoggerE("no data set");
347 ContactConverterFactory::ConverterType converter =
348 ContactConverterFactory::getConverter(cbm->getContext());
352 contacts = converter->toJSValueRef(eventInfo->getContacts());
353 } Catch (Exception) {
354 LoggerE("Conversion error");
358 cbm->callOnContactsAdded(contacts);
361 void AddressBookAsyncAnswerHandler::changeListenerContactUpdated(const EventAddressBookChangeListenerPtr &event)
364 JSAddressBookChangeCallbackManagerPtr cbm =
365 DPL::StaticPointerCast<JSAddressBookChangeCallbackManager>(event->getPrivateData());
368 LoggerE("no callback manager");
372 EventInfoAddressBookChangePtr _eventInfo = event->getEventInfo();
373 if(_eventInfo->getCallbackType() != EventInfoAddressBookChange::OnContactsUpdated)
375 LoggerE("wrong type");
379 EventInfoAddressBookChangeUpdatedPtr eventInfo = DPL::DynamicPointerCast<EventInfoAddressBookChangeUpdated>(_eventInfo);
381 if (!eventInfo->getContactsIsSet())
383 LoggerE("no data set");
387 ContactConverterFactory::ConverterType converter =
388 ContactConverterFactory::getConverter(cbm->getContext());
392 contacts = converter->toJSValueRef(eventInfo->getContacts());
393 } Catch (Exception) {
394 LoggerE("Conversion error");
398 cbm->callOnContactsUpdated(contacts);
401 void AddressBookAsyncAnswerHandler::changeListenerContactRemoved(const EventAddressBookChangeListenerPtr &event)
404 JSAddressBookChangeCallbackManagerPtr cbm =
405 DPL::StaticPointerCast<JSAddressBookChangeCallbackManager>(event->getPrivateData());
408 LoggerE("no callback manager");
412 EventInfoAddressBookChangePtr _eventInfo = event->getEventInfo();
413 if(_eventInfo->getCallbackType() != EventInfoAddressBookChange::OnContactsRemoved)
415 LoggerE("wrong type");
419 EventInfoAddressBookChangeRemovedPtr eventInfo = DPL::DynamicPointerCast<EventInfoAddressBookChangeRemoved>(_eventInfo);
420 if (!eventInfo->getContactIdsIsSet())
422 LoggerE("no data set");
426 ContactConverterFactory::ConverterType converter =
427 ContactConverterFactory::getConverter(cbm->getContext());
429 JSValueRef contactIds;
431 contactIds = converter->toJSValueRef(eventInfo->getContactIds());
432 } Catch (Exception) {
433 LoggerE("Conversion error");
437 cbm->callOnContactsDeleted(contactIds);
440 void AddressBookController::OnAnswerReceived(const EventAddressBookAddBatchPtr &event)
442 AddressBookAsyncAnswerHandler::addBatch(event);
445 void AddressBookController::OnAnswerReceived(const EventAddressBookUpdateBatchPtr &event)
447 AddressBookAsyncAnswerHandler::updateBatch(event);
450 void AddressBookController::OnAnswerReceived(const EventAddressBookRemoveBatchPtr &event)
452 AddressBookAsyncAnswerHandler::removeBatch(event);
455 void AddressBookController::OnAnswerReceived(const EventAddressBookFindPtr &event)
457 AddressBookAsyncAnswerHandler::find(event);
460 void AddressBookController::onAnswerReceived(const EventAddressBookChangeListenerPtr &event)
462 EventInfoAddressBookChangePtr eventInfo = event->getEventInfo();
463 if(eventInfo == NULL)
465 LoggerE("wrong type");
469 EventInfoAddressBookChange::CallbackType type = eventInfo->getCallbackType();
470 if(type == EventInfoAddressBookChange::OnContactsAdded)
471 AddressBookAsyncAnswerHandler::changeListenerContactAdded(event);
472 else if(type == EventInfoAddressBookChange::OnContactsUpdated)
473 AddressBookAsyncAnswerHandler::changeListenerContactUpdated(event);
474 else if(type == EventInfoAddressBookChange::OnContactsRemoved)
475 AddressBookAsyncAnswerHandler::changeListenerContactRemoved(event);
476 else if(type == EventInfoAddressBookChange::OnError)
477 AddressBookAsyncAnswerHandler::changeListenerError(event);