Tizen 2.2.1
[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         ClearCertificateDb();\r
80 }\r
81 \r
82 \r
83 void\r
84 _WebManager::InitWebManager(void)\r
85 {\r
86         result r = E_SUCCESS;\r
87 \r
88         std::unique_ptr<_WebManager> pInstance(new (std::nothrow) _WebManager());\r
89         SysTryReturnVoidResult(NID_WEB_CTRL, pInstance.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));\r
90 \r
91         r = pInstance->Construct();\r
92         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));\r
93 \r
94         __pInstance = pInstance.release();\r
95         std::atexit(DestroyWebManager);\r
96 }\r
97 \r
98 \r
99 void\r
100 _WebManager::DestroyWebManager(void)\r
101 {\r
102         delete __pInstance;\r
103         __pInstance = null;\r
104 }\r
105 \r
106 \r
107 _WebManager*\r
108 _WebManager::GetInstance(void)\r
109 {\r
110         static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;\r
111         if (__pInstance== null)\r
112         {\r
113                 ClearLastResult();\r
114                 pthread_once(&onceBlock, InitWebManager);\r
115                 result r = GetLastResult();\r
116                 if (IsFailed(r))\r
117                 {\r
118                         onceBlock = PTHREAD_ONCE_INIT;\r
119                 }\r
120         }\r
121 \r
122         return __pInstance;\r
123 }\r
124 \r
125 \r
126 result\r
127 _WebManager::Construct(void)\r
128 {\r
129         result r = E_SUCCESS;\r
130 \r
131         std::unique_ptr<ArrayListT< int> > pWebList(new (std::nothrow) ArrayListT< int >());\r
132         SysTryReturnResult(NID_WEB_CTRL, pWebList.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");\r
133         r = pWebList->Construct();\r
134         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
135 \r
136         std::unique_ptr<MultiHashMapT< int, int > > pCallbackList(new (std::nothrow) MultiHashMapT< int, int >());\r
137         SysTryReturnResult(NID_WEB_CTRL, pCallbackList.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");\r
138         r = pCallbackList->Construct();\r
139         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
140 \r
141         r = InitializeProxyAddress();\r
142         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
143 \r
144         r = CreateResourceDirectory();\r
145         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
146 \r
147         r = InitializeCustomDb();\r
148         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
149 \r
150         __pWebList = std::move(pWebList);\r
151         __pCallbackList = std::move(pCallbackList);\r
152 \r
153         return E_SUCCESS;\r
154 }\r
155 \r
156 \r
157 void
158 _WebManager::ClearCertificateDb(void)\r
159 {
160         result r = E_SUCCESS;
161
162         String certificatePath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
163         String table(CERTIFICATE_TABLE_NAME);
164         _DatabaseImpl db;
165
166         r = db.Construct(certificatePath, "r+", null);
167         SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
168
169         db.BeginTransaction();
170
171         r = db.ExecuteSql(L"Delete From " + table, true);
172         SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
173
174         db.CommitTransaction();
175
176         return;
177
178 CATCH:
179         db.RollbackTransaction();
180 }\r
181 \r
182 \r
183 result\r
184 _WebManager::InitializeProxyAddress(void)\r
185 {\r
186         int ret = -1;\r
187         connection_h handle = null;\r
188         char* pProxy = null;\r
189 \r
190         ret = connection_create(&handle);
191         SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to create connection.");
192 \r
193         connection_address_family_e family = CONNECTION_ADDRESS_FAMILY_IPV4;
194
195         ret = connection_get_proxy(handle, family, &pProxy);
196         SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to get proxy address.");\r
197 \r
198         ret = connection_destroy(handle);
199         SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to destroy connection.");\r
200 \r
201         __pProxy = pProxy;\r
202 \r
203         return E_SUCCESS;\r
204 }\r
205 \r
206 \r
207 result
208 _WebManager::CreateResourceDirectory(void) const\r
209 {
210         String html5FeaturesPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH);
211
212         if (!_FileImpl::IsFileExist(html5FeaturesPath))
213         {
214                 result r = E_SUCCESS;
215
216                 r = _DirectoryImpl::Create(html5FeaturesPath, true);
217                 SysTryReturnResult(NID_WEB_CTRL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred. create html5 features directory.");
218         }
219
220         return E_SUCCESS;
221 }
222
223
224 result
225 _WebManager::InitializeCustomDb(void) const\r
226 {
227         result r = E_SUCCESS;
228
229         _DatabaseImpl db;
230         String path(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
231         String geolocationTable(GEOLOCATION_TABLE_NAME);
232         String protocolTable(CUSTOM_PROTOCOL_TABLE_NAME);
233         String contentTable(CUSTOM_CONTENT_TABLE_NAME);
234         String certificateTable(CERTIFICATE_TABLE_NAME);
235
236         r = db.Construct(path, "a+", null);
237         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
238
239         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"')"));
240         if (pEnum.get())
241         {
242                 int count = 0;
243
244                 r = pEnum->MoveNext();
245                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
246
247                 r = pEnum->GetIntAt(0, count);
248                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
249
250                 if (count == CUSTOM_DB_TABLE_COUNT)
251                 {
252                         return E_SUCCESS;
253                 }
254         }
255
256         pEnum.reset();
257         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + geolocationTable + L"'"));
258         if (!pEnum.get())
259         {
260                 r = db.ExecuteSql(
261                         L"CREATE TABLE IF NOT EXISTS " + geolocationTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, origin TEXT, permission INTEGER)",
262                         true);
263                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
264         }
265
266         pEnum.reset();
267         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + protocolTable + L"'"));
268         if (!pEnum.get())
269         {
270                 r = db.ExecuteSql(
271                         L"CREATE TABLE IF NOT EXISTS " + protocolTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",
272                         true);
273                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
274         }
275
276         pEnum.reset();
277         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + contentTable + L"'"));
278         if (!pEnum.get())
279         {
280                 r = db.ExecuteSql(
281                         L"CREATE TABLE IF NOT EXISTS " + contentTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",
282                         true);
283                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
284         }
285
286         pEnum.reset();
287         pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + certificateTable + L"'"));
288         if (!pEnum.get())
289         {
290                 r = db.ExecuteSql(
291                         L"CREATE TABLE IF NOT EXISTS " + certificateTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, pem TEXT, allow INTEGER)",
292                         true);
293                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
294         }
295
296         return E_SUCCESS;
297 }
298 \r
299 \r
300 result\r
301 _WebManager::AddWeb(int webAdress)\r
302 {\r
303         result r = E_SUCCESS;\r
304 \r
305         _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(webAdress);\r
306         _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));\r
307 \r
308         r = pWebCore->GetEflWebkit()->SetProxyAddress(__pProxy);\r
309         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
310 \r
311         r = __pWebList->Add(webAdress);\r
312         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
313 \r
314         return E_SUCCESS;\r
315 }\r
316 \r
317 \r
318 result\r
319 _WebManager::RemoveWeb(int webAdress)\r
320 {\r
321         result r = E_SUCCESS;\r
322 \r
323         r = __pWebList->Remove(webAdress);\r
324         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
325 \r
326         __pCallbackList->Remove(webAdress);\r
327 \r
328         return E_SUCCESS;\r
329 }\r
330 \r
331 \r
332 bool\r
333 _WebManager::IsValidWeb(int webAdress) const\r
334 {\r
335         return __pWebList->Contains(webAdress);\r
336 }\r
337 \r
338 \r
339 result\r
340 _WebManager::AddCallback(int callerAdress, int callbackAdress)\r
341 {\r
342         result r = E_SUCCESS;\r
343 \r
344         r = __pCallbackList->Add(callerAdress, callbackAdress);\r
345         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
346 \r
347         return E_SUCCESS;\r
348 }\r
349 \r
350 \r
351 result\r
352 _WebManager::RemoveCallback(int callerAdress, int callbackAdress)\r
353 {\r
354         result r = E_SUCCESS;\r
355 \r
356         r = __pCallbackList->Remove(callerAdress, callbackAdress);\r
357         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
358 \r
359         return E_SUCCESS;\r
360 }\r
361 \r
362 \r
363 bool\r
364 _WebManager::IsValidCallback(int callerAdress, int callbackAdress) const\r
365 {\r
366         bool ret = true;\r
367 \r
368         result r = __pCallbackList->Contains(callerAdress, callbackAdress, ret);\r
369         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, true, r, "[%s] Propagating.", GetErrorMessage(r));\r
370 \r
371         return ret;\r
372 }\r
373 \r
374 \r
375 void\r
376 _WebManager::SetActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
377 {\r
378         if (__pActiveWeb == null)\r
379         {\r
380                 __pActiveWeb = pWebAddress;\r
381         }\r
382         else\r
383         {\r
384                 if (__pActiveWeb->IsVisible() == true)\r
385                 {\r
386                         return;\r
387                 }\r
388                 __pActiveWeb = pWebAddress;\r
389         }\r
390 \r
391         if (__pActivePopup != null)\r
392         {\r
393                 __pActivePopup->SetShowState(false);\r
394 \r
395                 _FormImpl* pFormImpl = __pActiveWeb->GetParentFormImpl(__pActiveWeb);\r
396 \r
397                 if (pFormImpl != null)\r
398                 {\r
399                         __pActivePopup->SetOwner(&pFormImpl->GetPublic());\r
400                 }\r
401                 else\r
402                 {\r
403                         __pActivePopup->SetOwner(&__pActiveWeb->GetPublic());\r
404                 }\r
405 \r
406                 __pActivePopup->SetShowState(true);\r
407                 __pActivePopup->Show();\r
408         }\r
409 }\r
410 \r
411 \r
412 void\r
413 _WebManager::RemoveActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
414 {\r
415         if (__pActiveWeb == pWebAddress)\r
416         {\r
417                 __pActiveWeb = null;\r
418         }\r
419 }\r
420 \r
421 \r
422 void\r
423 _WebManager::SetActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)\r
424 {\r
425         __pActivePopup = pPopupAddress;\r
426 }\r
427 \r
428 \r
429 void\r
430 _WebManager::RemoveActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)\r
431 {\r
432         if (__pActivePopup == pPopupAddress)\r
433         {\r
434                 __pActivePopup = null;\r
435         }\r
436 }\r
437 \r
438 \r
439 } } }\r