2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 * @file ConfigurationManager.cpp
19 * @brief This is the implementation file for %ConfigurationManager class.
25 #include <unique_ptr.h>
27 #include <pkgmgr_parser.h>
28 #include <pkgmgr_installer.h>
29 #include <app2ext_interface.h>
31 #include <FBaseUtilStringUtil.h>
33 #include <FIoDirectory.h>
34 #include <FSecCertX509CertificatePath.h>
36 #include <FBase_StringConverter.h>
38 #include "ConfigurationManager.h"
39 #include "ManifestGenerator.h"
40 #include "InstallerUtil.h"
41 #include "SmackManager.h"
43 using namespace Tizen::Base;
44 using namespace Tizen::Base::Collection;
45 using namespace Tizen::Base::Utility;
46 using namespace Tizen::Security::Cert;
47 using namespace Tizen::App;
48 using namespace Tizen::Io;
50 ConfigurationManager::ConfigurationManager(void)
54 ConfigurationManager::~ConfigurationManager(void)
59 ConfigurationManager::CreateFile(InstallationContext* pContext)
64 rootPath = pContext->__rootPath;
67 apiVersion = pContext->__apiVersion;
68 String versionInfoFile;
69 versionInfoFile.Format(1024, L"%ls%ls", rootPath.GetPointer(), VERSION_INFO_FILE);
70 CreateInfoFile(versionInfoFile, &apiVersion);
72 if (pContext->__isOspCompat == true)
74 AppLog("[OspCompat] is detected");
76 String compatInfoFile;
77 compatInfoFile.Format(1024, L"%ls%ls", rootPath.GetPointer(), COMPAT_INFO_FILE);
78 CreateInfoFile(compatInfoFile, null);
81 String webServicePrivilege(TIZEN_PRIVILEGE_WEB_SERVICE);
82 if (FindPrivilege(pContext, webServicePrivilege) == true)
84 AppLog("WEB_SERVICE privilege is detected. rootPath=[%ls]", rootPath.GetPointer());
86 String webServiceInfoFile;
87 webServiceInfoFile.Format(1024, L"%ls%ls", rootPath.GetPointer(), WEBSERVICE_INFO_FILE);
88 CreateInfoFile(webServiceInfoFile, null);
91 IListT<AppData*>* pAppDataList = pContext->__pAppDataList;
92 TryReturn(pAppDataList, false, "pAppDataList is null");
94 for (int i = 0 ; i < pAppDataList->GetCount(); i++)
96 AppData* pAppData = null;
97 pAppDataList->GetAt(i, pAppData);
98 TryReturn(pAppData, false, "pAppData is null");
100 String appName = pAppData->__name;
101 String appType = pAppData->__type;
102 AppId appId = pAppData->__appId;
105 binaryPath.Format(1024, L"%ls%ls/%ls", rootPath.GetPointer(), DIR_BIN, appName.GetPointer());
107 if (File::IsFileExist(binaryPath) == true)
109 InstallerUtil::Remove(binaryPath);
112 if (appType == L"UiApp")
114 //err = symlink(UIAPP_LOADER_PATH, pBinaryPath);
116 AppLog("copy ui app loader");
117 InstallerUtil::Copy(UIAPP_LOADER_PATH, binaryPath);
119 HashMap* pFeatureList = pAppData->__pFeatureList;
120 TryReturn(pFeatureList, false, "pFeatureList is null");
122 String coordinateSystem;
123 String baseScreenSize;
124 String logicalCoordinate;
126 std::unique_ptr< IMapEnumerator > pEnum(pFeatureList->GetMapEnumeratorN());
127 TryReturn(pEnum, false, "GetMapEnumeratorN() failed. [%s]", GetErrorMessage(GetLastResult()));
129 while (pEnum->MoveNext() == E_SUCCESS)
131 String* pKey = static_cast< String* > (pEnum->GetKey());
132 TryReturn(pEnum, false, "GetKey() failed. [%s]", GetErrorMessage(GetLastResult()));
134 String* pValue = static_cast< String* > (pEnum->GetValue());
135 TryReturn(pEnum, false, "GetValue() failed. [%s]", GetErrorMessage(GetLastResult()));
137 if ((*pKey) == L"CoordinateSystem")
139 coordinateSystem = (*pValue);
142 if ((*pKey) == L"BaseScreenSize")
144 baseScreenSize = (*pValue);
147 if ((*pKey) == L"LogicalCoordinate")
149 logicalCoordinate = (*pValue);
153 String uiScalability;
154 uiScalability.Format(1024, UISCALABILITY_INFO, coordinateSystem.GetPointer(), baseScreenSize.GetPointer(), logicalCoordinate.GetPointer());
156 String uiScalabilityInfoFile;
157 uiScalabilityInfoFile.Format(1024, L"%ls%ls", rootPath.GetPointer(), UISCALABILITY_INFO_FILE);
159 CreateInfoFile(uiScalabilityInfoFile, &uiScalability);
161 int categoryType = pAppData->__feature;
162 if (categoryType != CATEGORY_TYPE_NONE)
164 String category = InstallerUtil::GetCategory(categoryType);
165 category.ToLowerCase();
167 int type = _Aul::GetAppType(category);
169 if (category == L"ime")
171 CreateImeSymlink(binaryPath, appId);
175 typeInfo.Format(1024, L"%d", type);
178 typeInfoFile.Format(1024, L"%ls%ls", rootPath.GetPointer(), TYPE_INFO_FILE);
180 CreateInfoFile(typeInfoFile, &typeInfo);
183 else if (appType == L"ServiceApp")
185 if (pContext->__isPreloaded == true || pAppData->__isSystemService == true)
187 AppLog("copy system service loader");
188 InstallerUtil::Copy(SYSTEMSERIVCE_LOADER_PATH, binaryPath);
192 AppLog("copy service app loader");
193 InstallerUtil::Copy(SERVICEAPP_LOADER_PATH, binaryPath);
197 InstallerUtil::ChangeMode(binaryPath, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
200 ArrayList* pContentDataList = pContext->GetContentDataList();
201 if (pContentDataList)
203 int contentCount = pContentDataList->GetCount();
204 for (int i = 0 ; i < contentCount; i++)
206 ContentData* pContentData = static_cast<ContentData*>(pContentDataList->GetAt(i));
209 String contentId = pContentData->GetContentId();
210 String oldPath = rootPath + DIR_CONTENTS + L"/" + contentId;
212 if (File::IsFileExist(SLP_FONT_PATH) == false)
214 Directory::Create(SLP_FONT_PATH, false);
215 InstallerUtil::ChangeMode(SLP_FONT_PATH, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
218 String newPath = SLP_FONT_PATH;
219 newPath += L"/" + pContext->__packageId;
220 Directory::Create(newPath, false);
221 InstallerUtil::ChangeMode(newPath, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
224 newPath += contentId;
225 InstallerUtil::CreateSymlink(oldPath, newPath);
230 if (pContext->__isPreloaded == true)
232 pContext->__coreXmlPath.Format(1024, DIR_RO_PACKAGE_SYSTEM_MANIFEST, pContext->__packageId.GetPointer());
236 pContext->__coreXmlPath.Format(1024, DIR_RW_PACKAGE_SYSTEM_MANIFEST, pContext->__packageId.GetPointer());
239 std::unique_ptr<char[]> pXmlPath(_StringConverter::CopyToCharArrayN(pContext->__coreXmlPath));
240 TryReturn(pXmlPath != null, false, "pXmlPath is null");
242 if (pContext->__isHybridService == true)
244 String webXmlPath = pXmlPath.get();
245 webXmlPath += L".wgt";
246 InstallerUtil::Copy(pXmlPath.get(), webXmlPath);
248 AppLog("pkgmgr_parser_parse_manifest_for_uninstallation() - START");
249 pkgmgr_parser_parse_manifest_for_uninstallation(pXmlPath.get(), null);
250 AppLog("pkgmgr_parser_parse_manifest_for_uninstallation() - END");
251 CreateCoreXmlFile(pContext);
253 String serviceXmlPath = pXmlPath.get();
254 serviceXmlPath += L".tpk";
255 InstallerUtil::Copy(pXmlPath.get(), serviceXmlPath);
256 InstallerUtil::Remove(pXmlPath.get());
258 MergeToSystemXmlFile(pXmlPath.get(), webXmlPath, serviceXmlPath);
259 InstallerUtil::Remove(webXmlPath);
260 InstallerUtil::Remove(serviceXmlPath);
264 AppLog("pkgmgr_parser_parse_manifest_for_uninstallation() - START");
265 pkgmgr_parser_parse_manifest_for_uninstallation(pXmlPath.get(), null);
266 AppLog("pkgmgr_parser_parse_manifest_for_uninstallation() - END");
267 CreateCoreXmlFile(pContext);
270 AppLog("------------------------------------------");
271 AppLog("sync() - START");
273 AppLog("sync() - END");
274 AppLog("------------------------------------------");
276 err = pkgmgr_parser_check_manifest_validation(pXmlPath.get());
277 TryReturn(err == 0, false, "pkgmgr_parser_check_manifest_validation() is failed. error = [%d][%s]", err, pXmlPath.get());
283 ConfigurationManager::RemoveFile(InstallationContext* pContext)
285 if (pContext->__isPreloaded == true)
287 pContext->__coreXmlPath.Format(1024, DIR_RO_PACKAGE_SYSTEM_MANIFEST, pContext->__packageId.GetPointer());
291 pContext->__coreXmlPath.Format(1024, DIR_RW_PACKAGE_SYSTEM_MANIFEST, pContext->__packageId.GetPointer());
294 std::unique_ptr<char[]> pXmlPath(_StringConverter::CopyToCharArrayN(pContext->__coreXmlPath));
295 TryReturn(pXmlPath != null, false, "pXmlPath is null");
297 if (pContext->__isHybridService == true)
299 AppLog("Uninstallation for HybridService - skip");
304 AppLog("pkgmgr_parser_parse_manifest_for_uninstallation() START");
305 if (pkgmgr_parser_parse_manifest_for_uninstallation(pXmlPath.get(), null) != 0)
307 AppLog("pkgmgr_parser_parse_manifest_for_uninstallation() is failed.[%s]", pXmlPath.get());
309 AppLog("pkgmgr_parser_parse_manifest_for_uninstallation() END");
311 InstallerUtil::Remove(pXmlPath.get());
314 // _PackageInfoImpl* pPackageInfoImpl = pContext->GetPackageInfoImpl();
315 // TryReturn(pPackageInfoImpl, false, "[osp-installer] pPackageInfoImpl is null.");
317 // ArrayList* pAppList = pPackageInfoImpl->GetAppInfoList();
318 // for (int i = 0 ; i < pAppList->GetCount(); i++)
320 // _PackageAppInfoImpl* pAppInfoImpl = dynamic_cast<_PackageAppInfoImpl*>(pAppList->GetAt(i));
323 // String packageName = pAppInfoImpl->GetPackageName();
325 // char dest[772] = {0};
327 // destPath.Format(1024, L"%ls/%ls", SLP_APP_PATH, packageName.GetPointer());
328 // sprintf(dest, "%ls", destPath.GetPointer());
337 ConfigurationManager::RegisterCertInfo(InstallationContext* pContext) const
339 if (pContext->__isHybridService == true)
341 AppLog("Skip - HybridService");
349 pkgmgr_instcertinfo_h handle = null;
350 String appId = pContext->__packageId;
351 X509CertificatePath* pAuthorCertPath = pContext->GetAuthorCertPath();
352 X509CertificatePath* pDistributorCertPath = pContext->GetDistributorCertPath();
354 char* pAppId = _StringConverter::CopyToCharArrayN(appId);
355 TryCatch(pAppId, result = false, "pAppId is null");
357 res = pkgmgr_installer_create_certinfo_set_handle(&handle);
358 TryCatch(res == 0, result = false, "pkgmgr_installer_create_certinfo_set_handle() failed.[%d]", res);
362 AppLog("[AuthorCert]");
363 result = SetCertHashValue(handle, pAuthorCertPath, PM_SET_AUTHOR_SIGNER_CERT);
364 TryCatch(result == true, , "RegisterCertHashValue() failed. [pAuthorCertPath]");
367 if (pDistributorCertPath)
369 AppLog("[DistributorCert]");
370 result = SetCertHashValue(handle, pDistributorCertPath, PM_SET_DISTRIBUTOR_SIGNER_CERT);
371 TryCatch(result == true, , "RegisterCertHashValue() failed. [pDistributorCertPath]");
374 res = pkgmgr_installer_save_certinfo(pAppId, handle);
375 TryCatch(res == 0, result = false, "pkgmgr_installer_save_certinfo(%s) failed.[%d]", pAppId, res);
377 AppLog("RegisterCertInfo - END");
378 AppLog("------------------------------------------");
383 pkgmgr_installer_destroy_certinfo_set_handle(handle);
391 ConfigurationManager::SetCertHashValue(void* pHandle, X509CertificatePath* pCertPath, int certType) const
393 TryReturn(pCertPath, false, "pCertPath is null.");
397 ICertificate* pCert = null;
398 char* pCertValue = null;
400 for (int i = 0; i < pCertPath->GetLength(); i++)
402 pCert = pCertPath->GetCertificateN(i);
403 TryCatch(pCert, result = false, "pCert is null.[%i]", i);
405 pCertValue = GetCertValueN(pCert);
406 TryCatch(pCertValue, result = false, "pCertValue is null.[%i]", i);
408 AppLog("------------------------------------------");
409 AppLog("CertValue(%d), certType[%d]", i, certType);
410 AppLog("[%s]", pCertValue);
412 res = pkgmgr_installer_set_cert_value(pHandle, (pkgmgr_instcert_type)certType, pCertValue);
413 TryCatch(res == 0, result = false, "pkgmgr_installer_set_cert_value(%d) failed.[%d]", i, res);
431 ConfigurationManager::GetCertValueN(ICertificate* pCert) const
433 result r = E_SUCCESS;
434 ByteBuffer* pEncodedData = null;
436 char* pEncodedValue = null;
438 pEncodedData = pCert->GetEncodedDataN();
439 TryCatch(pEncodedData, , "pEncodedData is null.");
441 r = StringUtil::EncodeToBase64String(*pEncodedData, base64Value);
442 TryCatch(!IsFailed(r), , "StringUtil::EncodeToBase64String is failed.");
444 pEncodedValue = _StringConverter::CopyToCharArrayN(base64Value);
445 TryCatch(pEncodedValue, , "pEncodedValue is null");
450 return pEncodedValue;
454 ConfigurationManager::UnregisterCertInfo(InstallationContext* pContext) const
456 if (pContext->__isHybridService == true)
458 AppLog("Skip - HybridService");
465 String appId = pContext->__packageId;
467 char* pAppId = _StringConverter::CopyToCharArrayN(appId);
468 TryCatch(pAppId, result = false, "pAppId is null");
470 res = pkgmgr_installer_delete_certinfo(pAppId);
471 TryCatch(res == 0, result = false, "pkgmgr_installer_delete_certinfo(%s) failed.[%d]", pAppId, res);
473 AppLog("UnregisterCertInfo - END");
474 AppLog("------------------------------------------");
482 ConfigurationManager::PostInstall(InstallationContext* pContext, bool error) const
484 app2ext_handle* pHandle = (app2ext_handle*)pContext->__pApp2ExtHandle;
486 PackageId packageId = pContext->__packageId;
487 std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
488 TryReturn(pPackageId, false, "pPackageId is null");
492 std::unique_ptr<char[]> pXmlPath(_StringConverter::CopyToCharArrayN(pContext->__coreXmlPath));
493 TryReturn(pXmlPath != null, false, "pXmlPath is null");
495 AppLog("------------------------------------------");
496 AppLog("pkgmgr_parser_parse_manifest_for_installation() - START");
497 int err = pkgmgr_parser_parse_manifest_for_installation(pXmlPath.get(), null);
498 TryReturn(err == 0, false, "pkgmgr_parser_parse_manifest_for_installation() is failed. error = [%d][%s]", err, pXmlPath.get());
500 AppLog("pkgmgr_parser_parse_manifest_for_installation() - END");
501 AppLog("------------------------------------------");
503 SmackManager smackManager;
504 smackManager.Construct(pContext);
505 smackManager.AddPermissions(packageId);
512 pHandle->interface.post_install(pPackageId.get(), APP2EXT_STATUS_FAILED);
513 AppLog("[app2sd] post_install(%s, APP2EXT_STATUS_FAILED)", pPackageId.get());
517 pHandle->interface.post_install(pPackageId.get(), APP2EXT_STATUS_SUCCESS);
518 AppLog("[app2sd] post_install(%s, APP2EXT_STATUS_SUCCESS)", pPackageId.get());
521 app2ext_deinit(pHandle);
528 ConfigurationManager::PostUninstall(InstallationContext* pContext) const
530 app2ext_handle* pHandle = (app2ext_handle*)pContext->__pApp2ExtHandle;
532 PackageId packageId = pContext->__packageId;
533 std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
534 TryReturn(pPackageId, false, "pPackageId is null.");
538 pHandle->interface.post_uninstall(pPackageId.get());
539 AppLog("[app2sd] post_uninstall(%s)", pPackageId.get());
541 app2ext_deinit(pHandle);
544 SmackManager smackManager;
545 smackManager.Construct(pContext);
546 smackManager.RevokePermissions(packageId);
552 ConfigurationManager::CreateCoreXmlFile(InstallationContext* pContext)
554 AppLog("------------------------------------------");
555 AppLog("CreateCoreXmlFile() - START");
558 ManifestGenerator manifestGenerator;
559 manifestGenerator.Construct(pContext);
560 ret = manifestGenerator.Write();
564 AppLog("manifestGenerator.Write() is failed.");
566 AppLog("CreateCoreXmlFile() - END");
567 AppLog("------------------------------------------");
573 //ConfigurationManager::CreateHybridServiceDesktopFile(InstallationContext* pContext)
575 // AppLog("HybridServiceDesktopFile - START");
578 // _PackageInfoImpl *pPackageInfoImpl = pContext->GetPackageInfoImpl();
579 // _PackageAppInfoImpl* pAppInfoImpl = null;
580 // ArrayList* pAppList = null;
581 // pAppList = pPackageInfoImpl->GetAppInfoList();
583 // for (int i = 0 ; i < pAppList->GetCount(); i++)
585 // pAppInfoImpl = dynamic_cast<_PackageAppInfoImpl*>(pAppList->GetAt(i));
590 // name.Format(1024, L"%ls", pPackageInfoImpl->GetAppName().GetPointer());
592 // String binaryPath;
593 // binaryPath.Format(1024, L"%ls%ls/%ls", pPackageInfoImpl->GetAppRootPath().GetPointer(), DIR_BIN, pAppInfoImpl->GetName().GetPointer());
596 // iconPath.Format(1024, L"%ls%ls/%ls", pPackageInfoImpl->GetAppRootPath().GetPointer(), DIR_ICONS, pAppInfoImpl->GetMainmenuIcon().GetPointer());
599 // version.Format(1024, L"%ls", pPackageInfoImpl->GetVersion().GetPointer());
602 // desktop.Format(1024, L"[Desktop Entry]\n"
604 // "Name[en_GB]=%ls\n"
605 // "Type=Application\n"
609 // "NoDisplay=true\n"
610 // "X-TIZEN-TaskManage=False\n"
611 // "X-TIZEN-PackageType=tpk\n",
612 // name.GetPointer(), name.GetPointer(), binaryPath.GetPointer(), iconPath.GetPointer(), version.GetPointer());
614 // String desktopPath;
615 // desktopPath.Format(1024, L"/opt/share/applications/%ls.desktop", pAppInfoImpl->GetPackageName().GetPointer());
617 // if (File::IsFileExist(desktopPath) == true)
619 // AppLog("removing desktop filePath=[%ls]", desktopPath.GetPointer());
620 // InstallerUtil::Remove(desktopPath);
623 // CreateInfoFile(desktopPath, &desktop);
627 // AppLog("HybridServiceDesktopFile - END");
633 ConfigurationManager::MergeToSystemXmlFile(const String& systemXmlPath, const String& webXmlPath, const String& serviceXmlPath)
635 result r = E_SUCCESS;
637 FileAttributes webXmlAttr;
638 r = File::GetAttributes(webXmlPath, webXmlAttr);
639 TryReturn(!IsFailed(r), false, "File::GetAttributes() failed, webXmlPath=%ls", webXmlPath.GetPointer());
641 FileAttributes serviceAttr;
642 r = File::GetAttributes(serviceXmlPath, serviceAttr);
643 TryReturn(!IsFailed(r), false, "File::GetAttributes() failed, serviceXmlPath=%ls", serviceXmlPath.GetPointer());
645 long long webXmlFileSize = webXmlAttr.GetFileSize();
646 long long serviceXmlFileSize = serviceAttr.GetFileSize();
647 long long mergedSize = webXmlFileSize + serviceXmlFileSize;
650 r = webXml.Construct(webXmlPath, L"r");
651 TryReturn(!IsFailed(r), false, "webXmlPath.Construct is failed");
653 std::unique_ptr<char[]> pMergedBuf(new (std::nothrow) char[mergedSize + 1]);
654 TryReturn(pMergedBuf, false, "pMergedBuf is null");
655 memset(pMergedBuf.get(), 0, mergedSize + 1);
657 int readBytes = webXml.Read(pMergedBuf.get(), webXmlFileSize);
658 TryReturn(readBytes >= 0, false, "webXml.Read is failed");
661 r = serviceXml.Construct(serviceXmlPath, L"r");
662 TryReturn(!IsFailed(r), false, "serviceXmlPath.Construct is failed");
664 std::unique_ptr<char[]> pServiceBuf(new (std::nothrow) char[serviceXmlFileSize + 1]);
665 TryReturn(pServiceBuf, false, "pServiceBuf is null");
666 memset(pServiceBuf.get(), 0, serviceXmlFileSize + 1);
668 readBytes = serviceXml.Read(pServiceBuf.get(), serviceXmlFileSize);
669 TryReturn(readBytes >= 0, false, "serviceXml.Read is failed");
671 char* pManifestTag = strcasestr(pMergedBuf.get(), "</manifest>");
672 TryReturn(pManifestTag, false, "pManifestTag is null");
674 char* pAppTagStart = strcasestr(pServiceBuf.get(), "<ui-application");
675 TryReturn(pAppTagStart, false, "pAppTagStart is null");
677 char* pAppTagEnd = strcasestr(pServiceBuf.get(), "</ui-application>");
678 TryReturn(pAppTagEnd, false, "pAppTagEnd is null");
680 int serviceAppLen = pAppTagEnd - pAppTagStart + strlen("</ui-application>");
682 memcpy(pManifestTag, pAppTagStart, serviceAppLen);
684 char* pManifestEndTag = pManifestTag + serviceAppLen;
685 strcpy(pManifestEndTag, "\n</manifest>");
687 int fileSize = pManifestEndTag - pMergedBuf.get() + strlen("\n</manifest>");
690 r = systemXml.Construct(systemXmlPath, L"w");
691 TryReturn(!IsFailed(r), false, "systemXmlPath.Construct is failed");
693 systemXml.Write(pMergedBuf.get(), fileSize);
695 AppLog("pMergedBuf.get()=0x%0x, length=%d", (unsigned int)pMergedBuf.get(), fileSize);
696 InstallerUtil::DumpLogData(pMergedBuf.get(), fileSize);
702 ConfigurationManager::CreateInfoFile(const String& filePath, const String* pContext)
704 result r = E_SUCCESS;
707 r = file.Construct(filePath, "w");
708 TryReturn(!IsFailed(r), false, "file.Construct() failed, filePath=[%ls]", filePath.GetPointer());
710 AppLog("------------------------------------------");
711 AppLog("CreateInfoFile(), filePath = [%ls]", filePath.GetPointer());
715 r = file.Write(*pContext);
716 TryReturn(!IsFailed(r), false, "file.Write() failed, filePath=[%ls]", filePath.GetPointer());
717 AppLog("string = [%ls]", pContext->GetPointer());
719 AppLog("------------------------------------------");
725 ConfigurationManager::CreateImeSymlink(const String& binaryPath, const String& appId)
729 const char* pExePath = null;
730 const char* pSymlinkPath = null;
732 Directory::Create(IME_PATH, true);
735 exePath.Format(1024, L"%ls.exe", binaryPath.GetPointer());
738 symlinkPath.Format(1024, L"%s/%ls.so", IME_PATH, appId.GetPointer());
740 pExePath = _StringConverter::CopyToCharArrayN(exePath);
741 TryCatch(pExePath, res = false, "pExePath is null");
743 pSymlinkPath = _StringConverter::CopyToCharArrayN(symlinkPath);
744 TryCatch(pSymlinkPath, res = false, "pSymlinkPath is null");
746 err = symlink(pExePath, pSymlinkPath);
748 AppLog("[%s] -> [%s]", pSymlinkPath, pExePath);
752 delete[] pSymlinkPath;
758 ConfigurationManager::FindPrivilege(InstallationContext* pContext, const String& privilege) const
760 TryReturn(pContext, false, "pContext is null.");
763 const ArrayList* pPrivilegeList = pContext->GetPrivilegeList();
767 if (pPrivilegeList->Contains(privilege) == true)
769 AppLog("Privilege = [%ls]", privilege.GetPointer());