IssueNo:#I44HOB

Description:change uninstall callback
Sig:appexecfwk
Feature or Bugfix:Bugfix
Binary Source:No

Signed-off-by: wangdengjia <wangdengjia@huawei.com>
This commit is contained in:
openharmony_ci
2021-07-19 13:11:36 +00:00
committed by wangdengjia
14 changed files with 156 additions and 81 deletions
@@ -47,7 +47,7 @@ public:
bool GetInstallState(const char *bundleName, InstallState *installState, uint8_t *installProcess) const;
bool GetUninstallState(const char *bundleName, UninstallState *uninstallState) const;
uint32_t GetBundleSize(const char *bundleName) const;
private:
BundleMsClient() = default;
@@ -24,8 +24,8 @@ bool GetInstallState(const char *bundleName, InstallState *installState, uint8_t
return OHOS::BundleMsClient::GetInstance().GetInstallState(bundleName, installState, installProcess);
}
bool GetUninstallState(const char *bundleName, UninstallState *uninstallState)
uint32_t GetBundleSize(const char *bundleName)
{
return OHOS::BundleMsClient::GetInstance().GetUninstallState(bundleName, uninstallState);
return OHOS::BundleMsClient::GetInstance().GetBundleSize(bundleName);
}
}
@@ -158,11 +158,11 @@ bool BundleMsClient::GetInstallState (const char *bundleName, InstallState *inst
return bmsProxy_->GetInstallState(bundleName, installState, installProcess);
}
bool BundleMsClient::GetUninstallState (const char *bundleName, UninstallState *uninstallState) const
uint32_t BundleMsClient::GetBundleSize (const char *bundleName) const
{
if (!Initialize()) {
return false;
return -1;
}
return bmsProxy_->GetUninstallState(bundleName, uninstallState);
return bmsProxy_->GetBundleSize(bundleName);
}
} // namespace OHOS
@@ -50,7 +50,7 @@ struct BmsSliteInterface {
uint8_t (*GetBundleInfo)(const char *bundleName, int32_t flags, BundleInfo *bundleInfo);
uint8_t (*GetBundleInfos)(int32_t flags, BundleInfo **bundleInfos, int32_t *len);
bool (*GetInstallState)(const char *bundleName, InstallState *installState, uint8_t *installProcess);
bool (*GetUninstallState)(const char *bundleName, UninstallState *uninstallState);
uint32_t (*GetBundleSize)(const char *bundleName);
};
#ifdef __cplusplus
#if __cplusplus
@@ -27,7 +27,10 @@ extern "C" {
typedef enum {
BUNDLE_INSTALL_DOING = 0,
BUNDLE_INSTALL_OK = 1,
BUNDLE_INSTALL_FAIL = 2
BUNDLE_INSTALL_FAIL = 2,
BUNDLE_UNINSTALL_DOING = 3,
BUNDLE_UNINSTALL_OK = 4,
BUNDLE_UNINSTALL_FAIL = 5
} InstallState;
typedef struct {
@@ -39,12 +42,6 @@ typedef struct {
uint8_t installProcess;
} BundleInstallMsg;
typedef enum {
BUNDLE_UNINSTALL_DOING = 0,
BUNDLE_UNINSTALL_OK = 1,
BUNDLE_UNINSTALL_FAIL = 2
} UninstallState;
/**
* @brief Get the install state and install process of the bundle.
*
@@ -59,14 +56,13 @@ typedef enum {
bool GetInstallState(const char *bundleName, InstallState *installState, uint8_t *installProcess);
/**
* @brief Get the uninstall state and uninstall state of the bundle.
* @brief Get the bundle size.
*
* @param bundleName Indicates the name of the bundle.
* @param uninstallState Obtains uninstall state.
* @return Returns success or not.
* @return Returns bundle size or returns 0 if get bundle size failed.
*
*/
bool GetUninstallState(const char *bundleName, UninstallState *uninstallState);
uint32_t GetBundleSize(const char *bundleName);
#ifdef __cplusplus
#if __cplusplus
@@ -36,7 +36,7 @@ public:
static uint8_t GetBundleInfo(const char *bundleName, int32_t flags, BundleInfo *bundleInfo);
static uint8_t GetBundleInfos(int32_t flags, BundleInfo **bundleInfos, int32_t *len);
static bool GetInstallState(const char *bundleName, InstallState *installState, uint8_t *installProcess);
static bool GetUninstallState(const char *bundleName, UninstallState *uninstallState);
static uint32_t GetBundleSize (const char *bundleName);
static BundleMgrSliteFeature *GetInstance()
{
@@ -36,6 +36,8 @@ public:
static bool StartWith(const char *str, const char *subStr);
static cJSON *GetJsonStream(const char *path);
static uint32_t GetFileSize(const char *filePath);
static uint32_t GetFileFolderSize(const char *filePath);
static uint32_t GetCurrentFolderSize(const char *dirPath, List<char *>* list);
static cJSON *ConvertInstallRecordToJson(const InstallRecord &installRecord);
static char *GetValueFromBundleJson(const char *bundleName, const char *key);
static int32_t GetValueFromBundleJson(const char *bundleName, const char *key, int32_t defaultValue);
@@ -26,7 +26,7 @@ public:
uint8_t bundleStyle);
static char *ExtractHapProfile(int32_t fp, uint32_t totalFileSize);
static uint8_t ExtractBundleParam(const char *path, int32_t &fpStart, char **bundleName);
static bool ExtractInstallMsg(const char *path, char **bundleName, char **label, char **smallIconPath,
static uint8_t ExtractInstallMsg(const char *path, char **bundleName, char **label, char **smallIconPath,
char **bigIconPath);
private:
static uint8_t ExtractFileDataPos(int32_t fp, uint64_t &filePos);
@@ -49,11 +49,6 @@ typedef enum {
BUNDLE_UPDATE,
} BundleState;
typedef struct {
char *bundleName;
UninstallState uninstallState;
} BundleUninstallMsg;
class GtManagerService {
public:
static GtManagerService &GetInstance()
@@ -79,10 +74,10 @@ public:
void ReduceNumOfThirdBundles();
int32_t ReportInstallCallback(uint8_t errCode, uint8_t installState,
uint8_t process, InstallerCallback installerCallback);
int32_t ReportUninstallCallback(uint8_t errCode, char *bundleName,
int32_t ReportUninstallCallback(uint8_t errCode, uint8_t installState, char *bundleName,
uint8_t process, InstallerCallback installerCallback);
bool GetInstallState(const char *bundleName, InstallState *installState, uint8_t *installProcess);
bool GetUninstallState(const char *bundleName, UninstallState *uninstallState);
uint32_t GetBundleSize(const char *bundleName);
private:
GtManagerService();
@@ -112,7 +107,6 @@ private:
BundleMap *bundleMap_;
List<BundleRes *> *bundleResList_;
BundleInstallMsg *bundleInstallMsg_;
BundleUninstallMsg *bundleUninstallMsg_;
char *jsEngineVer_;
uint32_t installedThirdBundleNum_;
};
@@ -33,7 +33,7 @@ BundleMgrSliteFeatureImpl g_bmsSliteImpl = {
.GetBundleInfo = BundleMgrSliteFeature::GetBundleInfo,
.GetBundleInfos = BundleMgrSliteFeature::GetBundleInfos,
.GetInstallState = BundleMgrSliteFeature::GetInstallState,
.GetUninstallState = BundleMgrSliteFeature::GetUninstallState,
.GetBundleSize = BundleMgrSliteFeature::GetBundleSize,
DEFAULT_IUNKNOWN_ENTRY_END
};
@@ -128,8 +128,8 @@ bool BundleMgrSliteFeature::GetInstallState(const char *bundleName, InstallState
return OHOS::GtManagerService::GetInstance().GetInstallState(bundleName, installState, installProcess);
}
bool BundleMgrSliteFeature::GetUninstallState(const char *bundleName, UninstallState *uninstallState)
uint32_t BundleMgrSliteFeature::GetBundleSize(const char *bundleName)
{
return OHOS::GtManagerService::GetInstance().GetUninstallState(bundleName, uninstallState);
return OHOS::GtManagerService::GetInstance().GetBundleSize(bundleName);
}
} // namespace OHOS
@@ -182,6 +182,80 @@ uint32_t BundleUtil::GetFileSize(const char *filePath)
return fileInfo.st_size;
}
uint32_t BundleUtil::GetFileFolderSize(const char *filePath)
{
if (!CheckRealPath(filePath)) {
return 0;
}
List<char *>* list = new (std::nothrow)List<char *>();
if (list == nullptr) {
#ifdef APP_PLATFORM_WATCHGT
HILOG_ERROR(HILOG_MODULE_AAFWK, "[BMS] GetFolderSize failed, list is null");
#endif
return 0;
}
list->PushFront(Utils::Strdup(filePath));
uint32_t fileFolderSize = 0;
while(!list->IsEmpty()) {
char *curPath = list->Front();
if (curPath == nullptr) {
break;
}
fileFolderSize += GetCurrentFolderSize(curPath, list);
list->PopFront();
AdapterFree(curPath);
}
if (!list->IsEmpty()) {
#ifdef APP_PLATFORM_WATCHGT
HILOG_ERROR(HILOG_MODULE_AAFWK, "[BMS] After get folder size, list is still not empty");
#endif
for (auto node = list->Begin(); node != list->End(); node = node->next_) {
AdapterFree(node->value_);
}
}
delete list;
return fileFolderSize;
}
uint32_t BundleUtil::GetCurrentFolderSize(const char *dirPath, List<char *>* list)
{
DIR *dir = nullptr;
if ((dir = opendir(dirPath)) == nullptr) {
return 0;
}
dirent *dp = nullptr;
char filePath[PATH_LENGTH] = { 0 };
struct stat buf = { 0 };
uint32_t fileSize = 0;
while ((dp = readdir(dir)) != nullptr) {
if ((strcmp(dp->d_name, ".") == 0) || (strcmp(dp->d_name, "..")) == 0) {
continue;
}
if (memset_s(filePath, PATH_LENGTH, 0, PATH_LENGTH) != EOK) {
continue;
}
if (sprintf_s(filePath, PATH_LENGTH, "%s/%s", dirPath, dp->d_name) < 0) {
continue;
}
if (IsFile(filePath)) {
if (stat(filePath, &buf) != 0 || buf.st_size <= 0) {
fileSize = 0;
break;
}
fileSize += buf.st_size;
} else {
list->PushBack(Utils::Strdup(filePath));
}
}
closedir(dir);
return fileSize;
}
void BundleUtil::DeleteJsonFile(const char *bundleName, const char *randStr)
{
if (bundleName == nullptr || randStr == nullptr) {
@@ -179,45 +179,45 @@ bool GtBundleExtractor::ExtractResourceFile(const char *path, int32_t fp, uint32
return true;
}
bool GtBundleExtractor::ExtractInstallMsg(const char *path, char **bundleName, char **label, char **smallIconPath,
uint8_t GtBundleExtractor::ExtractInstallMsg(const char *path, char **bundleName, char **label, char **smallIconPath,
char **bigIconPath)
{
if (!BundleUtil::CheckRealPath(path)) {
return false;
return ERR_APPEXECFWK_INSTALL_FAILED_PARAM_ERROR;
}
int32_t totalFileSize = APPVERI_GetUnsignedFileLength(path);
if (totalFileSize == V_ERR) {
return false;
return ERR_APPEXECFWK_INSTALL_FAILED_INTERNAL_ERROR;
}
char *emptyJsPathComp[] = {const_cast<char *>(TMP_RESOURCE_DIR), const_cast<char *>(ASSET_JS_PATH)};
char *emptyJsPath = BundleUtil::Strscat(emptyJsPathComp, sizeof(emptyJsPathComp) / sizeof(char *));
if (emptyJsPath == nullptr) {
return false;
return ERR_APPEXECFWK_INSTALL_FAILED_INTERNAL_ERROR;
}
if (!BundleUtil::MkDirs(emptyJsPath)) {
AdapterFree(emptyJsPath);
return false;
return ERR_APPEXECFWK_INSTALL_FAILED_CREATE_DATA_DIR_ERROR;
}
AdapterFree(emptyJsPath);
int32_t fp = open(path, O_RDONLY, S_IREAD | S_IWRITE);
if (fp < 0) {
return false;
return ERR_APPEXECFWK_INSTALL_FAILED_FILE_NOT_EXISTS;
}
// extractor config.json、 resources dir and resources.index in TMP_RESOURCE_DIR
if (!ExtractResourceFile(TMP_RESOURCE_DIR, fp, static_cast<uint32_t>(totalFileSize))) {
close(fp);
return false;
return ERR_APPEXECFWK_INSTALL_FAILED_PARSE_PROFILE_ERROR;
}
close(fp);
// get bundleName、 label、 smallIconPath and bigIconPath from bundleInfo
BundleRes bundleRes = { 0 };
BundleInfo *bundleInfo = GtBundleParser::ParseHapProfile(TMP_RESOURCE_DIR, &bundleRes);
if (bundleInfo == nullptr) {
return false;
return ERR_APPEXECFWK_INSTALL_FAILED_PARSE_PROFILE_ERROR;
}
if (bundleRes.abilityRes != nullptr) {
AdapterFree(bundleRes.abilityRes);
@@ -228,10 +228,10 @@ bool GtBundleExtractor::ExtractInstallMsg(const char *path, char **bundleName, c
*bigIconPath = Utils::Strdup(bundleInfo->bigIconPath);
if (*bundleName == nullptr || *label == nullptr || *smallIconPath == nullptr || *bigIconPath == nullptr) {
BundleInfoUtils::FreeBundleInfo(bundleInfo);
return false;
return ERR_APPEXECFWK_INSTALL_FAILED_PARSE_ABILITIES_ERROR;
}
BundleInfoUtils::FreeBundleInfo(bundleInfo);
return true;
return ERR_OK;
}
uint8_t GtBundleExtractor::ExtractBundleParam(const char *path, int32_t &fpStart, char **bundleName)
@@ -234,8 +234,8 @@ uint8_t GtBundleInstaller::ProcessBundleInstall(const char *path, const char *ra
BundleInfo *bundleInfo = nullptr;
(void) GtManagerService::GetInstance().ReportInstallCallback(OPERATION_DOING, 0, BMS_FIRST_FINISHED_PROCESS, installerCallback);
uint8_t errorCode = PreCheckBundle(path, fp, signatureInfo, fileSize, bundleStyle);
(void) GtManagerService::GetInstance().ReportInstallCallback(OPERATION_DOING, 0, BMS_SECOND_FINISHED_PROCESS, installerCallback);
CHECK_PRO_RESULT(errorCode, fp, permissions, bundleInfo, signatureInfo);
(void) GtManagerService::GetInstance().ReportInstallCallback(OPERATION_DOING, 0, BMS_SECOND_FINISHED_PROCESS, installerCallback);
// parse HarmoyProfile.json, get permissions and bundleInfo
errorCode = GtBundleParser::ParseHapProfile(fp, fileSize, permissions, bundleRes, &bundleInfo);
CHECK_PRO_RESULT(errorCode, fp, permissions, bundleInfo, signatureInfo);
@@ -285,6 +285,11 @@ uint8_t GtBundleInstaller::ProcessBundleInstall(const char *path, const char *ra
errorCode = MoveRawFileToDataPath(bundleInfo);
CHECK_PRO_ROLLBACK(errorCode, permissions, bundleInfo, signatureInfo, randStr);
(void) GtManagerService::GetInstance().ReportInstallCallback(OPERATION_DOING, 0, BMS_FIFTH_FINISHED_PROCESS, installerCallback);
// store permissions
errorCode = StorePermissions(installRecord.bundleName, permissions.permissionTrans, permissions.permNum,
isUpdate);
CHECK_PRO_ROLLBACK(errorCode, permissions, bundleInfo, signatureInfo, randStr);
// update bundle Info
errorCode = UpdateBundleInfo(bundleStyle, labelId, iconId, bundleInfo, isUpdate);
CHECK_PRO_ROLLBACK(errorCode, permissions, bundleInfo, signatureInfo, randStr);
// free memory
@@ -572,6 +577,10 @@ uint8_t GtBundleInstaller::Uninstall(const char *bundleName)
return ERR_APPEXECFWK_UNINSTALL_FAILED_INTERNAL_ERROR;
}
if (DeletePermissions(const_cast<char *>(bundleName)) < 0) {
return ERR_APPEXECFWK_UNINSTALL_FAILED_DELETE_PERMISSIONS_ERROR;
}
bool res = CheckIsThirdSystemBundle(bundleName);
if (!(BundleUtil::RemoveDir(bundleInfo->codePath) && BundleUtil::RemoveDir(bundleInfo->dataPath))) {
GtManagerService::GetInstance().RemoveBundleInfo(bundleName);
@@ -49,7 +49,6 @@ GtManagerService::GtManagerService()
bundleResList_ = new List<BundleRes *>();
bundleMap_ = BundleMap::GetInstance();
bundleInstallMsg_ = nullptr;
bundleUninstallMsg_ = nullptr;
jsEngineVer_ = nullptr;
installedThirdBundleNum_ = 0;
}
@@ -95,20 +94,25 @@ bool GtManagerService::Install(const char *hapPath, const InstallParam *installP
return false;
}
// set bundleName、label、smallIconPath、bigIconPath in bundleInstallMsg_
bool isSuccess = GtBundleExtractor::ExtractInstallMsg(path, &(bundleInstallMsg_->bundleName),
uint8_t ret = GtBundleExtractor::ExtractInstallMsg(path, &(bundleInstallMsg_->bundleName),
&(bundleInstallMsg_->label), &(bundleInstallMsg_->smallIconPath),
&(bundleInstallMsg_->bigIconPath));
if (!isSuccess) {
if (ret != 0) {
char *name = strchr(path, '/');
bundleInstallMsg_->bundleName = Utils::Strdup(name + 1);
(void) ReportInstallCallback(ret, BUNDLE_INSTALL_FAIL, BMS_INSTALLATION_COMPLETED, installerCallback);
// delete resource temp dir
(void) BundleUtil::RemoveDir(TMP_RESOURCE_DIR);
ClearSystemBundleInstallMsg();
AdapterFree(path);
return false;
}
SetCurrentBundle(bundleInstallMsg_->bundleName);
(void) ReportInstallCallback(OPERATION_DOING, 0, BMS_INSTALLATION_START, installerCallback);
DisableServiceWdg();
uint8_t ret = installer_->Install(path, installerCallback);
ret = installer_->Install(path, installerCallback);
EnableServiceWdg();
if (ret == 0) {
(void) ReportInstallCallback(ret, BUNDLE_INSTALL_OK, BMS_INSTALLATION_COMPLETED, installerCallback);
@@ -145,30 +149,19 @@ bool GtManagerService::Uninstall(const char *bundleName, const InstallParam *ins
}
SetCurrentBundle(innerBundleName);
bundleUninstallMsg_ = reinterpret_cast<BundleUninstallMsg *>(AdapterMalloc(sizeof(BundleUninstallMsg)));
if (bundleUninstallMsg_ == nullptr) {
return false;
}
if (memset_s(bundleUninstallMsg_, sizeof(BundleUninstallMsg), 0, sizeof(BundleUninstallMsg)) != EOK) {
AdapterFree(bundleUninstallMsg_);
return false;
}
bundleUninstallMsg_->bundleName = innerBundleName;
bundleUninstallMsg_->uninstallState = BUNDLE_UNINSTALL_DOING;
(void) ReportUninstallCallback(OPERATION_DOING, innerBundleName, BMS_UNINSTALLATION_START, installerCallback);
(void) ReportUninstallCallback(OPERATION_DOING, BUNDLE_UNINSTALL_DOING, innerBundleName,
BMS_UNINSTALLATION_START, installerCallback);
uint8_t ret = installer_->Uninstall(innerBundleName);
if (ret == 0) {
bundleUninstallMsg_->uninstallState = BUNDLE_UNINSTALL_OK;
(void) ReportUninstallCallback(ret, BUNDLE_UNINSTALL_OK, innerBundleName,
BMS_INSTALLATION_COMPLETED, installerCallback);
} else {
bundleUninstallMsg_->uninstallState = BUNDLE_UNINSTALL_FAIL;
(void) ReportUninstallCallback(ret, BUNDLE_UNINSTALL_FAIL, innerBundleName,
BMS_INSTALLATION_COMPLETED, installerCallback);
}
(void) ReportUninstallCallback(ret, innerBundleName, BMS_INSTALLATION_COMPLETED, installerCallback);
SetCurrentBundle(nullptr);
AdapterFree(innerBundleName);
AdapterFree(bundleUninstallMsg_);
bundleUninstallMsg_ = nullptr;
return true;
}
@@ -198,19 +191,25 @@ bool GtManagerService::GetInstallState(const char *bundleName, InstallState *ins
return true;
}
bool GtManagerService::GetUninstallState(const char *bundleName, UninstallState *uninstallState)
uint32_t GtManagerService::GetBundleSize(const char *bundleName)
{
BundleInfo *uninstalledInfo = bundleMap_->Get(bundleName);
if (uninstalledInfo == nullptr) {
*uninstallState = BUNDLE_UNINSTALL_OK;
return true;
if (bundleName == nullptr) {
return 0;
}
if (strcmp(bundleName, bundleUninstallMsg_->bundleName) == 0) {
*uninstallState = bundleUninstallMsg_->uninstallState;
return true;
BundleInfo *installedInfo = bundleMap_->Get(bundleName);
if (installedInfo == nullptr) {
HILOG_INFO(HILOG_MODULE_AAFWK, "[BMS] failed to get bundle size because the bundle does not exist!");
return 0;
}
*uninstallState = BUNDLE_UNINSTALL_DOING;
return true;
char *codePath = installedInfo->codePath;
uint32_t codeBundleSize = BundleUtil::GetFileFolderSize(codePath);
if (codeBundleSize == 0) {
HILOG_ERROR(HILOG_MODULE_AAFWK, "[BMS] failed to get code bundle size!");
return 0;
}
char *dataPath = installedInfo->dataPath;
uint32_t dataBundleSize = BundleUtil::GetFileFolderSize(dataPath);
return codeBundleSize + dataBundleSize;
}
uint8_t GtManagerService::QueryAbilityInfo(const Want *want, AbilityInfo *abilityInfo)
@@ -290,10 +289,10 @@ void GtManagerService::InstallSystemBundle(const char *systemAppPath)
return;
}
// set bundleName、label、smallIconPath、bigIconPath in bundleInstallMsg_
bool ret = GtBundleExtractor::ExtractInstallMsg(systemAppPath, &(bundleInstallMsg_->bundleName),
uint8_t ret = GtBundleExtractor::ExtractInstallMsg(systemAppPath, &(bundleInstallMsg_->bundleName),
&(bundleInstallMsg_->label), &(bundleInstallMsg_->smallIconPath),
&(bundleInstallMsg_->bigIconPath));
if (!ret) {
if (ret != 0) {
// delete resource temp dir
(void) BundleUtil::RemoveDir(TMP_RESOURCE_DIR);
ClearSystemBundleInstallMsg();
@@ -883,19 +882,20 @@ int32_t GtManagerService::ReportInstallCallback(uint8_t errCode, uint8_t install
return 0;
}
int32_t GtManagerService::ReportUninstallCallback(uint8_t errCode, char *bundleName,
int32_t GtManagerService::ReportUninstallCallback(uint8_t errCode, uint8_t installState, char *bundleName,
uint8_t process, InstallerCallback installerCallback)
{
if (installerCallback == nullptr) {
return -1;
}
BundleInstallMsg *bundleUninstallMsg = reinterpret_cast<BundleInstallMsg *>(AdapterMalloc(sizeof(BundleInstallMsg)));
if (bundleUninstallMsg == nullptr) {
BundleInstallMsg *bundleInstallMsg = reinterpret_cast<BundleInstallMsg *>(AdapterMalloc(sizeof(BundleInstallMsg)));
if (bundleInstallMsg == nullptr) {
return -1;
}
bundleUninstallMsg->bundleName = bundleName;
bundleUninstallMsg->installProcess = process;
(*installerCallback)(errCode, bundleUninstallMsg);
bundleInstallMsg->installState = static_cast<InstallState>(installState);
bundleInstallMsg->bundleName = bundleName;
bundleInstallMsg->installProcess = process;
(*installerCallback)(errCode, bundleInstallMsg);
return 0;
}