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 #include "CalendarResponseDispatcher.h"
19 #include <dpl/log/log.h>
20 #include <CommonsJavaScript/JSCallbackManager.h>
21 #include <Tizen/Common/JSTizenException.h>
22 #include <Tizen/Common/JSTizenExceptionFactory.h>
23 #include "CalendarConverter.h"
24 #include "JSCalendarItem.h"
25 #include "JSCalendarEventId.h"
26 #include "CalendarMultiCallback.h"
27 #include <API/Calendar/EventId.h>
29 using namespace TizenApis::Api::Calendar;
30 using namespace WrtDeviceApis::Commons;
31 using namespace WrtDeviceApis::CommonsJavaScript;
37 CalendarResponseDispatcher& CalendarResponseDispatcher::getInstance()
39 static CalendarResponseDispatcher instance;
43 CalendarResponseDispatcher::CalendarResponseDispatcher() :
44 GetCalendarsEventAnswerReceiver(ThreadEnum::NULL_THREAD),
45 CalendarEventsEventAnswerReceiverAdds(ThreadEnum::NULL_THREAD),
46 CalendarEventsEventAnswerReceiverDeletes(ThreadEnum::NULL_THREAD),
47 CalendarEventsEventAnswerReceiverUpdates(ThreadEnum::NULL_THREAD),
48 CalendarEventsEventAnswerReceiverFind(ThreadEnum::NULL_THREAD),
49 CalendarEventsEventAnswerReceiverExpand(ThreadEnum::NULL_THREAD),
50 OnAddEventsChangedListener(ThreadEnum::NULL_THREAD),
51 OnUpdateEventsChangedListener(ThreadEnum::NULL_THREAD),
52 OnDeleteEventsChangedListener(ThreadEnum::NULL_THREAD),
53 OnEventsChangedListener(ThreadEnum::NULL_THREAD)
58 CalendarResponseDispatcher::~CalendarResponseDispatcher()
63 void CalendarResponseDispatcher::OnAnswerReceived(
64 const IEventGetCalendarsPtr &event)
67 JSCallbackManagerPtr cbm =
68 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
70 LogError("no callback manager");
75 if (event->getResult()) {
76 CalendarConverterFactory::ConverterType converter =
77 CalendarConverterFactory::getConverter(cbm->getContext());
78 const std::vector<ICalendarPtr> &results = event->getCalendars();
79 LogDebug("found calendars: " << results.size());
80 JSValueRef result = converter->toJSValueRef(results);
81 cbm->callOnSuccess(result);
87 LogError("error during processing answer");
89 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
90 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
91 cbm->callOnError(errorObject);
94 void CalendarResponseDispatcher::OnAnswerReceived(const IEventAddEventsPtr &event)
97 JSCallbackManagerPtr cbm =
98 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
102 LogDebug("no callback manager");
105 if (event->getResult()) {
106 LogDebug("result success");
107 CalendarConverterFactory::ConverterType converter =
108 CalendarConverterFactory::getConverter(cbm->getContext());
109 cbm->callOnSuccess(converter->toJSValueRef(event->getEvents()));
112 LogDebug("result fail");
114 Catch(ConversionException)
116 LogError("cannot convert event");
118 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
119 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
120 cbm->callOnError(errorObject);
123 void CalendarResponseDispatcher::onAnswerReceived(const OnAddEventsChangedPtr& event)
126 CalendarEventsCallbackPrivateDataPtr multiCallbacks =
127 DPL::StaticPointerCast<CalendarEventsCallbackPrivateData>(event->getPrivateData());
128 JSContextRef context = multiCallbacks->getOnEvent()->getContext();
130 switch (event->getStatus())
132 case OnAddEventsChanged::EVENT_ADD_SUCCESS:
134 CalendarConverterFactory::ConverterType converter =
135 CalendarConverterFactory::getConverter(context);
136 multiCallbacks->getOnEvent()->callOnSuccess(converter->toJSValueRefItem(event->getEvent()));
139 case OnAddEventsChanged::EVENT_ADD_FAIL:
141 CalendarConverterFactory::ConverterType converter =
142 CalendarConverterFactory::getConverter(context);
143 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
144 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
145 JSValueRef eventObject = converter->toJSValueRefItem(event->getEvent());
146 JSValueRef obj[] = {errorObject, eventObject};
147 multiCallbacks->getOnEvent()->callOnError(obj, 2);
152 LogDebug("Invalid status!");
153 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
154 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
155 multiCallbacks->getOnEvent()->callOnError(errorObject);
161 void CalendarResponseDispatcher::OnAnswerReceived(const IEventUpdateEventsPtr &event)
163 JSCallbackManagerPtr cbm =
164 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
166 LogDebug("no callback manager");
169 if (event->getResult()) {
170 cbm->callOnSuccess();
172 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
173 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
174 cbm->callOnError(errorObject);
178 void CalendarResponseDispatcher::onAnswerReceived(const OnUpdateEventsChangedPtr& event)
181 CalendarEventsCallbackPrivateDataPtr multiCallbacks =
182 DPL::StaticPointerCast<CalendarEventsCallbackPrivateData>(event->getPrivateData());
183 JSContextRef context = multiCallbacks->getOnEvent()->getContext();
185 switch (event->getStatus())
187 case OnUpdateEventsChanged::EVENT_UPDATE_SUCCESS:
189 CalendarConverterFactory::ConverterType converter =
190 CalendarConverterFactory::getConverter(context);
191 multiCallbacks->getOnEvent()->callOnSuccess(converter->toJSValueRefItem(event->getEvent()));
194 case OnUpdateEventsChanged::EVENT_UPDATE_FAIL:
196 CalendarConverterFactory::ConverterType converter =
197 CalendarConverterFactory::getConverter(context);
198 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
199 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
200 JSValueRef eventObject = converter->toJSValueRefItem(event->getEvent());
201 JSValueRef obj[] = {errorObject, eventObject};
202 multiCallbacks->getOnEvent()->callOnError(obj, 2);
207 LogDebug("Invalid status!");
208 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
209 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
210 multiCallbacks->getOnEvent()->callOnError(errorObject);
216 void CalendarResponseDispatcher::OnAnswerReceived(const IEventDeleteEventsPtr &event)
218 JSCallbackManagerPtr cbm =
219 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
221 LogDebug("no callback manager");
224 if (event->getResult()) {
225 cbm->callOnSuccess();
227 JSValueRef errorObject;
228 if (event->getExceptionCode() ==
229 ExceptionCodes::NotFoundException) {
230 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
231 cbm->getContext(), TizenApis::Commons::JSTizenException::NOT_FOUND_ERROR);
233 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
234 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
236 cbm->callOnError(errorObject);
240 void CalendarResponseDispatcher::onAnswerReceived(const OnDeleteEventsChangedPtr& event)
243 CalendarEventsCallbackPrivateDataPtr multiCallbacks =
244 DPL::StaticPointerCast<CalendarEventsCallbackPrivateData>(event->getPrivateData());
245 JSContextRef context = multiCallbacks->getOnEvent()->getContext();
247 switch (event->getStatus())
249 case OnDeleteEventsChanged::EVENT_DELETE_SUCCESS:
251 multiCallbacks->getOnEvent()->callOnSuccess(
252 JSCalendarEventId::createJSCalendarEventId(context, event->getEventId()));
255 case OnDeleteEventsChanged::EVENT_DELETE_FAIL:
257 JSValueRef errorObject;
258 if (event->getExceptionCode() == ExceptionCodes::NotFoundException) {
260 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
261 context, TizenApis::Commons::JSTizenException::NOT_FOUND_ERROR);
263 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
264 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
267 JSValueRef eventObject = JSCalendarEventId::createJSCalendarEventId(context, event->getEventId());
268 JSValueRef obj[] = {errorObject, eventObject};
269 multiCallbacks->getOnEvent()->callOnError(obj, 2);
274 LogDebug("Invalid status!");
275 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
276 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
277 multiCallbacks->getOnEvent()->callOnError(errorObject);
283 void CalendarResponseDispatcher::OnAnswerReceived(const IEventFindEventsPtr &event)
285 JSCallbackManagerPtr cbm =
286 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
288 LogError("no callback manager");
293 if (event->getResult()) {
294 CalendarConverterFactory::ConverterType converter =
295 CalendarConverterFactory::getConverter(cbm->getContext());
297 JSValueRef result = converter->toJSValueRef(event->getEvents());
298 cbm->callOnSuccess(result);
301 JSValueRef errorObject;
302 if (event->getExceptionCode() == ExceptionCodes::InvalidArgumentException) {
303 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
304 cbm->getContext(), TizenApis::Commons::JSTizenException::INVALID_VALUES_ERROR);
305 } else if (event->getExceptionCode() == ExceptionCodes::NotFoundException) {
306 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
307 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
309 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
310 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
312 cbm->callOnError(errorObject);
318 LogError("error during processing answer");
319 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
320 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
321 cbm->callOnError(errorObject);
325 void CalendarResponseDispatcher::OnAnswerReceived(const IEventExpandEventRecurrencePtr &event)
328 JSCallbackManagerPtr cbm =
329 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
333 LogDebug("no callback manager");
336 if (event->getResult()) {
337 CalendarConverterFactory::ConverterType converter =
338 CalendarConverterFactory::getConverter(cbm->getContext());
339 cbm->callOnSuccess(converter->toJSValueRef(event->getExpandedEventList()));
342 JSValueRef errorObject;
343 if (event->getExceptionCode() ==
344 ExceptionCodes::NotFoundException) {
345 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
346 cbm->getContext(), TizenApis::Commons::JSTizenException::NOT_FOUND_ERROR);
348 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
349 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
351 cbm->callOnError(errorObject);
354 LogDebug("result fail");
358 LogError("error during processing answer");
359 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
360 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
361 cbm->callOnError(errorObject);
365 void CalendarResponseDispatcher::onAnswerReceived(const OnEventsChangedPtr& event)
368 CalendarChangeCallbackPrivateDataPtr multiCallbacks =
369 DPL::StaticPointerCast<CalendarChangeCallbackPrivateData>(event->getPrivateData());
370 JSContextRef context = multiCallbacks->getOnAdded()->getContext();
372 CalendarConverterFactory::ConverterType converter = CalendarConverterFactory::getConverter(context);
376 switch (event->getStatus())
378 case OnEventsChanged::ON_ADD:
380 multiCallbacks->getOnAdded()->callOnSuccess(converter->toJSValueRef(event->getEventList()));
383 case OnEventsChanged::ON_UPDATE:
385 multiCallbacks->getOnUpdated()->callOnSuccess(converter->toJSValueRef(event->getEventList()));
388 case OnEventsChanged::ON_DELETE:
390 CalendarEventListPtr eventList = event->getEventList();
392 JSObjectRef jsResult = JSCreateArrayObject(context, 0, NULL);
393 if (NULL == jsResult) {
394 ThrowMsg(ConversionException, "Could not create js array object");
397 for (std::size_t i = 0; i < eventList->size(); i++) {
398 EventIdPtr eventId( new EventId() );
399 eventId->setUId(eventList->at(i)->getUId());
400 eventId->setRecurrenceId(eventList->at(i)->getRecurrenceId());
401 JSValueRef tmpVal =JSCalendarEventId::createJSCalendarEventId(context, eventId);
402 if (!JSSetArrayElement(context, jsResult, i, tmpVal)) {
403 ThrowMsg(ConversionException, "Could not create js array element");
407 multiCallbacks->getOnDeleted()->callOnSuccess(jsResult);
410 //case OnEventsChanged::ON_CALENDAR_RESET:
413 LogDebug("Invalid status!");
414 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
415 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
416 multiCallbacks->getOnAdded()->callOnError(errorObject);
421 Catch(ConversionException)
423 LogError("cannot convert change event");
427 LogError("exception occurred while handling change noti callback!");