+ std::string dllPath = absDllPath;
+ std::string fileName = getFileName(absDllPath);
+ if (opt->flags & NI_FLAGS_APPNI) {
+ std::string niDirPath;
+ std::string niTmpDirPath;
+ std::string prevPath;
+
+ prevPath = getBaseName(absDllPath);
+ niDirPath = concatPath(prevPath, APP_NI_SUB_DIR);
+ niTmpDirPath = concatPath(prevPath, APP_NI_SUB_TMP_DIR);
+
+ if (opt->flags & NI_FLAGS_APP_UNDER_RO_AREA) {
+ niTmpDirPath = replaceAll(niTmpDirPath, getBaseName(__pm->getAppRootPath()), __READ_ONLY_APP_UPDATE_DIR);
+ niDirPath = replaceAll(niDirPath, getBaseName(__pm->getAppRootPath()), __READ_ONLY_APP_UPDATE_DIR);
+ _INFO("App is installed in RO area. Change NI path to RW area(%s).", niTmpDirPath.c_str());
+ }
+
+ if (!isDirectory(niDirPath)) {
+ if (!createDirsAndCopyOwnerShip(niTmpDirPath, prevPath)) {
+ niTmpDirPath = prevPath;
+ _SERR("fail to create dir (%s)", niTmpDirPath.c_str());
+ }
+ dllPath = concatPath(niTmpDirPath, fileName);
+ } else {
+ dllPath = concatPath(niDirPath, fileName);
+ }
+ } else if (opt->flags & NI_FLAGS_RESOURCE_NI) {
+ std::string rpkDir = concatPath(__pm->getAppRootPath(), APP_NI_SUB_DIR);
+ dllPath = createDir(rpkDir) ? concatPath(rpkDir, fileName) : concatPath(__pm->getAppRootPath(), fileName);
+ }
+