diff -riwbBu -Xex aspell-setter-sep06/common/config.cpp aspell-setter-sep06-modified/common/config.cpp --- aspell-setter-sep06/common/config.cpp Mon Dec 12 17:41:06 2005 +++ aspell-setter-sep06-modified/common/config.cpp Sun Sep 17 20:55:02 2006 @@ -78,6 +78,11 @@ namespace aspell { +#ifdef WIN32PORT + HKEY GetRegHive(); + aspell::String ReadRegString(HKEY type, aspell::String key, aspell::String name); +#endif + const char * const keyinfo_type_name[4] = { N_("string"), N_("integer"), N_("boolean"), N_("list") }; @@ -642,20 +647,30 @@ } else if (strcmp(i, "home-dir") == 0) { - //get the personal folder (e.g. "c:\My Documents") + //get the personal folder + + //get from registry + HKEY hive; + hive = GetRegHive(); + final_str = ReadRegString(hive, "Software\\Aspell", "Base Path"); + + //default location + if (final_str == "") { char * dir = new char[MAX_PATH]; LPITEMIDLIST items = 0; - HRESULT hand = SHGetSpecialFolderLocation(0, CSIDL_PERSONAL, &items); + HRESULT hand = SHGetSpecialFolderLocation(0, CSIDL_APPDATA, &items); if ((NOERROR == hand) && items) { if (SHGetPathFromIDList(items, dir)) { for (char *ptr = dir; *ptr; ++ptr) if ('\\' == *ptr) *ptr = '/'; final_str = dir; + final_str.append("/Aspell"); } CoTaskMemFree(items); } delete [] dir; + } } #endif @@ -1394,20 +1409,6 @@ return no_err; } -#if defined(WIN32_USE_PERSONAL_DIR) -# define HOME_DIR "!home-dir" -# define PERSONAL ".pws" -# define REPL ".prepl" -#elif defined(ENABLE_WIN32_RELOCATABLE) -# define HOME_DIR "" -# define PERSONAL ".pws" -# define REPL ".prepl" -#else -# define HOME_DIR "<$HOME|./>" -# define PERSONAL ".aspell..pws" -# define REPL ".aspell..prepl" -#endif - static const KeyInfo config_keys[] = { // the description should be under 50 chars {"actual-dict-dir", KeyInfoString, "", 0} @@ -1484,7 +1485,7 @@ , {"per-conf-path", KeyInfoString, "", 0} , {"personal", KeyInfoString, PERSONAL, N_("personal dictionary file name")} - , {"personal-path", KeyInfoString, "", 0} + , {"personal-path", KeyInfoString, PERSONAL_DIR, 0} , {"prefix", KeyInfoString, PREFIX, N_("prefix directory")} , {"repl", KeyInfoString, REPL, @@ -1525,10 +1526,12 @@ , {"warn", KeyInfoBool, "true", N_("enable warnings")} #ifdef WIN32PORT - , {"dict-subdir", KeyInfoString, "dicts", + , {"dict-subdir", KeyInfoString, "Dictionaries", N_("sub directory for dictionaries")} , {"data-subdir", KeyInfoString, "data", N_("sub directory for other data")} + , {"personal-subdir", KeyInfoString, "Personal", + N_("sub directory for personal data")} #endif // @@ -1587,5 +1590,53 @@ config_impl_keys_begin, config_impl_keys_end); } + +#ifdef WIN32PORT + + String ReadRegString(HKEY hive, String key, String name) + { + + // Reads a string from the Windows registry (used to get paths) + + HKEY hKey; + unsigned long lType; + DWORD dwSize; + unsigned char* szValue = NULL; + + if (::RegOpenKeyEx(hive, key.c_str(), 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + if(::RegQueryValueEx(hKey, name.c_str(), NULL, &lType, NULL, &dwSize) == ERROR_SUCCESS) + { + szValue = new unsigned char[dwSize + 1]; + ::RegQueryValueEx(hKey, name.c_str(), NULL, &lType, szValue, &dwSize); + String RegistryReturn((char*)szValue); + delete[] szValue; + return RegistryReturn; + } else { + return ""; + } + } else { + return ""; + } + + } + + HKEY GetRegHive() + { + + // Check whether Aspell is installed for the current user or for all users + + String value; + + if (ReadRegString(HKEY_LOCAL_MACHINE, "Software\\Aspell", "Dictionary Path") == "") + { + return HKEY_CURRENT_USER; + } else { + return HKEY_LOCAL_MACHINE; + } + + } + +#endif } diff -riwbBu -Xex aspell-setter-sep06/common/vector.hpp aspell-setter-sep06-modified/common/vector.hpp --- aspell-setter-sep06/common/vector.hpp Thu Oct 13 09:42:54 2005 +++ aspell-setter-sep06-modified/common/vector.hpp Sun Sep 17 19:50:46 2006 @@ -50,10 +50,10 @@ T * data_end() {return &*this->end();} T * pbegin() {return &*this->begin();} - T * pend() {return &*this->end();} + T * pend() {return &this->back()+1;} const T * pbegin() const {return &*this->begin();} - const T * pend() const {return &*this->end();} + const T * pend() const {return &this->back()+1;} template U * datap() { diff -riwbBu -Xex aspell-setter-sep06/win32/dirs.h aspell-setter-sep06-modified/win32/dirs.h --- aspell-setter-sep06/win32/dirs.h Thu Oct 13 13:29:34 2005 +++ aspell-setter-sep06-modified/win32/dirs.h Sun Sep 17 20:26:26 2006 @@ -1,16 +1,26 @@ #ifndef dirs_h #define dirs_h -#ifdef WIN32_USE_EXECUTABLE_DIR -# define DATA_DIR "" -# define CONF_DIR "" -# define DICT_DIR "" +# define DATA_DIR "" +# define CONF_DIR "" +# define DICT_DIR "" +# define PERSONAL_DIR "" + +#if defined(WIN32_USE_EXECUTABLE_DIR) +# define HOME_DIR "" +# define PERSONAL "/.pws" +# define REPL "/.prepl" # define PREFIX "!prefix" +#elif defined(WIN32_USE_PERSONAL_DIR) +# define HOME_DIR "!home-dir" +# define PERSONAL "/.pws" +# define REPL "/.prepl" +# define PREFIX "" #else -# define DATA_DIR "aspell-win32/data" -# define CONF_DIR "aspell-win32" -# define DICT_DIR "dicts" -# define PREFIX "aspell-win32" +# define HOME_DIR "<$HOME|./>" +# define PERSONAL "/.aspell..pws" +# define REPL "/.aspell..prepl" +# define PREFIX "" #endif #endif diff -riwbBu -Xex aspell-setter-sep06/win32/settings.h aspell-setter-sep06-modified/win32/settings.h --- aspell-setter-sep06/win32/settings.h Wed Sep 6 10:51:16 2006 +++ aspell-setter-sep06-modified/win32/settings.h Sun Sep 17 18:55:23 2006 @@ -9,9 +9,6 @@ /* Defined if curses like POSIX Functions should be used */ #undef CURSES_ONLY -/* Defined if win32 relocation should be used */ -#define ENABLE_WIN32_RELOCATABLE 1 - /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H