onlineupdate/inc/types.hxx | 25 ++++++ onlineupdate/source/update/common/readstrings.h | 7 - onlineupdate/source/update/common/updatedefines.h | 2 onlineupdate/source/update/updater/archivereader.h | 7 - onlineupdate/source/update/updater/progressui.h | 3 onlineupdate/source/update/updater/updater.cxx | 80 +++++++++++++++++++-- 6 files changed, 104 insertions(+), 20 deletions(-)
New commits: commit 5e8da3ee848df84e9376ee450c44ea08a4e649e0 Author: Markus Mohrhard <[email protected]> Date: Fri May 5 06:55:02 2017 +0200 second part for user profile in instdir This handles the replacement request part. The algorithm moves the user profile out of the backup back into the user profile. Change-Id: Ide45009d7a42b01ee645418b1a0c30b211842510 diff --git a/onlineupdate/source/update/common/updatedefines.h b/onlineupdate/source/update/common/updatedefines.h index acca6887f422..748f9e098dd6 100644 --- a/onlineupdate/source/update/common/updatedefines.h +++ b/onlineupdate/source/update/common/updatedefines.h @@ -70,6 +70,7 @@ static inline int mywcsprintf(WCHAR* dest, size_t count, const WCHAR* fmt, ...) # define NS_tstat_t _stat # define NS_tstrcat wcscat # define NS_tstrcmp wcscmp +# define NS_tstrncmp wcsncmp # define NS_tstricmp wcsicmp # define NS_tstrcpy wcscpy # define NS_tstrncpy wcsncpy @@ -115,6 +116,7 @@ static inline int mywcsprintf(WCHAR* dest, size_t count, const WCHAR* fmt, ...) # define NS_tlstat lstat # define NS_tstrcat strcat # define NS_tstrcmp strcmp +# define NS_tstrncmp strncmp # define NS_tstricmp strcasecmp # define NS_tstrcpy strcpy # define NS_tstrncpy strncpy diff --git a/onlineupdate/source/update/updater/updater.cxx b/onlineupdate/source/update/updater/updater.cxx index e6eb3855286c..e81fd89e840b 100644 --- a/onlineupdate/source/update/updater/updater.cxx +++ b/onlineupdate/source/update/updater/updater.cxx @@ -332,6 +332,32 @@ get_full_path(const NS_tchar *relpath) return s; } +namespace { + +bool is_userprofile_in_instdir() +{ + // the algorithm is: + // 1.) if userprofile path length is smaller than installation dir, + // the profile is surely not in instdir + // 2.) else comparing the two paths looking only at the installation dir + // characters should yield an equal string + NS_tchar userprofile[MAXPATHLEN]; + NS_tstrcpy(userprofile, gPatchDirPath); + NS_tchar *slash = (NS_tchar *) NS_tstrrchr(userprofile, NS_T('/')); + if (slash) + *slash = NS_T('\0'); + + size_t userprofile_len = NS_tstrlen(userprofile); + size_t installdir_len = NS_tstrlen(gInstallDirPath); + + if (userprofile_len < installdir_len) + return false; + + return NS_tstrncmp(userprofile, gInstallDirPath, installdir_len) == 0; +} + +} + /** * Converts a full update path into a relative path; reverses get_full_path. * @@ -2406,6 +2432,31 @@ ProcessReplaceRequest() return rv; } + if (is_userprofile_in_instdir()) + { + // 1.) calculate path of the user profile in the backup directory + // 2.) move the user profile from the backup to the install directory + NS_tchar backup_user_profile[MAXPATHLEN]; + NS_tchar userprofile[MAXPATHLEN]; + + NS_tstrcpy(userprofile, gPatchDirPath); + NS_tchar *slash = (NS_tchar *) NS_tstrrchr(userprofile, NS_T('/')); + if (slash) + *slash = NS_T('\0'); + NS_tstrcpy(backup_user_profile, tmpDir); + size_t installdir_len = NS_tstrlen(destDir); + + NS_tstrcat(backup_user_profile, userprofile + installdir_len); + if (slash) + *slash = NS_T('/'); + LOG(("copy user profile back from " LOG_S " to " LOG_S, backup_user_profile, userprofile)); + int rv2 = rename_file(backup_user_profile, userprofile); + if (rv2) + { + LOG(("failed to copy user profile back")); + } + } + #if !defined(_WIN32) && !defined(MACOSX) // Platforms that have their updates directory in the installation directory // need to have the last-update.log and backup-update.log files moved from the commit 79ec65870e7afda17176ee9b51c2230e010ea57e Author: Markus Mohrhard <[email protected]> Date: Fri May 5 04:46:30 2017 +0200 first step into supporting user profile in installation dir Change-Id: I2485ad2b69ed28b7f964540ac3eecd22099b4f7c diff --git a/onlineupdate/source/update/updater/updater.cxx b/onlineupdate/source/update/updater/updater.cxx index 1e36b4d300f8..e6eb3855286c 100644 --- a/onlineupdate/source/update/updater/updater.cxx +++ b/onlineupdate/source/update/updater/updater.cxx @@ -735,6 +735,11 @@ struct copy_recursive_skiplist NS_tsnprintf(paths[index], MAXPATHLEN, NS_T("%s/%s"), path, suffix); } + void append(unsigned index, const NS_tchar* path) + { + NS_tstrcpy(paths[index], path); + } + bool find(const NS_tchar *path) { for (int i = 0; i < static_cast<int>(N); ++i) @@ -2262,18 +2267,28 @@ CopyInstallDirToDestDir() { // These files should not be copied over to the updated app #ifdef _WIN32 -#define SKIPLIST_COUNT 3 +#define SKIPLIST_COUNT 4 #elif defined(MACOSX) -#define SKIPLIST_COUNT 0 +#define SKIPLIST_COUNT 1 #else -#define SKIPLIST_COUNT 2 +#define SKIPLIST_COUNT 3 #endif copy_recursive_skiplist<SKIPLIST_COUNT> skiplist; + + std::unique_ptr<NS_tchar> pUserProfile(new NS_tchar[MAXPATHLEN]); + NS_tstrcpy(pUserProfile.get(), gPatchDirPath); + NS_tchar *slash = (NS_tchar *) NS_tstrrchr(pUserProfile.get(), NS_T('/')); + if (slash) + *slash = NS_T('\0'); + + LOG(("ignore user profile directory during copy: " LOG_S, pUserProfile.get())); + + skiplist.append(0, pUserProfile.get()); #ifndef MACOSX - skiplist.append(0, gInstallDirPath, NS_T("updated")); - skiplist.append(1, gInstallDirPath, NS_T("updates/0")); + skiplist.append(1, gInstallDirPath, NS_T("updated")); + skiplist.append(2, gInstallDirPath, NS_T("updates/0")); #ifdef _WIN32 - skiplist.append(2, gInstallDirPath, NS_T("updated.update_in_progress.lock")); + skiplist.append(4, gInstallDirPath, NS_T("updated.update_in_progress.lock")); #endif #endif @@ -2289,6 +2304,8 @@ CopyInstallDirToDestDir() static int ProcessReplaceRequest() { + // TODO: moggi: handle the user profile in the installation dir also + // during the replacement request // The replacement algorithm is like this: // 1. Move destDir to tmpDir. In case of failure, abort. // 2. Move newDir to destDir. In case of failure, revert step 1 and abort. commit d3d75a6c26e4a71ca0acd3a029cfcf84c3e26425 Author: Markus Mohrhard <[email protected]> Date: Fri May 5 03:07:02 2017 +0200 extract string typedefs to a shared file Change-Id: I6e5d7c828f56b6a3f562ed8a9dd5f63a9d603ce0 diff --git a/onlineupdate/inc/types.hxx b/onlineupdate/inc/types.hxx new file mode 100644 index 000000000000..3e83a19c7d78 --- /dev/null +++ b/onlineupdate/inc/types.hxx @@ -0,0 +1,25 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef INCLUDED_ONLINEUPDATE_TYPES_HXX +#define INCLUDED_ONLINEUPDATE_TYPES_HXX + +#include <string> + +#if defined(_WIN32) +typedef std::wstring tstring; +typedef WCHAR NS_tchar; +#else +typedef std::string tstring; +typedef char NS_tchar; +#endif + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/onlineupdate/source/update/common/readstrings.h b/onlineupdate/source/update/common/readstrings.h index bc837ef326b5..747081394c10 100644 --- a/onlineupdate/source/update/common/readstrings.h +++ b/onlineupdate/source/update/common/readstrings.h @@ -11,14 +11,9 @@ #ifdef _WIN32 # include <windows.h> -typedef WCHAR NS_tchar; -#else -typedef char NS_tchar; #endif -#ifndef NULL -#define NULL 0 -#endif +#include "types.hxx" struct StringTable { diff --git a/onlineupdate/source/update/updater/archivereader.h b/onlineupdate/source/update/updater/archivereader.h index 9b7885dc0103..090b787f9cf5 100644 --- a/onlineupdate/source/update/updater/archivereader.h +++ b/onlineupdate/source/update/updater/archivereader.h @@ -9,12 +9,7 @@ #include <stdio.h> #include <onlineupdate/mar.h> - -#ifdef _WIN32 -typedef WCHAR NS_tchar; -#else -typedef char NS_tchar; -#endif +#include "types.hxx" // This class provides an API to extract files from an update archive. class ArchiveReader diff --git a/onlineupdate/source/update/updater/progressui.h b/onlineupdate/source/update/updater/progressui.h index 455ae125180a..cb1468d3949c 100644 --- a/onlineupdate/source/update/updater/progressui.h +++ b/onlineupdate/source/update/updater/progressui.h @@ -8,12 +8,11 @@ #define PROGRESSUI_H__ #include "updatedefines.h" +#include "types.hxx" #if defined(_WIN32) -typedef WCHAR NS_tchar; #define NS_main wmain #else -typedef char NS_tchar; #define NS_main main #endif _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
