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/main.cpp | 918 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 918 insertions(+) create mode 100644 dbeditorpp/main.cpp (limited to 'dbeditorpp/main.cpp') diff --git a/dbeditorpp/main.cpp b/dbeditorpp/main.cpp new file mode 100644 index 0000000..e5a0060 --- /dev/null +++ b/dbeditorpp/main.cpp @@ -0,0 +1,918 @@ +#include "headers.h" + +#pragma comment(exestr, "\n\n Bio was here 8-) \n") + +// {A8A417EF-07AA-4f37-869F-7BFD74886534} +#define MIID_DBEDITOR {0xa8a417ef, 0x7aa, 0x4f37, { 0x86, 0x9f, 0x7b, 0xfd, 0x74, 0x88, 0x65, 0x34}} + + + +HANDLE hTTBButt = NULL; +DWORD mirandaVer; +BOOL bServiceMode = FALSE; + +//======================== +// MirandaPluginInfo +//======================== +PLUGININFO pluginInfo={ + sizeof(PLUGININFO), + modFullname, + PLUGIN_MAKE_VERSION(3,2,0,0), + "Advanced Database Editor. More advanced & bugfixed by Bio.\r\n[ "__DATE__" "__TIME__" ]", + "Bio, Jonathan Gordon", + "bio@msx.ru, jdgordy@gmail.com", + "© 2003-2006 Bio, Jonathan Gordon", + "http://addons.miranda-im.org/details.php?action=viewfile&id=2957", + 0, //not transient + 0 //doesn't replace anything built-in +}; + +__declspec(dllexport) PLUGININFO* MirandaPluginInfo(DWORD mirandaVersion) +{ + if (mirandaVersion < PLUGIN_MAKE_VERSION(0, 7, 0, 0)) // 0.4 better. 0.3 have too many bugs + { + return NULL; + } + return &pluginInfo; +} + +PLUGININFOEX pluginInfoEx={ + sizeof(PLUGININFOEX), + modFullname, + PLUGIN_MAKE_VERSION(3,2,0,0), + "Advanced Database Editor. More advanced & bugfixed by Bio.\r\n[ "__DATE__" "__TIME__" ]", + "Bio, Jonathan Gordon", + "bio@msx.ru, jdgordy@gmail.com", + "© 2003-2006 Bio, Jonathan Gordon", + "http://addons.miranda-im.org/details.php?action=viewfile&id=2957", + UNICODE_AWARE, + 0, + MIID_DBEDITOR +}; + + +__declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + mirandaVer = mirandaVersion; + return &pluginInfoEx; +} + +// we implement service mode interface +static const MUUID interfaces[] = {MIID_SERVICEMODE, MIID_LAST}; +__declspec(dllexport) const MUUID* MirandaPluginInterfaces(void) +{ + return interfaces; +} + + +//======================== +// WINAPI DllMain +//======================== + +BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) +{ + hInst=hinstDLL; + return TRUE; +} + +//=================== +// MainInit +//=================== + +int MainInit(WPARAM wParam,LPARAM lParam) +{ + return 0; +} + +void settingChanged(HWND hwnd2Settings, HANDLE hContact, char* module, char* setting); + +int DBSettingChanged(WPARAM wParam,LPARAM lParam) +{ + DBCONTACTWRITESETTING *cws=(DBCONTACTWRITESETTING*)lParam; + HANDLE hContact = (HANDLE)wParam; + char *setting; + int i; + SettingListInfo* info; + + if (hwnd2mainWindow) + { + HWND hwnd2Settings = GetDlgItem(hwnd2mainWindow, IDC_SETTINGS); + if (info = (SettingListInfo*)GetWindowLong(hwnd2Settings,GWL_USERDATA)) + { + if ((hContact == info->hContact) && !mir_strcmp(info->module, cws->szModule)) + { + setting = strdup(cws->szSetting); + if (cws->value.type == DBVT_DELETED) + { + LVFINDINFO lvfi; + int index; + lvfi.flags = LVFI_STRING; + lvfi.psz = setting; + lvfi.vkDirection = VK_DOWN; + index = ListView_FindItem(hwnd2Settings,-1,&lvfi); + if (index > -1) + ListView_DeleteItem(hwnd2Settings, index); + safe_free(setting); + return 0; + } + settingChanged(hwnd2Settings, hContact, info->module, setting); + safe_free(setting); + } + } + } + // watch list + if (!hwnd2watchedVarsWindow && !usePopUps) return 0; + + for (i=0; iszModule, WatchListArray.item[i].module)) + { + if (!WatchListArray.item[i].setting || !mir_strcmp(cws->szSetting, WatchListArray.item[i].setting)) + { + if (usePopUps) + popupWatchedVar(hContact,cws->szModule, cws->szSetting); + if (hwnd2watchedVarsWindow) + PopulateWatchedWindow(GetDlgItem(hwnd2watchedVarsWindow, IDC_VARS)); + break; + } + } + } + } + return 0; +} + +static int DBEditorppMenuCommand(WPARAM wParam,LPARAM lParam) +{ + + if (!hwnd2mainWindow) // so only opens 1 at a time + { + hRestore = (HANDLE)wParam; + SetCursor(LoadCursor(NULL,IDC_WAIT)); + CreateDialog(hInst,MAKEINTRESOURCE(IDD_MAIN),0,MainDlgProc); + } + else + { + ShowWindow(hwnd2mainWindow, SW_RESTORE); + SetForegroundWindow(hwnd2mainWindow); + if (!hRestore && wParam) { + hRestore = (HANDLE)wParam; + refreshTree(4); + } + } + + if (hTTBButt) + CallService(MS_TTB_SETBUTTONSTATE, (WPARAM)hTTBButt, (LPARAM)(TTBST_RELEASED)); + + return 0; +} + + +BOOL IsCP_UTF8(void) +{ + CPINFO CPInfo; + + return GetCPInfo(CP_UTF8, &CPInfo); +} + + +BOOL InitWFuctions(void) +{ + HMODULE hDll = LoadLibrary("user32.dll"); + if (hDll) + { + _CreateDialogParamW = (HWND (WINAPI *)(HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM))GetProcAddress(hDll, "CreateDialogParamW"); + _CreateWindowExW = (HWND (WINAPI *)(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID))GetProcAddress(hDll, "CreateWindowExW"); + _CallWindowProcW = (LRESULT (WINAPI *)(WNDPROC,HWND,UINT,WPARAM,LPARAM))GetProcAddress(hDll, "CallWindowProcW"); + _SetWindowLongW = (LONG (WINAPI *)(HWND,int,LONG))GetProcAddress(hDll, "SetWindowLongW"); + _SendMessageW = (LRESULT (WINAPI *)(HWND,UINT,WPARAM,LPARAM))GetProcAddress(hDll, "SendMessageW"); + + if (_CreateDialogParamW && + _CreateWindowExW && + _CallWindowProcW && + _SetWindowLongW && + _SendMessageW) + return 1; + + } + return 0; +} + +HANDLE hTTBHook = NULL; +static int OnTTBLoaded(WPARAM wParam,LPARAM lParam) +{ + TTBButtonV2 ttbb = {0}; + HICON ico = LoadIcon(hInst,MAKEINTRESOURCE(ICO_DBE_BUTT)); + UnhookEvent(hTTBHook); + + ttbb.cbSize = sizeof(ttbb); + ttbb.dwFlags=TTBBF_VISIBLE|TTBBF_SHOWTOOLTIP; + ttbb.pszServiceDown = "DBEditorpp/MenuCommand"; + ttbb.name = Translate("Database Editor++"); + ttbb.hIconUp = ico; + ttbb.hIconDn = ico; +// ttbb.tooltipDn = Translate("Show DataBase Editor"); + + hTTBButt = (HANDLE)CallService(MS_TTB_ADDBUTTON, (WPARAM)&ttbb, 0); + + if (hTTBButt) + CallService(MS_TTB_SETBUTTONOPTIONS,MAKEWPARAM(TTBO_TIPNAME,hTTBButt), + (LPARAM)(Translate("Show DataBase Editor"))); + + return 0; +} + +HANDLE hModulesLoadedHook = NULL; +int ModulesLoaded(WPARAM wParam,LPARAM lParam) +{ + DBVARIANT dbv; + char *coreMods = "AutoAway, CLC, CList CListGroups, CLUI, Contact, DBEditorpp, Icons, Idle, Ignore, Netlib, Options, PluginDisable, Skin, SkinHotKeys, SkinSounds, SkinSoundsOff, SRAway, SRFile, SRMsg, SRUrl, UpdateCheck, UserInfo, UserOnline, _Filter, Protocol, KnownModules, SkinIcons, FirstRun"; + char *mods; + char mod[64] = ""; + char szModuleFileName[MAX_PATH]; + int i=0, len; + if (!DBGetContactSetting(NULL,modname,"CoreModules",&dbv) && dbv.type == DBVT_ASCIIZ) + mods = dbv.pszVal; + else + { + DBWriteContactSettingString(NULL,modname,"CoreModules",coreMods); + mods = coreMods; + } + + len=strlen(mods); + while (i='0' && b<='9') || + (b>='A' && b<='F') || + (b>='a' && b<='f')) + { + if (sscanf(&szValue[j], "%02X", &tmp) == 1) + { + data[i++] = (BYTE)tmp; + j++; + } + } + j++; + } + + if (i) + return DBWriteContactSettingBlob(hContact,szModule,szSetting, data, (WORD)i); + + return 0; +} + + +int GetSetting(HANDLE hContact, const char *szModule, const char *szSetting, DBVARIANT *dbv) +{ + DBCONTACTGETSETTING cgs; + + cgs.szModule=szModule; + cgs.szSetting=szSetting; + cgs.pValue=dbv; + dbv->type = 0; + + if (UDB) + return CallService(MS_DB_CONTACT_GETSETTING_STR,(WPARAM)hContact,(LPARAM)&cgs); + else + { + int rr = CallService(MS_DB_CONTACT_GETSETTING,(WPARAM)hContact,(LPARAM)&cgs); + + if (dbv->type != DBVT_UTF8) + return rr; + else + return 1; + } +} + + +int GetValue(HANDLE hContact, const char* szModule, const char* szSetting, char* Value, int length) +{ + DBVARIANT dbv = {0}; + + if (Value && length >= 10 && !GetSetting(hContact, szModule, szSetting, &dbv)) + { + switch(dbv.type) { + case DBVT_UTF8: + if (UOS) + { + 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); + strncpy(Value, sz, length); + break; + }// else fall through + case DBVT_ASCIIZ: + strncpy(Value, dbv.pszVal, length); + break; + case DBVT_DWORD: + _itoa(dbv.dVal,Value,10); + break; + case DBVT_BYTE: + _itoa(dbv.bVal,Value,10); + break; + case DBVT_WORD: + _itoa(dbv.wVal,Value,10); + break; + } + + DBFreeVariant(&dbv); + + Value[length-1] = 0; + return 1; + } + + if (Value) + Value[0] = 0; + + return 0; +} + + +int GetValueW(HANDLE hContact, const char* szModule, const char* szSetting, WCHAR* Value, int length) +{ + DBVARIANT dbv ={0}; + + if (Value && length >= 10 && !GetSetting(hContact, szModule, szSetting, &dbv)) + { + switch(dbv.type) { + case DBVT_UTF8: + { + int len = strlen(dbv.pszVal)+1; + WCHAR *wc = _alloca(length*sizeof(WCHAR)); + MultiByteToWideChar(CP_UTF8, 0, dbv.pszVal, -1, wc, len); + wcsncpy((WCHAR*)Value, wc, length); + } + break; + case DBVT_ASCIIZ: + { + int len = strlen(dbv.pszVal)+1; + WCHAR *wc = _alloca(len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, dbv.pszVal, -1, wc, len); + wcsncpy((WCHAR*)Value, wc, length); + } + break; + case DBVT_DWORD: + _itow(dbv.dVal,Value,10); + break; + case DBVT_BYTE: + _itow(dbv.bVal,Value,10); + break; + case DBVT_WORD: + _itow(dbv.wVal,Value,10); + break; + } + + DBFreeVariant(&dbv); + + Value[length-1] = 0; + return 1; + } + + if (Value) + Value[0] = 0; + + return 0; +} + + +char *u2a( wchar_t* src ) +{ + if (src) + { + int cbLen = WideCharToMultiByte( CP_ACP, 0, src, -1, NULL, 0, NULL, NULL ); + char* result = ( char* )calloc( cbLen+1, 1); + if ( result == NULL ) + return NULL; + + WideCharToMultiByte( CP_ACP, 0, src, -1, result, cbLen, NULL, NULL ); + result[ cbLen ] = 0; + return result; + } + else + return NULL; +} + + +wchar_t *a2u( char* src , wchar_t *buffer, int len ) +{ + wchar_t *result = buffer; + if ( result == NULL || len < 3) + return NULL; + + MultiByteToWideChar( CP_ACP, 0, src, -1, result, len - 1 ); + result[ len - 1 ] = 0; + + return result; +} + +/* +wchar_t *a2u( char* src ) +{ + int cbLen = MultiByteToWideChar( CP_ACP, 0, src, -1, NULL, 0 ); + wchar_t* result = ( wchar_t* )calloc(sizeof(wchar_t),(cbLen+1)); + if ( result == NULL ) + return NULL; + + MultiByteToWideChar( CP_ACP, 0, src, -1, result, cbLen ); + result[ cbLen ] = 0; + return result; +} + +*/ +/* + * The following UTF8 routines are + * + * Copyright (C) 2001 Peter Harris + * Copyright (C) 2001 Edmund Grimley Evans + * + * under a GPL license + * + * -------------------------------------------------------------- + * Convert a string between UTF-8 and the locale's charset. + * Invalid bytes are replaced by '#', and characters that are + * not available in the target encoding are replaced by '?'. + * + * If the locale's charset is not set explicitly then it is + * obtained using nl_langinfo(CODESET), where available, the + * environment variable CHARSET, or assumed to be US-ASCII. + * + * Return value of conversion functions: + * + * -1 : memory allocation failed + * 0 : data was converted exactly + * 1 : valid data was converted approximately (using '?') + * 2 : input was invalid (but still converted, using '#') + * 3 : unknown encoding (but still converted, using '?') + */ + + +/* +unsigned char *make_utf8_string(const wchar_t *unicode) +{ + + int size = 0; + int index = 0; + int out_index = 0; + unsigned char* out; + unsigned short c; + + + // first calculate the size of the target string + c = unicode[index++]; + while(c) { + if(c < 0x0080) { + size += 1; + } else if(c < 0x0800) { + size += 2; + } else { + size += 3; + } + c = unicode[index++]; + } + + out = malloc(size + 1); + if (out == NULL) + return NULL; + index = 0; + + c = unicode[index++]; + while(c) + { + if(c < 0x080) { + out[out_index++] = (unsigned char)c; + } else if(c < 0x800) { + out[out_index++] = 0xc0 | (c >> 6); + out[out_index++] = 0x80 | (c & 0x3f); + } else { + out[out_index++] = 0xe0 | (c >> 12); + out[out_index++] = 0x80 | ((c >> 6) & 0x3f); + out[out_index++] = 0x80 | (c & 0x3f); + } + c = unicode[index++]; + } + out[out_index] = 0x00; + + return out; +} + + +wchar_t *make_unicode_string(const unsigned char *utf8) +{ + + int size = 0, index = 0, out_index = 0; + wchar_t *out; + unsigned char c; + + + // first calculate the size of the target string + c = utf8[index++]; + while(c) { + if((c & 0x80) == 0) { + index += 0; + } else if((c & 0xe0) == 0xe0) { + index += 2; + } else { + index += 1; + } + size += 1; + c = utf8[index++]; + } + + out = malloc((size + 1) * sizeof(wchar_t)); + if (out == NULL) + return NULL; + index = 0; + + c = utf8[index++]; + while(c) + { + if((c & 0x80) == 0) { + out[out_index++] = c; + } else if((c & 0xe0) == 0xe0) { + out[out_index] = (c & 0x1F) << 12; + c = utf8[index++]; + out[out_index] |= (c & 0x3F) << 6; + c = utf8[index++]; + out[out_index++] |= (c & 0x3F); + } else { + out[out_index] = (c & 0x3F) << 6; + c = utf8[index++]; + out[out_index++] |= (c & 0x3F); + } + c = utf8[index++]; + } + out[out_index] = 0; + + return out; +} +*/ + + +int mir_snwprintf(WCHAR *buffer, size_t count, const WCHAR* fmt, ...) +{ + va_list va; + int len; + + va_start(va, fmt); + len = _vsnwprintf(buffer, count-1, fmt, va); + va_end(va); + + buffer[count-1] = 0; + + return len; +} + + +int GetDatabaseString(HANDLE hContact, const char *szModule, const char* szSetting, WCHAR *Value, int length, BOOL unicode) +{ + if (unicode) + return GetValueW(hContact, szModule, szSetting, Value, length); + else + return GetValue(hContact, szModule, szSetting, (char*)Value, length); +} + + +WCHAR *GetContactName(HANDLE hContact, const char *szProto, int unicode) +{ + + int i, r = 0; + static WCHAR res[512]; + char *proto = (char*)szProto; + char name[256]; + + if (hContact && !proto) + { + if (GetValue(hContact,"Protocol","p",name,sizeof(name))) + proto = name; + } + + if (proto) + { + + for(i=0;i 1) + r |= GetDatabaseString(hContact,proto,"LastName",&res[len],SIZEOF(res)-len,unicode); + + break; + } + } + + if (r) return res; + } + } + + if (unicode) + return nick_unknownW; + else + return (WCHAR*)nick_unknown; +} -- cgit v1.2.3