Update change log and spec for wrt-plugins-tizen_0.4.70
[platform/framework/web/wrt-plugins-tizen.git] / src / Filesystem / ResponseDispatcher.cpp
1 //
2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16 //
17
18 #include "ResponseDispatcher.h"
19
20 #include <dpl/assert.h>
21 #include <Commons/Exception.h>
22 #include <Commons/IEvent.h>
23 #include <CommonsJavaScript/JSUtils.h>
24 #include <JSWebAPIErrorFactory.h>
25 #include "JSFile.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"
32 #include <Logger.h>
33
34 using namespace WrtDeviceApis;
35 using namespace WrtDeviceApis::Commons;
36 using namespace WrtDeviceApis::CommonsJavaScript;
37 using namespace DeviceAPI::Common;
38
39 namespace DeviceAPI {
40 namespace Filesystem {
41 ResponseDispatcher& ResponseDispatcher::getInstance()
42 {
43         static ResponseDispatcher dispatcher;
44         return dispatcher;
45 }
46
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)
57 {
58 }
59
60 void ResponseDispatcher::OnAnswerReceived(const EventResolvePtr& event)
61 {
62         LoggerD("ENTER");
63         EventGetNodeDataPtr data =
64         DPL::DynamicPointerCast<EventGetNodeData>(event->getPrivateData());
65
66         FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data->getCallbackManager());
67
68         if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
69                 event->getResult()->setPermissions(data->getPerms());
70                 
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());
74
75                 try {
76                         INodePtr parent = event->getResult()->getParent();
77                         
78                         if (parent)
79                         {
80                                 privDefData->pushParentPermissions(data->getPerms());
81                         }
82                 }
83                 catch (...)
84                 {
85                         LoggerD("no parent");
86                 }
87
88         JSObjectRef object = JSObjectMake(data->getCallbackManager()->getContext(), JSFile::getClassRef(), privData);
89                 data->getCallbackManager()->callOnSuccess(object);
90         }  else {
91                 JSObjectRef jsException;
92                 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
93                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getCallbackManager()->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
94                 } 
95                 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::SecurityException) {
96                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getCallbackManager()->getContext(), JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "PermissionDeniedError");
97                 }
98                 else {
99                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getCallbackManager()->getContext(), JSWebAPIErrorFactory::UNKNOWN_ERROR, "Unknown error");
100                 }
101                 data->getCallbackManager()->callOnError(jsException);
102         }
103 }
104
105
106 void ResponseDispatcher::OnAnswerReceived(const EventListNodesPtr& event)
107 {
108         LoggerD("ENTER");
109         JSFile::ListFilesPrivateDataPtr privData =
110         DPL::DynamicPointerCast<JSFile::ListFilesPrivateData>(event->getPrivateData());
111
112         JSCallbackManagerPtr data = privData->getCallbackManager();
113
114         FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
115
116         if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
117                 Converter converter(data->getContext());
118                 Try {
119                         JSValueRef result = converter.toJSValueRef(event->getResult(), privData->getParentPermissions(), data->getContext(), event.Get());
120                         data->callOnSuccess(result);
121                 }
122                 Catch(WrtDeviceApis::Commons::ConversionException) {
123                         data->callOnError(JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error"));
124                 }
125         } else {
126                 JSObjectRef jsException = NULL;
127                 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
128                 data->callOnError(jsException);
129         }
130 }
131
132 void ResponseDispatcher::OnAnswerReceived(const EventOpenPtr& event)
133 {
134         LoggerD("ENTER");
135         DPL::SharedPtr<JSCallbackManager> data =
136         DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
137
138         FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
139
140         if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
141                 JSFilestream::PrivateObject* privData = new JSFilestream::PrivateObject(data->getContext(), event->getResult());
142                 privData->copyAceCheckAccessFunction(event.Get());
143                 
144         JSObjectRef object = JSObjectMake(data->getContext(), JSFilestream::getClassRef(), privData);
145                 data->callOnSuccess(object);
146         } else {
147                 JSObjectRef jsException;
148
149                 if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
150                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
151                 }
152                 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::SecurityException) {
153                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "Permission Denied Error");
154                 }
155                 else {
156                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
157                 }
158                 data->callOnError(jsException);
159         }
160 }
161
162 void ResponseDispatcher::OnAnswerReceived(const EventCopyPtr& event)
163 {
164         LoggerD("ENTER");
165         DPL::SharedPtr<JSCallbackManager> data =
166         DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
167
168         FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
169
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());
174
175         JSObjectRef object = JSObjectMake(data->getContext(), JSFile::getClassRef(), privData);
176                 data->callOnSuccess(object);
177         } else {
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");
181                 } 
182                 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
183                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
184                 }
185                 else {
186                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
187                 }
188                 data->callOnError(jsException);
189         }
190 }
191
192 void ResponseDispatcher::OnAnswerReceived(const EventMovePtr& event)
193 {
194         LoggerD("ENTER");
195         DPL::SharedPtr<JSCallbackManager> data =
196         DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
197
198         FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
199
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());
204                 
205         JSObjectRef object = JSObjectMake(data->getContext(), JSFile::getClassRef(), privData);
206                 data->callOnSuccess(object);
207         } else {
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");
211                 } 
212                 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
213                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
214                 }
215                 else {
216                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
217                 }
218                 data->callOnError(jsException);
219         }
220 }
221
222 void ResponseDispatcher::OnAnswerReceived(const EventRemovePtr& event)
223 {
224         LoggerD("--| ENTER");
225         DPL::SharedPtr<JSCallbackManager> data =
226         DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
227
228         FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
229
230         if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
231                 data->callOnSuccess();
232         } else {
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");
236                 } 
237                 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
238                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
239                 }
240                 else {
241                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
242                 }
243                 data->callOnError(jsException);
244         }
245 }
246
247 void ResponseDispatcher::OnAnswerReceived(const EventReadTextPtr& event)
248 {
249         LoggerD("--| ENTER");
250         DPL::SharedPtr<JSCallbackManager> data =
251         DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
252
253         FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);    
254
255         if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
256                 Converter converter(data->getContext());
257                 Try {
258                         std::string resultText = event->getResult();
259                         std::string currentEncoding = event->getCharSet();
260                         std::string utf8OutStr = "";
261                         JSValueRef result;
262
263                         if (!strcmp(currentEncoding.c_str(), Encodings::UTF8) || !strcmp(currentEncoding.c_str(), Encodings::ISO88591))
264                         {
265                                 result = converter.toJSValueRef(resultText);
266                                 data->callOnSuccess(result);
267                         }
268                         else 
269                         {
270                                 Utils::toUTF8String(currentEncoding, resultText.c_str(), resultText.length(), utf8OutStr);
271                                 result = converter.toJSValueRef(utf8OutStr);
272                                 data->callOnSuccess(result);
273                         }
274                 }
275                 Catch(WrtDeviceApis::Commons::ConversionException) {
276                         data->callOnError(JSWebAPIErrorFactory::makeErrorObject(
277                         data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error"));
278                 }
279         }  else {
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");
283                 } 
284                 else if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::NotFoundException) {
285                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::NOT_FOUND_ERROR, "NotFoundError");
286                 }
287                 else {
288                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
289                 }
290                 data->callOnError(jsException);
291         }
292 }
293
294 void ResponseDispatcher::OnAnswerReceived(const EventGetStoragePtr& event)
295 {
296         DPL::SharedPtr<JSCallbackManager> data = DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
297
298         FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
299
300         if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
301                 Converter converter(data->getContext());
302                 Try {
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"));
307                 }
308         } else {
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");                      
312                 }
313                 else {
314                         jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
315                 }
316                 data->callOnError(jsException);
317         }
318 }
319
320 void ResponseDispatcher::OnAnswerReceived(const EventListStoragesPtr& event)
321 {
322         DPL::SharedPtr<JSCallbackManager> data = DPL::DynamicPointerCast<JSCallbackManager>(event->getPrivateData());
323
324         FilesystemAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(data);
325
326         if (event->getExceptionCode() == WrtDeviceApis::Commons::ExceptionCodes::None) {
327                 Converter converter(data->getContext());
328                 Try {
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"));
333                 }
334         } else {
335                 JSObjectRef jsException = NULL;
336                 jsException = JSWebAPIErrorFactory::makeErrorObject(data->getContext(), JSWebAPIErrorFactory::IO_ERROR, "IO error");
337                 data->callOnError(jsException);
338         }
339 }
340
341 }
342 }