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"
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 "JSEventId.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 CalendarConverterFactory::ConverterType converter =
248 CalendarConverterFactory::getConverter(context);
250 switch (event->getStatus())
252 case OnDeleteEventsChanged::EVENT_DELETE_SUCCESS:
254 multiCallbacks->getOnEvent()->callOnSuccess(
255 converter->toJSValueRef(event->getEventId()));
258 case OnDeleteEventsChanged::EVENT_DELETE_FAIL:
260 JSValueRef errorObject;
261 if (event->getExceptionCode() == ExceptionCodes::NotFoundException) {
263 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
264 context, TizenApis::Commons::JSTizenException::NOT_FOUND_ERROR);
266 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
267 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
270 JSValueRef eventObject = converter->toJSValueRef(event->getEventId());
271 JSValueRef obj[] = {errorObject, eventObject};
272 multiCallbacks->getOnEvent()->callOnError(obj, 2);
277 LogDebug("Invalid status!");
278 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
279 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
280 multiCallbacks->getOnEvent()->callOnError(errorObject);
286 void CalendarResponseDispatcher::OnAnswerReceived(const IEventFindEventsPtr &event)
288 JSCallbackManagerPtr cbm =
289 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
291 LogError("no callback manager");
296 if (event->getResult()) {
297 CalendarConverterFactory::ConverterType converter =
298 CalendarConverterFactory::getConverter(cbm->getContext());
300 JSValueRef result = converter->toJSValueRef(event->getEvents());
301 cbm->callOnSuccess(result);
304 JSValueRef errorObject;
305 if (event->getExceptionCode() ==
306 ExceptionCodes::NotFoundException) {
307 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
308 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
310 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
311 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
313 cbm->callOnError(errorObject);
318 LogError("error during processing answer");
320 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
321 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
322 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);
353 LogDebug("result fail");
355 Catch(ConversionException)
357 LogError("cannot convert event");
359 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
360 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
361 cbm->callOnError(errorObject);
364 void CalendarResponseDispatcher::onAnswerReceived(const OnEventsChangedPtr& event)
367 CalendarChangeCallbackPrivateDataPtr multiCallbacks =
368 DPL::StaticPointerCast<CalendarChangeCallbackPrivateData>(event->getPrivateData());
369 JSContextRef context = multiCallbacks->getOnAdded()->getContext();
371 CalendarConverterFactory::ConverterType converter = CalendarConverterFactory::getConverter(context);
375 switch (event->getStatus())
377 case OnEventsChanged::ON_ADD:
379 multiCallbacks->getOnAdded()->callOnSuccess(converter->toJSValueRef(event->getEventList()));
382 case OnEventsChanged::ON_UPDATE:
384 multiCallbacks->getOnUpdated()->callOnSuccess(converter->toJSValueRef(event->getEventList()));
387 case OnEventsChanged::ON_DELETE:
389 CalendarEventListPtr eventList = event->getEventList();
391 JSObjectRef jsResult = JSCreateArrayObject(context, 0, NULL);
392 if (NULL == jsResult) {
393 ThrowMsg(ConversionException, "Could not create js array object");
396 for (std::size_t i = 0; i < eventList->size(); i++) {
397 EventIdPtr eventId( new EventId() );
398 eventId->setUId(eventList->at(i)->getUId());
399 eventId->setRecurrenceId(eventList->at(i)->getRecurrenceId());
400 JSValueRef tmpVal = converter->toJSValueRef(eventId);
401 if (!JSSetArrayElement(context, jsResult, i, tmpVal)) {
402 ThrowMsg(ConversionException, "Could not create js array element");
406 multiCallbacks->getOnDeleted()->callOnSuccess(jsResult);
409 //case OnEventsChanged::ON_CALENDAR_RESET:
412 LogDebug("Invalid status!");
413 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
414 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
415 multiCallbacks->getOnAdded()->callOnError(errorObject);
420 Catch(ConversionException)
422 LogError("cannot convert change event");
426 LogError("exception occurred while handling change noti callback!");