diff options
Diffstat (limited to 'db3x_autobackups/dbsettings.c')
-rw-r--r-- | db3x_autobackups/dbsettings.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/db3x_autobackups/dbsettings.c b/db3x_autobackups/dbsettings.c index a8d347d..3e8f49d 100644 --- a/db3x_autobackups/dbsettings.c +++ b/db3x_autobackups/dbsettings.c @@ -26,6 +26,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. DWORD GetModuleNameOfs(const char *szName);
DBCachedContactValueList* AddToCachedContactList(HANDLE hContact, int index);
+static int mirCp = CP_ACP;
+
HANDLE hCacheHeap = NULL;
SortedList lContacts = {0};
HANDLE hLastCachedContact = NULL;
@@ -386,12 +388,23 @@ static int GetContactSetting(WPARAM wParam,LPARAM lParam) return 1;
if ( dgs->pValue->type == DBVT_UTF8 ) {
- WCHAR* tmp;
- char* val = mir_utf8decode( dgs->pValue->pszVal, &tmp );
- if ( val == NULL ) {
- dgs->pValue->type = DBVT_WCHAR;
+ WCHAR* tmp = NULL;
+ char* p = NEWSTR_ALLOCA(dgs->pValue->pszVal);
+ if ( mir_utf8decode( p, &tmp ) != NULL ) {
+ BOOL bUsed = FALSE;
+ int result = WideCharToMultiByte( mirCp, 0, tmp, -1, NULL, 0, "?", &bUsed );
+
mir_free( dgs->pValue->pszVal );
- dgs->pValue->pwszVal = tmp;
+
+ if ( bUsed || result == 0 ) {
+ dgs->pValue->type = DBVT_WCHAR;
+ dgs->pValue->pwszVal = tmp;
+ }
+ else {
+ dgs->pValue->type = DBVT_ASCIIZ;
+ dgs->pValue->pszVal = mir_strdup( p );
+ mir_free( tmp );
+ }
}
else {
dgs->pValue->type = DBVT_ASCIIZ;
@@ -428,9 +441,10 @@ static int GetContactSettingStr(WPARAM wParam,LPARAM lParam) dgs->pValue->pwszVal = wszResult;
}
else {
- char* savePtr = dgs->pValue->pszVal;
- mir_utf8decode( dgs->pValue->pszVal, &dgs->pValue->pwszVal );
- mir_free( savePtr );
+ char* savePtr = NEWSTR_ALLOCA(dgs->pValue->pszVal);
+ mir_free( dgs->pValue->pszVal );
+ if ( !mir_utf8decode( savePtr, &dgs->pValue->pwszVal ))
+ return 1;
}
}
else if ( iSaveType == DBVT_UTF8 ) {
@@ -530,7 +544,7 @@ static int WriteContactSetting(WPARAM wParam,LPARAM lParam) int bytesRequired,bytesRemaining;
DWORD ofsContact,ofsSettingsGroup,ofsBlobPtr;
- if (dbcws == NULL)
+ if (dbcws == NULL || dbcws->szSetting==NULL || dbcws->szModule==NULL )
return 1;
// the db format can't tolerate more than 255 bytes of space (incl. null) for settings+module name
@@ -990,6 +1004,8 @@ int InitSettings(void) lGlobalSettings.increment=50;
lResidentSettings.sortFunc=stringCompare2;
lResidentSettings.increment=50;
+
+ mirCp = CallService( MS_LANGPACK_GETCODEPAGE, 0, 0 );
return 0;
}
|