diff options
Diffstat (limited to 'plugins/MenuItemEx/src')
-rw-r--r-- | plugins/MenuItemEx/src/images.cpp | 363 | ||||
-rw-r--r-- | plugins/MenuItemEx/src/images.h | 8 | ||||
-rw-r--r-- | plugins/MenuItemEx/src/main.cpp | 1386 | ||||
-rw-r--r-- | plugins/MenuItemEx/src/menuex.h | 73 | ||||
-rw-r--r-- | plugins/MenuItemEx/src/options.cpp | 136 | ||||
-rw-r--r-- | plugins/MenuItemEx/src/resource.h | 52 | ||||
-rw-r--r-- | plugins/MenuItemEx/src/version.h | 13 |
7 files changed, 2031 insertions, 0 deletions
diff --git a/plugins/MenuItemEx/src/images.cpp b/plugins/MenuItemEx/src/images.cpp new file mode 100644 index 0000000000..51903294bb --- /dev/null +++ b/plugins/MenuItemEx/src/images.cpp @@ -0,0 +1,363 @@ +#include "menuex.h"
+#include "images.h"
+
+extern HINSTANCE hinstance;
+
+
+void HalfBitmap32Alpha(HBITMAP hBitmap)
+{
+ BITMAP bmp;
+ DWORD dwLen;
+ BYTE *p;
+ int x, y;
+
+ GetObject(hBitmap, sizeof(bmp), &bmp);
+
+ if (bmp.bmBitsPixel != 32)
+ return;
+
+ dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8);
+ p = (BYTE *)malloc(dwLen);
+ if (p == NULL)
+ return;
+ memset(p, 0, dwLen);
+
+ GetBitmapBits(hBitmap, dwLen, p);
+
+ for (y = 0; y < bmp.bmHeight; ++y) {
+ BYTE *px = p + bmp.bmWidth * 4 * y;
+
+ for (x = 0; x < bmp.bmWidth; ++x)
+ {
+ px[3]>>=1;
+ px += 4;
+ }
+ }
+
+ SetBitmapBits(hBitmap, dwLen, p);
+
+ free(p);
+}
+
+
+// Make a bitmap all transparent, but only if it is a 32bpp
+//void MakeBmpTransparent(HBITMAP hBitmap)
+//{
+// BITMAP bmp;
+// DWORD dwLen;
+// BYTE *p;
+//
+// GetObject(hBitmap, sizeof(bmp), &bmp);
+//
+// if (bmp.bmBitsPixel != 32)
+// return;
+//
+// dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8);
+// p = (BYTE *)malloc(dwLen);
+// if (p == NULL)
+// return;
+//
+// memset(p, 0, dwLen);
+// SetBitmapBits(hBitmap, dwLen, p);
+//
+// free(p);
+//}
+
+
+// Correct alpha from bitmaps loaded without it (it cames with 0 and should be 255)
+void CorrectBitmap32Alpha(HBITMAP hBitmap, BOOL force)
+{
+ BITMAP bmp;
+ DWORD dwLen;
+ BYTE *p;
+ int x, y;
+ BOOL fixIt;
+
+ GetObject(hBitmap, sizeof(bmp), &bmp);
+
+ if (bmp.bmBitsPixel != 32)
+ return;
+
+ dwLen = bmp.bmWidth * bmp.bmHeight * (bmp.bmBitsPixel / 8);
+ p = (BYTE *)malloc(dwLen);
+ if (p == NULL)
+ return;
+ memset(p, 0, dwLen);
+
+ GetBitmapBits(hBitmap, dwLen, p);
+
+ fixIt = TRUE;
+ for (y = 0; fixIt && y < bmp.bmHeight; ++y) {
+ BYTE *px = p + bmp.bmWidth * 4 * y;
+
+ for (x = 0; fixIt && x < bmp.bmWidth; ++x)
+ {
+ if (px[3] != 0 && !force)
+ {
+ fixIt = FALSE;
+ }
+ else
+ {
+ if (px[0] != 0 || px[1] != 0 || px[2] != 0)
+ px[3] = 255;
+ }
+
+ px += 4;
+ }
+ }
+
+ if (fixIt)
+ SetBitmapBits(hBitmap, dwLen, p);
+
+ free(p);
+}
+
+
+HBITMAP CopyBitmapTo32(HBITMAP hBitmap)
+{
+ BITMAPINFO RGB32BitsBITMAPINFO;
+ BYTE * ptPixels;
+ HBITMAP hDirectBitmap;
+
+ BITMAP bmp;
+ DWORD dwLen;
+ BYTE *p;
+
+ GetObject(hBitmap, sizeof(bmp), &bmp);
+
+ dwLen = bmp.bmWidth * bmp.bmHeight * 4;
+ p = (BYTE *)malloc(dwLen);
+ if (p == NULL)
+ return NULL;
+
+ // Create bitmap
+ ZeroMemory(&RGB32BitsBITMAPINFO, sizeof(BITMAPINFO));
+ RGB32BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ RGB32BitsBITMAPINFO.bmiHeader.biWidth = bmp.bmWidth;
+ RGB32BitsBITMAPINFO.bmiHeader.biHeight = bmp.bmHeight;
+ RGB32BitsBITMAPINFO.bmiHeader.biPlanes = 1;
+ RGB32BitsBITMAPINFO.bmiHeader.biBitCount = 32;
+
+ hDirectBitmap = CreateDIBSection(NULL,
+ (BITMAPINFO *)&RGB32BitsBITMAPINFO,
+ DIB_RGB_COLORS,
+ (void **)&ptPixels,
+ NULL, 0);
+
+ // Copy data
+ if (bmp.bmBitsPixel != 32)
+ {
+ HDC hdcOrig, hdcDest;
+ HBITMAP oldOrig, oldDest;
+
+ hdcOrig = CreateCompatibleDC(NULL);
+ oldOrig = (HBITMAP) SelectObject(hdcOrig, hBitmap);
+
+ hdcDest = CreateCompatibleDC(NULL);
+ oldDest = (HBITMAP) SelectObject(hdcDest, hDirectBitmap);
+
+ BitBlt(hdcDest, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcOrig, 0, 0, SRCCOPY);
+
+ SelectObject(hdcDest, oldDest);
+ DeleteObject(hdcDest);
+ SelectObject(hdcOrig, oldOrig);
+ DeleteObject(hdcOrig);
+
+ // Set alpha
+ CorrectBitmap32Alpha(hDirectBitmap, FALSE);
+ }
+ else
+ {
+ GetBitmapBits(hBitmap, dwLen, p);
+ SetBitmapBits(hDirectBitmap, dwLen, p);
+ }
+
+ free(p);
+
+ return hDirectBitmap;
+}
+
+
+//HBITMAP CreateBitmap32(int cx, int cy)
+//{
+// BITMAPINFO RGB32BitsBITMAPINFO;
+// UINT * ptPixels;
+// HBITMAP DirectBitmap;
+//
+// ZeroMemory(&RGB32BitsBITMAPINFO,sizeof(BITMAPINFO));
+// RGB32BitsBITMAPINFO.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+// RGB32BitsBITMAPINFO.bmiHeader.biWidth=cx;//bm.bmWidth;
+// RGB32BitsBITMAPINFO.bmiHeader.biHeight=cy;//bm.bmHeight;
+// RGB32BitsBITMAPINFO.bmiHeader.biPlanes=1;
+// RGB32BitsBITMAPINFO.bmiHeader.biBitCount=32;
+//
+// DirectBitmap = CreateDIBSection(NULL,
+// (BITMAPINFO *)&RGB32BitsBITMAPINFO,
+// DIB_RGB_COLORS,
+// (void **)&ptPixels,
+// NULL, 0);
+// return DirectBitmap;
+//}
+
+
+BOOL MakeBitmap32(HBITMAP *hBitmap)
+{
+ BITMAP bmp;
+
+ GetObject(*hBitmap, sizeof(bmp), &bmp);
+
+ if (bmp.bmBitsPixel != 32) {
+ // Convert to 32 bpp
+ HBITMAP hBmpTmp = CopyBitmapTo32(*hBitmap);
+ DeleteObject(*hBitmap);
+ *hBitmap = hBmpTmp;
+ }
+
+ return TRUE;
+}
+
+
+//#define GET_PIXEL(__P__, __X__, __Y__) ( __P__ + width * 4 * (__Y__) + 4 * (__X__))
+
+//BOOL MakeGrayscale(HBITMAP *hBitmap)
+//{
+// BYTE *p = NULL;
+// BYTE *p1;
+// DWORD dwLen;
+// int width, height, x, y;
+// BITMAP bmp;
+//
+// GetObject(*hBitmap, sizeof(bmp), &bmp);
+// width = bmp.bmWidth;
+// height = bmp.bmHeight;
+//
+// dwLen = width * height * 4;
+// p = (BYTE *)malloc(dwLen);
+// if (p == NULL)
+// {
+// return FALSE;
+// }
+//
+// if (bmp.bmBitsPixel != 32)
+// {
+// // Convert to 32 bpp
+// HBITMAP hBmpTmp = CopyBitmapTo32(*hBitmap);
+// DeleteObject(*hBitmap);
+// *hBitmap = hBmpTmp;
+// }
+// GetBitmapBits(*hBitmap, dwLen, p);
+//
+// // Make grayscale
+// for (y = 0 ; y < height ; y++)
+// {
+// for (x = 0 ; x < width ; x++)
+// {
+// p1 = GET_PIXEL(p, x, y);
+// p1[0] = p1[1] = p1[2] = ( p1[0] + p1[1] + p1[2] ) / 3;
+// }
+// }
+//
+// dwLen = SetBitmapBits(*hBitmap, dwLen, p);
+// free(p);
+//
+// return TRUE;
+//}
+
+
+HICON MakeHalfAlphaIcon(HICON SourceIcon)
+{
+ ICONINFO TargetIconInfo;
+ BITMAP TargetBitmapInfo;
+ HICON TargetIcon, TempIcon;
+
+ TempIcon = CopyIcon(SourceIcon);
+ if ( !GetIconInfo(TempIcon, &TargetIconInfo))
+ return NULL;
+
+ if ( !GetObject(TargetIconInfo.hbmColor, sizeof(BITMAP), &TargetBitmapInfo))
+ return NULL;
+
+ MakeBitmap32(&TargetIconInfo.hbmColor);
+ HalfBitmap32Alpha(TargetIconInfo.hbmColor);
+ TargetIcon = CreateIconIndirect(&TargetIconInfo);
+
+ DestroyIcon(TempIcon);
+ DeleteObject(TargetIconInfo.hbmColor);
+ DeleteObject(TargetIconInfo.hbmMask);
+ return TargetIcon;
+}
+
+
+//HICON MakeGrayscaleIcon(HICON SourceIcon)
+//{
+// ICONINFO TargetIconInfo;
+// BITMAP TargetBitmapInfo;
+// HICON TargetIcon, TempIcon;
+//
+// TempIcon = CopyIcon(SourceIcon);
+// if (! GetIconInfo(TempIcon, &TargetIconInfo) || GetObject(TargetIconInfo.hbmColor, sizeof(BITMAP), &TargetBitmapInfo)==0) return NULL;
+//
+// MakeGrayscale(&TargetIconInfo.hbmColor);
+//
+// TargetIcon = CreateIconIndirect(&TargetIconInfo);
+// DestroyIcon(TempIcon);
+//
+// return TargetIcon;
+//}
+
+
+HICON BindOverlayIcon(HICON SourceIcon,LPCSTR OverlayIconName)
+{
+ ICONINFO OverlayIconInfo, TargetIconInfo;
+ BITMAP OverlayBitmapInfo, TargetBitmapInfo;
+ HBITMAP OldOverlayBitmap, OldTargetBitmap;
+ HICON OverlayIcon, TargetIcon, TempIcon;
+ HDC OverlayDC, TargetDC;
+ BLENDFUNCTION bf = {0,0,255,1};
+
+ TempIcon = CopyIcon(SourceIcon);
+ if ( !GetIconInfo( TempIcon, &TargetIconInfo ))
+ return NULL;
+
+ MakeBitmap32(&TargetIconInfo.hbmColor);
+ CorrectBitmap32Alpha(TargetIconInfo.hbmColor, FALSE);
+ GetObject(TargetIconInfo.hbmColor, sizeof(BITMAP), &TargetBitmapInfo);
+
+ OverlayIcon = (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)OverlayIconName);
+ if ( !GetIconInfo(OverlayIcon, &OverlayIconInfo) || !GetObject(OverlayIconInfo.hbmColor, sizeof(BITMAP), &OverlayBitmapInfo))
+ return NULL;
+
+ TargetDC = CreateCompatibleDC(NULL);
+ OldTargetBitmap = (HBITMAP)SelectObject(TargetDC, TargetIconInfo.hbmColor);
+
+ OverlayDC = CreateCompatibleDC(NULL);
+ OldOverlayBitmap = (HBITMAP)SelectObject(OverlayDC, OverlayIconInfo.hbmColor);
+
+ AlphaBlend(TargetDC, 0, 0, TargetBitmapInfo.bmWidth, TargetBitmapInfo.bmHeight,
+ OverlayDC, 0, 0, OverlayBitmapInfo.bmWidth, OverlayBitmapInfo.bmHeight, bf);
+
+ SelectObject(TargetDC, TargetIconInfo.hbmMask);
+ SelectObject(OverlayDC, OverlayIconInfo.hbmMask);
+
+ BitBlt(TargetDC, 0, 0, TargetBitmapInfo.bmWidth, TargetBitmapInfo.bmHeight,
+ OverlayDC, 0, 0, SRCCOPY);
+
+ TargetIcon = CreateIconIndirect(&TargetIconInfo);
+ DestroyIcon(TempIcon);
+ //DestroyIcon(OverlayIcon);
+
+ SelectObject(TargetDC, OldTargetBitmap);
+ DeleteObject(TargetIconInfo.hbmColor);
+ DeleteObject(TargetIconInfo.hbmMask);
+ DeleteDC(TargetDC);
+
+ SelectObject(OverlayDC, OldOverlayBitmap);
+ DeleteObject(OverlayIconInfo.hbmColor);
+ DeleteObject(OverlayIconInfo.hbmMask);
+ DeleteDC(OverlayDC);
+
+ return TargetIcon;
+}
+
+
+// EOF
diff --git a/plugins/MenuItemEx/src/images.h b/plugins/MenuItemEx/src/images.h new file mode 100644 index 0000000000..e8288714f7 --- /dev/null +++ b/plugins/MenuItemEx/src/images.h @@ -0,0 +1,8 @@ +#ifndef __IMAGE_UTILS_H__
+#define __IMAGE_UTILS_H__
+
+HICON BindOverlayIcon(HICON,LPCSTR);
+//HICON MakeGrayscaleIcon(HICON);
+HICON MakeHalfAlphaIcon(HICON);
+
+#endif // __IMAGE_UTILS_H__
diff --git a/plugins/MenuItemEx/src/main.cpp b/plugins/MenuItemEx/src/main.cpp new file mode 100644 index 0000000000..760520ce91 --- /dev/null +++ b/plugins/MenuItemEx/src/main.cpp @@ -0,0 +1,1386 @@ +#include "menuex.h"
+#include "images.h"
+#include "version.h"
+
+#define MS_SETINVIS "MenuEx/SetInvis"
+#define MS_SETVIS "MenuEx/SetVis"
+#define MS_HIDE "MenuEx/Hide"
+#define MS_IGNORE "MenuEx/Ignore"
+#define MS_PROTO "MenuEx/ChangeProto"
+#define MS_ADDED "MenuEx/SendAdded"
+#define MS_AUTHREQ "MenuEx/SendAuthReq"
+#define MS_COPYID "MenuEx/CopyID"
+#define MS_RECVFILES "MenuEx/RecvFiles"
+#define MS_STATUSMSG "MenuEx/CopyStatusMsg"
+#define MS_COPYIP "MenuEx/CopyIP"
+#define MS_COPYMIRVER "MenuEx/CopyMirVer"
+
+
+const int vf_default = VF_VS|VF_HFL|VF_IGN|VF_CID|VF_SHOWID|VF_RECV|VF_STAT|VF_SMNAME|VF_CIDN|VF_CIP;
+
+HINSTANCE hinstance;
+HANDLE hmenuVis,hmenuOff,hmenuHide,hmenuIgnore,hmenuProto,hmenuAdded,hmenuAuthReq;
+HANDLE hmenuCopyID,hmenuRecvFiles,hmenuStatusMsg,hmenuCopyIP,hmenuCopyMirVer;
+static HANDLE hIgnoreItem[9], hProtoItem[MAX_PROTOS], hHooks[8], hServices[12];
+HICON hIcon[5];
+BOOL bMetaContacts, bMir_08;
+PROTOACCOUNT **accs;
+OPENOPTIONSDIALOG ood;
+int protoCount;
+int hLangpack;
+static LONG_PTR OldAuthReqEditProc;
+
+struct {
+ char *module;
+ char *name;
+ TCHAR *fullName;
+ char flag;
+}
+static const statusMsg[] = {
+ { "CList", "StatusMsg", LPGENT("Status message"), 1 },
+ { 0, "XStatusName", LPGENT("XStatus title"), 4 },
+ { 0, "XStatusMsg", LPGENT("XStatus message"), 2 },
+ { "AdvStatus", "tune/text", LPGENT("Listening to"), 8 },
+ { "AdvStatus", "activity/title", LPGENT("Activity title"), 8 },
+ { "AdvStatus", "activity/text", LPGENT("Activity text"), 8 }
+};
+
+struct
+{
+ TCHAR* szDescr;
+ char* szName;
+ int defIconID;
+}
+static const iconList[] = {
+ { _T("Hide from list"), "miex_hidefl", IDI_ICON0 },
+ { _T("Show in list"), "miex_showil", IDI_ICON8 },
+ { _T("Always visible"), "miex_vis", IDI_ICON1 },
+ { _T("Never visible"), "miex_invis", IDI_ICON2 },
+ { _T("Send 'You were added'"), "miex_added", IDI_ICON4 },
+ { _T("Request authorization"), "miex_authorization", IDI_ICON5 },
+ { _T("Copy to Account"), "miex_protocol", IDI_ICON6 },
+ { _T("Ignore"), "miex_ignore", IDI_ICON7 },
+ { _T("Browse Received Files"), "miex_recfiles", IDI_ICON12 },
+ { _T("Copy MirVer"), "miex_copymver", IDI_ICON13 }
+};
+
+struct
+{
+ TCHAR* szDescr;
+ char* szName;
+ int defIconID;
+}
+static const overlayIconList[] = {
+ { _T("Copy ID"), "miex_copyid", IDI_ICON3 },
+ { _T("Copy Status Message"), "miex_copysm1", IDI_ICON9 },
+ { _T("Copy xStatus Message"), "miex_copysm2", IDI_ICON10 },
+ { _T("Copy IP"), "miex_copyip", IDI_ICON11 }
+};
+
+struct {
+ TCHAR* name;
+ int type;
+ int icon;
+}
+static const ii[] = {
+ { LPGENT("All"), IGNOREEVENT_ALL, SKINICON_OTHER_FILLEDBLOB },
+ { LPGENT("Messages"), IGNOREEVENT_MESSAGE, SKINICON_EVENT_MESSAGE },
+ { LPGENT("URL"), IGNOREEVENT_URL, SKINICON_EVENT_URL },
+ { LPGENT("Files"), IGNOREEVENT_FILE, SKINICON_EVENT_FILE },
+ { LPGENT("User Online"), IGNOREEVENT_USERONLINE, SKINICON_OTHER_USERONLINE },
+ { LPGENT("Authorization"), IGNOREEVENT_AUTHORIZATION, SKINICON_OTHER_MIRANDA },
+ { LPGENT("You Were Added"), IGNOREEVENT_YOUWEREADDED, SKINICON_OTHER_ADDCONTACT },
+ { LPGENT("Typing Notify"), IGNOREEVENT_TYPINGNOTIFY, SKINICON_OTHER_TYPING }
+};
+
+PLUGININFOEX pluginInfoEx = {
+ sizeof(PLUGININFOEX),
+ MODULENAME,
+ __VERSION_DWORD,
+ __DESC,
+ __AUTHORS,
+ __EMAIL,
+ __COPYRIGHTS,
+ __WEB,
+ UNICODE_AWARE,
+ MIID_MENUEX
+};
+
+struct ModSetLinkLinkItem { // code from dbe++ plugin by Bio
+ char *name;
+ BYTE *next; //struct ModSetLinkLinkItem
+};
+
+typedef struct {
+ struct ModSetLinkLinkItem *first;
+ struct ModSetLinkLinkItem *last;
+} ModuleSettingLL;
+
+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;
+
+ return CallService(MS_DB_CONTACT_GETSETTING_STR,(WPARAM)hContact,(LPARAM)&cgs);
+}
+
+int enumModulesSettingsProc( const char *szName, LPARAM lParam)
+{
+ ModuleSettingLL *msll = (ModuleSettingLL *)lParam;
+ if (!msll->first)
+ {
+ msll->first = (struct ModSetLinkLinkItem *)malloc(sizeof(struct ModSetLinkLinkItem));
+ if (!msll->first) return 1;
+ msll->first->name = _strdup(szName);
+ msll->first->next = 0;
+ msll->last = msll->first;
+ }
+ else
+ {
+ struct ModSetLinkLinkItem *item = (struct ModSetLinkLinkItem *)malloc(sizeof(struct ModSetLinkLinkItem));
+ if (!item) return 1;
+ msll->last->next = (BYTE*)item;
+ msll->last = (struct ModSetLinkLinkItem *)item;
+ item->name = _strdup(szName);
+ item->next = 0;
+ }
+ return 0;
+}
+
+void FreeModuleSettingLL(ModuleSettingLL* msll)
+{
+ if (msll)
+ {
+ struct ModSetLinkLinkItem *item = msll->first;
+ struct ModSetLinkLinkItem *temp;
+
+ while (item)
+ {
+ if (item->name)
+ {
+ free(item->name);
+ item->name = 0;
+ }
+ temp = item;
+ item = (struct ModSetLinkLinkItem *)item->next;
+ if (temp)
+ {
+ free(temp);
+ temp = 0;
+ }
+ }
+
+ msll->first = 0;
+ msll->last = 0;
+ }
+}
+
+void RenameDbProto(HANDLE hContact, HANDLE hContactNew, char* oldName, char* newName, int delOld)
+{
+ DBVARIANT dbv;
+ ModuleSettingLL settinglist;
+ struct ModSetLinkLinkItem *setting;
+ DBCONTACTENUMSETTINGS dbces;
+
+ // enum all setting the contact has for the module
+ dbces.pfnEnumProc = enumModulesSettingsProc;
+ dbces.szModule = oldName;
+ dbces.lParam = (LPARAM)&settinglist;
+ settinglist.first = 0;
+ settinglist.last = 0;
+ CallService(MS_DB_CONTACT_ENUMSETTINGS, (WPARAM)hContact,(LPARAM)&dbces);
+
+ setting = settinglist.first;
+ while (setting)
+ {
+ if (!GetSetting(hContact,oldName,setting->name,&dbv))
+ {
+ switch (dbv.type)
+ {
+ case DBVT_BYTE:
+ DBWriteContactSettingByte(hContactNew, newName, setting->name, dbv.bVal);
+ break;
+ case DBVT_WORD:
+ DBWriteContactSettingWord(hContactNew, newName, setting->name, dbv.wVal);
+ break;
+ case DBVT_DWORD:
+ DBWriteContactSettingDword(hContactNew, newName, setting->name, dbv.dVal);
+ break;
+ case DBVT_ASCIIZ:
+ DBWriteContactSettingString(hContactNew, newName, setting->name, dbv.pszVal);
+ break;
+ case DBVT_UTF8:
+ DBWriteContactSettingStringUtf(hContactNew, newName, setting->name, dbv.pszVal);
+ break;
+ case DBVT_BLOB:
+ DBWriteContactSettingBlob(hContactNew, newName, setting->name, dbv.pbVal, dbv.cpbVal);
+ break;
+
+ }
+ if (delOld)
+ DBDeleteContactSetting(hContact, oldName, setting->name);
+ }
+ DBFreeVariant(&dbv);
+ setting = (struct ModSetLinkLinkItem *)setting->next;
+ }
+ FreeModuleSettingLL(&settinglist);
+} // end code from dbe++
+
+static void IconsInit()
+{
+ int i;
+ TCHAR tszFile[MAX_PATH];
+ GetModuleFileName(hinstance, tszFile, MAX_PATH);
+
+ SKINICONDESC sid = {0};
+ sid.cbSize = sizeof(SKINICONDESC);
+ sid.flags = SIDF_ALL_TCHAR;
+ sid.ptszDefaultFile = tszFile;
+ sid.cx = sid.cy = 16;
+ sid.ptszSection = LPGENT(MODULENAME);
+
+ for ( i = 0; i < SIZEOF(iconList); i++ ) {
+ sid.pszName = iconList[i].szName;
+ sid.ptszDescription = iconList[i].szDescr;
+ sid.iDefaultIndex = -iconList[i].defIconID;
+ Skin_AddIcon(&sid);
+ }
+
+ for ( i = 0; i < SIZEOF(overlayIconList); i++ ) {
+ sid.pszName = overlayIconList[i].szName;
+ sid.ptszDescription = overlayIconList[i].szDescr;
+ sid.iDefaultIndex = -overlayIconList[i].defIconID;
+ Skin_AddIcon(&sid);
+ }
+}
+
+void ShowPopup(char* szText, TCHAR* tszText, HANDLE hContact)
+{
+ POPUPDATAT ppd = {0};
+ TCHAR* text = 0;
+
+ if (tszText)
+ text = mir_tstrdup(tszText);
+ else if (szText)
+ text = mir_a2t(szText);
+ if (!text) return;
+
+ ppd.lchIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA);
+ ppd.lchContact = hContact;
+ _tcsncpy(ppd.lptzContactName, (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR), MAX_CONTACTNAME - 1);
+ _tcsncpy(ppd.lptzText, text, MAX_SECONDLINE - 1);
+ ppd.iSeconds = -1;
+
+ PUAddPopUpT(&ppd);
+ mir_free(text);
+}
+
+BOOL DirectoryExists(HANDLE hContact)
+{
+ int attr;
+ char path[MAX_PATH];
+ CallService(MS_FILE_GETRECEIVEDFILESFOLDER, (WPARAM)hContact, (LPARAM)&path);
+ attr = GetFileAttributesA(path);
+ return (attr != -1) && (attr&FILE_ATTRIBUTE_DIRECTORY);
+}
+
+void CopyToClipboard(HWND hwnd,LPSTR pszMsg, LPTSTR ptszMsg)
+{
+ HGLOBAL hglbCopy;
+ LPTSTR lptstrCopy;
+ LPTSTR buf = 0;
+ if (ptszMsg)
+ buf = mir_tstrdup(ptszMsg);
+ else if (pszMsg)
+ buf = mir_a2t(pszMsg);
+
+ if (buf == 0)
+ return;
+
+ hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(buf)+1)*sizeof(TCHAR));
+ lptstrCopy = (LPTSTR)GlobalLock(hglbCopy);
+ lstrcpy(lptstrCopy, buf);
+ mir_free(buf);
+ GlobalUnlock(hglbCopy);
+
+ OpenClipboard(NULL);
+ EmptyClipboard();
+
+ SetClipboardData(CF_UNICODETEXT, hglbCopy);
+
+ CloseClipboard();
+}
+
+BOOL isMetaContact(HANDLE hContact) {
+
+ char *proto;
+ if(bMetaContacts) {
+ proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if ( lstrcmpA(proto,"MetaContacts") == 0 ) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+HANDLE getDefaultContact(HANDLE hContact) {
+
+ if(bMetaContacts) {
+ return (HANDLE)CallService(MS_MC_GETDEFAULTCONTACT,(WPARAM)hContact,0);
+ }
+ return 0;
+}
+
+HANDLE getMostOnline(HANDLE hContact) {
+
+ if(bMetaContacts) {
+ return (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT,(WPARAM)hContact,0);
+ }
+ return 0;
+}
+
+void GetID(HANDLE hContact,LPSTR szProto,LPSTR szID)
+{
+ DBVARIANT dbv_uniqueid;
+ LPSTR uID = (LPSTR) CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
+ if ( uID == (LPSTR)CALLSERVICE_NOTFOUND )
+ uID = NULL;
+
+ *szID = '\0';
+
+ if ( uID && DBGetContactSetting(hContact, szProto, uID ,&dbv_uniqueid) == 0 ) {
+ if (dbv_uniqueid.type == DBVT_DWORD)
+ wsprintfA(szID, "%u", dbv_uniqueid.dVal);
+ else if (dbv_uniqueid.type == DBVT_WORD)
+ wsprintfA(szID, "%u", dbv_uniqueid.wVal);
+ else if (dbv_uniqueid.type == DBVT_BLOB)
+ wsprintfA(szID, "%s", dbv_uniqueid.cpbVal);
+ else
+ wsprintfA(szID, "%s", dbv_uniqueid.pszVal);
+
+ DBFreeVariant(&dbv_uniqueid);
+ }
+}
+
+int StatusMsgExists(HANDLE hContact)
+{
+ LPSTR module,msg;
+ char par[32];
+ BOOL ret = 0;
+ int i;
+
+ module = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (!module) return 0;
+
+ for(i = 0; i < SIZEOF(statusMsg); i++) {
+ if (statusMsg[i].flag & 8)
+ mir_snprintf(par, SIZEOF(par), "%s/%s", module, statusMsg[i].name);
+ else
+ strcpy(par, statusMsg[i].name);
+
+ msg = DBGetString(hContact, (statusMsg[i].module) ? statusMsg[i].module : module, par);
+ if(msg) {
+ if(strlen(msg))
+ ret |= statusMsg[i].flag;
+ mir_free(msg);
+ }
+ }
+ return ret;
+}
+
+BOOL IPExists(HANDLE hContact)
+{
+ LPSTR szProto;
+ DWORD mIP,rIP;
+
+ szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (!szProto) return 0;
+
+ mIP = DBGetContactSettingDword(hContact, szProto, "IP", 0);
+ rIP = DBGetContactSettingDword(hContact, szProto, "RealIP", 0);
+
+ return (mIP != 0 || rIP != 0);
+}
+
+BOOL MirVerExists(HANDLE hContact)
+{
+ LPSTR szProto, msg;
+ BOOL ret = 0;
+
+ szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (!szProto) return 0;
+
+ msg = DBGetString(hContact,szProto,"MirVer");
+ if(msg) {
+ if(strlen(msg)) ret = 1;
+ mir_free(msg);
+ }
+
+ return ret;
+}
+
+void getIP(HANDLE hContact,LPSTR szProto,LPSTR szIP)
+{
+ char szmIP[64] = {0};
+ char szrIP[64] = {0};
+ DWORD mIP = DBGetContactSettingDword(hContact, szProto, "IP", 0);
+ DWORD rIP = DBGetContactSettingDword(hContact, szProto, "RealIP", 0);
+ if ( mIP ) wsprintfA(szmIP, "External IP: %d.%d.%d.%d\r\n", mIP>>24,(mIP>>16)&0xFF,(mIP>>8)&0xFF,mIP&0xFF);
+ if ( rIP ) wsprintfA(szrIP, "Internal IP: %d.%d.%d.%d\r\n", rIP>>24,(rIP>>16)&0xFF,(rIP>>8)&0xFF,rIP&0xFF);
+ strcpy(szIP,szrIP);
+ strcat(szIP,szmIP);
+}
+
+LPSTR getMirVer(HANDLE hContact)
+{
+ LPSTR szProto, msg;
+
+ szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (!szProto) return NULL;
+
+ msg = DBGetString(hContact,szProto,"MirVer");
+ if(msg) {
+ if(strlen(msg))
+ return msg;
+ mir_free(msg);
+ }
+
+ return NULL;
+}
+
+static LRESULT CALLBACK AuthReqEditSubclassProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
+{
+ switch(msg) {
+ case WM_CHAR:
+ if(wParam == '\n' && CTRL_IS_PRESSED) { // ctrl + ENTER
+ PostMessage(GetParent(hwnd), WM_COMMAND, IDOK, 0);
+ return 0;
+ }
+ if(wParam == 1 && CTRL_IS_PRESSED) { // ctrl + a
+ SendMessage(hwnd, EM_SETSEL, 0, -1);
+ return 0;
+ }
+ break;
+ case WM_SETFOCUS:
+ SendMessage(hwnd, EM_SETSEL, 0, -1);
+ break;
+ }
+ return CallWindowProc((WNDPROC)OldAuthReqEditProc,hwnd,msg,wParam,lParam);
+}
+
+INT_PTR CALLBACK AuthReqWndProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
+{
+ static HANDLE hcontact;
+
+ switch(msg){
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hdlg);
+ OldAuthReqEditProc = SetWindowLongPtr(GetDlgItem(hdlg, IDC_REASON), GWLP_WNDPROC, (LONG_PTR)AuthReqEditSubclassProc);
+ SendDlgItemMessage(hdlg, IDC_REASON, EM_LIMITTEXT, (WPARAM)255, 0);
+ SetDlgItemText(hdlg, IDC_REASON, TranslateT("Please authorize me to add you to my contact list."));
+ hcontact = (HANDLE)lparam;
+ break;
+
+ case WM_COMMAND:
+ switch(LOWORD(wparam)) {
+ case IDOK:
+ {
+ char szReason[256] = {0};
+
+ WCHAR wszReason[256] = {0};
+
+ if (CallService(MS_SYSTEM_GETVERSION, 0, 0) < 0x00090007)
+ {
+ GetDlgItemTextA(hdlg,IDC_REASON,szReason,255);
+ CallContactService(hcontact,PSS_AUTHREQUEST,0,(LPARAM)szReason);
+ }
+ else
+ {
+ GetDlgItemText(hdlg,IDC_REASON,wszReason,255);
+ CallContactService(hcontact,PSS_AUTHREQUESTW,0,(LPARAM)wszReason);
+ }
+
+ } // fall through
+ case IDCANCEL:
+ DestroyWindow(hdlg);
+ break;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+BOOL isVisSupport(HANDLE hContact)
+{
+ char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+ if(szProto == NULL) return 0;
+ return CallProtoService(szProto,PS_GETCAPS,PFLAGNUM_1,0)&PF1_INVISLIST;
+}
+
+BOOL isInvSupport(HANDLE hContact)
+{
+ char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+ if(szProto == NULL) return 0;
+ return CallProtoService(szProto,PS_GETCAPS,PFLAGNUM_1,0)&PF1_VISLIST;
+}
+
+BOOL isProtoOnline(char *szProto)
+{
+//#ifdef _DEBUG
+// return TRUE;
+//#else
+ DWORD protoStatus;
+ protoStatus = CallProtoService(szProto,PS_GETSTATUS,0,0);
+ return (protoStatus > ID_STATUS_OFFLINE && protoStatus < ID_STATUS_IDLE);
+
+//#endif
+}
+
+INT_PTR onSendAuthRequest(WPARAM wparam,LPARAM lparam)
+{
+ DWORD flags;
+ char *szProto;
+
+ szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO,wparam,0);
+
+ flags = CallProtoService(szProto,PS_GETCAPS,PFLAGNUM_4,0);
+ if (flags&PF4_NOCUSTOMAUTH)
+ CallContactService((HANDLE)wparam,PSS_AUTHREQUEST,0, (LPARAM)"");
+ else
+ CreateDialogParam(hinstance,MAKEINTRESOURCE(IDD_AUTHREQ),(HWND)CallService(MS_CLUI_GETHWND,0,0),AuthReqWndProc,(LPARAM)wparam);
+
+ return 0;
+}
+
+INT_PTR onSendAdded(WPARAM wparam,LPARAM lparam)
+{
+ CallContactService((HANDLE)wparam,PSS_ADDED,0,0);
+ return 0;
+}
+
+// set the invisible-flag in db
+INT_PTR onSetInvis(WPARAM wparam,LPARAM lparam)
+{
+ CallContactService((HANDLE)wparam,PSS_SETAPPARENTMODE,(DBGetContactSettingWord((HANDLE)wparam,(const char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wparam,0),"ApparentMode",0) == ID_STATUS_OFFLINE)?0:ID_STATUS_OFFLINE,0);
+ return 0;
+}
+
+// set visible-flag in db
+INT_PTR onSetVis(WPARAM wparam,LPARAM lparam)
+{
+ CallContactService((HANDLE)wparam,PSS_SETAPPARENTMODE,(DBGetContactSettingWord((HANDLE)wparam,(const char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wparam,0),"ApparentMode",0) == ID_STATUS_ONLINE)?0:ID_STATUS_ONLINE,0);
+ return 0;
+}
+
+INT_PTR onHide(WPARAM wparam,LPARAM lparam)
+{
+ DBWriteContactSettingByte((HANDLE)wparam,"CList","Hidden",(byte)!DBGetContactSettingByte((HANDLE)wparam,"CList","Hidden",0));
+ CallService(MS_CLUI_SORTLIST,0,0);
+ return 0;
+}
+
+void ShowItem(CLISTMENUITEM *cli, HANDLE hmenu)
+{
+ cli->flags = CMIM_FLAGS | CMIF_TCHAR;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenu,(LPARAM)cli);
+}
+
+void HideItem(CLISTMENUITEM *cli,HANDLE hmenu)
+{
+ cli->flags|=CMIF_HIDDEN;
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenu,(LPARAM)cli);
+}
+
+// following 4 functions should be self-explanatory
+void ModifyVisibleSet(CLISTMENUITEM *cli,int mode,BOOL alpha)
+{
+ cli->flags |= CMIM_ICON;
+ cli->hIcon = (mode) ? hIcon[1] : (alpha?hIcon[3] : LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT));
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hmenuVis, (LPARAM)cli);
+}
+
+void ModifyInvisSet(CLISTMENUITEM *cli,int mode,BOOL alpha)
+{
+ cli->flags |= CMIM_ICON;
+ cli->hIcon = (mode) ? hIcon[2] : (alpha ? hIcon[4] : LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT));
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hmenuOff, (LPARAM)cli);
+}
+
+void ModifyHidden(CLISTMENUITEM *cli,int mode)
+{
+ cli->flags |= CMIM_ICON | CMIM_NAME;
+ cli->hIcon = (mode) ?
+ (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_showil") :
+ (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_hidefl");
+ cli->ptszName = mode ? LPGENT("Show in list") : LPGENT("Hide from list");
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hmenuHide, (LPARAM)cli);
+}
+
+void ModifyCopyID(CLISTMENUITEM *cli, HANDLE hContact, BOOL bShowID, BOOL bTrimID)
+{
+ LPSTR szProto;
+ char szID[256];
+ TCHAR buffer[256];
+ HICON hIconCID;
+ HANDLE hC;
+
+ cli->flags|=CMIM_ICON|CMIM_NAME;
+
+ if(isMetaContact(hContact)) {
+ hC = getMostOnline(hContact);
+ if ( !hContact ) hC = getDefaultContact(hContact);
+ hContact = hC;
+ }
+
+ szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (!szProto) {
+ HideItem(cli,hmenuCopyID);
+ return;
+ }
+ hIconCID = (HICON) CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
+ cli->hIcon = BindOverlayIcon(hIconCID, "miex_copyid");
+ DestroyIcon(hIconCID);
+ hIconCID = cli->hIcon;
+
+ GetID(hContact,szProto,(LPSTR)&szID);
+ if(szID[0])
+ {
+ if (bShowID)
+ {
+ TCHAR* tmp;
+
+ if (bTrimID && (strlen(szID) > MAX_IDLEN))
+ {
+ szID[MAX_IDLEN - 2] = szID[MAX_IDLEN - 1] = szID[MAX_IDLEN] = '.';
+ szID[MAX_IDLEN + 1] = 0;
+ }
+ tmp = mir_a2t(szID);
+ mir_sntprintf(buffer, SIZEOF(buffer), _T("%s [%s]"), TranslateT("Copy ID"), tmp);
+ mir_free(tmp);
+
+ cli->ptszName = (TCHAR*)&buffer;
+ }
+ else
+ cli->ptszName = _T("Copy ID");
+ }
+ else {
+ cli->flags = CMIM_FLAGS|CMIF_HIDDEN;
+ }
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenuCopyID,(LPARAM)cli);
+ DestroyIcon(hIconCID);
+}
+
+void ModifyStatusMsg(CLISTMENUITEM *cli,HANDLE hContact)
+{
+ LPSTR szProto;
+ HICON hIconSMsg;
+
+ cli->flags|=CMIM_ICON;
+
+ szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (!szProto) {
+ HideItem(cli,hmenuStatusMsg);
+ return;
+ }
+
+ hIconSMsg = (HICON) CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
+ cli->hIcon = BindOverlayIcon(hIconSMsg, (StatusMsgExists(hContact)&2) ? "miex_copysm2" : "miex_copysm1");
+ DestroyIcon(hIconSMsg);
+ hIconSMsg = cli->hIcon;
+
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenuStatusMsg,(LPARAM)cli);
+ DestroyIcon(hIconSMsg);
+}
+
+void ModifyCopyIP(CLISTMENUITEM *cli,HANDLE hContact)
+{
+ LPSTR szProto;
+ HICON hIconCIP;
+
+ cli->flags |= CMIM_ICON;
+
+ szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (!szProto) {
+ HideItem(cli,hmenuCopyIP);
+ return;
+ }
+
+ hIconCIP = (HICON) CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
+
+ cli->hIcon = BindOverlayIcon(hIconCIP, "miex_copyip");
+ DestroyIcon(hIconCIP);
+ hIconCIP = cli->hIcon;
+
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenuCopyIP,(LPARAM)cli);
+ DestroyIcon(hIconCIP);
+}
+
+void ModifyCopyMirVer(CLISTMENUITEM *cli,HANDLE hContact)
+{
+ LPSTR msg;
+ cli->flags|=CMIM_ICON;
+ cli->hIcon = NULL;
+ if(ServiceExists(MS_FP_GETCLIENTICON)) {
+ msg = getMirVer(hContact);
+ if(msg) {
+ cli->hIcon = (HICON)CallService(MS_FP_GETCLIENTICON,(WPARAM)msg,(LPARAM)1);
+ mir_free(msg);
+ }
+ }
+ if (!cli->hIcon) cli->hIcon = hIcon[0];
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hmenuCopyMirVer,(LPARAM)cli);
+}
+
+INT_PTR onCopyID(WPARAM wparam,LPARAM lparam)
+{
+ LPSTR szProto;
+ char szID[128] = {0}, buffer[256] = {0};
+ HANDLE hContact ,hC;
+ PROTOACCOUNT* pa;
+
+ hContact = (HANDLE)wparam;
+ if(isMetaContact(hContact)) {
+ hC = getMostOnline(hContact);
+ if ( !hContact ) hC = getDefaultContact(hContact);
+ hContact = hC;
+ }
+ if ((szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0)) == NULL)
+ return 0;
+
+ GetID(hContact,szProto,(LPSTR)&szID);
+
+ if(DBGetContactSettingDword(NULL,VISPLG,"flags",vf_default)&VF_CIDN) {
+ if (bMir_08)
+ pa = (PROTOACCOUNT*)CallService(MS_PROTO_GETACCOUNT, 0, (LPARAM)szProto);
+
+ if (bMir_08 && !pa->bOldProto)
+ mir_snprintf(buffer, SIZEOF(buffer), "%s: %s", pa->szProtoName, szID);
+ else
+ mir_snprintf(buffer, SIZEOF(buffer), "%s: %s", szProto, szID);
+ }
+ else
+ strcpy(buffer, szID);
+
+ CopyToClipboard((HWND)lparam, buffer, 0);
+ if(CTRL_IS_PRESSED && ServiceExists(MS_POPUP_ADDPOPUP))
+ ShowPopup(buffer, 0, hContact);
+
+ return 0;
+}
+
+INT_PTR onCopyStatusMsg(WPARAM wparam,LPARAM lparam)
+{
+ LPSTR module;
+ LPTSTR msg;
+ char par[32];
+ TCHAR buffer[2048];
+ int i;
+ DWORD flags = DBGetContactSettingDword(NULL,VISPLG,"flags",vf_default);
+
+ module = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, wparam, 0);
+ if (!module) return 0;
+
+ buffer[0] = 0;
+ for(i = 0; i < SIZEOF(statusMsg); i++) {
+ if (statusMsg[i].flag & 8)
+ mir_snprintf(par, SIZEOF(par), "%s/%s", module, statusMsg[i].name);
+ else
+ strcpy(par, statusMsg[i].name);
+
+ msg = DBGetStringT((HANDLE)wparam, (statusMsg[i].module) ? statusMsg[i].module : module, par);
+ if(msg)
+ {
+ if(_tcsclen(msg))
+ {
+ if (flags&VF_SMNAME)
+ {
+ _tcsncat (buffer, TranslateTS(statusMsg[i].fullName), (SIZEOF(buffer) - _tcsclen(buffer) - 1));
+ _tcsncat (buffer, _T(": "), (SIZEOF(buffer) - _tcsclen(buffer) - 1));
+ }
+ _tcsncat(buffer, msg, (SIZEOF(buffer) - _tcsclen(buffer) - 1));
+ _tcsncat(buffer, _T("\r\n"), (SIZEOF(buffer) - _tcsclen(buffer) - 1));
+ }
+ mir_free(msg);
+ }
+ }
+
+ CopyToClipboard((HWND)lparam, 0, buffer);
+ if(CTRL_IS_PRESSED && ServiceExists(MS_POPUP_ADDPOPUP))
+ ShowPopup(0, buffer, (HANDLE)wparam);
+
+ return 0;
+}
+
+INT_PTR onCopyIP(WPARAM wparam,LPARAM lparam)
+{
+ LPSTR szProto;
+ char szIP[128];
+
+ szProto = (LPSTR) CallService(MS_PROTO_GETCONTACTBASEPROTO, wparam, 0);
+ getIP((HANDLE)wparam,szProto,(LPSTR)&szIP);
+
+ CopyToClipboard((HWND)lparam, szIP, 0);
+ if(CTRL_IS_PRESSED && ServiceExists(MS_POPUP_ADDPOPUP))
+ ShowPopup(szIP, 0, (HANDLE)wparam);
+
+ return 0;
+}
+
+INT_PTR onCopyMirVer(WPARAM wparam,LPARAM lparam)
+{
+ LPSTR msg = getMirVer((HANDLE)wparam);
+ if(msg) {
+ CopyToClipboard((HWND)lparam, msg, 0);
+ if(CTRL_IS_PRESSED && ServiceExists(MS_POPUP_ADDPOPUP))
+ ShowPopup(msg, 0, (HANDLE)wparam);
+
+ mir_free(msg);
+ }
+ return 0;
+}
+
+INT_PTR onRecvFiles(WPARAM wparam,LPARAM lparam)
+{
+ char path[MAX_PATH];
+ CallService(MS_FILE_GETRECEIVEDFILESFOLDER, wparam, (LPARAM)&path);
+ ShellExecuteA(0, "open", path, 0, 0, SW_SHOW);
+ return 0;
+}
+
+INT_PTR onChangeProto(WPARAM wparam,LPARAM lparam)
+{
+ HANDLE hContact, hContactNew;
+
+ hContact = (HANDLE)wparam;
+ if (!strcmp((char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, wparam, 0), (char*)lparam))
+ return 0;
+
+ if (CTRL_IS_PRESSED)
+ {
+ hContactNew = hContact;
+ RenameDbProto(hContact, hContactNew, (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0), (char*)lparam, 1);
+ CallService(MS_PROTO_REMOVEFROMCONTACT, (WPARAM)hContact, CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0));
+ CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContactNew, lparam);
+ }
+ else
+ {
+ hContactNew = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0);
+ if (hContactNew)
+ {
+ CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContactNew, lparam);
+ RenameDbProto(hContact, hContactNew, (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0), (char*)lparam, 0);
+ RenameDbProto(hContact, hContactNew, "CList", "CList", 0);
+ }
+ else
+ return 0;
+ }
+ if(MessageBox(NULL,(LPCTSTR)TranslateT("Do you want to send authorization request\nto new contact?"),
+ TranslateT("Miranda IM"), MB_OKCANCEL | MB_SETFOREGROUND | MB_TOPMOST) == IDOK)
+
+ onSendAuthRequest((WPARAM)hContactNew, 0);
+
+ return 0;
+}
+
+int isIgnored(HANDLE hContact, int type)
+{
+ int i = 0, all = 0;
+ if (type == IGNOREEVENT_ALL)
+ {
+ for (i = 1; i < SIZEOF(ii); i++)
+ {
+ if (isIgnored(hContact, ii[i].type))
+ all++;
+ }
+ return (all == SIZEOF(ii) - 1) ? 1 : 0; // ignoring all or not
+ }
+ else
+ return CallService(MS_IGNORE_ISIGNORED, (WPARAM)hContact, (LPARAM)type);
+}
+
+INT_PTR onIgnore(WPARAM wparam,LPARAM lparam)
+{
+ if (DBGetContactSettingByte(NULL, VISPLG, "ignorehide", 0) && (lparam == IGNOREEVENT_ALL)) {
+ DBWriteContactSettingByte((HANDLE)wparam, "CList", "Hidden", (isIgnored((HANDLE)wparam, lparam) ? (byte)0 : (byte)1));
+ CallService(MS_CLUI_SORTLIST, 0, 0);
+ }
+
+ CallService(isIgnored((HANDLE)wparam, lparam) ? MS_IGNORE_UNIGNORE : MS_IGNORE_IGNORE, wparam, lparam);
+ return 0;
+}
+
+static HANDLE AddSubmenuItem(HANDLE hRoot, TCHAR* name, HICON icon, DWORD flag, char* service, int pos, int param)
+{
+ CLISTMENUITEM mi = { 0 };
+ mi.cbSize = sizeof(mi);
+ mi.hParentMenu = (HGENMENU)hRoot;
+ mi.pszPopupName = (char*)hRoot; // for Miranda 0.7
+ mi.popupPosition = param;
+ mi.position = pos;
+ mi.ptszName = name;
+ mi.hIcon = icon;
+ mi.flags = CMIF_TCHAR | CMIF_CHILDPOPUP;
+ if (flag)
+ mi.flags |= flag;
+ mi.pszService = service;
+ return Menu_AddContactMenuItem(&mi);
+}
+
+static void ModifySubmenuItem(HANDLE hItem, TCHAR* name, int checked, int hidden)
+{
+ CLISTMENUITEM mi = { 0 };
+ mi.cbSize = sizeof(mi);
+ mi.ptszName = name;
+ mi.flags = CMIM_FLAGS | CMIF_TCHAR;
+ if ( checked )
+ mi.flags |= CMIF_CHECKED;
+ if ( hidden )
+ mi.flags |= CMIF_HIDDEN;
+ CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hItem, (LPARAM)&mi);
+}
+
+// called when the contact-menu is built
+int BuildMenu(WPARAM wparam,LPARAM lparam)
+{
+ CLISTMENUITEM miAV = {0},miNV,miHFL,miIGN,miPROTO,miADD,miREQ,miCID,miRECV,miSTAT,miCIP,miCMV;
+ DWORD flags = DBGetContactSettingDword(NULL,VISPLG,"flags",vf_default);
+ int i = 0, j = 0, check = 0, all = 0, hide = 0;
+ BOOL bIsOnline = FALSE, bShowAll = CTRL_IS_PRESSED;
+ PROTOACCOUNT* pa;
+ char* pszProto;
+ pszProto = (LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO, wparam, 0);
+ if(bMir_08)
+ pa = (PROTOACCOUNT*)CallService(MS_PROTO_GETACCOUNT, 0, (LPARAM)pszProto);
+
+ bIsOnline = isProtoOnline(pszProto);
+
+ miAV.cbSize = sizeof(CLISTMENUITEM);
+ miAV.flags = CMIM_FLAGS | CMIF_TCHAR;
+ miAV.hIcon = NULL;
+ miAV.pszContactOwner = NULL;
+ miNV = miHFL = miIGN = miPROTO = miADD = miREQ = miCID = miRECV = miSTAT = miCIP = miCMV = miAV;
+
+ if(bShowAll || flags&VF_VS) {
+ ShowItem(&miAV,hmenuVis);
+ ShowItem(&miNV,hmenuOff);
+ }
+ else {
+ HideItem(&miAV,hmenuVis);
+ HideItem(&miNV,hmenuOff);
+ }
+
+ if(bShowAll || flags&VF_HFL){
+ ShowItem(&miHFL,hmenuHide);
+ ModifyHidden(&miHFL,DBGetContactSettingByte((HANDLE)wparam,"CList","Hidden",0));
+ }
+ else HideItem(&miHFL,hmenuHide);
+
+ if(bShowAll || flags&VF_IGN)
+ {
+ ShowItem(&miIGN,hmenuIgnore);
+ for (i = 1; i < SIZEOF(ii); i++)
+ {
+ check = isIgnored((HANDLE)wparam, ii[i].type);
+ if (check)
+ all++;
+ ModifySubmenuItem(hIgnoreItem[i], ii[i].name, check, 0);
+
+ if (all == SIZEOF(ii) - 1) // ignor all
+ check = 1;
+ else
+ check = 0;
+ ModifySubmenuItem(hIgnoreItem[0], ii[i].name, check, 0);
+ }
+ }
+
+ else HideItem(&miIGN,hmenuIgnore);
+
+ if(bMir_08 && pa && (bShowAll || flags&VF_PROTO))
+ {
+ for (i = 0; i < protoCount; i++)
+ {
+ if ((!accs[i]->bIsEnabled) || (strcmp(pa->szProtoName, accs[i]->szProtoName)))
+ hide = 1;
+ else
+ {
+ hide = 0;
+ j++;
+ }
+
+ if (CallService(MS_PROTO_ISPROTOONCONTACT, wparam, (LPARAM)accs[i]->szModuleName))
+ check = 1;
+ else
+ check = 0;
+
+ ModifySubmenuItem(hProtoItem[i], accs[i]->tszAccountName, check, hide);
+ }
+ if (j > 1)
+ ShowItem(&miPROTO,hmenuProto);
+ else
+ HideItem(&miPROTO,hmenuProto);
+ }
+ else HideItem(&miPROTO,hmenuProto);
+
+ if ((bShowAll || flags & VF_ADD) && bIsOnline && (bMir_08 ? IsAccountEnabled( pa ) : TRUE))
+ ShowItem(&miADD,hmenuAdded);
+ else
+ HideItem(&miADD,hmenuAdded);
+
+ if ((bShowAll || flags & VF_REQ) && bIsOnline && (bMir_08 ? IsAccountEnabled( pa ) : TRUE))
+ ShowItem(&miREQ,hmenuAuthReq);
+ else
+ HideItem(&miREQ,hmenuAuthReq);
+
+ if(bShowAll || flags&VF_CID){
+ ShowItem(&miCID,hmenuCopyID);
+ ModifyCopyID(&miCID,(HANDLE)wparam, flags&VF_SHOWID, flags&VF_TRIMID);
+ }
+ else HideItem(&miCID,hmenuCopyID);
+
+ if ((bShowAll || flags&VF_RECV) && DirectoryExists((HANDLE)wparam)) ShowItem(&miRECV,hmenuRecvFiles);
+ else HideItem(&miRECV,hmenuRecvFiles);
+
+ if ((bShowAll || flags&VF_STAT) && StatusMsgExists((HANDLE)wparam)) {
+ ShowItem(&miSTAT,hmenuStatusMsg);
+ ModifyStatusMsg(&miSTAT,(HANDLE)wparam);
+ }
+ else HideItem(&miSTAT,hmenuStatusMsg);
+
+ if ((bShowAll || flags&VF_CIP) && IPExists((HANDLE)wparam)) {
+ ShowItem(&miCIP,hmenuCopyIP);
+ ModifyCopyIP(&miCIP,(HANDLE)wparam);
+ }
+ else HideItem(&miCIP,hmenuCopyIP);
+
+ if ((bShowAll || flags&VF_CMV) && MirVerExists((HANDLE)wparam)) {
+ ShowItem(&miCMV,hmenuCopyMirVer);
+ ModifyCopyMirVer(&miCMV,(HANDLE)wparam);
+ }
+ else HideItem(&miCMV,hmenuCopyMirVer);
+
+ if(bShowAll || (flags&VF_VS))
+ {
+ int apparent = DBGetContactSettingWord((HANDLE)wparam,(const char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wparam,0),"ApparentMode",0);
+ if(isVisSupport((HANDLE)wparam)) ModifyVisibleSet(&miAV,apparent == ID_STATUS_ONLINE,flags&VF_SAI);
+ else HideItem(&miAV,hmenuVis);
+ if(isInvSupport((HANDLE)wparam)) ModifyInvisSet(&miNV,apparent == ID_STATUS_OFFLINE,flags&VF_SAI);
+ else HideItem(&miAV,hmenuOff);
+ }
+ return 0;
+}
+
+int EnumProtoSubmenu(WPARAM wparam, LPARAM lparam)
+{
+ int i;
+ int pos = 1000;
+ if (protoCount) // remove old items
+ {
+ for (i = 0; i < protoCount; i++)
+ {
+ if (hProtoItem[i])
+ {
+ CallService(MS_CLIST_REMOVECONTACTMENUITEM, (WPARAM)hProtoItem[i], 0);
+ hProtoItem[i] = 0;
+ }
+ }
+ }
+ CallService( MS_PROTO_ENUMACCOUNTS, (WPARAM)&protoCount, (LPARAM)&accs);
+ if (protoCount > MAX_PROTOS)
+ protoCount = MAX_PROTOS;
+ for (i = 0; i < protoCount; i++)
+ {
+ hProtoItem[i] = AddSubmenuItem((HGENMENU)hmenuProto, accs[i]->tszAccountName,
+ LoadSkinnedProtoIcon(accs[i]->szModuleName, ID_STATUS_ONLINE), CMIF_KEEPUNTRANSLATED,
+ MS_PROTO, pos++, (int)accs[i]->szModuleName);
+ }
+ return 0;
+}
+
+// Tabsrmm toolbar support
+static int TabsrmmButtonPressed(WPARAM wParam, LPARAM lParam)
+{
+ CustomButtonClickData *cbcd = (CustomButtonClickData *)lParam;
+
+ if (!strcmp(cbcd->pszModule, MODULENAME) && cbcd->dwButtonId == 0)
+ onRecvFiles(wParam, 0);
+
+ return 0;
+}
+
+static int TabsrmmButtonsInit(WPARAM wParam, LPARAM lParam)
+{
+ BBButton bbd = {0};
+
+ bbd.cbSize = sizeof(BBButton);
+ bbd.pszModuleName = MODULENAME;
+ bbd.dwButtonID = 0;
+ bbd.dwDefPos = 1000;
+ bbd.ptszTooltip = _T("Browse Received Files");
+ bbd.bbbFlags = BBBF_ISLSIDEBUTTON | BBBF_CANBEHIDDEN;
+ bbd.hIcon = (HANDLE)CallService(MS_SKIN2_GETICONHANDLE, 0, (LPARAM)"miex_recfiles");
+ CallService (MS_BB_ADDBUTTON, 0, (LPARAM)&bbd);
+
+ return 0;
+}
+
+static void TabsrmmButtonsModify(HANDLE hContact)
+{
+ if (!DirectoryExists(hContact))
+ {
+ BBButton bbd = {0};
+ bbd.cbSize = sizeof(BBButton);
+ bbd.dwButtonID = 0;
+ bbd.pszModuleName = MODULENAME;
+ bbd.bbbFlags = BBSF_DISABLED | BBSF_HIDDEN;
+ CallService(MS_BB_SETBUTTONSTATE, (WPARAM)hContact, (LPARAM)&bbd);
+ }
+}
+
+static int ContactWindowOpen(WPARAM wparam,LPARAM lParam)
+{
+ MessageWindowEventData *MWeventdata = (MessageWindowEventData*)lParam;
+
+ if(MWeventdata->uType == MSG_WINDOW_EVT_OPENING && MWeventdata->hContact)
+ {
+ TabsrmmButtonsModify(MWeventdata->hContact);
+ }
+ return 0;
+}
+
+static int ContactSettingChanged( WPARAM wParam, LPARAM lParam )
+{ // NSN
+ DBCONTACTWRITESETTING *cws = ( DBCONTACTWRITESETTING* )lParam;
+ WORD newStatus = 0, oldStatus = 0;
+ DWORD dwStatuses = 0;
+ time_t tCurrentTime;
+ char *lpzProto;
+
+ if ( ( HANDLE )wParam == NULL || lstrcmpA( cws->szSetting, "Status" ))
+ return 0;
+
+ newStatus = cws->value.wVal;
+ oldStatus = DBGetContactSettingWord((HANDLE)wParam,"UserOnline","OldStatus2",ID_STATUS_OFFLINE );
+ if (oldStatus == newStatus)
+ return 0;
+
+ tCurrentTime = time( NULL );
+ lpzProto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )wParam, 0);
+
+ // ignore chat rooms
+ if (DBGetContactSettingByte((HANDLE)wParam, lpzProto, "ChatRoom", 0))
+ return 0;
+
+ if (oldStatus == ID_STATUS_OFFLINE)
+ {
+ // set online timestamp for this contact, only when not set already
+ if (!DBGetContactSettingDword( ( HANDLE )wParam, lpzProto, "LogonTS", FALSE))
+ DBWriteContactSettingDword( ( HANDLE )wParam, lpzProto, "LogonTS", ( DWORD )tCurrentTime);
+
+ // TODO: dont reset logoff timestamp?
+ DBDeleteContactSetting( ( HANDLE )wParam, lpzProto, "LogoffTS");
+
+ // TESTING: updating user's details
+ if (DBGetContactSettingDword(NULL, VISPLG, "flags", vf_default) & VF_REFRESH)
+ {
+ // don't refresh Hidden or NotOnList contact's details
+ if (!DBGetContactSettingByte((HANDLE)wParam, "CList", "Hidden", 0) && !DBGetContactSettingByte((HANDLE)wParam, "CList", "NotOnList", 0))
+ CallContactService( ( HANDLE )wParam, PSS_GETINFO, 0, 0 );
+ }
+ }
+ if (newStatus == ID_STATUS_OFFLINE)
+ {
+ // set offline timestamp for this contact
+ DBWriteContactSettingDword( ( HANDLE )wParam, lpzProto, "LogoffTS", ( DWORD )tCurrentTime);
+ // reset logon timestamp
+ DBDeleteContactSetting( ( HANDLE )wParam, lpzProto, "LogonTS");
+
+ // set last status for this contact
+ DBWriteContactSettingDword( ( HANDLE )wParam, lpzProto, "LastStatus", ( DWORD )oldStatus);
+ }
+ DBWriteContactSettingWord( ( HANDLE )wParam, "UserOnline", "OldStatus2", newStatus);
+
+ return 0;
+}
+
+// called when all modules are loaded
+static int PluginInit(WPARAM wparam,LPARAM lparam)
+{
+ int pos = 1000, i = 0;
+
+ CLISTMENUITEM mi;
+
+ IconsInit();
+
+ bMetaContacts = ServiceExists(MS_MC_GETMETACONTACT) != 0;
+ bMir_08 = ServiceExists(MS_PROTO_GETACCOUNT) != 0;
+
+ hServices[0] = CreateServiceFunction(MS_SETINVIS,onSetInvis);
+ hServices[1] = CreateServiceFunction(MS_SETVIS,onSetVis);
+ hServices[2] = CreateServiceFunction(MS_HIDE,onHide);
+ hServices[3] = CreateServiceFunction(MS_IGNORE,onIgnore);
+ if (bMir_08)
+ hServices[4] = CreateServiceFunction(MS_PROTO,onChangeProto);
+ hServices[5] = CreateServiceFunction(MS_ADDED,onSendAdded);
+ hServices[6] = CreateServiceFunction(MS_AUTHREQ,onSendAuthRequest);
+ hServices[7] = CreateServiceFunction(MS_COPYID,onCopyID);
+ hServices[8] = CreateServiceFunction(MS_RECVFILES,onRecvFiles);
+ hServices[9] = CreateServiceFunction(MS_STATUSMSG,onCopyStatusMsg);
+ hServices[10] = CreateServiceFunction(MS_COPYIP,onCopyIP);
+ hServices[11] = CreateServiceFunction(MS_COPYMIRVER,onCopyMirVer);
+
+ mi.cbSize = sizeof(CLISTMENUITEM);
+ mi.flags = CMIF_TCHAR;
+ mi.hIcon = NULL;
+ mi.pszContactOwner = NULL;
+
+ mi.position = 120000;
+ mi.ptszName = LPGENT("Always visible");
+ mi.pszService = MS_SETVIS;
+ hmenuVis = Menu_AddContactMenuItem(&mi);
+
+ mi.position++;
+ mi.ptszName = LPGENT("Never visible");
+ mi.pszService = MS_SETINVIS;
+ hmenuOff = Menu_AddContactMenuItem(&mi);
+
+ mi.position++;
+ mi.ptszName = NULL;
+ mi.pszService = MS_HIDE;
+ hmenuHide = Menu_AddContactMenuItem(&mi);
+
+ mi.position++;
+ mi.pszPopupName = (char*)-1; // for Miranda 0.7
+ mi.ptszName = LPGENT("Ignore");
+ mi.pszService = 0;
+ mi.flags |= CMIF_ROOTHANDLE;
+ mi.hIcon = (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_ignore" );
+ hmenuIgnore = Menu_AddContactMenuItem(&mi);
+
+ hIgnoreItem[0] = AddSubmenuItem(hmenuIgnore, ii[0].name, LoadSkinnedIcon(ii[0].icon), 0, MS_IGNORE, pos, ii[0].type );
+ pos += 100000; // insert separator
+ for (i = 1; i < SIZEOF(ii); i++)
+ hIgnoreItem[i] = AddSubmenuItem(hmenuIgnore, ii[i].name, LoadSkinnedIcon(ii[i].icon), 0, MS_IGNORE, pos++, ii[i].type );
+
+ pos += 100000; // insert separator
+ ood.cbSize = sizeof(ood);
+ ood.pszGroup = "Events";
+ ood.pszPage = "Ignore";
+ AddSubmenuItem(hmenuIgnore, LPGENT("Open ignore settings"), (HICON)CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_ignore"), 0, MS_OPT_OPENOPTIONS, pos, (int)&ood );
+
+ mi.pszPopupName = 0;
+ if (bMir_08) {
+ mi.position++;
+ mi.ptszName = LPGENT("Copy to Account");
+ mi.pszService = MS_PROTO;
+ mi.hIcon = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_protocol");
+ hmenuProto = Menu_AddContactMenuItem(&mi);
+
+ EnumProtoSubmenu(0, 0);
+ }
+
+ mi.flags = CMIF_TCHAR;
+
+ mi.position++;
+ mi.ptszName = LPGENT("Send 'You were added'");
+ mi.pszService = MS_ADDED;
+ mi.hIcon = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_added");
+ hmenuAdded = Menu_AddContactMenuItem(&mi);
+
+ mi.position++;
+ mi.ptszName = LPGENT("Request authorization");
+ mi.pszService = MS_AUTHREQ;
+ mi.hIcon = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_authorization");
+ hmenuAuthReq = Menu_AddContactMenuItem(&mi);
+
+ mi.position++;
+ mi.ptszName = LPGENT("Copy ID");
+ mi.pszService = MS_COPYID;
+ hmenuCopyID = Menu_AddContactMenuItem(&mi);
+
+ mi.position++;
+ mi.ptszName = LPGENT("Browse Received Files");
+ mi.pszService = MS_RECVFILES;
+ mi.hIcon = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_recfiles");
+ hmenuRecvFiles = Menu_AddContactMenuItem(&mi);
+
+ mi.position++;
+ mi.ptszName = LPGENT("Copy Status Message");
+ mi.pszService = MS_STATUSMSG;
+ mi.hIcon = NULL;//LoadIcon(hinstance, MAKEINTRESOURCE(IDI_ICON5));
+ hmenuStatusMsg = Menu_AddContactMenuItem(&mi);
+
+ mi.position++;
+ mi.ptszName = LPGENT("Copy IP");
+ mi.pszService = MS_COPYIP;
+ hmenuCopyIP = Menu_AddContactMenuItem(&mi);
+
+ mi.position++;
+ mi.ptszName = LPGENT("Copy MirVer");
+ mi.pszService = MS_COPYMIRVER;
+ hmenuCopyMirVer = Menu_AddContactMenuItem(&mi);
+
+ hIcon[0] = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_copymver");
+ hIcon[1] = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_vis");
+ hIcon[2] = ( HICON )CallService( MS_SKIN2_GETICON, 0, (LPARAM)"miex_invis");
+ hIcon[3] = MakeHalfAlphaIcon(hIcon[1]);
+ hIcon[4] = MakeHalfAlphaIcon(hIcon[2]);
+
+ hHooks[0] = HookEvent(ME_CLIST_PREBUILDCONTACTMENU,BuildMenu);
+ hHooks[1] = HookEvent(ME_OPT_INITIALISE,OptionsInit);
+ hHooks[2] = HookEvent(ME_DB_CONTACT_SETTINGCHANGED,ContactSettingChanged);
+ if (bMir_08)
+ hHooks[3] = HookEvent(ME_PROTO_ACCLISTCHANGED, EnumProtoSubmenu);
+ hHooks[4] = HookEvent(ME_MSG_TOOLBARLOADED, TabsrmmButtonsInit);
+ if (hHooks[4])
+ {
+ hHooks[5] = HookEvent(ME_MSG_BUTTONPRESSED, TabsrmmButtonPressed);
+ hHooks[6] = HookEvent(ME_MSG_WINDOWEVENT,ContactWindowOpen);
+ }
+
+ return 0;
+}
+
+extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = {MIID_MENUEX, MIID_LAST};
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ return &pluginInfoEx;
+}
+
+extern "C" __declspec(dllexport) int Load(void)
+{
+
+ mir_getLP(&pluginInfoEx);
+ hHooks[7] = HookEvent(ME_SYSTEM_MODULESLOADED,PluginInit);
+ return 0;
+}
+
+extern "C" __declspec(dllexport) int Unload(void)
+{
+ int i;
+ for (i = 0; i < SIZEOF(hHooks); i++)
+ {
+ if (hHooks[i])
+ UnhookEvent(hHooks[i]);
+ }
+ for (i = 0; i < SIZEOF(hServices); i++)
+ {
+ if (hServices[i])
+ DestroyServiceFunction(hServices[i]);
+ }
+
+ DestroyIcon( hIcon[3] );
+ DestroyIcon( hIcon[4] );
+ return 0;
+}
+
+BOOL WINAPI DllMain(HINSTANCE hinst,DWORD fdwReason,LPVOID lpvReserved)
+{
+ hinstance = hinst;
+ return 1;
+}
\ No newline at end of file diff --git a/plugins/MenuItemEx/src/menuex.h b/plugins/MenuItemEx/src/menuex.h new file mode 100644 index 0000000000..5f6540827a --- /dev/null +++ b/plugins/MenuItemEx/src/menuex.h @@ -0,0 +1,73 @@ +#ifndef MENUEX_H__
+#define MENUEX_H__
+
+#define _CRT_SECURE_NO_DEPRECATE
+#define MIRANDA_VER 0x0A00
+
+#include "m_stdhdr.h"
+#include <windows.h>
+#include "resource.h"
+#include <stdio.h>
+#include "newpluginapi.h"
+#include "win2k.h"
+#include "time.h"
+#include "m_system.h"
+#include "m_utils.h"
+#include "m_options.h"
+#include "m_database.h"
+#include "m_langpack.h"
+#include "m_file.h"
+#include "m_clist.h"
+#include "m_protosvc.h"
+#include "m_protomod.h"
+#include "m_clui.h"
+#include "m_ignore.h"
+#include "m_icolib.h"
+#include "m_skin.h"
+#include "m_genmenu.h"
+#include "m_popup.h"
+#include "m_message.h"
+#include "m_fingerprint.h"
+#include "m_metacontacts.h"
+#include "m_msg_buttonsbar.h"
+
+#pragma optimize("gsy",on)
+
+#define VISPLG "MenuItemEx"
+#define MODULENAME VISPLG
+
+#define MIIM_STRING 0x00000040
+
+extern PLUGININFOEX pluginInfoEx;
+
+int OptionsInit(WPARAM,LPARAM);
+
+#define MAX_PROTOS 32
+#define MAX_GROUPS 32
+#define MAX_IDLEN 16
+
+#define VF_VS 0x00000001
+#define VF_SMNAME 0x00000002
+#define VF_HFL 0x00000004
+#define VF_IGN 0x00000008
+#define VF_PROTO 0x00000010
+#define VF_SHOWID 0x00000020
+#define VF_ADD 0x00000040
+#define VF_REQ 0x00000080
+#define VF_CID 0x00000100
+#define VF_RECV 0x00000200
+#define VF_STAT 0x00000400
+#define VF_CIDN 0x00000800
+#define VF_CIP 0x00001000
+#define VF_SAI 0x00002000
+#define VF_TRIMID 0x00004000
+#define VF_CMV 0x00008000
+#define VF_IGNH 0x00010000
+#define VF_REFRESH 0x00020000
+
+#define CTRL_IS_PRESSED (GetAsyncKeyState(VK_CONTROL)&0x8000)
+
+extern const int vf_default;
+extern BOOL bMir_08;
+
+#endif
diff --git a/plugins/MenuItemEx/src/options.cpp b/plugins/MenuItemEx/src/options.cpp new file mode 100644 index 0000000000..0aa0bbb68b --- /dev/null +++ b/plugins/MenuItemEx/src/options.cpp @@ -0,0 +1,136 @@ +#include "menuex.h"
+
+
+extern HINSTANCE hinstance;
+
+struct {
+ int idc;
+ int flag;
+}
+static const checkboxes[]={
+ { IDC_COPYID, VF_CID },
+ { IDC_STATUSMSG, VF_STAT },
+ { IDC_COPYIP, VF_CIP },
+ { IDC_COPYMIRVER, VF_CMV },
+ { IDC_VIS, VF_VS },
+ { IDC_SHOWALPHAICONS, VF_SAI },
+ { IDC_HIDE, VF_HFL },
+ { IDC_IGNORE, VF_IGN },
+ { IDC_IGNOREHIDE, VF_IGNH },
+ { IDC_PROTOS, VF_PROTO },
+ { IDC_ADDED, VF_ADD },
+ { IDC_AUTHREQ, VF_REQ },
+ { IDC_SHOWID, VF_SHOWID },
+ { IDC_COPYIDNAME, VF_CIDN },
+ { IDC_RECVFILES, VF_RECV },
+ { IDC_SMNAME, VF_SMNAME },
+ { IDC_TRIMID, VF_TRIMID },
+ { IDC_REFRESH_DETAILS, VF_REFRESH }
+};
+
+INT_PTR CALLBACK OptionsProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
+{
+ DWORD flags=DBGetContactSettingDword(NULL,VISPLG,"flags",vf_default);
+ TCHAR buffer[64] = {0};
+ int i;
+
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+
+ TranslateDialogDefault(hdlg);
+
+ for (i = 0; i < SIZEOF(checkboxes); i++)
+ {
+ CheckDlgButton(hdlg, checkboxes[i].idc, (flags & checkboxes[i].flag) ? BST_CHECKED : BST_UNCHECKED);
+ }
+
+ if (ServiceExists(MS_POPUP_ADDPOPUP))
+ {
+ for (i = 0; i < 4; i++)
+ {
+ GetDlgItemText(hdlg, checkboxes[i].idc, buffer, SIZEOF(buffer) - 3);
+ _tcscat(buffer, _T(" *"));
+ SetDlgItemText(hdlg, checkboxes[i].idc, buffer);
+ }
+ }
+ else
+ ShowWindow(GetDlgItem(hdlg, IDC_HINT1), SW_HIDE);
+
+ if (!bMir_08)
+ EnableWindow(GetDlgItem(hdlg,IDC_PROTOS), 0);
+
+ SendMessage(hdlg, WM_USER + 50, 0, 0);
+ return 0;
+
+ case WM_USER+50:
+
+ EnableWindow(GetDlgItem(hdlg,IDC_SHOWALPHAICONS),
+ IsDlgButtonChecked(hdlg,IDC_VIS) == BST_CHECKED);
+ EnableWindow(GetDlgItem(hdlg,IDC_IGNOREHIDE),
+ IsDlgButtonChecked(hdlg,IDC_IGNORE) == BST_CHECKED);
+ EnableWindow(GetDlgItem(hdlg,IDC_COPYIDNAME),
+ IsDlgButtonChecked(hdlg,IDC_COPYID) == BST_CHECKED);
+ EnableWindow(GetDlgItem(hdlg,IDC_SHOWID),
+ IsDlgButtonChecked(hdlg,IDC_COPYID) == BST_CHECKED);
+ EnableWindow(GetDlgItem(hdlg,IDC_TRIMID),
+ (IsDlgButtonChecked(hdlg,IDC_COPYID) == BST_CHECKED && IsDlgButtonChecked(hdlg,IDC_SHOWID) == BST_CHECKED));
+ EnableWindow(GetDlgItem(hdlg,IDC_SMNAME),
+ IsDlgButtonChecked(hdlg,IDC_STATUSMSG) == BST_CHECKED);
+ return 1;
+
+ case WM_NOTIFY:
+ switch(((LPNMHDR)lparam)->code){
+ case PSN_APPLY:
+ {
+ DWORD mod_flags=0;
+
+ for (i = 0; i < SIZEOF(checkboxes); i++)
+ {
+ mod_flags |= IsDlgButtonChecked(hdlg, checkboxes[i].idc) ? checkboxes[i].flag : 0;
+ }
+
+ //DBDeleteContactSetting(NULL,VISPLG,"flags");
+ DBWriteContactSettingDword(NULL,VISPLG,"flags",mod_flags);
+
+ return 1;
+ }
+ }
+ break;
+
+ case WM_COMMAND:
+ if(HIWORD(wparam)==BN_CLICKED && GetFocus()==(HWND)lparam) {
+ SendMessage(GetParent(hdlg),PSM_CHANGED,0,0);
+ if (LOWORD(wparam) == IDC_VIS ||
+ LOWORD(wparam) == IDC_IGNORE ||
+ LOWORD(wparam) == IDC_COPYID ||
+ LOWORD(wparam) == IDC_STATUSMSG ||
+ LOWORD(wparam) == IDC_SHOWID) {
+
+ SendMessage(hdlg, WM_USER + 50, 0, 0);
+ }
+ }
+ return 0;
+
+ case WM_CLOSE:
+ EndDialog(hdlg,0);
+ return 0;
+ }
+ return 0;
+}
+
+int OptionsInit(WPARAM wparam,LPARAM lparam)
+{
+ OPTIONSDIALOGPAGE odp={0};
+ odp.cbSize = sizeof(odp);
+ odp.position = 955000000;
+ odp.hInstance = hinstance;
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS);
+ odp.pszTitle = MODULENAME;
+ odp.pfnDlgProc = OptionsProc;
+ odp.pszGroup = LPGEN("Customize");
+ odp.flags = ODPF_BOLDGROUPS;
+ Options_AddPage(wparam,&odp);
+
+ return 0;
+}
diff --git a/plugins/MenuItemEx/src/resource.h b/plugins/MenuItemEx/src/resource.h new file mode 100644 index 0000000000..18b7de34cd --- /dev/null +++ b/plugins/MenuItemEx/src/resource.h @@ -0,0 +1,52 @@ +//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by resource.rc
+//
+#define IDD_OPTIONS 101
+#define IDD_AUTHREQ 103
+#define IDI_ICON0 110
+#define IDI_ICON1 111
+#define IDI_ICON2 112
+#define IDI_ICON3 113
+#define IDI_ICON4 114
+#define IDI_ICON5 115
+#define IDI_ICON6 116
+#define IDI_ICON7 117
+#define IDI_ICON8 118
+#define IDI_ICON9 119
+#define IDI_ICON10 120
+#define IDI_ICON11 121
+#define IDI_ICON12 122
+#define IDI_ICON13 123
+#define IDC_VIS 1000
+#define IDC_REASON 1001
+#define IDC_HIDE 1002
+#define IDC_IGNORE 1003
+#define IDC_PROTOS 1004
+#define IDC_REFRESH_DETAILS 1005
+#define IDC_ADDED 1006
+#define IDC_AUTHREQ 1007
+#define IDC_COPYID 1008
+#define IDC_RECVFILES 1009
+#define IDC_STATUSMSG 1010
+#define IDC_COPYIDNAME 1011
+#define IDC_COPYIP 1012
+#define IDC_SHOWALPHAICONS 1013
+#define IDC_SMNAME 1014
+#define IDC_COPYMIRVER 1015
+#define IDC_HINT1 1016
+#define IDC_SHOWID 1017
+#define IDC_TRIMID 1018
+#define IDC_IGNOREHIDE 1019
+#define IDC_STATIC -1
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 124
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1017
+#define _APS_NEXT_SYMED_VALUE 125
+#endif
+#endif
diff --git a/plugins/MenuItemEx/src/version.h b/plugins/MenuItemEx/src/version.h new file mode 100644 index 0000000000..b98a1d6faf --- /dev/null +++ b/plugins/MenuItemEx/src/version.h @@ -0,0 +1,13 @@ +#define __FILEVERSION_STRING 1,3,0,9
+#define __VERSION_STRING "1.3.0.9"
+#define __VERSION_DWORD 0x01030009
+
+#define __PLUGIN_NAME "MenuItemEx"
+#define __WEB "http://nightly.miranda.im"
+#define __DESC "Adds some useful options to a contacts menu."
+#define __AUTHORS "Heiko Schillinger, Baloo, Billy_Bons, Robert Posel"
+#define __EMAIL "micron@nexgo.de, baloo@bk.ru, tatarinov.sergey@gmail.com, robyer@seznam.cz"
+#define __COPYRIGHTS "© 2001-03 Heiko Schillinger, © 2006-08 Baloo, © 2009-10 Billy_Bons, © 2011-12 Robert Posel"
+
+// {b1902a52-9114-4d7e-ac2e-b3a52e01d574}
+#define MIID_MENUEX {0xb1902a52, 0x9114, 0x4d7e, { 0xac, 0x2e, 0xb3, 0xa5, 0x2e, 0x01, 0xd5, 0x74 }}
|