* @version 1.0
* @brief Implementation file for installer task database updating
*/
+#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#include <widget_install/task_file_manipulation.h>
namespace {
const char* GLIST_RES_DIR = "res";
-const char* GLIST_BIN_DIR = "bin";
bool _FolderCopy(std::string source, std::string dest)
{
return false;
}
- struct dirent* dEntry = NULL;
+ struct dirent dEntry;
+ struct dirent *dEntryResult;
+ int return_code;
+
do {
struct stat statInfo;
- if (dEntry = readdir(dir)) {
- std::string fileName = dEntry->d_name;
+ return_code = readdir_r(dir, &dEntry, &dEntryResult);
+ if (dEntryResult != NULL && return_code == 0) {
+ std::string fileName = dEntry.d_name;
std::string fullName = source + "/" + fileName;
if (stat(fullName.c_str(), &statInfo) != 0) {
+ closedir(dir);
return false;
}
if (S_ISDIR(statInfo.st_mode)) {
- if(("." == fileName) || (".." == fileName)) {
+ if (("." == fileName) || (".." == fileName)) {
continue;
}
std::string destFolder = dest + "/" + fileName;
outfile.close();
infile.close();
}
- } while(dEntry);
+ } while (dEntryResult != NULL && return_code == 0);
closedir(dir);
return true;
}
namespace WidgetInstall {
TaskFileManipulation::TaskFileManipulation(InstallerContext& context) :
DPL::TaskDecl<TaskFileManipulation>(this),
- m_context(context)
+ m_context(context),
+ m_extHandle(NULL)
{
if (INSTALL_LOCATION_TYPE_EXTERNAL !=
- m_context.locationType) {
+ m_context.locationType)
+ {
AddStep(&TaskFileManipulation::StepCreateDirs);
AddStep(&TaskFileManipulation::StepCreatePrivateStorageDir);
- AddStep(&TaskFileManipulation::StepCreateShareDir);
if (m_context.widgetConfig.packagingType !=
- WrtDB::PKG_TYPE_DIRECTORY_WEB_APP)
+ WrtDB::PKG_TYPE_DIRECTORY_WEB_APP)
{
AddStep(&TaskFileManipulation::StepRenamePath);
AddAbortStep(&TaskFileManipulation::StepAbortRenamePath);
AddStep(&TaskFileManipulation::StepPrepareExternalDir);
AddStep(&TaskFileManipulation::StepInstallToExternal);
AddStep(&TaskFileManipulation::StepCreatePrivateStorageDir);
- AddStep(&TaskFileManipulation::StepCreateShareDir);
AddAbortStep(&TaskFileManipulation::StepAbortCreateExternalDir);
}
std::string storagePath = m_context.locations->getPrivateStorageDir();
if (euidaccess(storagePath.c_str(), F_OK) != 0) {
- if(!WrtUtilMakeDir(storagePath, PRIVATE_STORAGE_MODE)){
+ if (!WrtUtilMakeDir(storagePath, PRIVATE_STORAGE_MODE)) {
LogError("Failed to create directory for private storage");
- ThrowMsg(Exceptions::InternalError,
- "Failed to create directory for private storage");
+ ThrowMsg(Exceptions::FileOperationFailed,
+ "Failed to create directory for private storage");
}
// '5000' is default uid, gid for applications.
- // So installed applications should be launched as process of uid '5000'.
+ // So installed applications should be launched as process of uid
+ // '5000'.
// the process can access private directory 'data' of itself.
- if(chown(storagePath.c_str(),
- WEBAPP_DEFAULT_UID,
- WEBAPP_DEFAULT_GID) != 0)
+ if (chown(storagePath.c_str(),
+ WEBAPP_DEFAULT_UID,
+ WEBAPP_DEFAULT_GID) != 0)
{
- ThrowMsg(Exceptions::InternalError,
- "Chown to invaild user");
+ ThrowMsg(Exceptions::FileOperationFailed,
+ "Chown to invaild user");
}
} else if (euidaccess(storagePath.c_str(), W_OK | R_OK | X_OK) == 0) {
LogInfo("Private storage already exists.");
// Even if private directory already is created, private dircetory
// should change owner.
- if(chown(storagePath.c_str(),
- WEBAPP_DEFAULT_UID,
- WEBAPP_DEFAULT_GID) != 0)
- {
- ThrowMsg(Exceptions::InternalError,
- "Chown to invaild user");
- }
- if(chmod(storagePath.c_str(), PRIVATE_STORAGE_MODE) != 0) {
- ThrowMsg(Exceptions::InternalError,
- "chmod to 0700");
- }
-
- } else {
- ThrowMsg(Exceptions::InternalError,
- "No access to private storage.");
- }
-}
-
-void TaskFileManipulation::StepCreateShareDir()
-{
- std::string sharePath = m_context.locations->getShareDir();
-
- if (euidaccess(sharePath.c_str(), F_OK) != 0) {
- if(!WrtUtilMakeDir(sharePath, SHARE_MODE)){
- LogError("Failed to create directory for share");
- ThrowMsg(Exceptions::InternalError,
- "Failed to create directory for share");
- }
- // '5000' is default uid, gid for applications.
- // So installed applications should be launched as process of uid '5000'.
- // the process can access private directory 'data' of itself.
- if(chown(sharePath.c_str(),
- WEBAPP_DEFAULT_UID,
- WEBAPP_DEFAULT_GID) != 0)
- {
- ThrowMsg(Exceptions::InternalError,
- "Chown to invaild user");
- }
- } else if (euidaccess(sharePath.c_str(), W_OK | R_OK | X_OK) == 0) {
- LogInfo("Share directory already exists.");
- // Even if share directory already is created, share dircetory
- // should change owner.
- if(chown(sharePath.c_str(),
- WEBAPP_DEFAULT_UID,
- WEBAPP_DEFAULT_GID) != 0)
+ if (chown(storagePath.c_str(),
+ WEBAPP_DEFAULT_UID,
+ WEBAPP_DEFAULT_GID) != 0)
{
- ThrowMsg(Exceptions::InternalError,
- "Chown to invaild user");
+ ThrowMsg(Exceptions::FileOperationFailed,
+ "Chown to invaild user");
}
- if(chmod(sharePath.c_str(), SHARE_MODE) != 0) {
- ThrowMsg(Exceptions::InternalError,
- "chmod to 0700");
+ if (chmod(storagePath.c_str(), PRIVATE_STORAGE_MODE) != 0) {
+ ThrowMsg(Exceptions::FileOperationFailed,
+ "chmod to 0700");
}
-
} else {
- ThrowMsg(Exceptions::InternalError,
+ ThrowMsg(Exceptions::FileOperationFailed,
"No access to private storage.");
}
-
}
void TaskFileManipulation::StepRenamePath()
LogDebug("Copy file from temp directory to " << instDir);
if (!WrtUtilRemove(instDir)) {
ThrowMsg(Exceptions::RemovingFolderFailure,
- "Error occurs during removing existing folder");
+ "Error occurs during removing existing folder");
}
- if (!(rename(m_context.locations->getTemporaryPackageDir().c_str(), instDir.c_str()) == 0)) {
- ThrowMsg(Exceptions::UnknownError,
- "Error occurs during renaming widget folder");
+ if (!(rename(m_context.locations->getTemporaryPackageDir().c_str(),
+ instDir.c_str()) == 0))
+ {
+ ThrowMsg(Exceptions::FileOperationFailed,
+ "Error occurs during renaming widget folder");
}
m_context.job->UpdateProgress(
InstallerContext::INSTALL_RENAME_PATH,
widgetPath = m_context.locations->getPackageInstallationDir();
if (!WrtUtilRemove(widgetPath)) {
ThrowMsg(Exceptions::RemovingFolderFailure,
- "Error occurs during removing existing folder");
+ "Error occurs during removing existing folder");
}
}
LogDebug("Rename widget path sucessful!");
{
LogDebug("Step prepare to install in exernal directory");
Try {
- std::string pkgname =
- DPL::ToUTF8String(*m_context.widgetConfig.pkgname);
+ std::string pkgid =
+ DPL::ToUTF8String(m_context.widgetConfig.tzPkgid);
- WidgetInstallToExtSingleton::Instance().initialize(pkgname);
+ WidgetInstallToExtSingleton::Instance().initialize(pkgid);
size_t totalSize =
Utils::getFolderSize(m_context.locations->getTemporaryPackageDir());
GList *list = NULL;
app2ext_dir_details* dirDetail = NULL;
- std::string dirNames[2] = {GLIST_RES_DIR, GLIST_BIN_DIR};
-
- for (int i = 0; i < 2; i++) {
- dirDetail = (app2ext_dir_details*) calloc(1,
- sizeof(app2ext_dir_details));
- if (NULL == dirDetail) {
- ThrowMsg(Exceptions::ErrorExternalInstallingFailure, "error in app2ext");
- }
- dirDetail->name = strdup(dirNames[i].c_str());
- dirDetail->type = APP2EXT_DIR_RO;
- list = g_list_append(list, dirDetail);
+ dirDetail = (app2ext_dir_details*) calloc(1,
+ sizeof(
+ app2ext_dir_details));
+ if (NULL == dirDetail) {
+ ThrowMsg(Exceptions::ErrorExternalInstallingFailure,
+ "error in app2ext");
}
+ dirDetail->name = strdup(GLIST_RES_DIR);
+ dirDetail->type = APP2EXT_DIR_RO;
+ list = g_list_append(list, dirDetail);
- if (false == m_context.existingWidgetInfo.isExist) {
- WidgetInstallToExtSingleton::Instance().preInstallation(list,
- folderSize);
- } else {
+ if (m_context.isUpdateMode) {
WidgetInstallToExtSingleton::Instance().preUpgrade(list,
- folderSize);
+ folderSize);
+ } else {
+ WidgetInstallToExtSingleton::Instance().preInstallation(list,
+ folderSize);
}
free(dirDetail);
g_list_free(list);
+
+ /* make bin directory */
+ std::string widgetBinPath = m_context.locations->getBinaryDir();
+ WrtUtilMakeDir(widgetBinPath);
}
- Catch (WidgetInstallToExt::Exception::ErrorInstallToExt)
+ Catch(WidgetInstallToExt::Exception::ErrorInstallToExt)
{
- ReThrowMsg(Exceptions::ErrorExternalInstallingFailure, "Error during \
+ ReThrowMsg(Exceptions::ErrorExternalInstallingFailure,
+ "Error during \
create external folder ");
}
}
{
LogDebug("StepInstallExternal");
if (!WrtUtilMakeDir(m_context.locations->getSourceDir())) {
- ThrowMsg(Exceptions::ErrorExternalInstallingFailure, "To make src \
+ ThrowMsg(Exceptions::ErrorExternalInstallingFailure,
+ "To make src \
directory failed");
}
LogDebug("Resource move to external storage " <<
- m_context.locations->getSourceDir());
+ m_context.locations->getSourceDir());
if (!_FolderCopy(m_context.locations->getTemporaryPackageDir(),
- m_context.locations->getSourceDir()))
+ m_context.locations->getSourceDir()))
{
- ThrowMsg(Exceptions::UnknownError,
- "Error occurs during renaming widget folder");
+ ThrowMsg(Exceptions::ErrorExternalInstallingFailure,
+ "Error occurs during renaming widget folder");
}
}
void TaskFileManipulation::StepAbortCreateExternalDir()
{
LogError("Abort StepAbortCreateExternalDir");
- if (false == m_context.existingWidgetInfo.isExist) {
- WidgetInstallToExtSingleton::Instance().postInstallation(false);
- } else {
+ if (m_context.isUpdateMode) {
WidgetInstallToExtSingleton::Instance().postUpgrade(false);
+ } else {
+ WidgetInstallToExtSingleton::Instance().postInstallation(false);
}
WidgetInstallToExtSingleton::Instance().deinitialize();
}