Calibre portable: Allow renaming of the 'Calibre Library' folder to something else

This commit is contained in:
Kovid Goyal 2012-09-16 15:44:28 +05:30
parent 95b52a2059
commit 2a7a7cab4c
2 changed files with 44 additions and 1 deletions

View File

@ -442,7 +442,7 @@ class Win32Freeze(Command, WixMixIn):
'/RELEASE', '/RELEASE',
'/ENTRY:wWinMainCRTStartup', '/ENTRY:wWinMainCRTStartup',
'/OUT:'+exe, self.embed_resources(exe), '/OUT:'+exe, self.embed_resources(exe),
obj, 'User32.lib'] obj, 'User32.lib', 'Shlwapi.lib']
self.run_builder(cmd) self.run_builder(cmd)
self.info('Creating portable installer') self.info('Creating portable installer')

View File

@ -8,6 +8,7 @@
#include <windows.h> #include <windows.h>
#include <Shlwapi.h>
#include <tchar.h> #include <tchar.h>
#include <wchar.h> #include <wchar.h>
#include <stdio.h> #include <stdio.h>
@ -134,6 +135,46 @@ void launch_calibre(LPCTSTR exe, LPCTSTR config_dir, LPCTSTR library_dir) {
} }
static BOOL is_dots(LPCTSTR name) {
return _tcscmp(name, _T(".")) == 0 || _tcscmp(name, _T("..")) == 0;
}
static void find_calibre_library(LPTSTR library_dir) {
TCHAR base[BUFSIZE] = {0}, buf[BUFSIZE] = {0};
WIN32_FIND_DATA fdFile;
HANDLE hFind = NULL;
_sntprintf_s(buf, BUFSIZE, _TRUNCATE, _T("%s\\metadata.db"), base);
if (PathFileExists(buf)) return; // Calibre Library/metadata.db exists, we use it
_tcscpy(base, library_dir);
PathRemoveFileSpec(base);
_sntprintf_s(buf, BUFSIZE, _TRUNCATE, _T("%s\\*"), base);
// Look for some other folder that contains a metadata.db file inside the Calibre Portable folder
if((hFind = FindFirstFileEx(buf, FindExInfoStandard, &fdFile, FindExSearchLimitToDirectories, NULL, 0))
!= INVALID_HANDLE_VALUE) {
do {
if(is_dots(fdFile.cFileName)) continue;
if(fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
_sntprintf_s(buf, BUFSIZE, _TRUNCATE, _T("%s\\%s\\metadata.db"), base, fdFile.cFileName);
if (PathFileExists(buf)) {
// some dir/metadata.db exists, we use it as the library
PathRemoveFileSpec(buf);
_tcscpy(library_dir, buf);
FindClose(hFind);
return;
}
}
} while(FindNextFile(hFind, &fdFile));
FindClose(hFind);
}
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{ {
LPTSTR app_dir, config_dir, exe, library_dir, too_long; LPTSTR app_dir, config_dir, exe, library_dir, too_long;
@ -147,6 +188,8 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
_sntprintf_s(exe, BUFSIZE, _TRUNCATE, _T("%sCalibre\\calibre.exe"), app_dir); _sntprintf_s(exe, BUFSIZE, _TRUNCATE, _T("%sCalibre\\calibre.exe"), app_dir);
_sntprintf_s(library_dir, BUFSIZE, _TRUNCATE, _T("%sCalibre Library"), app_dir); _sntprintf_s(library_dir, BUFSIZE, _TRUNCATE, _T("%sCalibre Library"), app_dir);
find_calibre_library(library_dir);
if ( _tcscnlen(library_dir, BUFSIZE) <= 74 ) { if ( _tcscnlen(library_dir, BUFSIZE) <= 74 ) {
launch_calibre(exe, config_dir, library_dir); launch_calibre(exe, config_dir, library_dir);
} else { } else {