Init Tizen 2.2.1
[framework/osp/web.git] / src / controls / FWebCtrl_WebManager.cpp
index d62b8c7..137a022 100755 (executable)
  *\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
@@ -88,23 +138,183 @@ _WebManager::Construct(void)
        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
@@ -113,12 +323,12 @@ _WebManager::RemoveWeb(int webAdress)
        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
@@ -137,6 +347,7 @@ _WebManager::AddCallback(int callerAdress, int callbackAdress)
        return E_SUCCESS;\r
 }\r
 \r
+\r
 result\r
 _WebManager::RemoveCallback(int callerAdress, int callbackAdress)\r
 {\r
@@ -148,6 +359,7 @@ _WebManager::RemoveCallback(int callerAdress, int callbackAdress)
        return E_SUCCESS;\r
 }\r
 \r
+\r
 bool\r
 _WebManager::IsValidCallback(int callerAdress, int callbackAdress) const\r
 {\r
@@ -159,6 +371,7 @@ _WebManager::IsValidCallback(int callerAdress, int callbackAdress) const
        return ret;\r
 }\r
 \r
+\r
 void\r
 _WebManager::SetActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
 {\r
@@ -195,6 +408,7 @@ _WebManager::SetActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)
        }\r
 }\r
 \r
+\r
 void\r
 _WebManager::RemoveActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
 {\r
@@ -204,12 +418,14 @@ _WebManager::RemoveActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)
        }\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
@@ -219,4 +435,5 @@ _WebManager::RemoveActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)
        }\r
 }\r
 \r
+\r
 } } }\r