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 "ResponseDispatcher.h"
20 #include <dpl/assert.h>
21 #include <Commons/Exception.h>
22 #include <Commons/IEvent.h>
23 #include <CommonsJavaScript/JSUtils.h>
24 #include <JSWebAPIErrorFactory.h>
26 #include "JSFilestream.h"
27 #include "EventGetNodeData.h"
28 #include "Converter.h"
29 #include "FilesystemAsyncCallbackManager.h"
30 #include "Encodings.h"
31 #include "FilesystemUtils.h"
34 using namespace WrtDeviceApis;
35 using namespace WrtDeviceApis::Commons;
36 using namespace WrtDeviceApis::CommonsJavaScript;
37 using namespace DeviceAPI::Common;
40 namespace Filesystem {
41 ResponseDispatcher& ResponseDispatcher::getInstance()
43 static ResponseDispatcher dispatcher;
47 ResponseDispatcher::ResponseDispatcher() :
48 EventAnswerReceiver<EventResolve>(ThreadEnum::NULL_THREAD),
49 EventAnswerReceiver<EventGetStorage>(ThreadEnum::NULL_THREAD),
50 EventAnswerReceiver<EventListStorages>(ThreadEnum::NULL_THREAD),
51 EventAnswerReceiver<EventListNodes>(ThreadEnum::NULL_THREAD),
52 EventAnswerReceiver<EventOpen>(ThreadEnum::NULL_THREAD),
53 EventAnswerReceiver<EventCopy>(ThreadEnum::NULL_THREAD),
54 EventAnswerReceiver<EventMove>(ThreadEnum::NULL_THREAD),
55 EventAnswerReceiver<EventRemove>(ThreadEnum::NULL_THREAD),
56 EventAnswerReceiver<EventReadText>(ThreadEnum::NULL_THREAD)
60 void ResponseDispatcher::OnAnswerReceived(const EventResolvePtr& event)
63 EventGetNodeDataPtr data =
64 DPL::DynamicPointerCast<EventGetNodeData>(event->getPrivateData());
66 FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data->getCallbackManager());
68 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
69 event->getResult()->setPermissions(data->getPerms());
71 JSFile::PrivateObjectDefPtr privDefData(new JSFile::PrivateObjectDef(event->getResult(), JSFile::PrivateObjectDef::PermissionList()));
72 JSFile::PrivateObject* privData = new JSFile::PrivateObject(data->getCallbackManager()->getContext(), privDefData);
73 privData->copyAceCheckAccessFunction(event.Get());
76 INodePtr parent = event->getResult()->getParent();
80 privDefData->pushParentPermissions(data->getPerms());
88 JSObjectRef object = JSObjectMake(data->getCallbackManager()->getContext(), JSFile::getClassRef(), privData);
89 data->getCallbackManager()->callOnSuccess(object);
91 JSObjectRef jsException;
92 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
93 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getCallbackManager()->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
95 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::SecurityException) {
96 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getCallbackManager()->getContext(), JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "PermissionDeniedError");
99 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getCallbackManager()->getContext(), JSWebAPIErrorFactory::UNKNOWN_ERROR, "Unknown error");
101 data->getCallbackManager()->callOnError(jsException);
106 void ResponseDispatcher::OnAnswerReceived(const EventListNodesPtr& event)
109 JSFile::ListFilesPrivateDataPtr privData =
110 DPL::DynamicPointerCast<JSFile::ListFilesPrivateData>(event->getPrivateData());
112 JSCallbackManagerPtr data = privData->getCallbackManager();
114 FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
116 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
117 Converter converter(data->getContext());
119 JSValueRef result = converter.toJSValueRef(event->getResult(), privData->getParentPermissions(), data->getContext(), event.Get());
120 data->callOnSuccess(result);
122 Catch(WrtDeviceApis::Commons::ConversionException) {
123 data->callOnError(JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error"));
126 JSObjectRef jsException = NULL;
127 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
128 data->callOnError(jsException);
132 void ResponseDispatcher::OnAnswerReceived(const EventOpenPtr& event)
135 DPL::SharedPtr<JSCallbackManager> data =
136 DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
138 FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
140 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
141 JSFilestream::PrivateObject* privData = new JSFilestream::PrivateObject(data->getContext(), event->getResult());
142 privData->copyAceCheckAccessFunction(event.Get());
144 JSObjectRef object = JSObjectMake(data->getContext(), JSFilestream::getClassRef(), privData);
145 data->callOnSuccess(object);
147 JSObjectRef jsException;
149 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
150 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
152 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::SecurityException) {
153 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "Permission Denied Error");
156 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
158 data->callOnError(jsException);
162 void ResponseDispatcher::OnAnswerReceived(const EventCopyPtr& event)
165 DPL::SharedPtr<JSCallbackManager> data =
166 DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
168 FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
170 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
171 JSFile::PrivateObjectDefPtr privDefData(new JSFile::PrivateObjectDef(event->getResult(),JSFile::PrivateObjectDef::PermissionList()));
172 JSFile::PrivateObject* privData = new JSFile::PrivateObject(data->getContext(), privDefData);
173 privData->copyAceCheckAccessFunction(event.Get());
175 JSObjectRef object = JSObjectMake(data->getContext(), JSFile::getClassRef(), privData);
176 data->callOnSuccess(object);
178 JSObjectRef jsException = NULL;
179 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::SecurityException) {
180 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "Permission denied error");
182 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
183 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
186 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
188 data->callOnError(jsException);
192 void ResponseDispatcher::OnAnswerReceived(const EventMovePtr& event)
195 DPL::SharedPtr<JSCallbackManager> data =
196 DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
198 FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
200 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
201 JSFile::PrivateObjectDefPtr privDefData(new JSFile::PrivateObjectDef(event->getResult(), JSFile::PrivateObjectDef::PermissionList()));
202 JSFile::PrivateObject* privData = new JSFile::PrivateObject(data->getContext(), privDefData);
203 privData->copyAceCheckAccessFunction(event.Get());
205 JSObjectRef object = JSObjectMake(data->getContext(), JSFile::getClassRef(), privData);
206 data->callOnSuccess(object);
208 JSObjectRef jsException = NULL;
209 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::SecurityException) {
210 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "Permission denied error");
212 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
213 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
216 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
218 data->callOnError(jsException);
222 void ResponseDispatcher::OnAnswerReceived(const EventRemovePtr& event)
224 LoggerD("--| ENTER");
225 DPL::SharedPtr<JSCallbackManager> data =
226 DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
228 FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
230 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
231 data->callOnSuccess();
233 JSObjectRef jsException = NULL;
234 if (event->getExceptionCode() ==WrtDeviceApis::Commons::ExceptionCodes::SecurityException) {
235 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "Permission denied error");
237 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
238 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
241 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
243 data->callOnError(jsException);
247 void ResponseDispatcher::OnAnswerReceived(const EventReadTextPtr& event)
249 LoggerD("--| ENTER");
250 DPL::SharedPtr<JSCallbackManager> data =
251 DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
253 FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
255 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
256 Converter converter(data->getContext());
258 std::string resultText = event->getResult();
259 std::string currentEncoding = event->getCharSet();
260 std::string utf8OutStr = "";
263 if (!strcmp(currentEncoding.c_str(), Encodings::UTF8) || !strcmp(currentEncoding.c_str(), Encodings::ISO88591))
265 result = converter.toJSValueRef(resultText);
266 data->callOnSuccess(result);
270 Utils::toUTF8String(currentEncoding, resultText.c_str(), resultText.length(), utf8OutStr);
271 result = converter.toJSValueRef(utf8OutStr);
272 data->callOnSuccess(result);
275 Catch(WrtDeviceApis::Commons::ConversionException) {
276 data->callOnError(JSWebAPIErrorFactory::makeErrorObject(
277 data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error"));
280 JSObjectRef jsException = NULL;
281 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::SecurityException) {
282 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "Permission denied error");
284 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
285 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
288 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
290 data->callOnError(jsException);
294 void ResponseDispatcher::OnAnswerReceived(const EventGetStoragePtr& event)
296 DPL::SharedPtr<JSCallbackManager> data = DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
298 FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
300 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
301 Converter converter(data->getContext());
303 JSValueRef result = converter.toJSValueRef(event->getResult(), data->getContext());
304 data->callOnSuccess(result);
305 } Catch (WrtDeviceApis::Commons::ConversionException) {
306 data->callOnError(JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error"));
309 JSObjectRef jsException = NULL;
310 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
311 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "Not found error");
314 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
316 data->callOnError(jsException);
320 void ResponseDispatcher::OnAnswerReceived(const EventListStoragesPtr& event)
322 DPL::SharedPtr<JSCallbackManager> data = DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
324 FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
326 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
327 Converter converter(data->getContext());
329 JSValueRef result = converter.toJSValueRef(event->getResult(), data->getContext());
330 data->callOnSuccess(result);
331 } Catch (WrtDeviceApis::Commons::ConversionException) {
332 data->callOnError(JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error"));
335 JSObjectRef jsException = NULL;
336 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
337 data->callOnError(jsException);