From bed6bee936ff79d32c08245f0fedaee9d839f76f Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Thu, 28 Apr 2011 12:14:32 +0000 Subject: test rename git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@64 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- dbeditorpp/addeditsettingsdlg.cpp | 458 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 458 insertions(+) create mode 100644 dbeditorpp/addeditsettingsdlg.cpp (limited to 'dbeditorpp/addeditsettingsdlg.cpp') diff --git a/dbeditorpp/addeditsettingsdlg.cpp b/dbeditorpp/addeditsettingsdlg.cpp new file mode 100644 index 0000000..c0bfb7c --- /dev/null +++ b/dbeditorpp/addeditsettingsdlg.cpp @@ -0,0 +1,458 @@ +#include "headers.h" + + +static BOOL Convert(HANDLE hContact, char* module, char* setting, int value, int toType) // 0 = byte, 1 = word, 2 = dword, 3 = string +{ + int Result = 1; + char temp[64]; + + switch (toType) + { + case 0: + if (value > 0xFF) + Result = 0; + else + DBWriteContactSettingByte(hContact, module, setting, (BYTE)value); + break; + case 1: + if (value > 0xFFFF) + Result = 0; + else + DBWriteContactSettingWord(hContact, module, setting, (WORD)value); + break; + case 2: + DBWriteContactSettingDword(hContact, module, setting, (DWORD)value); + break; + case 3: + DBDeleteContactSetting(hContact, module, setting); + DBWriteContactSettingString(hContact, module, setting, itoa(value,temp,10)); + break; + } + return Result; +} + + +BOOL convertSetting(HANDLE hContact, char* module, char* setting, int toType) // 0 = byte, 1 = word, 2 = dword, 3 = string, 4 = unicode +{ + DBVARIANT dbv = {0}; + BOOL Result = 0; + + if (!GetSetting(hContact, module, setting, &dbv)) + { + switch (dbv.type) + { + case DBVT_BYTE: + Result = Convert(hContact, module, setting, dbv.bVal, toType); + break; + + case DBVT_WORD: + Result = Convert(hContact, module, setting, dbv.wVal, toType); + break; + + case DBVT_DWORD: + Result = Convert(hContact, module, setting, dbv.dVal, toType); + break; + + case DBVT_ASCIIZ: + if (toType == 4) // convert to UNICODE + { + int len = strlen(dbv.pszVal)+1; + WCHAR *wc = _alloca(len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, dbv.pszVal, -1, wc, len); + Result = !DBWriteContactSettingWString(hContact, module, setting, wc); + } + else + if (strlen(dbv.pszVal) < 11 && toType != 3) + { + int val = atoi(dbv.pszVal); + if (val == 0 && dbv.pszVal[0] != '0') + break; + + Result = Convert(hContact, module, setting, val, toType); + } + break; + case DBVT_UTF8: + if (toType == 3 && UOS) // convert to ANSI + { + int len = strlen(dbv.pszVal)+1; + char *sz = _alloca(len*3); + WCHAR *wc = _alloca(len*sizeof(WCHAR)); + MultiByteToWideChar(CP_UTF8, 0, dbv.pszVal, -1, wc, len); + WideCharToMultiByte(CP_ACP, 0, wc, -1, sz, len, NULL, NULL); + Result = !DBWriteContactSettingString(hContact, module, setting, sz); + } + break; + } + + if (!Result) + msg(Translate("Cannot Convert!"), modFullname); + + DBFreeVariant(&dbv); + } + + return Result; +} + + +int saveAsType(HWND hwnd) +{ + if(IsDlgButtonChecked(hwnd, CHK_BYTE)) + return 0; + else if(IsDlgButtonChecked(hwnd, CHK_WORD)) + return 1; + else if(IsDlgButtonChecked(hwnd, CHK_DWORD)) + return 2; + else if(IsDlgButtonChecked(hwnd, CHK_STRING)) + return 3; + return 3; +} + + +BOOL CALLBACK EditSettingDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + char tmp[32]; + SetWindowLong(hwnd,GWL_USERDATA,(LPARAM)lParam); + switch (((struct DBsetting*)lParam)->dbv.type) + { + case DBVT_BYTE: + ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_HIDE); + if (!((struct DBsetting*)lParam)->setting[0]) + { + SetWindowText(hwnd, Translate("New BYTE value")); + } + else + { + SetWindowText(hwnd, Translate("Edit BYTE value")); + SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); + SetDlgItemText(hwnd, IDC_SETTINGVALUE, itoa(((struct DBsetting*)lParam)->dbv.bVal, tmp, 10)); + } + CheckRadioButton(hwnd, CHK_HEX, CHK_DECIMAL, CHK_DECIMAL); + CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, CHK_BYTE); + break; + case DBVT_WORD: + ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_HIDE); + if (!((struct DBsetting*)lParam)->setting[0]) + { + SetWindowText(hwnd, Translate("New WORD value")); + } + else + { + SetWindowText(hwnd, Translate("Edit WORD value")); + SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); + SetDlgItemText(hwnd, IDC_SETTINGVALUE, itoa(((struct DBsetting*)lParam)->dbv.wVal, tmp, 10)); + } + CheckRadioButton(hwnd, CHK_HEX, CHK_DECIMAL, CHK_DECIMAL); + CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, CHK_WORD); + break; + case DBVT_DWORD: + ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_HIDE); + if (!((struct DBsetting*)lParam)->setting[0]) + { + SetWindowText(hwnd, Translate("New DWORD value")); + } + else + { + char text[32]; + SetWindowText(hwnd, Translate("Edit DWORD value")); + SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); + mir_snprintf(text, 32, "%X", ((struct DBsetting*)lParam)->dbv.dVal); + SetDlgItemText(hwnd, IDC_SETTINGVALUE, text); + } + CheckRadioButton(hwnd, CHK_HEX, CHK_DECIMAL, CHK_HEX); + CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, CHK_DWORD); + break; + case DBVT_ASCIIZ: + ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGVALUE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_HEX),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_DECIMAL),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, GRP_BASE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, GRP_TYPE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_BYTE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_WORD),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_DWORD),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_STRING),SW_HIDE); + if (!((struct DBsetting*)lParam)->setting[0]) + { + SetWindowText(hwnd, Translate("New STRING value")); + } + else + { + SetWindowText(hwnd, Translate("Edit STRING value")); + SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); + SetDlgItemText(hwnd, IDC_STRING, ((struct DBsetting*)lParam)->dbv.pszVal); + } + break; + case DBVT_UTF8: + ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_SHOW); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGVALUE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_HEX),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_DECIMAL),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, GRP_BASE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, GRP_TYPE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_BYTE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_WORD),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_DWORD),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_STRING),SW_HIDE); + if (!((struct DBsetting*)lParam)->setting[0]) + { + SetWindowText(hwnd, Translate("New UNICODE value")); + } + else + { + char *tmp = (((struct DBsetting*)lParam)->dbv.pszVal); + if (UOS) + { + int length = strlen(tmp)+1; + WCHAR *wc = _alloca(length*sizeof(WCHAR)); + MultiByteToWideChar(CP_UTF8, 0, tmp, -1, wc, length); + _SendMessageW(GetDlgItem(hwnd, IDC_STRING), WM_SETTEXT, 0, (LPARAM)wc); + } + else { + // convert from UTF8 + SetDlgItemText(hwnd, IDC_STRING, tmp); + } + SetWindowText(hwnd, Translate("Edit UNICODE value")); + SetDlgItemText(hwnd, IDC_SETTINGNAME, ((struct DBsetting*)lParam)->setting); + } + break; + case DBVT_BLOB: + { + ShowWindow(GetDlgItem(hwnd, IDC_STRING),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_SETTINGVALUE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, IDC_BLOB),SW_SHOW); + + if (!((struct DBsetting*)lParam)->setting[0]) + { + SetWindowText(hwnd, Translate("New BLOB value")); + } + else + { + int j; + char tmp[16]; + int len = ((struct DBsetting*)lParam)->dbv.cpbVal; + char *data = (char*)_alloca(3*(len+1)+10); + BYTE *p = ((struct DBsetting*)lParam)->dbv.pbVal; + + if (!data) return TRUE; + data[0] = '\0'; + + for(j=0; jsetting); + SetDlgItemText(hwnd, IDC_BLOB, data); + } + ShowWindow(GetDlgItem(hwnd, CHK_HEX),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_DECIMAL),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, GRP_BASE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, GRP_TYPE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_BYTE),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_WORD),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_DWORD),SW_HIDE); + ShowWindow(GetDlgItem(hwnd, CHK_STRING),SW_HIDE); + } + break; + default: return TRUE; + } + TranslateDialogDefault(hwnd); + } + return TRUE; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case CHK_BYTE: + case CHK_WORD: + case CHK_DWORD: + EnableWindow(GetDlgItem(hwnd, CHK_HEX),1); + EnableWindow(GetDlgItem(hwnd, CHK_DECIMAL),1); + CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, LOWORD(wParam)); + break; + case CHK_STRING: + EnableWindow(GetDlgItem(hwnd, CHK_HEX),0); + EnableWindow(GetDlgItem(hwnd, CHK_DECIMAL),0); + CheckRadioButton(hwnd, CHK_BYTE, CHK_STRING, LOWORD(wParam)); + break; + + case CHK_HEX: + case CHK_DECIMAL: + CheckRadioButton(hwnd,CHK_HEX, CHK_DECIMAL, LOWORD(wParam)); + { + char *setting, temp[32]; + int settingLength, tmp; + settingLength = GetWindowTextLength(GetDlgItem(hwnd, IDC_SETTINGVALUE)); + if (settingLength) + { + setting = (char*)_alloca(settingLength + 1); + if (setting) + { + // havta convert it with sprintf() + GetWindowText(GetDlgItem(hwnd, IDC_SETTINGVALUE), setting, settingLength+1); + if (LOWORD(wParam) == CHK_DECIMAL && IsDlgButtonChecked(hwnd, CHK_DECIMAL)) + { + sscanf(setting, "%X", &tmp); + mir_snprintf(temp, 32, "%ld", tmp); + } + else + { + sscanf(setting, "%d", &tmp); + mir_snprintf(temp, 32, "%X", tmp); + } + SetWindowText(GetDlgItem(hwnd, IDC_SETTINGVALUE), temp); + } + } + } + break; + case IDOK: + { + struct DBsetting *dbsetting = (struct DBsetting*)GetWindowLong(hwnd,GWL_USERDATA); + char *setting, *value; + int settingLength, valueLength, valueID = IDC_SETTINGVALUE; + settingLength = GetWindowTextLength(GetDlgItem(hwnd, IDC_SETTINGNAME)); + + if (IsWindowVisible(GetDlgItem(hwnd,IDC_STRING))) + valueID = IDC_STRING; + else + if (IsWindowVisible(GetDlgItem(hwnd,IDC_SETTINGVALUE))) + valueID = IDC_SETTINGVALUE; + else + if (IsWindowVisible(GetDlgItem(hwnd,IDC_BLOB))) + valueID = IDC_BLOB; + else + break; + + valueLength = GetWindowTextLength(GetDlgItem(hwnd, valueID)); + + if (dbsetting->dbv.type == DBVT_UTF8 && UOS) + valueLength *= sizeof(WCHAR); + + if (settingLength) + { + int settingValue; + setting = (char*)_alloca(settingLength + 1); + + if (valueLength) + value = (char*)_alloca(valueLength + 2); + else + value = (char*)_alloca(2); + + if (!setting || !value) + { + msg(Translate("Couldnt allocate enough memory!"), modFullname); + DestroyWindow(hwnd); + break; + } + + GetWindowText(GetDlgItem(hwnd, IDC_SETTINGNAME), setting, settingLength+1); + + if (valueLength) + { + if (dbsetting->dbv.type == DBVT_UTF8 && UOS) + _SendMessageW(GetDlgItem(hwnd, valueID), WM_GETTEXT, valueLength+2, (LPARAM)value); + else + GetWindowText(GetDlgItem(hwnd, valueID), value, valueLength+1); + } + else + if (IsWindowVisible(GetDlgItem(hwnd,IDC_STRING)) || (saveAsType(hwnd)==3)) + memcpy(value,"\0\0",2); + else + strcpy(value,"0"); + + // delete the old setting + if (mir_strcmp(setting, dbsetting->setting) && dbsetting->setting && (dbsetting->setting)[0] != 0) + DBDeleteContactSetting(dbsetting->hContact, dbsetting->module, dbsetting->setting); + + // delete the setting if we are saving as a different type + switch (dbsetting->dbv.type) + { + case DBVT_BYTE: + if (saveAsType(hwnd) != 0) DBDeleteContactSetting(dbsetting->hContact, dbsetting->module, setting); + break; + case DBVT_WORD: + if (saveAsType(hwnd) != 1) DBDeleteContactSetting(dbsetting->hContact, dbsetting->module, setting); + break; + case DBVT_DWORD: + if (saveAsType(hwnd) != 2) DBDeleteContactSetting(dbsetting->hContact, dbsetting->module, setting); + break; + //case DBVT_ASCIIZ: + //DBWriteContactSettingString(dbsetting->hContact, dbsetting->module, setting, value); + //break; + } + // write the setting + switch (saveAsType(hwnd)) + { + case 0: + if (IsDlgButtonChecked(hwnd, CHK_HEX)) sscanf(value, "%x", &settingValue); + else sscanf(value, "%d", &settingValue); + DBWriteContactSettingByte(dbsetting->hContact, dbsetting->module, setting, (BYTE)settingValue); + break; + case 1: + if (IsDlgButtonChecked(hwnd, CHK_HEX)) sscanf(value, "%x", &settingValue); + else sscanf(value, "%d", &settingValue); + DBWriteContactSettingWord(dbsetting->hContact, dbsetting->module, setting, (WORD)settingValue); + break; + case 2: + if (IsDlgButtonChecked(hwnd, CHK_HEX)) sscanf(value, "%x", &settingValue); + else sscanf(value, "%d", &settingValue); + DBWriteContactSettingDword(dbsetting->hContact, dbsetting->module, setting, (DWORD)settingValue); + break; + case 3: + if (dbsetting->dbv.type == DBVT_UTF8) + { + if (UOS) + DBWriteContactSettingWString(dbsetting->hContact, dbsetting->module, setting, (WCHAR*)value); + else + DBWriteContactSettingStringUtf(dbsetting->hContact, dbsetting->module, setting, value); + } + else + if (dbsetting->dbv.type == DBVT_BLOB) + WriteBlobFromString(dbsetting->hContact,dbsetting->module,setting,value,valueLength); + else + if (dbsetting->dbv.type == DBVT_ASCIIZ) + DBWriteContactSettingString(dbsetting->hContact, dbsetting->module, setting, value); + break; + } + + } + } // fall through + case IDCANCEL: + { + struct DBsetting *dbsetting = (struct DBsetting*)GetWindowLong(hwnd,GWL_USERDATA); + safe_free(dbsetting->module); + safe_free(dbsetting->setting); + safe_free(dbsetting); + DestroyWindow(hwnd); + } + break; + } + break; + } + return 0; +} + +void editSetting(HANDLE hContact, char* module, char* setting) +{ + DBVARIANT dbv = {0}; // freed in the dialog + if (!GetSetting(hContact,module, setting, &dbv)) + { + struct DBsetting *dbsetting = (struct DBsetting *)malloc(sizeof(struct DBsetting)); // gets free()ed in the window proc + + dbsetting->dbv = dbv; // freed in the dialog + dbsetting->hContact = hContact; + dbsetting->module = strdup(module); + dbsetting->setting = strdup(setting); + + if (dbv.type == DBVT_UTF8 && UOS) + _CreateDialogParamW(hInst,MAKEINTRESOURCEW(IDD_EDIT_SETTING),hwnd2mainWindow,EditSettingDlgProc, (LPARAM)dbsetting); + else + CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_EDIT_SETTING),hwnd2mainWindow,EditSettingDlgProc, (LPARAM)dbsetting); + } +} \ No newline at end of file -- cgit v1.2.3