2 // Open Service Platform
\r
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
\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
9 // http://www.apache.org/licenses/LICENSE-2.0
\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
19 * @file FWebCtrl_WebManager.cpp
\r
20 * @brief The file contains the definition of _WebManager class.
\r
22 * The file contains the definition of _WebManager class.
\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
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
49 namespace Tizen { namespace Web { namespace Controls
\r
53 _WebManager* _WebManager::__pInstance = null;
\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";
64 static const int CUSTOM_DB_TABLE_COUNT= 4;
\r
67 _WebManager::_WebManager(void)
\r
69 , __pCallbackList(null)
\r
70 , __pActiveWeb(null)
\r
71 , __pActivePopup(null)
\r
76 _WebManager::~_WebManager(void)
\r
83 _WebManager::InitWebManager(void)
\r
85 result r = E_SUCCESS;
\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
90 r = pInstance->Construct();
\r
91 SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
\r
93 __pInstance = pInstance.release();
\r
94 std::atexit(DestroyWebManager);
\r
99 _WebManager::DestroyWebManager(void)
\r
101 delete __pInstance;
\r
102 __pInstance = null;
\r
107 _WebManager::GetInstance(void)
\r
109 static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
\r
110 if (__pInstance== null)
\r
113 pthread_once(&onceBlock, InitWebManager);
\r
114 result r = GetLastResult();
\r
117 onceBlock = PTHREAD_ONCE_INIT;
\r
121 return __pInstance;
\r
126 _WebManager::Construct(void)
\r
128 result r = E_SUCCESS;
\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
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
140 r = InitializeProxyAddress();
\r
141 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
143 r = CreateResourceDirectory();
\r
144 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
146 r = InitializeCustomDb();
\r
147 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
149 __pWebList = std::move(pWebList);
\r
150 __pCallbackList = std::move(pCallbackList);
\r
157 _WebManager::InitializeProxyAddress(void)
\r
160 connection_h handle = null;
\r
161 char* pProxy = null;
\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.");
166 connection_address_family_e family = CONNECTION_ADDRESS_FAMILY_IPV4;
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
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
181 _WebManager::CreateResourceDirectory(void) const
\r
183 String html5FeaturesPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH);
185 if (!_FileImpl::IsFileExist(html5FeaturesPath))
187 result r = E_SUCCESS;
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.");
198 _WebManager::InitializeCustomDb(void) const
\r
200 result r = E_SUCCESS;
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);
209 r = db.Construct(path, "a+", null);
210 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
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"')"));
217 r = pEnum->MoveNext();
218 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
220 r = pEnum->GetIntAt(0, count);
221 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
223 if (count == CUSTOM_DB_TABLE_COUNT)
230 pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + geolocationTable + L"'"));
234 L"CREATE TABLE IF NOT EXISTS " + geolocationTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, origin TEXT, permission INTEGER)",
236 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
240 pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + protocolTable + L"'"));
244 L"CREATE TABLE IF NOT EXISTS " + protocolTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",
246 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
250 pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + contentTable + L"'"));
254 L"CREATE TABLE IF NOT EXISTS " + contentTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",
256 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
260 pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + certificateTable + L"'"));
264 L"CREATE TABLE IF NOT EXISTS " + certificateTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, pem TEXT, allow INTEGER)",
266 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
274 _WebManager::AddWeb(int webAdress)
\r
276 result r = E_SUCCESS;
\r
278 _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(webAdress);
\r
279 _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));
\r
281 r = pWebCore->GetEflWebkit()->SetProxyAddress(__pProxy);
\r
282 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
284 r = __pWebList->Add(webAdress);
\r
285 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
292 _WebManager::RemoveWeb(int webAdress)
\r
294 result r = E_SUCCESS;
\r
296 r = __pWebList->Remove(webAdress);
\r
297 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
299 __pCallbackList->Remove(webAdress);
\r
306 _WebManager::IsValidWeb(int webAdress) const
\r
308 return __pWebList->Contains(webAdress);
\r
313 _WebManager::AddCallback(int callerAdress, int callbackAdress)
\r
315 result r = E_SUCCESS;
\r
317 r = __pCallbackList->Add(callerAdress, callbackAdress);
\r
318 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
325 _WebManager::RemoveCallback(int callerAdress, int callbackAdress)
\r
327 result r = E_SUCCESS;
\r
329 r = __pCallbackList->Remove(callerAdress, callbackAdress);
\r
330 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
337 _WebManager::IsValidCallback(int callerAdress, int callbackAdress) const
\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
349 _WebManager::SetActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)
\r
351 if (__pActiveWeb == null)
\r
353 __pActiveWeb = pWebAddress;
\r
357 if (__pActiveWeb->IsVisible() == true)
\r
361 __pActiveWeb = pWebAddress;
\r
364 if (__pActivePopup != null)
\r
366 __pActivePopup->SetShowState(false);
\r
368 _FormImpl* pFormImpl = __pActiveWeb->GetParentFormImpl(__pActiveWeb);
\r
370 if (pFormImpl != null)
\r
372 __pActivePopup->SetOwner(&pFormImpl->GetPublic());
\r
376 __pActivePopup->SetOwner(&__pActiveWeb->GetPublic());
\r
379 __pActivePopup->SetShowState(true);
\r
380 __pActivePopup->Show();
\r
386 _WebManager::RemoveActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)
\r
388 if (__pActiveWeb == pWebAddress)
\r
390 __pActiveWeb = null;
\r
396 _WebManager::SetActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)
\r
398 __pActivePopup = pPopupAddress;
\r
403 _WebManager::RemoveActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)
\r
405 if (__pActivePopup == pPopupAddress)
\r
407 __pActivePopup = null;
\r