#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; }