6b363921e802d643586c418beba880287fcb283f
[framework/osp/web.git] / src / controls / FWebCtrl_WebManager.cpp
1 //\r
2 // Open Service Platform\r
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.\r
4 //\r
5 // Licensed under the Apache License, Version 2.0 (the License);\r
6 // you may not use this file except in compliance with the License.\r
7 // You may obtain a copy of the License at\r
8 //\r
9 //     http://www.apache.org/licenses/LICENSE-2.0\r
10 //\r
11 // Unless required by applicable law or agreed to in writing, software\r
12 // distributed under the License is distributed on an "AS IS" BASIS,\r
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 // See the License for the specific language governing permissions and\r
15 // limitations under the License.\r
16 //\r
17 \r
18 /**\r
19  * @file                FWebCtrl_WebManager.cpp\r
20  * @brief               The file contains the definition of _WebManager class.\r
21  *\r
22  * The file contains the definition of _WebManager class.\r
23  */\r
24 #include <pthread.h>\r
25 #include <net_connection.h>\r
26 #include <FAppApp.h>\r
27 #include <FBaseSysLog.h>\r
28 #include <FIoDbEnumerator.h>\r
29 #include <FUiControl.h>\r
30 #include <FIo_DirectoryImpl.h>
31 #include <FIo_DatabaseImpl.h>
32 #include <FIo_FileImpl.h>\r
33 #include <FUiCtrl_FormImpl.h>\r
34 #include <FIo_DirectoryImpl.h>
35 #include <FIo_DatabaseImpl.h>
36 #include <FIo_FileImpl.h>
37 #include "FWebCtrl_EflWebkit.h"\r
38 #include "FWebCtrl_Web.h"\r
39 #include "FWebCtrl_WebImpl.h"\r
40 #include "FWebCtrl_WebManager.h"\r
41 #include "FWebCtrl_WebPopup.h"\r
42 \r
43 using namespace Tizen::Base;\r
44 using namespace Tizen::Base::Collection;\r
45 using namespace Tizen::Io;\r
46 using namespace Tizen::Ui;\r
47 using namespace Tizen::Ui::Controls;\r
48 \r
49 namespace Tizen { namespace Web { namespace Controls\r
50 {\r
51 \r
52 \r
53 _WebManager* _WebManager::__pInstance = null;\r
54 \r
55 \r
56 extern const wchar_t CUSTOM_DB_DIRECTORY_PATH[] = L"data/.webkit/customDatabase/";
57 extern const wchar_t USER_CONFIRM_DB_NAME[] = L"userConfirm.db";
58 extern const wchar_t GEOLOCATION_TABLE_NAME[] = L"geolocationPermission";
59 extern const wchar_t CUSTOM_PROTOCOL_TABLE_NAME[] = L"customProtocol";
60 extern const wchar_t CUSTOM_CONTENT_TABLE_NAME[] = L"customContent";
61 extern const wchar_t CERTIFICATE_TABLE_NAME[] = L"certificate";
62
63
64 static const int CUSTOM_DB_TABLE_COUNT= 4;\r
65 \r
66 \r
67 _WebManager::_WebManager(void)\r
68         : __pWebList(null)\r
69         , __pCallbackList(null)\r
70         , __pActiveWeb(null)\r
71         , __pActivePopup(null)\r
72         , __pProxy(null)\r
73 {\r
74 }\r
75 \r
76 _WebManager::~_WebManager(void)\r
77 {\r
78         free(__pProxy);\r
79 }\r
80 \r
81 \r
82 void\r
83 _WebManager::InitWebManager(void)\r
84 {\r
85         result r = E_SUCCESS;\r
86 \r
87         std::unique_ptr<_WebManager> pInstance(new (std::nothrow) _WebManager());\r
88         SysTryReturnVoidResult(NID_WEB_CTRL, pInstance.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));\r
89 \r
90         r = pInstance->Construct();\r
91         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));\r
92 \r
93         __pInstance = pInstance.release();\r
94         std::atexit(DestroyWebManager);\r
95 }\r
96 \r
97 \r
98 void\r
99 _WebManager::DestroyWebManager(void)\r
100 {\r
101         delete __pInstance;\r
102         __pInstance = null;\r
103 }\r
104 \r
105 \r
106 _WebManager*\r
107 _WebManager::GetInstance(void)\r
108 {\r
109         static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;\r
110         if (__pInstance== null)\r
111         {\r
112                 ClearLastResult();\r
113                 pthread_once(&onceBlock, InitWebManager);\r
114                 result r = GetLastResult();\r
115                 if (IsFailed(r))\r
116                 {\r
117                         onceBlock = PTHREAD_ONCE_INIT;\r
118                 }\r
119         }\r
120 \r
121         return __pInstance;\r
122 }\r
123 \r
124 \r
125 result\r
126 _WebManager::Construct(void)\r
127 {\r
128         result r = E_SUCCESS;\r
129 \r
130         std::unique_ptr<ArrayListT< int> > pWebList(new (std::nothrow) ArrayListT< int >());\r
131         SysTryReturnResult(NID_WEB_CTRL, pWebList.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");\r
132         r = pWebList->Construct();\r
133         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
134 \r
135         std::unique_ptr<MultiHashMapT< int, int > > pCallbackList(new (std::nothrow) MultiHashMapT< int, int >());\r
136         SysTryReturnResult(NID_WEB_CTRL, pCallbackList.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");\r
137         r = pCallbackList->Construct();\r
138         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
139 \r
140         r = InitializeProxyAddress();\r
141         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
142 \r
143         r = CreateResourceDirectory();\r
144         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
145 \r
146         r = InitializeCustomDb();\r
147         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
148 \r
149         __pWebList = std::move(pWebList);\r
150         __pCallbackList = std::move(pCallbackList);\r
151 \r
152         return E_SUCCESS;\r
153 }\r
154 \r
155 \r
156 result\r
157 _WebManager::InitializeProxyAddress(void)\r
158 {\r
159         int ret = -1;\r
160         connection_h handle = null;\r
161         char* pProxy = null;\r
162 \r
163         ret = connection_create(&handle);
164         SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to create connection.");
165 \r
166         connection_address_family_e family = CONNECTION_ADDRESS_FAMILY_IPV4;
167
168         ret = connection_get_proxy(handle, family, &pProxy);
169         SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to get proxy address.");\r
170 \r
171         ret = connection_destroy(handle);
172         SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to destroy connection.");\r
173 \r
174         __pProxy = pProxy;\r
175 \r
176         return E_SUCCESS;\r
177 }\r
178 \r
179 \r
180 result
181 _WebManager::CreateResourceDirectory(void) const\r
182 {
183         String html5FeaturesPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH);
184
185         if (!_FileImpl::IsFileExist(html5FeaturesPath))
186         {
187                 result r = E_SUCCESS;
188
189                 r = _DirectoryImpl::Create(html5FeaturesPath, true);
190                 SysTryReturnResult(NID_WEB_CTRL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred. create html5 features directory.");
191         }
192
193         return E_SUCCESS;
194 }
195
196
197 result
198 _WebManager::InitializeCustomDb(void) const\r
199 {
200         result r = E_SUCCESS;
201
202         _DatabaseImpl db;
203         String path(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
204         String geolocationTable(GEOLOCATION_TABLE_NAME);
205         String protocolTable(CUSTOM_PROTOCOL_TABLE_NAME);
206         String contentTable(CUSTOM_CONTENT_TABLE_NAME);
207         String certificateTable(CERTIFICATE_TABLE_NAME);
208
209         r = db.Construct(path, "a+", null);
210         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
211
212         std::unique_ptr<DbEnumerator>   pEnum(db.QueryN(L"Select count(name) from sqlite_master Where type='table' And name in ('" + geolocationTable + L"', '" + protocolTable + L"', '" + contentTable + L"', '" + certificateTable + L"')"));
213         if (pEnum.get())
214         {
215                 int count = 0;
216
217                 r = pEnum->MoveNext();
218                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
219
220                 r = pEnum->GetIntAt(0, count);
221                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
222
223                 if (count == CUSTOM_DB_TABLE_COUNT)
224                 {
225                         return E_SUCCESS;
226                 }
227         }
228
229         pEnum.reset();
230         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + geolocationTable + L"'"));
231         if (!pEnum.get())
232         {
233                 r = db.ExecuteSql(
234                         L"CREATE TABLE IF NOT EXISTS " + geolocationTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, origin TEXT, permission INTEGER)",
235                         true);
236                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
237         }
238
239         pEnum.reset();
240         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + protocolTable + L"'"));
241         if (!pEnum.get())
242         {
243                 r = db.ExecuteSql(
244                         L"CREATE TABLE IF NOT EXISTS " + protocolTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",
245                         true);
246                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
247         }
248
249         pEnum.reset();
250         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + contentTable + L"'"));
251         if (!pEnum.get())
252         {
253                 r = db.ExecuteSql(
254                         L"CREATE TABLE IF NOT EXISTS " + contentTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",
255                         true);
256                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
257         }
258
259         pEnum.reset();
260         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + certificateTable + L"'"));
261         if (!pEnum.get())
262         {
263                 r = db.ExecuteSql(
264                         L"CREATE TABLE IF NOT EXISTS " + certificateTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, pem TEXT, allow INTEGER)",
265                         true);
266                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
267         }
268
269         return E_SUCCESS;
270 }
271 \r
272 \r
273 result\r
274 _WebManager::AddWeb(int webAdress)\r
275 {\r
276         result r = E_SUCCESS;\r
277 \r
278         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(webAdress);\r
279         _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));\r
280 \r
281         r = pWebCore->GetEflWebkit()->SetProxyAddress(__pProxy);\r
282         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
283 \r
284         r = __pWebList->Add(webAdress);\r
285         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
286 \r
287         return E_SUCCESS;\r
288 }\r
289 \r
290 \r
291 result\r
292 _WebManager::RemoveWeb(int webAdress)\r
293 {\r
294         result r = E_SUCCESS;\r
295 \r
296         r = __pWebList->Remove(webAdress);\r
297         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
298 \r
299         __pCallbackList->Remove(webAdress);\r
300 \r
301         return E_SUCCESS;\r
302 }\r
303 \r
304 \r
305 bool\r
306 _WebManager::IsValidWeb(int webAdress) const\r
307 {\r
308         return __pWebList->Contains(webAdress);\r
309 }\r
310 \r
311 \r
312 result\r
313 _WebManager::AddCallback(int callerAdress, int callbackAdress)\r
314 {\r
315         result r = E_SUCCESS;\r
316 \r
317         r = __pCallbackList->Add(callerAdress, callbackAdress);\r
318         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
319 \r
320         return E_SUCCESS;\r
321 }\r
322 \r
323 \r
324 result\r
325 _WebManager::RemoveCallback(int callerAdress, int callbackAdress)\r
326 {\r
327         result r = E_SUCCESS;\r
328 \r
329         r = __pCallbackList->Remove(callerAdress, callbackAdress);\r
330         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
331 \r
332         return E_SUCCESS;\r
333 }\r
334 \r
335 \r
336 bool\r
337 _WebManager::IsValidCallback(int callerAdress, int callbackAdress) const\r
338 {\r
339         bool ret = true;\r
340 \r
341         result r = __pCallbackList->Contains(callerAdress, callbackAdress, ret);\r
342         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, true, r, "[%s] Propagating.", GetErrorMessage(r));\r
343 \r
344         return ret;\r
345 }\r
346 \r
347 \r
348 void\r
349 _WebManager::SetActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
350 {\r
351         if (__pActiveWeb == null)\r
352         {\r
353                 __pActiveWeb = pWebAddress;\r
354         }\r
355         else\r
356         {\r
357                 if (__pActiveWeb->IsVisible() == true)\r
358                 {\r
359                         return;\r
360                 }\r
361                 __pActiveWeb = pWebAddress;\r
362         }\r
363 \r
364         if (__pActivePopup != null)\r
365         {\r
366                 __pActivePopup->SetShowState(false);\r
367 \r
368                 _FormImpl* pFormImpl = __pActiveWeb->GetParentFormImpl(__pActiveWeb);\r
369 \r
370                 if (pFormImpl != null)\r
371                 {\r
372                         __pActivePopup->SetOwner(&pFormImpl->GetPublic());\r
373                 }\r
374                 else\r
375                 {\r
376                         __pActivePopup->SetOwner(&__pActiveWeb->GetPublic());\r
377                 }\r
378 \r
379                 __pActivePopup->SetShowState(true);\r
380                 __pActivePopup->Show();\r
381         }\r
382 }\r
383 \r
384 \r
385 void\r
386 _WebManager::RemoveActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
387 {\r
388         if (__pActiveWeb == pWebAddress)\r
389         {\r
390                 __pActiveWeb = null;\r
391         }\r
392 }\r
393 \r
394 \r
395 void\r
396 _WebManager::SetActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)\r
397 {\r
398         __pActivePopup = pPopupAddress;\r
399 }\r
400 \r
401 \r
402 void\r
403 _WebManager::RemoveActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)\r
404 {\r
405         if (__pActivePopup == pPopupAddress)\r
406         {\r
407                 __pActivePopup = null;\r
408         }\r
409 }\r
410 \r
411 \r
412 } } }\r