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 InstallerManager.cpp
19 * @brief This is the implementation file for %InstallerManager class.
23 #include <unique_ptr.h>
26 #include <app2ext_interface.h>
27 #include <pkgmgr_installer.h>
30 #include <FIoDirectory.h>
31 #include <FBase_StringConverter.h>
32 #include <FAppPkgPackageInfo.h>
33 #include <FAppPkg_PackageManagerImpl.h>
34 #include <FAppPkg_PackageInfoImpl.h>
35 #include <FSysSystemTime.h>
37 #include "InstallerManager.h"
38 #include "GuestInstaller.h"
39 #include "IDEInstaller.h"
40 #include "PreloadedInstaller.h"
41 #include "RestorationInstaller.h"
42 #include "InstallerUtil.h"
44 using namespace Tizen::Base;
45 using namespace Tizen::Base::Utility;
46 using namespace Tizen::Base::Collection;
47 using namespace Tizen::Io;
48 using namespace Tizen::App;
49 using namespace Tizen::App::Package;
51 const int BUFSIZE = 512;
52 InstallerManager* InstallerManager::__pInstallerManager = null;
54 InstallerManager::InstallerManager(void)
58 ,__operation(INSTALLER_OPERATION_INSTALL)
62 ,__isHistoryFileLogOn(false)
66 InstallerManager::~InstallerManager(void)
76 InstallerManager::GetInstance()
78 if (__pInstallerManager == null)
80 __pInstallerManager = new InstallerManager();
81 TryReturn(__pInstallerManager, null, "__pInstallerManager is null");
84 return __pInstallerManager;
88 InstallerManager::Construct(const String& path, InstallerOperation operation, InstallerOption option, void* pPkgmgrInstaller, const String* pOptionalData)
90 InstallerError error = INSTALLER_ERROR_NONE;
91 InstallerType installerType = INSTALLER_TYPE_INSTALLER;
93 String newPath = path;
95 Tizen::System::SystemTime::GetTicks(__startTick);
96 SetInstallerOperation(operation);
98 if (option & INSTALLER_OPTION_FILELOG_ON)
100 r = Directory::Create(DIR_OSP_APPLICATIONS_TEMP, false);
103 __logFilePath = DIR_OSP_APPLICATIONS_TEMP;
104 __logFilePath += L"/log.txt";
105 InstallerUtil::CreateLog(__logFilePath);
107 __isFileLogOn = true;
110 if (File::IsFileExist(DIR_INSTALL_LOGS) == false)
112 r = Directory::Create(DIR_INSTALL_LOGS, false);
119 String logPath = path;
121 int length = logPath.GetLength();
122 if (logPath.EndsWith("/") == true)
124 logPath.Remove(length - 1, 1);
127 logPath.SubString(length - PACKAGE_ID_LENGTH, PACKAGE_ID_LENGTH, logId);
128 AppLog("logPath = [%ls], logId = [%ls]", __historyLogFilePath.GetPointer(), logId.GetPointer());
130 __historyLogFilePath = DIR_INSTALL_LOGS;
131 __historyLogFilePath += L"/";
132 __historyLogFilePath += logId;
133 __historyLogFilePath += L".txt";
134 InstallerUtil::CreateLog(__historyLogFilePath);
136 AppLog("__historyLogFilePath = [%ls]", __historyLogFilePath.GetPointer());
138 __isHistoryFileLogOn = true;
141 AppLog("------------------------------------------");
142 AppLog("InstallerManager");
143 AppLog("------------------------------------------");
144 AppLog(" # operation = [%s]", InstallerUtil::GetInstallerOperationString(operation));
145 AppLog(" # path = [%ls]", path.GetPointer());
146 AppLog("------------------------------------------");
148 __pContext = new InstallationContext();
149 TryReturn(__pContext, INSTALLER_ERROR_OUT_OF_MEMORY, "__pContext is null.");
151 error = __pContext->Construct();
152 TryReturn(error == INSTALLER_ERROR_NONE, INSTALLER_ERROR_INTERNAL_STATE, "__pContext->Construct() failed.");
154 __pContext->__pPkgmgrInstaller = pPkgmgrInstaller;
156 if (operation == INSTALLER_OPERATION_INSTALL)
159 r = File::GetAttributes(newPath, attr);
160 TryReturn(!IsFailed(r), INSTALLER_ERROR_PACKAGE_NOT_FOUND, "File::GetAttributes() failed");
162 if (attr.IsDirectory())
164 installerType = INSTALLER_TYPE_DIRECTORY;
166 if (newPath.EndsWith("/") == true)
168 int length = newPath.GetLength();
169 newPath.Remove(length - 1, 1);
170 AppLog("newPath=[%ls]", newPath.GetPointer());
173 if (newPath.StartsWith(PATH_USR_APPS, 0) == true)
175 installerType = INSTALLER_TYPE_PRELOADED;
176 __pContext->__isPreloaded = true;
179 __pContext->__inputPath = newPath;
180 __pContext->__installDir = newPath;
181 __pContext->__packageSize = InstallerUtil::GetDisplaySize(newPath);
185 if (option & INSTALLER_OPTION_CSC)
187 AppLog("INSTALLER_OPTION_CSC is detected.");
188 __pContext->__isCsc = true;
189 __pContext->__cscInfo = *pOptionalData;
192 installerType = INSTALLER_TYPE_PACKAGE;
193 __pContext->__packagePath = newPath;
194 __pContext->__packageSize = InstallerUtil::GetDisplaySize(newPath);
199 ParseOptionalData(pOptionalData);
200 SendEvent(__pContext, __pContext->__packageId, "start", "install");
204 AppLog("Input param(package) is null in case of cmd, hybrid package.");
207 if (option & INSTALLER_OPTION_RESET_PRELOADED)
209 TryReturn(__pContext->__packageId.IsEmpty() == false, INSTALLER_ERROR_INTERNAL_STATE, "packageId is empty.");
211 String rootPath(PATH_OPT_USR_APPS);
213 rootPath += __pContext->__packageId;
215 AppLog("rootPath[%ls] is deleted.", rootPath.GetPointer());
216 InstallerUtil::Remove(rootPath);
219 else if (operation == INSTALLER_OPERATION_UNINSTALL)
221 installerType = INSTALLER_TYPE_INSTALLER;
223 AppLog("operation is INSTALLER_OPERATION_UNINSTALL");
224 __pContext->SetCurrentInstallationStep(INSTALLER_STEP_INIT_UNINSTALL);
225 __pContext->__packageId = newPath;
227 SendEvent(__pContext, __pContext->__packageId, "start", "uninstall");
229 else if (operation == INSTALLER_OPERATION_REINSTALL)
231 installerType = INSTALLER_TYPE_INSTALLER;
232 AppLog("operation is INSTALLER_OPERATION_REINSTALL");
233 installerType = INSTALLER_TYPE_DIRECTORY;
235 __pContext->SetCurrentInstallationStep(INSTALLER_STEP_RDS_INIT);
236 __pContext->__packageId = newPath;
238 SendEvent(__pContext, __pContext->__packageId, "start", "install");
241 __pContext->SetInstallerOperation(operation);
243 if (option & INSTALLER_OPTION_HYBRID)
245 AppLog("Request to install HybridService app!");
246 __pContext->__isHybridService = true;
249 __pInstaller = CreateInstaller(installerType);
250 TryReturn(__pInstaller, INSTALLER_ERROR_INTERNAL_STATE, "__pInstaller is null.");
252 error = __pInstaller->Construct(__pContext);
253 TryReturn(error == INSTALLER_ERROR_NONE, INSTALLER_ERROR_INTERNAL_STATE, "__pInstaller->Construct() failed");
259 InstallerManager::Release(void)
261 delete __pInstallerManager;
262 __pInstallerManager = null;
266 InstallerManager::CreateInstaller(InstallerType installerType)
268 Installer* pInstaller = null;
270 switch (installerType)
272 case INSTALLER_TYPE_INSTALLER:
273 AppLog("InstallerType = [Installer]");
274 pInstaller = new (std::nothrow) Installer();
277 case INSTALLER_TYPE_PACKAGE:
278 AppLog("InstallerType = [PackageInstaller]");
279 pInstaller = new (std::nothrow) PackageInstaller();
282 case INSTALLER_TYPE_DIRECTORY:
283 AppLog("InstallerType = [DirectoryInstaller]");
284 pInstaller = new (std::nothrow) DirectoryInstaller();
287 case INSTALLER_TYPE_GUEST:
288 AppLog("InstallerType = [GuestInstaller]");
289 pInstaller = new (std::nothrow) GuestInstaller();
292 case INSTALLER_TYPE_PRELOADED:
293 AppLog("InstallerType = [PreloadedInstaller]");
294 pInstaller = new (std::nothrow) PreloadedInstaller();
297 case INSTALLER_TYPE_IDE:
298 AppLog("InstallerType = [IDEInstaller]");
299 pInstaller = new (std::nothrow) IDEInstaller();
302 case INSTALLER_TYPE_RESTORATION:
303 AppLog("InstallerType = [RestorationInstaller]");
304 pInstaller = new (std::nothrow) RestorationInstaller();
308 AppLogExceptionTag(OSP_INSTALLER, "Installer is not found.");
316 InstallerManager::GetNext(void)
318 InstallationStep step = __pContext->GetCurrentInstallationStep();
319 return __pInstaller->GetNext(step);
323 InstallerManager::Init(void)
325 SendEvent(__pContext, __pContext->__packageId, "install_percent", "0");
326 return __pInstaller->OnInit();
330 InstallerManager::Error(void)
332 return __pInstaller->OnError();
336 InstallerManager::Register(void)
338 SendEvent(__pContext, __pContext->__packageId, "install_percent", "60");
339 return __pInstaller->OnRegister();
343 InstallerManager::End(void)
345 return __pInstaller->OnEnd();
349 InstallerManager::Rollback(void)
351 return __pInstaller->OnRollback();
355 InstallerManager::UserCancel(void)
357 return __pInstaller->OnUserCancel();
361 InstallerManager::Activate(void)
363 InstallerError error = INSTALLER_ERROR_NONE;
364 IInstallationStep* pStep = null;
365 InstallationStep currentStep;
367 while (__pContext->GetState() == INSTALLER_STATE_RUNNING)
369 currentStep = GetNext();
370 __pContext->ChangeStep(currentStep);
372 pStep = __pContext->GetStep();
375 error = pStep->Run(__pContext);
377 if (error != INSTALLER_ERROR_NONE)
379 __pContext->SetError(error);
385 if (currentStep == INSTALLER_STEP_INIT)
388 TryCatch(error == INSTALLER_ERROR_NONE, , "error is occurred.");
390 else if (currentStep == INSTALLER_STEP_END)
393 TryCatch(error == INSTALLER_ERROR_NONE, , "error is occurred.");
396 TryCatch(error == INSTALLER_ERROR_NONE, , "error is occurred.");
398 else if (currentStep == INSTALLER_STEP_RDS)
400 AppLog("currentStep is INSTALLER_STEP_RDS");
401 __pContext->SetCurrentInstallationStep(INSTALLER_STEP_NONE);
404 if (__pContext->IsContinue() == false)
409 if (__pContext->GetCurrentInstallationStep() >= INSTALLER_STEP_MAX)
416 if (error == INSTALLER_ERROR_NONE)
418 SendEvent(__pContext, __pContext->__packageId, "install_percent", "100");
419 SendEvent(__pContext, __pContext->__packageId, "end", "ok");
424 errorString.Insert(error, 0);
426 if (__pContext->__additionalErrorString.IsEmpty() == false)
429 errorString += __pContext->__additionalErrorString;
431 SendEvent(__pContext, __pContext->__packageId, "error", errorString);
432 SendEvent(__pContext, __pContext->__packageId, "end", "fail");
439 InstallerManager::Progress(void)
441 return INSTALLER_ERROR_NONE;
445 InstallerManager::GetContext(void)
451 InstallerManager::ParseOptionalData(const String* pOptionalData)
453 TryReturn(__pContext, false, "__pContext is null.");
455 if (pOptionalData == null)
457 AppLog("pOptionalData is null.");
461 // format -> pOptionalData = "abcde12345:StoreClientId=12345abcde.TizenStore"
462 // format -> pOptionalData = "abcde12345"
463 // format -> pOptionalData = "path=/opt/usr/apps/22VoFBmj2I/:op=install:removable=true"
465 AppLog(" # optionalData = [%ls]", pOptionalData->GetPointer());
467 if ((pOptionalData->GetLength() == 10) || (pOptionalData->StartsWith(L":", 10) == true))
470 pOptionalData->SubString(0, PACKAGE_ID_LENGTH, packageId);
471 __pContext->__packageId = packageId;
472 AppLog(" # package = [%ls]", packageId.GetPointer());
475 String tokenDelimiter(":");
477 std::unique_ptr< IMap > pMap(InstallerUtil::ParseN(*pOptionalData, tokenDelimiter));
480 std::unique_ptr< IMapEnumerator > pEnum(pMap->GetMapEnumeratorN());
481 TryReturn(pEnum, false, "GetMapEnumeratorN() failed. [%s]", GetErrorMessage(GetLastResult()));
483 String storeClientId;
487 while (pEnum->MoveNext() == E_SUCCESS)
489 String* pKey = static_cast< String* > (pEnum->GetKey());
490 TryReturn(pEnum, false, "GetKey() failed. [%s]", GetErrorMessage(GetLastResult()));
492 String* pValue = static_cast< String* > (pEnum->GetValue());
493 TryReturn(pEnum, false, "GetValue() failed. [%s]", GetErrorMessage(GetLastResult()));
495 AppLog("key = [%ls], value = [%ls]", pKey->GetPointer(), pValue->GetPointer());
497 if (pKey->Equals(L"StoreClientId", false) == true)
499 storeClientId = (*pValue);
502 if (pKey->Equals(L"removable", false) == true)
504 removable = (*pValue);
507 if (pKey->Equals(L"path", false) == true)
513 if (storeClientId.IsEmpty() == false)
515 __pContext->__storeClientId = storeClientId;
516 AppLog(" # storeClient = [%ls]", storeClientId.GetPointer());
519 if (removable.Equals(L"true", false) == true)
521 __pContext->__isUninstallable = true;
522 AppLog(" # removable = [true]");
525 if (__pContext->__isCsc == true)
527 if (path.IsEmpty() == false)
529 std::unique_ptr< PackageInfo > pPackageInfo(_PackageManagerImpl::GetInstance()->GetPackageInfoFromFileN(path));
530 TryReturn(pPackageInfo, false, "GetPackageInfoFromFileN() failed. [%s]", GetErrorMessage(GetLastResult()));
532 __pContext->__packageId = pPackageInfo->GetId();
533 AppLog(" # packageId = [%ls]", __pContext->__packageId.GetPointer());
542 InstallerManager::ParseCommandArg(int argc, char **argv, int *mode, char *buf, InstallerOption& option)
544 const char* pOpts_str = "u:i:r:v:m:c";
549 AppLog("mode is null");
557 s = getopt(argc, argv, pOpts_str);
572 AppLog("__osp_installer_parse_options: i");
573 *mode = INSTALLER_MODE_INSTALL;
574 if (optarg[0] == 'v')
576 AppLog("__osp_installer_parse_options: v");
577 option = (InstallerOption)(option | INSTALLER_OPTION_HYBRID);
578 option = (InstallerOption)(option | INSTALLER_OPTION_UPDATE_STDOUT);
579 strncpy(buf, argv[optind++], BUFSIZE);
580 AppLog("__osp_installer_parse_options: buf = [%s]", buf);
584 strncpy(buf, optarg, BUFSIZE);
585 AppLog("__osp_installer_parse_options: optarg = [%s]", optarg);
595 AppLog("__osp_installer_parse_options: u");
596 *mode = INSTALLER_MODE_UNINSTALL;
597 if (optarg[0] == 'v')
599 AppLog("__osp_installer_parse_options: v");
600 option = (InstallerOption)(option | INSTALLER_OPTION_HYBRID);
601 option = (InstallerOption)(option | INSTALLER_OPTION_UPDATE_STDOUT);
602 strncpy(buf, argv[optind++], BUFSIZE);
603 AppLog("__osp_installer_parse_options: buf = [%s]", buf);
607 strncpy(buf, optarg, BUFSIZE);
608 AppLog("__osp_installer_parse_options: optarg = [%s]", optarg);
618 AppLog("__osp_installer_parse_options: r");
619 *mode = INSTALLER_MODE_REINSTALL;
620 strncpy(buf, optarg, BUFSIZE);
621 AppLog("__osp_installer_parse_options: optarg = [%s]", optarg);
625 AppLog("__osp_installer_parse_options: v");
626 option = (InstallerOption)(option | INSTALLER_OPTION_UPDATE_STDOUT);
627 AppLog("__osp_installer_parse_options: optarg = [%s]", optarg);
636 AppLog("__osp_installer_parse_options: m");
637 *mode = INSTALLER_MODE_RECURSIVE_DIRECTORY_INSTALL;
638 strncpy(buf, optarg, BUFSIZE);
639 AppLog("__osp_installer_parse_options: optarg = [%s]", optarg);
648 AppLog("__osp_installer_parse_options: c");
649 option = (InstallerOption)(option | INSTALLER_OPTION_UPDATE_STDOUT);
650 option = (InstallerOption)(option | INSTALLER_OPTION_CSC);
651 *mode = INSTALLER_MODE_PARSE_CSC_STRING;
652 AppLog("__osp_installer_parse_options: argv[optind] = [%s]", argv[optind]);
653 strncpy(buf, argv[optind], BUFSIZE);
658 AppLog("Invalid option");
666 AppLog("Invalid mode");
674 InstallerManager::RemoveGarbage(const String& filePath)
676 AppLog("RemoveGarbage Directory = [%ls]", filePath.GetPointer());
679 if (InstallerUtil::IsSymlink(filePath) == true)
681 if (InstallerUtil::GetRealPath(filePath, realPath) == true)
683 InstallerUtil::Remove(realPath);
687 InstallerUtil::Remove(filePath);
693 InstallerManager::ReqeustByTest(void)
697 Tizen::Io::File file;
698 Tizen::Io::FileAttributes attr;
699 result r = E_SUCCESS;
700 char readBuf[512] = {0};
702 r = File::GetAttributes(L"/opt/apps/cmtamb4mtv/data/configuration", attr);
703 TryCatch(!IsFailed(r), errorType = INSTALLER_ERROR_PACKAGE_NOT_FOUND, "file not found");
705 r = file.Construct(L"/opt/apps/cmtamb4mtv/data/configuration", L"r");
706 TryCatch(!IsFailed(r), errorType = INSTALLER_ERROR_PACKAGE_NOT_FOUND, "file.Construct failed");
708 if (file.Read(readBuf, sizeof(readBuf)-1) > 1)
711 path.Format(1024, L"%s", &readBuf[1]);
713 if (readBuf[0] == '+')
715 errorType = InstallerManager::Request(path, INSTALLER_OPERATION_INSTALL, INSTALLER_OPTION_NORMAL, null);
717 else if (readBuf[0] == '-')
719 errorType = InstallerManager::Request(path, INSTALLER_OPERATION_UNINSTALL, INSTALLER_OPTION_NORMAL, null);
721 else if (readBuf[0] == '*')
723 errorType = InstallerManager::RequestRecursiveDirectory(path, errorType);
725 else if (readBuf[0] == '>')
727 errorType = InstallerManager::RequestMove(path, PM_MOVE_TO_SDCARD);
729 else if (readBuf[0] == '<')
731 errorType = InstallerManager::RequestMove(path, PM_MOVE_TO_INTERNAL);
733 else if (readBuf[0] == '#')
735 errorType = InstallerManager::Request(path, INSTALLER_OPERATION_REINSTALL, INSTALLER_OPTION_NORMAL, null);
744 InstallerManager::PrintResult(void)
746 TryReturnVoid(__pContext, "__pContext is null.");
748 int errorType = GetErrorType();
749 InstallerOperation operation = __pContext->GetInstallerOperation();
751 Tizen::System::SystemTime::GetTicks(__endTick);
753 const char* pOperation = InstallerUtil::GetInstallerOperationString(operation);
755 const wchar_t* pPackageId = L"Unknown";
756 if (!__pContext->__packageId.IsEmpty())
758 pPackageId = __pContext->__packageId.GetPointer();
761 const wchar_t* pPackageSize = L"0 B";
762 if (!__pContext->__packageSize.IsEmpty())
764 pPackageSize = __pContext->__packageSize.GetPointer();
767 const wchar_t* pAppInfoStr = L"Unknown";
768 String appInfoStr = GetAppInfoString();
769 if (!appInfoStr.IsEmpty())
771 pAppInfoStr = appInfoStr.GetPointer();
774 String error = GetErrorString(errorType);
775 int duration = (int)(__endTick - __startTick);
777 AppLog("==========================================");
778 AppLog(" # osp-installer: %s", OSP_INSTALLER_VERSION);
779 AppLog("------------------------------------------");
780 AppLog(" # Operation = [%s]", pOperation);
781 AppLog(" # Package = [%ls](%ls)", pPackageId, pPackageSize);
782 AppLog(" # Apps = [%ls]", pAppInfoStr);
783 AppLog(" # Time = [%d]ms", duration);
784 AppLog(" # Result = [%ls(%03d)]", error.GetPointer(), errorType);
785 AppLog("==========================================");
787 fprintf(stderr, " ## osp-installer: package=[%ls](%ls) operation=[%s] result=[%ls](%03d)\n",
788 pPackageId, pPackageSize, pOperation, error.GetPointer(), errorType);
789 fprintf(stderr, " ## osp-installer: apps=[%ls] time=[%d]ms\n", pAppInfoStr, duration);
793 InstallerManager::GetErrorString(int errorType)
795 const char* pError = null;
799 case INSTALLER_ERROR_NONE:
803 case INSTALLER_ERROR_PACKAGE_NOT_FOUND:
804 pError = "[PACKAGE_NOT_FOUND] Thrown when package file is not found.";
807 case INSTALLER_ERROR_PACKAGE_INVALID:
808 pError = "[PACKAGE_INVALID] Thrown when package file is not valid due to file operation or directory hierarchy.";
811 case INSTALLER_ERROR_PACKAGE_LOWER_VERSION:
812 pError = "[PACKAGE_LOWER_VERSION] Thrown when the lower version package is tried to install.";
815 case INSTALLER_ERROR_EXECUTABLE_NOT_FOUND:
816 pError = "[EXECUTABLE_NOT_FOUND] Thrown when executable file is not found in the package.";
819 case INSTALLER_ERROR_MANIFEST_NOT_FOUND:
820 pError = "[MANIFEST_NOT_FOUND] Thrown when manifest.xml is not found in the package.";
823 case INSTALLER_ERROR_MANIFEST_INVALID:
824 pError = "[MANIFEST_INVALID] Thrown when manifest.xml is not valid due to schema or parsing failure.";
827 case INSTALLER_ERROR_SIGNATURE_NOT_FOUND:
828 pError = "[SIGNATURE_NOT_FOUND] Thrown when the signature files are not found in the package.";
831 case INSTALLER_ERROR_SIGNATURE_INVALID:
832 pError = "[SIGNATURE_INVALID] Thrown when the signature files are not valid due to schema or parsing failure.";
835 case INSTALLER_ERROR_SIGNATURE_VERIFICATION_FAILED:
836 pError = "[SIGNATURE_VERIFICATION_FAILED] Thrown when the signature verification has failed due to be modified illegally.";
839 case INSTALLER_ERROR_ROOT_CERTIFICATE_NOT_FOUND:
840 pError = "[ROOT_CERTIFICATE_NOT_FOUND] Thrown when the root certificate is not found.";
843 case INSTALLER_ERROR_CERTIFICATE_INVALID:
844 pError = "[CERTIFICATE_INVALID] Thrown when the certificate verification has failed.";
847 case INSTALLER_ERROR_CERTIFICATE_CHAIN_VERIFICATION_FAILED:
848 pError = "[CERTIFICATE_CHAIN_VERIFICATION_FAILED] Thrown when the certificate chain verification has failed.";
851 case INSTALLER_ERROR_CERTIFICATE_EXPIRED:
852 pError = "[CERTIFICATE_EXPIRED] Thrown when the used certificates have expired.";
855 case INSTALLER_ERROR_PRIVILEGE_INVALID:
856 pError = "[PRIVILEGE_INVALID] Thrown when unsupported privilege strings are detected.";
859 case INSTALLER_ERROR_MENU_ICON_NOT_FOUND:
860 pError = "[MENU_ICON_NOT_FOUND] Thrown when an icon for menu is not found. This icon is mandatory.";
863 case INSTALLER_ERROR_FATAL_ERROR:
864 pError = "[FATAL_ERROR] Thrown when an icon for menu is not found. This icon is mandatory.";
867 case INSTALLER_ERROR_OUT_OF_STORAGE:
868 pError = "[OUT_OF_STORAGE] Thrown when the storage is full.";
871 case INSTALLER_ERROR_OUT_OF_MEMORY:
872 pError = "[OUT_OF_MEMORY] Thrown when the memory is not sufficient to perform the requested installation or uninstallation.";
876 pError = "fatal error";
880 String error = pError;
885 InstallerManager::GetAppInfoString()
888 TryReturn(__pContext, appInfoStr, "__pContext is null");
890 String appRootPath = __pContext->__rootPath;
892 IListT<AppData*>* pAppDataList = __pContext->__pAppDataList;
893 TryReturn(pAppDataList, appInfoStr, "pAppDataList is null.");
895 for (int i = 0 ; i < pAppDataList->GetCount(); i++)
897 AppData* pAppData = null;
898 pAppDataList->GetAt(i, pAppData);
899 TryReturn(pAppData, appInfoStr, "pAppData is null.");
901 String destPath = appRootPath + DIR_BIN + L"/" + pAppData->__name + L".exe";
908 appInfoStr += pAppData->__name;
909 if (pAppData->__main.Equals("True", false) == true)
911 appInfoStr += L"(main)";
914 String sizeStr = L"(" + InstallerUtil::GetDisplaySize(destPath) + L")";
915 appInfoStr += sizeStr;
922 InstallerManager::GetErrorType(void) const
928 InstallerManager::SetErrorType(int errorType)
930 __errorType = errorType;
934 InstallerManager::SetInstallerOperation(InstallerOperation op)
940 InstallerManager::GetInstallerOperation(void) const
946 InstallerManager::GetLogFilePath() const
948 return __logFilePath;
952 InstallerManager::GetHistoryLogFilePath() const
954 return __historyLogFilePath;
958 InstallerManager::IsFileLogOn() const
960 return __isFileLogOn;
964 InstallerManager::IsHistoryFileLogOn() const
966 return __isHistoryFileLogOn;
970 InstallerManager::SendEvent(InstallationContext* pContext, const PackageId& packageId, const String& key, const String& val)
972 TryReturn(pContext, false, "pContext is null.");
973 TryReturn(key.IsEmpty() == false, false, "key is empty.");
974 TryReturn(val.IsEmpty() == false, false, "val is empty.");
976 InstallerOperation operation = pContext->GetInstallerOperation();
978 if (pContext->__pPkgmgrInstaller == null)
980 AppLog("pContext->__pPkgmgrInstaller is null. [%ls]", packageId.GetPointer());
984 if (operation == INSTALLER_OPERATION_UNINSTALL)
986 if (key == L"install_percent")
988 AppLog("install_percent is skipped. [%ls]", packageId.GetPointer());
993 std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
994 TryReturn(pPackageId, false, "pPackageId is null.");
996 std::unique_ptr<char[]> pKey(_StringConverter::CopyToCharArrayN(key));
997 TryReturn(pKey, false, "pKey is null.");
999 std::unique_ptr<char[]> pVal(_StringConverter::CopyToCharArrayN(val));
1000 TryReturn(pVal, false, "pVal is null.");
1002 pkgmgr_installer_send_signal((pkgmgr_installer*) pContext->__pPkgmgrInstaller, "tpk", pPackageId.get(), pKey.get(), pVal.get());
1003 AppLog("pkgmgr_installer_send_signal(tpk, %s, %s, %s)", pPackageId.get(), pKey.get(), pVal.get());
1009 InstallerManager::IsUninstallUpdates(const PackageId& packageId, String& originPath, bool& isCscPackage)
1013 roXmlPath.Format(1024, DIR_RO_PACKAGE_SYSTEM_MANIFEST, packageId.GetPointer());
1015 if (File::IsFileExist(roXmlPath) == true)
1018 rwXmlPath.Format(1024, DIR_RW_PACKAGE_SYSTEM_MANIFEST, packageId.GetPointer());
1019 if (File::IsFileExist(rwXmlPath) == true)
1021 InstallerUtil::Remove(rwXmlPath);
1023 String preloadedAppPath(PATH_USR_APPS);
1024 preloadedAppPath += L"/";
1025 preloadedAppPath += packageId;
1027 AppLog("uninstall updates for preloaded app. [%ls]", preloadedAppPath.GetPointer());
1028 originPath = preloadedAppPath;
1033 else if(InstallerUtil::IsCscPackage(packageId, cscInfo) == true)
1035 String tokenDelimiter(":");
1037 std::unique_ptr< IMap > pMap(InstallerUtil::ParseN(cscInfo, tokenDelimiter));
1038 TryReturn(pMap, false, "ParseN() failed. [%s]", GetErrorMessage(GetLastResult()));
1040 std::unique_ptr< IMapEnumerator > pEnum(pMap->GetMapEnumeratorN());
1041 TryReturn(pEnum, false, "GetMapEnumeratorN() failed. [%s]", GetErrorMessage(GetLastResult()));
1046 while (pEnum->MoveNext() == E_SUCCESS)
1048 String* pKey = static_cast< String* > (pEnum->GetKey());
1049 TryReturn(pEnum, false, "GetKey() failed. [%s]", GetErrorMessage(GetLastResult()));
1051 String* pValue = static_cast< String* > (pEnum->GetValue());
1052 TryReturn(pEnum, false, "GetValue() failed. [%s]", GetErrorMessage(GetLastResult()));
1054 AppLog("key = [%ls], value = [%ls]", pKey->GetPointer(), pValue->GetPointer());
1056 if (pKey->Equals(L"removable", false) == true)
1058 removable = (*pValue);
1061 if (pKey->Equals(L"path", false) == true)
1067 if (removable.Equals(L"false", false) == true)
1069 isCscPackage = true;
1071 AppLog("uninstall updates for csc-preloaded app [%ls]", path.GetPointer());
1072 originPath = cscInfo;
1078 AppLog("uninstall package for csc-preloaded app. [%ls]");
1086 InstallerManager::Request(const String& path, InstallerOperation operation, InstallerOption option, void* pPkgmgrInstaller, const String* pOptionalData)
1088 InstallerError errorType = INSTALLER_ERROR_NONE;
1089 InstallerManager* pInstallManager = null;
1091 if (File::IsFileExist(DIR_OSP_APPLICATIONS_TEMP) == true)
1093 InstallerUtil::Remove(DIR_OSP_APPLICATIONS_TEMP);
1096 if (File::IsFileExist(DIR_MEMORYCARD_OSP_APPLICATIONS_TEMP) == true)
1098 InstallerUtil::Remove(DIR_MEMORYCARD_OSP_APPLICATIONS_TEMP);
1101 pInstallManager = InstallerManager::GetInstance();
1102 TryCatch(pInstallManager, errorType = INSTALLER_ERROR_INTERNAL_STATE, "pInstallManager is null.");
1104 errorType = pInstallManager->Construct(path, operation, option, pPkgmgrInstaller, pOptionalData);
1105 TryCatch(errorType == INSTALLER_ERROR_NONE, , "pInstallManager->Construct() failed.");
1107 errorType = pInstallManager->Activate();
1108 TryCatch(errorType == INSTALLER_ERROR_NONE, , "pInstallManager->Activate() failed.");
1111 if (pInstallManager)
1113 pInstallManager->SetErrorType(errorType);
1115 if (!(option & INSTALLER_OPTION_NO_INPUT))
1117 pInstallManager->PrintResult();
1120 if (errorType != INSTALLER_ERROR_NONE)
1122 InstallerUtil::PrintLog(pInstallManager->GetLogFilePath());
1126 InstallerUtil::Remove(pInstallManager->GetHistoryLogFilePath());
1129 pInstallManager->Release();
1132 if (File::IsFileExist(DIR_OSP_APPLICATIONS_TEMP) == true)
1134 InstallerUtil::Remove(DIR_OSP_APPLICATIONS_TEMP);
1137 if (File::IsFileExist(DIR_MEMORYCARD_OSP_APPLICATIONS) == true)
1139 InstallerUtil::Remove(DIR_MEMORYCARD_OSP_APPLICATIONS);
1146 InstallerManager::RequestRecursiveDirectory(const Tizen::Base::String& path, int& errorType)
1148 Directory* pDir = null;
1149 DirEnumerator* pDirEnum = null;
1150 result r = E_SUCCESS;
1153 InstallerError error = INSTALLER_ERROR_NONE;
1155 int successCount = 0;
1156 int failureCount = 0;
1158 pDir = new (std::nothrow) Directory; // Allocate %Directory instance
1159 TryCatch(pDir, res = false, "pDir is null");
1161 r = pDir->Construct(path);
1162 TryCatch(!IsFailed(r), res = false, "pDir->Construct() failed, path = [%ls]", path.GetPointer());
1164 pDirEnum = pDir->ReadN();
1165 TryCatch(pDirEnum, res = false, "pDirEnum is null");
1167 while (pDirEnum->MoveNext() == E_SUCCESS)
1169 DirEntry entry = pDirEnum->GetCurrentDirEntry();
1171 String entryName = entry.GetName();
1172 String entryDir = path;
1174 entryDir += entryName;
1176 if (entryName == L"." || entryName == L"..")
1181 if (entry.IsDirectory() == false)
1186 const int entryLength = entryName.GetLength();
1187 if (entryLength == PACKAGE_ID_LENGTH)
1191 else if (entryLength == APP_DIR_LENGTH)
1193 if (entryName.Contains(PACKAGE_NAME_PREFIX_ORG) == false)
1195 AppLog(" - Not osp = [%ls]: prefix mismatch", entryDir.GetPointer());
1201 AppLog(" - Not osp = [%ls]: length(%d) mismatch", entryDir.GetPointer(), entryLength);
1206 xmlFile.Format(1024, L"%ls%ls", entryDir.GetPointer(), PACKAGE_XML_FILE);
1208 FileAttributes attr;
1209 r = File::GetAttributes(xmlFile, attr);
1212 AppLog(" - Not osp = [%ls]: No manifest.xml", entryDir.GetPointer());
1218 AppLog("------------------------------------------");
1219 AppLog(" # Directory = [%ls]", entryDir.GetPointer());
1221 errorType = Request(entryDir, INSTALLER_OPERATION_INSTALL, INSTALLER_OPTION_NORMAL, null);
1231 AppLog("------------------------------------------");
1234 AppLog("------------------------------------------");
1235 AppLog("recursive directory installation");
1236 AppLog(" # totalCount = [%d]", totalCount);
1237 AppLog(" # successCount = [%d]", successCount);
1238 AppLog(" # failureCount = [%d]", failureCount);
1247 InstallerManager::RequestByCommand(int argc, char **argv)
1250 char buf[BUFSIZE] = {0};
1252 InstallerOption option = INSTALLER_OPTION_NORMAL;
1254 AppLog(" # argc = [%d]", argc);
1256 for (int i = 0; i < argc; i++)
1258 AppLog(" # argv[%d] = [%s]", i, argv[i]);
1261 InstallerManager::ParseCommandArg(argc, argv, &mode, buf, option);
1263 AppLog("option = [%d]", (int)option);
1267 case INSTALLER_MODE_INSTALL:
1269 AppLog("------------------------------------------");
1270 AppLog(" # Directory = [%s]", buf);
1272 option = (InstallerOption)(option | INSTALLER_OPTION_FILELOG_ON);
1273 errorType = InstallerManager::Request(buf, INSTALLER_OPERATION_INSTALL, option, null);
1276 // in case of command, garbage directory is not deleted.
1277 // RemoveGarbage(buf);
1282 case INSTALLER_MODE_UNINSTALL:
1284 AppLog("------------------------------------------");
1285 AppLog(" # Directory = [%s]", buf);
1287 option = (InstallerOption)(option | INSTALLER_OPTION_FILELOG_ON);
1288 errorType = InstallerManager::Request(buf, INSTALLER_OPERATION_UNINSTALL, option, null);
1292 case INSTALLER_MODE_RECURSIVE_DIRECTORY_INSTALL:
1294 AppLog("------------------------------------------");
1296 errorType = InstallerManager::RequestRecursiveDirectory(buf, errorType);
1300 case INSTALLER_MODE_REINSTALL:
1302 AppLog("------------------------------------------");
1303 AppLog(" # Directory = [%s]", buf);
1305 option = (InstallerOption)(option | INSTALLER_OPTION_FILELOG_ON);
1306 errorType = InstallerManager::Request(buf, INSTALLER_OPERATION_REINSTALL, option, null);
1310 case INSTALLER_MODE_PARSE_CSC_STRING:
1312 AppLog("------------------------------------------");
1313 AppLog(" # CSC = [%s]", buf);
1315 option = (InstallerOption)(option | INSTALLER_OPTION_FILELOG_ON);
1316 errorType = InstallerManager::RequestCsc(buf, option);
1322 AppLog("__install_package_by_cmd, Invalid mode");
1327 AppLog("==========================================");
1329 if (option & INSTALLER_OPTION_UPDATE_STDOUT)
1331 AppLog("stdout is updated by errorType [%d]", errorType);
1332 fprintf(stdout, "%d", errorType);
1339 InstallerManager::RequestMove(const PackageId& packageId, int moveType)
1341 result r = E_SUCCESS;
1343 InstallerError errorType = INSTALLER_ERROR_NONE;
1344 app2ext_handle* pHandle = null;
1345 app2ext_move_type location = APP2EXT_MOVE_TO_EXT;
1346 GList* pDirectoryList = null;
1347 Directory* pDir = null;
1348 DirEnumerator* pDirEnum = null;
1349 PackageInfo* pPackageInfo = null;
1350 _PackageInfoImpl* pPackageInfoImpl = null;
1353 std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
1354 TryReturn(pPackageId, INSTALLER_ERROR_OUT_OF_MEMORY, "pPackageId is null");
1356 if (moveType == PM_MOVE_TO_INTERNAL)
1358 location = APP2EXT_MOVE_TO_PHONE;
1361 pPackageInfo = _PackageManagerImpl::GetInstance()->GetPackageInfoN(packageId);
1362 TryCatch(pPackageInfo != null, errorType = INSTALLER_ERROR_INTERNAL_STATE, "GetPackageInfoN() failed");
1364 pPackageInfoImpl = _PackageInfoImpl::GetInstance(pPackageInfo);
1365 TryCatch(pPackageInfoImpl, errorType = INSTALLER_ERROR_INTERNAL_STATE, "GetInstance() failed");
1367 rootPath = pPackageInfoImpl->GetAppRootPath();
1369 pHandle = app2ext_init(APP2EXT_SD_CARD);
1370 TryCatch(pHandle, errorType = INSTALLER_ERROR_INTERNAL_STATE, "app2ext_init() failed");
1372 if (location == APP2EXT_MOVE_TO_PHONE)
1374 res = pHandle->interface.enable(pPackageId.get());
1377 pDir = new (std::nothrow) Directory;
1378 TryCatch(pDir, errorType = INSTALLER_ERROR_OUT_OF_MEMORY, "pDir is null");
1380 r = pDir->Construct(rootPath);
1381 TryCatch(!IsFailed(r), errorType = INSTALLER_ERROR_INTERNAL_STATE, "pDir->Construct() failed, path = [%ls]", rootPath.GetPointer());
1383 pDirEnum = pDir->ReadN();
1384 TryCatch(pDirEnum, errorType = INSTALLER_ERROR_INTERNAL_STATE, "pDirEnum is null");
1386 while (pDirEnum->MoveNext() == E_SUCCESS)
1388 DirEntry entry = pDirEnum->GetCurrentDirEntry();
1390 String entryName = entry.GetName();
1392 if (entryName == L"." || entryName == L"..")
1397 if (entry.IsDirectory() == false)
1402 if (entryName.StartsWith(L".", 0) == true)
1408 app2ext_dir_details* pDirDetails = null;
1410 pDirDetails = (app2ext_dir_details*) calloc(1, sizeof(app2ext_dir_details));
1411 TryCatch(pDirDetails, errorType = INSTALLER_ERROR_INTERNAL_STATE, "pDirDetails is null");
1413 length = entryName.GetLength();
1414 pDirDetails->name = (char*) calloc(1, (sizeof(char) * length) + 1);
1415 snprintf(pDirDetails->name, length + 1, "%ls", entryName.GetPointer());
1417 String data(L"data");
1418 String shared(L"shared");
1419 String setting(L"setting");
1421 if (entryName.Contains(data) || entryName.Contains(shared) || entryName.Contains(setting))
1423 pDirDetails->type = APP2EXT_DIR_RW;
1427 pDirDetails->type = APP2EXT_DIR_RO;
1430 AppLog("------------------------------------------");
1431 AppLog("# Root Directory = [%s], Type = [%d]", pDirDetails->name, pDirDetails->type);
1433 pDirectoryList = g_list_append(pDirectoryList, pDirDetails);
1436 res = pHandle->interface.move(pPackageId.get(), pDirectoryList, location);
1437 TryCatch(res == 0, errorType = INSTALLER_ERROR_INTERNAL_STATE, "pHandle->interface.move() failed [%d]", res);
1442 app2ext_deinit(pHandle);
1447 GList* pList = null;
1448 app2ext_dir_details* pDirDetails = null;
1450 pList = g_list_first(pDirectoryList);
1453 pDirDetails = (app2ext_dir_details*)pList->data;
1454 if (pDirDetails && pDirDetails->name)
1456 free(pDirDetails->name);
1458 pList = g_list_next(pList);
1460 g_list_free(pDirectoryList);
1465 delete pPackageInfo;
1471 InstallerManager::RequestCsc(const String& buffer, InstallerOption option, void* pPkgmgrInstaller)
1476 String tokenDelimiter(":");
1478 std::unique_ptr< IMap > pMap(InstallerUtil::ParseN(str, tokenDelimiter));
1479 TryReturn(pMap, INSTALLER_ERROR_FATAL_ERROR, "CSC String[%ls] is invalid.", buffer.GetPointer());
1481 std::unique_ptr< IMapEnumerator > pEnum(pMap->GetMapEnumeratorN());
1482 TryReturn(pEnum, INSTALLER_ERROR_FATAL_ERROR, "GetMapEnumeratorN() failed. [%s]", GetErrorMessage(GetLastResult()));
1488 // format -> "path=/opt/usr/apps/22VoFBmj2I/:op=install:removable=true"
1489 // format -> "path=yandexmaps:op=uninstall"
1491 while (pEnum->MoveNext() == E_SUCCESS)
1493 String* pKey = static_cast< String* > (pEnum->GetKey());
1494 TryReturn(pEnum, -1, "GetKey() failed. [%s]", GetErrorMessage(GetLastResult()));
1496 String* pValue = static_cast< String* > (pEnum->GetValue());
1497 TryReturn(pEnum, -1, "GetValue() failed. [%s]", GetErrorMessage(GetLastResult()));
1499 AppLog("key = [%ls], value = [%ls]", pKey->GetPointer(), pValue->GetPointer());
1501 if (pKey->Equals(L"path", false) == true)
1506 if (pKey->Equals(L"op", false) == true)
1511 if (pKey->Equals(L"removable", false) == true)
1513 removable = (*pValue);
1517 AppLog("path = [%ls], op = [%ls], removable = [%ls]", path.GetPointer(), op.GetPointer(), removable.GetPointer());
1519 if (op.Equals(L"install", false) == true)
1521 errorType = InstallerManager::Request(path, INSTALLER_OPERATION_INSTALL, option, pPkgmgrInstaller, &buffer);
1523 else if (op.Equals(L"uninstall", false) == true)
1525 errorType = InstallerManager::Request(path, INSTALLER_OPERATION_UNINSTALL, option, null);
1529 AppLog("Operation[%ls] is invalid.", op.GetPointer());
1530 errorType = INSTALLER_ERROR_FATAL_ERROR;