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 "JSCalendarEventId.h"
25 #include "CalendarMultiCallback.h"
26 #include <API/Calendar/EventId.h>
28 #include "CalendarAsyncCallbackManager.h"
30 using namespace TizenApis::Api::Calendar;
31 using namespace WrtDeviceApis::Commons;
32 using namespace WrtDeviceApis::CommonsJavaScript;
38 CalendarResponseDispatcher& CalendarResponseDispatcher::getInstance()
40 static CalendarResponseDispatcher instance;
44 CalendarResponseDispatcher::CalendarResponseDispatcher() :
45 GetCalendarsEventAnswerReceiver(ThreadEnum::NULL_THREAD),
46 CalendarEventsEventAnswerReceiverAdds(ThreadEnum::NULL_THREAD),
47 CalendarEventsEventAnswerReceiverDeletes(ThreadEnum::NULL_THREAD),
48 CalendarEventsEventAnswerReceiverUpdates(ThreadEnum::NULL_THREAD),
49 CalendarEventsEventAnswerReceiverFind(ThreadEnum::NULL_THREAD),
50 CalendarEventsEventAnswerReceiverExpand(ThreadEnum::NULL_THREAD),
51 OnEventsChangedListener(ThreadEnum::NULL_THREAD)
55 CalendarResponseDispatcher::~CalendarResponseDispatcher()
59 void CalendarResponseDispatcher::OnAnswerReceived(const IEventGetCalendarsPtr &event)
61 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
63 LogError("no callback manager");
69 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
71 if (event->getResult()) {
72 CalendarConverter converter(cbm->getContext());
73 const std::vector<ICalendarPtr> &results = event->getCalendars();
74 LogDebug("found calendars: " << results.size());
75 JSValueRef result = converter.toJSValueRef(results);
76 cbm->callOnSuccess(result);
82 LogError("error during processing answer");
84 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
85 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
86 cbm->callOnError(errorObject);
89 void CalendarResponseDispatcher::OnAnswerReceived(const IEventAddEventsPtr &event)
91 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
95 LogDebug("no callback manager");
99 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
101 if (event->getResult()) {
102 LogDebug("result success");
103 CalendarConverter converter(cbm->getContext());
106 if (CalendarEvent::TASK_TYPE==event->getCalendarType()) {
107 result = converter.toJSValueRefTaskArray(event->getEvents());
109 result = converter.toJSValueRefEventArray(event->getEvents());
112 cbm->callOnSuccess(result);
115 LogDebug("result fail");
117 Catch(ConversionException)
119 LogError("cannot convert event");
121 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
122 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
123 cbm->callOnError(errorObject);
126 void CalendarResponseDispatcher::OnAnswerReceived(const IEventUpdateEventsPtr &event)
128 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
130 LogDebug("no callback manager");
134 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
136 if (event->getResult()) {
137 cbm->callOnSuccess();
139 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
140 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
141 cbm->callOnError(errorObject);
145 void CalendarResponseDispatcher::OnAnswerReceived(const IEventDeleteEventsPtr &event)
147 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
149 LogDebug("no callback manager");
153 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
155 if (event->getResult()) {
156 cbm->callOnSuccess();
158 JSValueRef errorObject;
159 if (event->getExceptionCode() ==
160 ExceptionCodes::NotFoundException) {
161 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
162 cbm->getContext(), TizenApis::Commons::JSTizenException::NOT_FOUND_ERROR);
164 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
165 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
167 cbm->callOnError(errorObject);
171 void CalendarResponseDispatcher::OnAnswerReceived(const IEventFindEventsPtr &event)
173 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
175 LogError("no callback manager");
180 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
182 if (event->getResult()) {
183 CalendarConverter converter(cbm->getContext());
186 if (CalendarEvent::TASK_TYPE==event->getCalendarType()) {
187 result = converter.toJSValueRefTaskArray(event->getEvents());
189 result = converter.toJSValueRefEventArray(event->getEvents());
191 cbm->callOnSuccess(result);
194 JSValueRef errorObject;
195 if (event->getExceptionCode() == ExceptionCodes::InvalidArgumentException) {
196 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
197 cbm->getContext(), TizenApis::Commons::JSTizenException::INVALID_VALUES_ERROR);
198 } else if (event->getExceptionCode() == ExceptionCodes::NotFoundException) {
199 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
200 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
202 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
203 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
205 cbm->callOnError(errorObject);
211 LogError("error during processing answer");
212 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
213 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
214 cbm->callOnError(errorObject);
218 void CalendarResponseDispatcher::OnAnswerReceived(const IEventExpandEventRecurrencePtr &event)
220 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
224 LogDebug("no callback manager");
228 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
230 if (event->getResult()) {
231 CalendarConverter converter(cbm->getContext());
232 cbm->callOnSuccess(converter.toJSValueRefEventArray(event->getExpandedEventList()));
235 JSValueRef errorObject;
236 if (event->getExceptionCode()==ExceptionCodes::InvalidArgumentException) {
237 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
238 cbm->getContext(), TizenApis::Commons::JSTizenException::INVALID_VALUES_ERROR);
239 } else if (event->getExceptionCode()==ExceptionCodes::NotFoundException) {
240 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
241 cbm->getContext(), TizenApis::Commons::JSTizenException::NOT_FOUND_ERROR);
243 errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
244 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
246 cbm->callOnError(errorObject);
249 LogDebug("result fail");
253 LogError("error during processing answer");
254 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
255 cbm->getContext(), TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
256 cbm->callOnError(errorObject);
260 void CalendarResponseDispatcher::onAnswerReceived(const OnEventsChangedPtr& event)
262 CalendarChangeCallbackPrivateDataPtr multiCallbacks =
263 DPL::StaticPointerCast<CalendarChangeCallbackPrivateData>(event->getPrivateData());
264 JSContextRef context = multiCallbacks->getOnAdded()->getContext();
266 CalendarConverter converter(context);
271 switch (event->getStatus())
273 case OnEventsChanged::ON_ADD:
275 if (CalendarEvent::TASK_TYPE==event->getCalendarType()) {
276 result = converter.toJSValueRefTaskArray(event->getEventList());
278 result = converter.toJSValueRefEventArray(event->getEventList());
281 multiCallbacks->getOnAdded()->callOnSuccess(result);
284 case OnEventsChanged::ON_UPDATE:
286 if (CalendarEvent::TASK_TYPE==event->getCalendarType()) {
287 result = converter.toJSValueRefTaskArray(event->getEventList());
289 result = converter.toJSValueRefEventArray(event->getEventList());
291 multiCallbacks->getOnUpdated()->callOnSuccess(result);
294 case OnEventsChanged::ON_DELETE:
296 CalendarEventListPtr eventList = event->getEventList();
298 JSObjectRef jsResult = JSCreateArrayObject(context, 0, NULL);
299 if (NULL == jsResult) {
300 ThrowMsg(ConversionException, "Could not create js array object");
303 for (std::size_t i = 0; i < eventList->size(); i++) {
304 EventIdPtr eventId( new EventId() );
305 eventId->setUId(eventList->at(i)->getUId());
306 std::stringstream ss;
307 std::time_t rid = eventList->at(i)->getRecurrenceId();
309 eventId->setRecurrenceId(ss.str());
310 JSValueRef tmpVal =JSCalendarEventId::createJSCalendarEventId(context, eventId);
311 if (!JSSetArrayElement(context, jsResult, i, tmpVal)) {
312 ThrowMsg(ConversionException, "Could not create js array element");
316 multiCallbacks->getOnDeleted()->callOnSuccess(jsResult);
319 //case OnEventsChanged::ON_CALENDAR_RESET:
322 LogDebug("Invalid status!");
323 JSValueRef errorObject = TizenApis::Commons::JSTizenExceptionFactory::makeErrorObject(
324 context, TizenApis::Commons::JSTizenException::UNKNOWN_ERROR);
325 multiCallbacks->getOnAdded()->callOnError(errorObject);
330 Catch(ConversionException)
332 LogError("cannot convert change event");
336 LogError("exception occurred while handling change noti callback!");