*\r
* The file contains the definition of _WebManager class.\r
*/\r
-\r
+#include <pthread.h>\r
+#include <net_connection.h>\r
+#include <FAppApp.h>\r
#include <FBaseSysLog.h>\r
+#include <FIoDbEnumerator.h>\r
#include <FUiControl.h>\r
+#include <FIo_DirectoryImpl.h>
+#include <FIo_DatabaseImpl.h>
+#include <FIo_FileImpl.h>\r
#include <FUiCtrl_FormImpl.h>\r
+#include <FIo_DirectoryImpl.h>
+#include <FIo_DatabaseImpl.h>
+#include <FIo_FileImpl.h>
+#include "FWebCtrl_EflWebkit.h"\r
+#include "FWebCtrl_Web.h"\r
#include "FWebCtrl_WebImpl.h"\r
#include "FWebCtrl_WebManager.h"\r
#include "FWebCtrl_WebPopup.h"\r
\r
using namespace Tizen::Base;\r
using namespace Tizen::Base::Collection;\r
+using namespace Tizen::Io;\r
using namespace Tizen::Ui;\r
using namespace Tizen::Ui::Controls;\r
\r
namespace Tizen { namespace Web { namespace Controls\r
{\r
\r
+\r
+_WebManager* _WebManager::__pInstance = null;\r
+\r
+\r
+extern const wchar_t CUSTOM_DB_DIRECTORY_PATH[] = L"data/.webkit/customDatabase/";
+extern const wchar_t USER_CONFIRM_DB_NAME[] = L"userConfirm.db";
+extern const wchar_t GEOLOCATION_TABLE_NAME[] = L"geolocationPermission";
+extern const wchar_t CUSTOM_PROTOCOL_TABLE_NAME[] = L"customProtocol";
+extern const wchar_t CUSTOM_CONTENT_TABLE_NAME[] = L"customContent";
+extern const wchar_t CERTIFICATE_TABLE_NAME[] = L"certificate";
+
+
+static const int CUSTOM_DB_TABLE_COUNT= 4;\r
+\r
+\r
_WebManager::_WebManager(void)\r
: __pWebList(null)\r
, __pCallbackList(null)\r
, __pActiveWeb(null)\r
, __pActivePopup(null)\r
+ , __pProxy(null)\r
{\r
}\r
\r
_WebManager::~_WebManager(void)\r
{\r
+ free(__pProxy);\r
+ ClearCertificateDb();\r
}\r
\r
-_WebManager*\r
-_WebManager::GetInstance(void)\r
+\r
+void\r
+_WebManager::InitWebManager(void)\r
{\r
result r = E_SUCCESS;\r
- static _WebManager* pWebMgr = null;\r
\r
- if (pWebMgr == null)\r
- {\r
- pWebMgr = new (std::nothrow) _WebManager();\r
- SysTryReturn(NID_WEB_CTRL, pWebMgr != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] _WebManager allocation failed.");\r
+ std::unique_ptr<_WebManager> pInstance(new (std::nothrow) _WebManager());\r
+ SysTryReturnVoidResult(NID_WEB_CTRL, pInstance.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));\r
\r
- r = pWebMgr->Construct();\r
- SysTryCatch(NID_WEB_CTRL, !IsFailed(r), , r, "[%s] _WebManager construction failed.", GetErrorMessage(r));\r
- }\r
+ r = pInstance->Construct();\r
+ SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+ __pInstance = pInstance.release();\r
+ std::atexit(DestroyWebManager);\r
+}\r
+\r
+\r
+void\r
+_WebManager::DestroyWebManager(void)\r
+{\r
+ delete __pInstance;\r
+ __pInstance = null;\r
+}\r
\r
- return pWebMgr;\r
\r
-CATCH:\r
- delete pWebMgr;\r
- pWebMgr = null;\r
+_WebManager*\r
+_WebManager::GetInstance(void)\r
+{\r
+ static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;\r
+ if (__pInstance== null)\r
+ {\r
+ ClearLastResult();\r
+ pthread_once(&onceBlock, InitWebManager);\r
+ result r = GetLastResult();\r
+ if (IsFailed(r))\r
+ {\r
+ onceBlock = PTHREAD_ONCE_INIT;\r
+ }\r
+ }\r
\r
- return null;\r
+ return __pInstance;\r
}\r
\r
+\r
result\r
_WebManager::Construct(void)\r
{\r
r = pCallbackList->Construct();\r
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
\r
+ r = InitializeProxyAddress();\r
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+ r = CreateResourceDirectory();\r
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+ r = InitializeCustomDb();\r
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
__pWebList = std::move(pWebList);\r
__pCallbackList = std::move(pCallbackList);\r
\r
return E_SUCCESS;\r
}\r
\r
+\r
+void
+_WebManager::ClearCertificateDb(void)\r
+{
+ result r = E_SUCCESS;
+
+ String certificatePath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
+ String table(CERTIFICATE_TABLE_NAME);
+ _DatabaseImpl db;
+
+ r = db.Construct(certificatePath, "r+", null);
+ SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ db.BeginTransaction();
+
+ r = db.ExecuteSql(L"Delete From " + table, true);
+ SysTryCatch(NID_WEB_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
+
+ db.CommitTransaction();
+
+ return;
+
+CATCH:
+ db.RollbackTransaction();
+}\r
+\r
+\r
+result\r
+_WebManager::InitializeProxyAddress(void)\r
+{\r
+ int ret = -1;\r
+ connection_h handle = null;\r
+ char* pProxy = null;\r
+\r
+ ret = connection_create(&handle);
+ SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to create connection.");
+\r
+ connection_address_family_e family = CONNECTION_ADDRESS_FAMILY_IPV4;
+
+ ret = connection_get_proxy(handle, family, &pProxy);
+ SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to get proxy address.");\r
+\r
+ ret = connection_destroy(handle);
+ SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to destroy connection.");\r
+\r
+ __pProxy = pProxy;\r
+\r
+ return E_SUCCESS;\r
+}\r
+\r
+\r
+result
+_WebManager::CreateResourceDirectory(void) const\r
+{
+ String html5FeaturesPath(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH);
+
+ if (!_FileImpl::IsFileExist(html5FeaturesPath))
+ {
+ result r = E_SUCCESS;
+
+ r = _DirectoryImpl::Create(html5FeaturesPath, true);
+ SysTryReturnResult(NID_WEB_CTRL, r == E_SUCCESS, E_SYSTEM, "A system error has been occurred. create html5 features directory.");
+ }
+
+ return E_SUCCESS;
+}
+
+
+result
+_WebManager::InitializeCustomDb(void) const\r
+{
+ result r = E_SUCCESS;
+
+ _DatabaseImpl db;
+ String path(Tizen::App::App::GetInstance()->GetAppRootPath() + CUSTOM_DB_DIRECTORY_PATH + USER_CONFIRM_DB_NAME);
+ String geolocationTable(GEOLOCATION_TABLE_NAME);
+ String protocolTable(CUSTOM_PROTOCOL_TABLE_NAME);
+ String contentTable(CUSTOM_CONTENT_TABLE_NAME);
+ String certificateTable(CERTIFICATE_TABLE_NAME);
+
+ r = db.Construct(path, "a+", null);
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ 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"')"));
+ if (pEnum.get())
+ {
+ int count = 0;
+
+ r = pEnum->MoveNext();
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ r = pEnum->GetIntAt(0, count);
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] Propagating.", GetErrorMessage(r));
+
+ if (count == CUSTOM_DB_TABLE_COUNT)
+ {
+ return E_SUCCESS;
+ }
+ }
+
+ pEnum.reset();
+ pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + geolocationTable + L"'"));
+ if (!pEnum.get())
+ {
+ r = db.ExecuteSql(
+ L"CREATE TABLE IF NOT EXISTS " + geolocationTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, origin TEXT, permission INTEGER)",
+ true);
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+ }
+
+ pEnum.reset();
+ pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + protocolTable + L"'"));
+ if (!pEnum.get())
+ {
+ r = db.ExecuteSql(
+ L"CREATE TABLE IF NOT EXISTS " + protocolTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",
+ true);
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+ }
+
+ pEnum.reset();
+ pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + contentTable + L"'"));
+ if (!pEnum.get())
+ {
+ r = db.ExecuteSql(
+ L"CREATE TABLE IF NOT EXISTS " + contentTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, baseUrl TEXT, url TEXT, mime TEXT, allow INTEGER)",
+ true);
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+ }
+
+ pEnum.reset();
+ pEnum = std::unique_ptr<DbEnumerator>(db.QueryN(L"Select name from sqlite_master Where type='table' And name = '" + certificateTable + L"'"));
+ if (!pEnum.get())
+ {
+ r = db.ExecuteSql(
+ L"CREATE TABLE IF NOT EXISTS " + certificateTable + L"(id INTEGER PRIMARY KEY AUTOINCREMENT, pem TEXT, allow INTEGER)",
+ true);
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
+ }
+
+ return E_SUCCESS;
+}
+\r
+\r
result\r
_WebManager::AddWeb(int webAdress)\r
{\r
result r = E_SUCCESS;\r
\r
+ _WebImpl* pImpl = reinterpret_cast< _WebImpl* >(webAdress);\r
+ _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));\r
+\r
+ r = pWebCore->GetEflWebkit()->SetProxyAddress(__pProxy);\r
+ SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
r = __pWebList->Add(webAdress);\r
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
\r
return E_SUCCESS;\r
}\r
\r
+\r
result\r
_WebManager::RemoveWeb(int webAdress)\r
{\r
r = __pWebList->Remove(webAdress);\r
SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
\r
- r = __pCallbackList->Remove(webAdress);\r
- SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+ __pCallbackList->Remove(webAdress);\r
\r
return E_SUCCESS;\r
}\r
\r
+\r
bool\r
_WebManager::IsValidWeb(int webAdress) const\r
{\r
return E_SUCCESS;\r
}\r
\r
+\r
result\r
_WebManager::RemoveCallback(int callerAdress, int callbackAdress)\r
{\r
return E_SUCCESS;\r
}\r
\r
+\r
bool\r
_WebManager::IsValidCallback(int callerAdress, int callbackAdress) const\r
{\r
return ret;\r
}\r
\r
+\r
void\r
_WebManager::SetActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
{\r
}\r
}\r
\r
+\r
void\r
_WebManager::RemoveActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
{\r
}\r
}\r
\r
+\r
void\r
_WebManager::SetActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)\r
{\r
__pActivePopup = pPopupAddress;\r
}\r
\r
+\r
void\r
_WebManager::RemoveActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)\r
{\r
}\r
}\r
\r
+\r
} } }\r