add AppControl internal functions
authorYoung Ik Cho <youngik.cho@samsung.com>
Wed, 10 Apr 2013 23:06:35 +0000 (08:06 +0900)
committerYoung Ik Cho <youngik.cho@samsung.com>
Wed, 10 Apr 2013 23:06:35 +0000 (08:06 +0900)
Change-Id: I4eb75d3096db1c12fc0b5c98a7196b415db672fb
Signed-off-by: Young Ik Cho <youngik.cho@samsung.com>
src/app/FApp_AppControlImpl.cpp
src/app/FApp_AppControlManager.cpp
src/app/FApp_AppControlRegistry.cpp
src/app/FApp_AppControlRegistry.h
src/app/inc/FApp_AppControlManager.h

index eb6139a..080a101 100755 (executable)
@@ -416,7 +416,7 @@ _AppControlImpl::AppControlCbLegacy(void* data, _AppArg* pArg, _AppArg* pResArg,
 
        if (prop & _APPCONTROL_PROPERTY_ALIAS)
        {
-               _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
+               const _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
                pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(provider, oId);
                if (pEntry)
                {
@@ -481,7 +481,7 @@ _AppControlImpl::AppControlCb(void* data, _AppArg* pArg, _AppArg* pResArg, servi
 
        if (prop & _APPCONTROL_PROPERTY_ALIAS)
        {
-               _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
+               const _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
                pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(provider, oId);
                if (pEntry)
                {
index 09b5d33..efeb4b0 100644 (file)
@@ -224,7 +224,7 @@ _AppControlManager::OnAppControlEventReceivedN(int reqId, int res, const IMap* p
 
                if (pInfo->property & _APPCONTROL_PROPERTY_ALIAS)
                {
-                       _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
+                       const _AppControlRegistry::_AppControlAliasEntry* pEntry = null;
                        pEntry = _AppControlRegistry::GetInstance()->GetReverseAppControlAliasEntry(aId, oId);
                        if (pEntry)
                        {
@@ -385,6 +385,8 @@ _AppControlManager::LaunchPkg(_AppMessageImpl& msg, const char* pkg_name, const
 
        return r;
 }
+
+
 int
 _AppControlManager::Launch(_AppMessageImpl& msg, const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data)
 {
@@ -438,6 +440,33 @@ _AppControlManager::Launch(_AppMessageImpl& msg, const char* pkg_name, const cha
 
 
 result
+_AppControlManager::LaunchPkg(_AppMessageImpl& msg, const String& package, const String& opId, const String* pUri, const String* pMime, AppSvcResFn pCb, void* data)
+{
+       std::unique_ptr<char[]> pPackage(_StringConverter::CopyToCharArrayN(package));
+       std::unique_ptr<char[]> pOperation(_StringConverter::CopyToCharArrayN(opId));
+
+       const char* pUriData = null;
+       if (pUri)
+       {
+               pUriData =  _StringConverter::CopyToCharArrayN(*pUri);
+       }
+
+       const char* pMimeData = null;
+       if (pMime)
+       {
+               pMimeData = _StringConverter::CopyToCharArrayN(*pMime);
+       }
+
+       result r = LaunchPkg(msg, pPackage.get(), pOperation.get(), pMimeData, pUriData, pCb, data);
+
+       delete [] pUriData;
+       delete [] pMimeData;
+
+       return r;
+}
+
+
+result
 _AppControlManager::LaunchPkg(const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data)
 {
        _AppMessageImpl msg;
@@ -794,4 +823,11 @@ _AppControlManager::IsAllowedAppControl(const wchar_t aTable[][2][64], int count
        return false;
 }
 
+
+AppId
+_AppControlManager::GetAliasAppId(const AppId& appId)
+{
+       return _AppControlRegistry::GetInstance()->GetAliasAppId(appId);
+}
+
 }} // Tizen::App
index e2b56bf..9ca8ef3 100644 (file)
@@ -82,6 +82,8 @@ _AppControlRegistry::_AppControlRegistry(void)
 {
        __nativeList.Construct();
 
+       __tizenList.Construct();
+
        __aliasList.Construct();
 
        __aliasAppId.Construct();
@@ -106,6 +108,8 @@ _AppControlRegistry::GetInstance(void)
 
                __pSelf->LoadRegistry();
 
+               __pSelf->LoadTizenAppControlRegistry();
+
                __pSelf->LoadLegacyList();
 
                __pSelf->LoadAliasList();
@@ -255,6 +259,75 @@ _AppControlRegistry::LoadRegistry(void)
 }
 
 result
+_AppControlRegistry::LoadTizenAppControlRegistry(void)
+{
+       _RegistryImpl reg;
+
+       const String regPath = ACTL_DEFAULT_FILE;
+
+       result r = reg.Construct(regPath, REG_OPEN_READ_ONLY, null);
+       SysTryReturn(NID_APP, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       const int secCount = reg.GetAllSectionCount();
+       SysTryReturnResult(NID_APP, !(secCount <= 0), E_OBJ_NOT_FOUND, "Registry contains no data.");
+
+       SysLog(NID_APP, "Loading %d sections from %ls", secCount, regPath.GetPointer());
+
+       int index = 0;
+       int size = 0;
+       //int num = 0;
+       String path;
+
+       for (int i = 0; i < secCount; i++)
+       {
+               ///////////////////////////////////////////////////////////////////////
+               // appcontrol Id
+               String sec_name(reg.GetSectionName(i));
+               sec_name.Trim();
+
+               if (sec_name.IsEmpty())
+               {
+                       continue;
+               }
+
+#if 0
+               int public_open = 0;
+
+               ///////////////////////////////////////////////////////////////////////
+               // Plubic
+               index = reg.GetEntryIndex(i, ACTL_REGISTRY_PUBLIC);
+               if (index >= 0)
+               {
+                       size = sizeof(size);
+                       num = 0;
+
+                       reg.GetEntryValue(i, index, REG_VALUE_TYPE_INT, &num, &size);
+                       if (num == 1)
+                       {
+                               // public
+                               public_open = 1;
+                       }
+               }
+#endif
+
+               ///////////////////////////////////////////////////////////////////////
+               // Path
+               index = reg.GetEntryIndex(i, ACTL_REGISTRY_PATH);
+               if (index >= 0)
+               {
+                       size = REG_VALUE_BUFFER_LEN;
+                       reg.GetEntryValue(i, index, REG_VALUE_TYPE_STRING, &path, &size);
+               }
+
+               __tizenList.Add(sec_name, path);
+       }
+
+       SysLog(NID_APP, "Finished loading %d tizen AppControl entries", __tizenList.GetCount());
+
+       return E_SUCCESS;
+}
+
+result
 _AppControlRegistry::LoadLegacyList(void)
 {
        _RegistryImpl reg;
@@ -378,6 +451,80 @@ CATCH:
 
 
 AppControl*
+_AppControlRegistry::GetTizenAppControlN(const String& aId, const String& oId) const
+{
+       const _AppControlAliasEntry* pEntry = null;
+       int count = 0;
+
+       do
+       {
+               const _AppControlAliasEntry* pTempEntry = GetAppControlAliasEntry(aId, oId);
+               // number does not matter
+               if (count >= 5 || pTempEntry == null)
+               {
+                       break;
+               }
+
+               pEntry = pTempEntry;
+               count++;
+       }
+       while (true);
+
+
+       const String* pAppId = null;
+       const String* pOperation = null;
+
+       if (count == 0)
+       {
+               // if count is 0, then no alias is found
+               pAppId = &aId;
+               pOperation = &oId;
+       }
+       else if (pEntry == null)
+       {
+               // no "TIZEN" AppControl
+               return null;
+       }
+       else
+       {
+               pAppId = &pEntry->provider2;
+               pOperation = &pEntry->operation2;
+       }
+
+       SysAssert(pAppId != null);
+       SysAssert(pOperation != null);
+
+       SysLog(NID_APP, "Found matching AppControl (%ls, %ls)", pAppId->GetPointer(), pOperation->GetPointer());
+
+       const String& soName = GetTizenAppControlProvider(*pAppId, *pOperation);
+
+       if (soName.IsEmpty())
+       {
+               SysLog(NID_APP, "No AppControl stub found for (%ls, %ls)", pAppId->GetPointer(), pOperation->GetPointer());
+               return null;
+       }
+
+       return _AppControlImpl::CreateN(soName, *pAppId, *pOperation, L"", _APPCONTROL_PROPERTY_PUBLIC | _APPCONTROL_PROPERTY_SLP);
+}
+
+
+String
+_AppControlRegistry::GetTizenAppControlProvider(const String& appId, const String& oId) const
+{
+       String val;
+       result r = __tizenList.GetValue(appId, val);
+       if (r == E_SUCCESS)
+       {
+               SysLog(NID_APP, "Found TIZEN AppControl stub %ls for %ls.", val.GetPointer(), appId.GetPointer());
+               return val;
+       }
+
+       SysLog(NID_APP, "No platform AppControl and use custom AppControl instead.");
+       return L"";
+}
+
+
+AppControl*
 _AppControlRegistry::GetNativeAppControlN(const String& aId, const String& oId) const
 {
        std::unique_ptr< IEnumeratorT<AppControl*> > pEnum(__nativeList.GetEnumeratorN());
@@ -487,7 +634,7 @@ _AppControlRegistry::FindAppControlListN(const String* pOid, const String* pUri,
        return pList;
 }
 
-_AppControlRegistry::_AppControlAliasEntry*
+const _AppControlRegistry::_AppControlAliasEntry*
 _AppControlRegistry::GetAppControlAliasEntry(const String& aId, const String& oId) const
 {
        std::unique_ptr< IEnumeratorT<_AppControlAliasEntry*> > pEnum(__aliasList.GetValuesN(aId));
@@ -512,7 +659,7 @@ _AppControlRegistry::GetAppControlAliasEntry(const String& aId, const String& oI
        return null;
 }
 
-_AppControlRegistry::_AppControlAliasEntry*
+const _AppControlRegistry::_AppControlAliasEntry*
 _AppControlRegistry::GetReverseAppControlAliasEntry(const String& aId, const String& oId) const
 {
        std::unique_ptr< IMapEnumeratorT<String, _AppControlAliasEntry*> > pEnum(__aliasList.GetMapEnumeratorN());
@@ -535,7 +682,7 @@ _AppControlRegistry::GetReverseAppControlAliasEntry(const String& aId, const Str
 AppControl*
 _AppControlRegistry::GetAliasAppControlN(const String& aId, const String& oId) const
 {
-       _AppControlAliasEntry* pEntry = GetAppControlAliasEntry(aId, oId);
+       const _AppControlAliasEntry* pEntry = GetAppControlAliasEntry(aId, oId);
 
        if (pEntry)
        {
@@ -574,9 +721,9 @@ _AppControlRegistry::GetAppControlN(const String& appId, const String& operation
        String actualAppId = appId;
        if (appId.StartsWith(TIZEN_ALIAS_APPID_PREFIX, 0))
        {
-               String tmp;
-               result r = __aliasAppId.GetValue(appId, tmp);
-               if (r == E_SUCCESS)
+               const String& tmp = GetAliasAppId(appId);
+
+               if (tmp.IsEmpty())
                {
                        actualAppId = tmp;
                        SysLog(NID_APP, "Found alias appId (%ls -> %ls).", appId.GetPointer(), tmp.GetPointer());
@@ -591,6 +738,21 @@ _AppControlRegistry::GetAppControlN(const String& appId, const String& operation
        return _AppControlImpl::CreateN(actualAppId, operationId, changeAppId);
 }
 
+
+AppId
+_AppControlRegistry::GetAliasAppId(const AppId& appId) const
+{
+       String tmp;
+       result r = __aliasAppId.GetValue(appId, tmp);
+       if (r != E_SUCCESS)
+       {
+               tmp.Clear();
+       }
+
+       return tmp;
+}
+
+
 AppId
 _AppControlRegistry::GetReverseAliasAppId(const AppId& appId) const
 {
index 4b6e447..e953f4a 100644 (file)
@@ -86,6 +86,8 @@ public:
 
        static _AppControlRegistry* GetInstance(void);
 
+       AppControl* GetTizenAppControlN(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const;
+
        AppControl* GetNativeAppControlN(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const;
 
        AppControl* GetSlpAppControlN(const Tizen::Base::String& packageName, const Tizen::Base::String& oId) const;
@@ -96,9 +98,11 @@ public:
 
        Tizen::Base::Collection::ArrayList* FindAppControlListN(const Tizen::Base::String* pOid, const Tizen::Base::String* pUri, const Tizen::Base::String* pMimeType, const Tizen::Base::String* pCategory) const;
 
-       _AppControlAliasEntry* GetAppControlAliasEntry(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const;
+       const _AppControlAliasEntry* GetAppControlAliasEntry(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const;
+
+       const _AppControlAliasEntry* GetReverseAppControlAliasEntry(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const;
 
-       _AppControlAliasEntry* GetReverseAppControlAliasEntry(const Tizen::Base::String& aId, const Tizen::Base::String& oId) const;
+       AppId GetAliasAppId(const AppId& appId) const;
 
        AppId GetReverseAliasAppId(const AppId& appId) const;
 
@@ -109,13 +113,19 @@ private:
 
        result LoadRegistry(void);
 
+       result LoadTizenAppControlRegistry(void);
+
        result LoadLegacyList(void);
 
        result LoadAliasList(void);
 
+       Tizen::Base::String GetTizenAppControlProvider(const Tizen::Base::String& appId, const Tizen::Base::String& opId) const;
+
 private:
        AppControlList __nativeList;
 
+       AliasMapType __tizenList;
+
        AppControlAliasList __aliasList;
 
        AliasMapType __aliasAppId;
index 634b5b6..75f94ac 100644 (file)
@@ -253,6 +253,8 @@ public:
 
        result LaunchPkg(_AppMessageImpl& msg, const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data);
 
+       result LaunchPkg(_AppMessageImpl& msg, const Tizen::Base::String& package, const Tizen::Base::String& opId, const Tizen::Base::String* pUri, const Tizen::Base::String* pMime, AppSvcResFn pCb, void* data);
+
        int Launch(_AppMessageImpl& msg, const char* pkg_name, const char* op, const char* mime, const char* uri, AppSvcResFn pCb, void* data);
        result LaunchAppWithCondition(const AppId& appId, const Tizen::Base::String& condition, Tizen::Base::Collection::IList* pArgs);
 
@@ -260,6 +262,8 @@ public:
 
        static bool IsAllowedAppControl(const wchar_t aTable[][2][64], int count, const Tizen::Base::String& aId, const Tizen::Base::String& oId);
 
+       static AppId GetAliasAppId(const AppId& appId);
+
        static result GetMimeFromExt(const Tizen::Base::String& ext, Tizen::Base::String& out);
 
        void RemoveLaunchRequest(int req);