2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * @file ContactManagerController.cpp
19 * @author Kisub Song (kisubs.song@samsung.com)
24 #include <CommonsJavaScript/JSCallbackManager.h>
25 #include <Tizen/Common/JSTizenExceptionFactory.h>
26 #include <Tizen/Common/JSTizenException.h>
27 #include "AddressBookController.h"
28 #include "ContactConverter.h"
29 #include "JSAddressBookChangeCallbackManager.h"
35 using namespace TizenApis::Commons;
36 using namespace TizenApis::Api::Contact;
37 using namespace WrtDeviceApis::Commons;
38 using namespace WrtDeviceApis::CommonsJavaScript;
40 AddressBookController::AddressBookController(JSContextRef context, IAddressBookPtr addressBook) :
41 EventAddressBookAddBatchEventAnswerReceiver(ThreadEnum::NULL_THREAD),
42 EventAddressBookUpdateBatchEventAnswerReceiver(ThreadEnum::NULL_THREAD),
43 EventAddressBookRemoveBatchEventAnswerReceiver(ThreadEnum::NULL_THREAD),
44 EventAddressBookFindEventAnswerReceiver(ThreadEnum::NULL_THREAD),
45 EventAddressBookChangeListenerListener(ThreadEnum::NULL_THREAD),
46 AddressBookPrivObject(context, addressBook)
49 LogWarning("controller has no addressBook object");
53 AddressBookController::~AddressBookController()
57 void AddressBookAsyncAnswerHandler::addBatch(const EventAddressBookAddBatchPtr &event)
59 JSCallbackManagerPtr callbackManager =
60 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
61 if (!callbackManager) {
62 LogError("no callback manager");
66 JSContextRef gContext = callbackManager->getContext();
68 JSValueRef error = NULL;
69 if (ExceptionCodes::None != event->getExceptionCode())
71 switch (event->getExceptionCode())
73 case ExceptionCodes::PlatformException:
74 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
76 case ExceptionCodes::InvalidArgumentException:
77 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Invalid value error");
79 case ExceptionCodes::ConversionException:
80 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong argument");
83 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
87 callbackManager->callOnError(error);
92 if (!event->getResult())
93 ThrowMsg(PlatformException, "No result.");
95 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
96 ContactArrayPtr contacts = event->getContacts();
98 JSValueRef result = converter->toJSValueRef(contacts);
100 callbackManager->callOnSuccess(result);
103 LogError("error during processing answer" << _rethrown_exception.GetMessage());
104 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
106 callbackManager->callOnError(error);
111 void AddressBookAsyncAnswerHandler::updateBatch(const EventAddressBookUpdateBatchPtr &event)
113 JSCallbackManagerPtr callbackManager =
114 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
115 if (!callbackManager) {
116 LogError("no callback manager");
120 JSContextRef gContext = callbackManager->getContext();
122 JSValueRef error = NULL;
123 if (ExceptionCodes::None != event->getExceptionCode())
125 switch (event->getExceptionCode())
127 case ExceptionCodes::PlatformException:
128 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
130 case ExceptionCodes::NotFoundException:
131 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR, "record not found");
133 case ExceptionCodes::InvalidArgumentException:
134 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Invalid value error");
136 case ExceptionCodes::ConversionException:
137 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong argument");
140 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
144 callbackManager->callOnError(error);
148 callbackManager->callOnSuccess();
151 void AddressBookAsyncAnswerHandler::removeBatch(const EventAddressBookRemoveBatchPtr &event)
153 JSCallbackManagerPtr callbackManager =
154 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
155 if (!callbackManager) {
156 LogError("no callback manager");
160 JSContextRef gContext = callbackManager->getContext();
162 JSValueRef error = NULL;
163 if (ExceptionCodes::None != event->getExceptionCode())
165 switch (event->getExceptionCode())
167 case ExceptionCodes::PlatformException:
168 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
170 case ExceptionCodes::NotFoundException:
171 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR, "record not found");
173 case ExceptionCodes::InvalidArgumentException:
174 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Invalid value error");
176 case ExceptionCodes::ConversionException:
177 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong argument");
180 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
183 callbackManager->callOnError(error);
187 callbackManager->callOnSuccess();
190 void AddressBookAsyncAnswerHandler::find(const EventAddressBookFindPtr &event)
192 JSCallbackManagerPtr callbackManager =
193 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
194 if (!callbackManager)
196 LogError("no callback manager");
200 JSContextRef gContext = callbackManager->getContext();
202 JSValueRef error = NULL;
203 if (ExceptionCodes::None != event->getExceptionCode())
205 switch (event->getExceptionCode())
207 case ExceptionCodes::PlatformException:
208 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_SUPPORTED_ERROR, "Not support such a filter");
210 case ExceptionCodes::InvalidArgumentException:
211 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Invalid value error");
213 case ExceptionCodes::ConversionException:
214 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong argument");
217 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
221 callbackManager->callOnError(error);
226 if (!event->getResult())
227 ThrowMsg(PlatformException, "No result.");
229 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
230 ContactArrayPtr contacts = event->getContacts();
232 JSValueRef result = converter->toJSValueRef(contacts);
234 callbackManager->callOnSuccess(result);
237 LogError("error during processing answer" << _rethrown_exception.GetMessage());
238 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
240 callbackManager->callOnError(error);
245 void AddressBookAsyncAnswerHandler::changeListenerError(const EventAddressBookChangeListenerPtr &event)
247 JSValueRef errorObject;
249 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
252 LogError("no callback manager");
256 JSContextRef gContext = cbm->getContext();
258 if (event->getExceptionCode() == ExceptionCodes::NotFoundException)
259 errorObject = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR, "Not found error");
261 errorObject = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Unknown error");
263 cbm->callOnError(errorObject);
266 void AddressBookAsyncAnswerHandler::changeListenerContactAdded(const EventAddressBookChangeListenerPtr &event)
268 JSAddressBookChangeCallbackManagerPtr cbm =
269 DPL::StaticPointerCast<JSAddressBookChangeCallbackManager>(event->getPrivateData());
272 LogError("no callback manager");
276 EventInfoAddressBookChangePtr _eventInfo = event->getEventInfo();
277 if(_eventInfo->getCallbackType() != EventInfoAddressBookChange::OnContactsAdded)
279 LogError("wrong type");
283 EventInfoAddressBookChangeAddedPtr eventInfo = DPL::DynamicPointerCast<EventInfoAddressBookChangeAdded>(_eventInfo);
285 if (!eventInfo->getContactsIsSet())
287 LogError("no data set");
291 ContactConverterFactory::ConverterType converter =
292 ContactConverterFactory::getConverter(cbm->getContext());
296 contacts = converter->toJSValueRef(eventInfo->getContacts());
297 } Catch (Exception) {
298 LogError("Conversion error");
302 cbm->callOnContactsAdded(contacts);
305 void AddressBookAsyncAnswerHandler::changeListenerContactUpdated(const EventAddressBookChangeListenerPtr &event)
307 JSAddressBookChangeCallbackManagerPtr cbm =
308 DPL::StaticPointerCast<JSAddressBookChangeCallbackManager>(event->getPrivateData());
311 LogError("no callback manager");
315 EventInfoAddressBookChangePtr _eventInfo = event->getEventInfo();
316 if(_eventInfo->getCallbackType() != EventInfoAddressBookChange::OnContactsUpdated)
318 LogError("wrong type");
322 EventInfoAddressBookChangeUpdatedPtr eventInfo = DPL::DynamicPointerCast<EventInfoAddressBookChangeUpdated>(_eventInfo);
324 if (!eventInfo->getContactsIsSet())
326 LogError("no data set");
330 ContactConverterFactory::ConverterType converter =
331 ContactConverterFactory::getConverter(cbm->getContext());
335 contacts = converter->toJSValueRef(eventInfo->getContacts());
336 } Catch (Exception) {
337 LogError("Conversion error");
341 cbm->callOnContactsUpdated(contacts);
344 void AddressBookAsyncAnswerHandler::changeListenerContactRemoved(const EventAddressBookChangeListenerPtr &event)
346 JSAddressBookChangeCallbackManagerPtr cbm =
347 DPL::StaticPointerCast<JSAddressBookChangeCallbackManager>(event->getPrivateData());
350 LogError("no callback manager");
354 EventInfoAddressBookChangePtr _eventInfo = event->getEventInfo();
355 if(_eventInfo->getCallbackType() != EventInfoAddressBookChange::OnContactsRemoved)
357 LogError("wrong type");
361 EventInfoAddressBookChangeRemovedPtr eventInfo = DPL::DynamicPointerCast<EventInfoAddressBookChangeRemoved>(_eventInfo);
362 if (!eventInfo->getContactIdsIsSet())
364 LogError("no data set");
368 ContactConverterFactory::ConverterType converter =
369 ContactConverterFactory::getConverter(cbm->getContext());
371 JSValueRef contactIds;
373 contactIds = converter->toJSValueRef(eventInfo->getContactIds());
374 } Catch (Exception) {
375 LogError("Conversion error");
379 cbm->callOnContactsAdded(contactIds);
382 void AddressBookAsyncAnswerHandler::changeListenerAddressBookReset(const EventAddressBookChangeListenerPtr &event)
384 JSAddressBookChangeCallbackManagerPtr cbm =
385 DPL::StaticPointerCast<JSAddressBookChangeCallbackManager>(event->getPrivateData());
388 LogError("no callback manager");
392 cbm->callOnAddressBookReset();
395 void AddressBookController::OnAnswerReceived(const EventAddressBookAddBatchPtr &event)
397 AddressBookAsyncAnswerHandler::addBatch(event);
400 void AddressBookController::OnAnswerReceived(const EventAddressBookUpdateBatchPtr &event)
402 AddressBookAsyncAnswerHandler::updateBatch(event);
405 void AddressBookController::OnAnswerReceived(const EventAddressBookRemoveBatchPtr &event)
407 AddressBookAsyncAnswerHandler::removeBatch(event);
410 void AddressBookController::OnAnswerReceived(const EventAddressBookFindPtr &event)
412 AddressBookAsyncAnswerHandler::find(event);
415 void AddressBookController::onAnswerReceived(const EventAddressBookChangeListenerPtr &event)
417 EventInfoAddressBookChangePtr eventInfo = event->getEventInfo();
418 if(eventInfo == NULL)
420 LogError("wrong type");
424 EventInfoAddressBookChange::CallbackType type = eventInfo->getCallbackType();
425 if(type == EventInfoAddressBookChange::OnContactsAdded)
426 AddressBookAsyncAnswerHandler::changeListenerContactAdded(event);
427 else if(type == EventInfoAddressBookChange::OnContactsUpdated)
428 AddressBookAsyncAnswerHandler::changeListenerContactUpdated(event);
429 else if(type == EventInfoAddressBookChange::OnContactsRemoved)
430 AddressBookAsyncAnswerHandler::changeListenerContactRemoved(event);
431 else if(type == EventInfoAddressBookChange::OnAddressBookReset)
432 AddressBookAsyncAnswerHandler::changeListenerAddressBookReset(event);
433 else if(type == EventInfoAddressBookChange::OnError)
434 AddressBookAsyncAnswerHandler::changeListenerError(event);
437 void AddressBookAddBatchPendingOperation::handleCallingCallbacks()
439 AddressBookAsyncAnswerHandler::addBatch(DPL::StaticPointerCast<EventAddressBookAddBatch>(m_event));
442 void AddressBookUpdateBatchPendingOperation::handleCallingCallbacks()
444 AddressBookAsyncAnswerHandler::updateBatch(DPL::StaticPointerCast<EventAddressBookUpdateBatch>(m_event));
447 void AddressBookRemoveBatchPendingOperation::handleCallingCallbacks()
449 AddressBookAsyncAnswerHandler::removeBatch(DPL::StaticPointerCast<EventAddressBookRemoveBatch>(m_event));
452 void AddressBookFindPendingOperation::handleCallingCallbacks()
454 AddressBookAsyncAnswerHandler::find(DPL::StaticPointerCast<EventAddressBookFind>(m_event));