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.
18 #include "CalendarResponseDispatcher.h"
19 #include <CommonsJavaScript/JSCallbackManager.h>
20 #include <JSTizenException.h>
21 #include <JSTizenExceptionFactory.h>
22 #include "CalendarConverter.h"
23 #include "JSCalendarEventId.h"
24 #include "CalendarMultiCallback.h"
26 #include "CalendarAsyncCallbackManager.h"
29 using namespace WrtDeviceApis::Commons;
30 using namespace WrtDeviceApis::CommonsJavaScript;
35 CalendarResponseDispatcher& CalendarResponseDispatcher::getInstance()
37 static CalendarResponseDispatcher instance;
41 CalendarResponseDispatcher::CalendarResponseDispatcher() :
42 GetCalendarsEventAnswerReceiver(ThreadEnum::NULL_THREAD),
43 CalendarEventsEventAnswerReceiverAdds(ThreadEnum::NULL_THREAD),
44 CalendarEventsEventAnswerReceiverDeletes(ThreadEnum::NULL_THREAD),
45 CalendarEventsEventAnswerReceiverUpdates(ThreadEnum::NULL_THREAD),
46 CalendarEventsEventAnswerReceiverFind(ThreadEnum::NULL_THREAD),
47 CalendarEventsEventAnswerReceiverExpand(ThreadEnum::NULL_THREAD),
48 OnEventsChangedListener(ThreadEnum::NULL_THREAD)
52 CalendarResponseDispatcher::~CalendarResponseDispatcher()
56 void CalendarResponseDispatcher::OnAnswerReceived(const IEventGetCalendarsPtr &event)
58 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
60 LoggerE("no callback manager");
66 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
68 if (event->getResult()) {
69 CalendarConverter converter(cbm->getContext());
70 const std::vector<ICalendarPtr> &results = event->getCalendars();
71 LoggerD("found calendars: " << results.size());
72 JSValueRef result = converter.toJSValueRef(results);
73 cbm->callOnSuccess(result);
79 LoggerE("error during processing answer");
81 JSValueRef errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
82 cbm->getContext(), DeviceAPI::Common::JSTizenException::UNKNOWN_ERROR);
83 cbm->callOnError(errorObject);
86 void CalendarResponseDispatcher::OnAnswerReceived(const IEventAddEventsPtr &event)
88 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
92 LoggerD("no callback manager");
96 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
98 if (event->getResult()) {
99 LoggerD("result success");
100 CalendarConverter converter(cbm->getContext());
103 if (CalendarEvent::TASK_TYPE==event->getCalendarType()) {
104 result = converter.toJSValueRefTaskArray(event->getEvents());
106 result = converter.toJSValueRefEventArray(event->getEvents());
109 cbm->callOnSuccess(result);
112 LoggerD("result fail");
114 Catch(ConversionException)
116 LoggerE("cannot convert event");
118 JSValueRef errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
119 cbm->getContext(), DeviceAPI::Common::JSTizenException::UNKNOWN_ERROR);
120 cbm->callOnError(errorObject);
123 void CalendarResponseDispatcher::OnAnswerReceived(const IEventUpdateEventsPtr &event)
125 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
127 LoggerD("no callback manager");
131 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
133 if (event->getResult()) {
134 cbm->callOnSuccess();
136 JSValueRef errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
137 cbm->getContext(), DeviceAPI::Common::JSTizenException::UNKNOWN_ERROR);
138 cbm->callOnError(errorObject);
142 void CalendarResponseDispatcher::OnAnswerReceived(const IEventDeleteEventsPtr &event)
144 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
146 LoggerD("no callback manager");
150 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
152 if (event->getResult()) {
153 cbm->callOnSuccess();
155 JSValueRef errorObject;
156 if (event->getExceptionCode() ==
157 ExceptionCodes::NotFoundException) {
158 errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
159 cbm->getContext(), DeviceAPI::Common::JSTizenException::NOT_FOUND_ERROR);
161 errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
162 cbm->getContext(), DeviceAPI::Common::JSTizenException::UNKNOWN_ERROR);
164 cbm->callOnError(errorObject);
168 void CalendarResponseDispatcher::OnAnswerReceived(const IEventFindEventsPtr &event)
170 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
172 LoggerE("no callback manager");
177 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
179 if (event->getResult()) {
180 CalendarConverter converter(cbm->getContext());
183 if (CalendarEvent::TASK_TYPE==event->getCalendarType()) {
184 result = converter.toJSValueRefTaskArray(event->getEvents());
186 result = converter.toJSValueRefEventArray(event->getEvents());
188 cbm->callOnSuccess(result);
191 JSValueRef errorObject;
192 if (event->getExceptionCode() == ExceptionCodes::InvalidArgumentException) {
193 errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
194 cbm->getContext(), DeviceAPI::Common::JSTizenException::INVALID_VALUES_ERROR);
195 } else if (event->getExceptionCode() == ExceptionCodes::NotFoundException) {
196 errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
197 cbm->getContext(), DeviceAPI::Common::JSTizenException::UNKNOWN_ERROR);
199 errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
200 cbm->getContext(), DeviceAPI::Common::JSTizenException::UNKNOWN_ERROR);
202 cbm->callOnError(errorObject);
208 LoggerE("error during processing answer");
209 JSValueRef errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
210 cbm->getContext(), DeviceAPI::Common::JSTizenException::UNKNOWN_ERROR);
211 cbm->callOnError(errorObject);
215 void CalendarResponseDispatcher::OnAnswerReceived(const IEventExpandEventRecurrencePtr &event)
217 JSCallbackManagerPtr cbm = DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
221 LoggerD("no callback manager");
225 CalendarAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
227 if (event->getResult()) {
228 CalendarConverter converter(cbm->getContext());
229 cbm->callOnSuccess(converter.toJSValueRefEventArray(event->getExpandedEventList()));
232 JSValueRef errorObject;
233 if (event->getExceptionCode()==ExceptionCodes::InvalidArgumentException) {
234 errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
235 cbm->getContext(), DeviceAPI::Common::JSTizenException::INVALID_VALUES_ERROR);
236 } else if (event->getExceptionCode()==ExceptionCodes::NotFoundException) {
237 errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
238 cbm->getContext(), DeviceAPI::Common::JSTizenException::NOT_FOUND_ERROR);
240 errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
241 cbm->getContext(), DeviceAPI::Common::JSTizenException::UNKNOWN_ERROR);
243 cbm->callOnError(errorObject);
249 LoggerE("error during processing answer");
250 JSValueRef errorObject = DeviceAPI::Common::JSTizenExceptionFactory::makeErrorObject(
251 cbm->getContext(), DeviceAPI::Common::JSTizenException::UNKNOWN_ERROR);
252 cbm->callOnError(errorObject);
256 void CalendarResponseDispatcher::onAnswerReceived(const OnEventsChangedPtr& event)
258 CalendarChangeCallbackPrivateDataPtr multiCallbacks =
259 DPL::StaticPointerCast<CalendarChangeCallbackPrivateData>(event->getPrivateData());
260 JSContextRef context = multiCallbacks->getOnAdded()->getContext();
262 CalendarConverter converter(context);
267 switch (event->getStatus())
269 case OnEventsChanged::ON_ADD:
271 if (CalendarEvent::TASK_TYPE==event->getCalendarType()) {
272 result = converter.toJSValueRefTaskArray(event->getEventList());
274 result = converter.toJSValueRefEventArray(event->getEventList());
277 multiCallbacks->getOnAdded()->callOnSuccess(result);
280 case OnEventsChanged::ON_UPDATE:
282 if (CalendarEvent::TASK_TYPE==event->getCalendarType()) {
283 result = converter.toJSValueRefTaskArray(event->getEventList());
285 result = converter.toJSValueRefEventArray(event->getEventList());
287 multiCallbacks->getOnUpdated()->callOnSuccess(result);
290 case OnEventsChanged::ON_DELETE:
292 CalendarEventListPtr eventList = event->getEventList();
294 JSObjectRef jsResult = JSCreateArrayObject(context, 0, NULL);
295 if (NULL == jsResult) {
296 ThrowMsg(ConversionException, "Could not create js array object");
299 for (std::size_t i = 0; i < eventList->size(); i++) {
300 EventIdPtr eventId( new EventId() );
301 eventId->setUId(eventList->at(i)->getUId());
302 std::stringstream ss;
303 std::time_t rid = eventList->at(i)->getRecurrenceId();
305 eventId->setRecurrenceId(ss.str());
306 JSValueRef tmpVal =JSCalendarEventId::createJSCalendarEventId(context, eventId);
307 if (!JSSetArrayElement(context, jsResult, i, tmpVal)) {
308 ThrowMsg(ConversionException, "Could not create js array element");
312 multiCallbacks->getOnDeleted()->callOnSuccess(jsResult);
315 //case OnEventsChanged::ON_CALENDAR_RESET:
318 LoggerD("Invalid status!");
323 Catch(ConversionException)
325 LoggerE("cannot convert change event");
329 LoggerE("exception occurred while handling change noti callback!");