#include "common.h" #include "popups.h" #include "options.h" #include HICON hPopupIcon; bool unicode_enabled; void __stdcall sttOpenSRMMWindowProc( ULONG dwParam ) { //CallService(MS_MSG_SENDMESSAGE, (WPARAM)dwParam, 0); // simulate double-click on contact CallService(MS_CLIST_CONTACTDOUBLECLICKED, (WPARAM)dwParam, 0); } void __stdcall sttCloseSRMMWindowProc( ULONG dwParam ) { HANDLE hContact = (HANDLE)dwParam; MessageWindowInputData mwid = {0}; MessageWindowData mwd = {0}; mwid.cbSize = sizeof(mwid); mwid.hContact = hContact; mwid.uFlags = MSG_WINDOW_UFLAG_MSG_BOTH; mwd.cbSize = sizeof(mwd); if(!CallService(MS_MSG_GETWINDOWDATA, (WPARAM)&mwid, (LPARAM)&mwd)) { HWND hwnd = mwd.hwndWindow;//, parent; //while((parent = GetParent(hwnd)) != 0) hwnd = parent; // ensure we have the top level window (need parent window for scriver & tabsrmm) //PostMessage(hwnd, WM_COMMAND, 1023, 0); // chat close tab? (unfortunately, chat doesn't implement the messaging API to notify us of window open/close events PostMessage(hwnd, WM_COMMAND, IDCANCEL, 0); // srmm/scriver close session button PostMessage(hwnd, WM_COMMAND, 1025, 0); // tabsrmm close session button PostMessageWindowList(WMU_CLOSEPOPUP, (WPARAM)hContact, 0); // close popups } } LRESULT CALLBACK NullWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_COMMAND: { HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact); QueueUserAPC( sttOpenSRMMWindowProc , mainThread, ( ULONG )hContact ); PUDeletePopUp( hWnd ); return TRUE; } case WMU_CLOSEPOPUP: { HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact); if((HANDLE)wParam == hContact) PUDeletePopUp( hWnd ); return TRUE; } case WM_CONTEXTMENU: { // mark most recent event read...FIXME (may not be correct event) HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact); HANDLE lastDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDLAST, (WPARAM)hContact, 0); int count = 0; while(lastDbEvent && count++ < 10) { CallService(MS_DB_EVENT_MARKREAD, (WPARAM)hContact, (LPARAM)lastDbEvent); CallService(MS_CLIST_REMOVEEVENT, (WPARAM)hContact, (LPARAM)lastDbEvent); lastDbEvent = (HANDLE)CallService(MS_DB_EVENT_FINDPREV, (WPARAM)lastDbEvent, 0); } if(options.close_win) QueueUserAPC( sttCloseSRMMWindowProc , mainThread, ( ULONG )hContact ); PUDeletePopUp( hWnd ); return TRUE; } case UM_FREEPLUGINDATA: { HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact); RemoveFromWindowList(hContact, hWnd); return TRUE; } case UM_INITPOPUP: HANDLE hContact = (HANDLE)CallService(MS_POPUP_GETPLUGINDATA, (WPARAM)hWnd, (LPARAM)&hContact); if(!InList(hContact, hWnd)) AddToWindowList(hContact, hWnd); return TRUE; } return DefWindowProc(hWnd, message, wParam, lParam); } void __stdcall sttPopupProc( ULONG param ){ //DWORD sttPopupProc(LPVOID param) { POPUPDATAEX* ppd = ( POPUPDATAEX* )param; if ( ServiceExists(MS_POPUP_ADDPOPUPEX) ) CallService( MS_POPUP_ADDPOPUPEX, ( WPARAM )ppd, 0 ); else if ( ServiceExists(MS_POPUP_ADDPOPUP) ) CallService( MS_POPUP_ADDPOPUP, ( WPARAM )ppd, 0 ); free( ppd ); //return 0; } void __stdcall sttPopupProcW( ULONG param ) { //DWORD sttPopupProcW(LPVOID param) { POPUPDATAW* ppd = ( POPUPDATAW* )param; if ( ServiceExists(MS_POPUP_ADDPOPUPW) ) CallService( MS_POPUP_ADDPOPUPW, ( WPARAM )ppd, 0 ); free( ppd ); //return 0; } void ShowPopup( HANDLE hContact, const char* line1, const char* line2, int flags ) { if(CallService(MS_SYSTEM_TERMINATED, 0, 0)) return; if ( !ServiceExists( MS_POPUP_ADDPOPUP )) { char title[256]; sprintf(title, "%s Message", MODULE); if(line1 && line2) { char *message = new char[strlen(line1) + strlen(line2) + 2]; // newline and null terminator sprintf(message, "%s\n%s", line1, line2); MessageBoxA( NULL, message, title, MB_OK | MB_ICONINFORMATION ); delete message; } else if(line1) { MessageBoxA( NULL, line1, title, MB_OK | MB_ICONINFORMATION ); } else if(line2) { MessageBoxA( NULL, line2, title, MB_OK | MB_ICONINFORMATION ); } return; } POPUPDATAEX* ppd = ( POPUPDATAEX* )malloc( sizeof( POPUPDATAEX )); memset((void *)ppd, 0, sizeof(POPUPDATAEX)); ppd->lchContact = hContact; HANDLE hMeta = 0; if((hMeta = (HANDLE)CallService(MS_MC_GETMETACONTACT, (WPARAM)hContact, 0)) != 0) ppd->lchContact = hMeta; ppd->lchIcon = hPopupIcon; if(line1 && line2) { strncpy( ppd->lpzContactName, line1, MAX_CONTACTNAME ); strncpy( ppd->lpzText, line2, MAX_SECONDLINE ); } else { if(line1) { strncpy( ppd->lpzText, line1, MAX_SECONDLINE ); } else { if(line2) strncpy( ppd->lpzText, line2, MAX_SECONDLINE ); } } if(options.set_colours) { ppd->colorBack = options.bkCol; ppd->colorText = options.textCol; } ppd->iSeconds = options.timeout; ppd->PluginWindowProc = ( WNDPROC )NullWindowProc; ppd->PluginData = NULL; ppd->PluginData = (void *)hContact; QueueUserAPC( sttPopupProc , mainThread, ( ULONG )ppd ); //CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sttPopupProc, (LPVOID)ppd, 0, 0)); } void ShowPopupW( HANDLE hContact, const wchar_t* line1, const wchar_t* line2, int flags ) { if(CallService(MS_SYSTEM_TERMINATED, 0, 0)) return; if ( !ServiceExists( MS_POPUP_ADDPOPUPW )) { wchar_t title[256]; _stprintf(title, _T("%s Message"), _T(MODULE)); if(line1 && line2) { wchar_t *message = new wchar_t[_tcslen(line1) + _tcslen(line2) + 2]; // newline and null terminator _stprintf(message, _T("%s\n%s"), line1, line2); MessageBoxW( NULL, message, title, MB_OK | MB_ICONINFORMATION ); delete message; } else if(line1) { MessageBoxW( NULL, line1, title, MB_OK | MB_ICONINFORMATION ); } else if(line2) { MessageBoxW( NULL, line2, title, MB_OK | MB_ICONINFORMATION ); } return; } POPUPDATAW* ppd = ( POPUPDATAW* )malloc( sizeof( POPUPDATAW )); memset((void *)ppd, 0, sizeof(POPUPDATAW)); ppd->lchContact = hContact; HANDLE hMeta = 0; if((hMeta = (HANDLE)CallService(MS_MC_GETMETACONTACT, (WPARAM)hContact, 0)) != 0) ppd->lchContact = hMeta; ppd->lchIcon = hPopupIcon; if(line1 && line2) { _tcsncpy( ppd->lpwzContactName, line1, MAX_CONTACTNAME ); _tcsncpy( ppd->lpwzText, line2, MAX_SECONDLINE ); } else { if(line1) { _tcsncpy( ppd->lpwzText, line1, MAX_SECONDLINE ); } else { if(line2) _tcsncpy( ppd->lpwzText, line2, MAX_SECONDLINE ); } } if(options.set_colours) { ppd->colorBack = options.bkCol; ppd->colorText = options.textCol; } ppd->iSeconds = options.timeout; ppd->PluginWindowProc = ( WNDPROC )NullWindowProc; ppd->PluginData = NULL; ppd->PluginData = (void *)hContact; QueueUserAPC( sttPopupProcW , mainThread, ( ULONG )ppd ); //CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sttPopupProcW, (LPVOID)ppd, 0, 0)); } void ShowWarning(char *msg) { if(ServiceExists(MS_POPUP_SHOWMESSAGE)) { char message[1024]; sprintf(message, "%s: %s", MODULE, msg); PUShowMessage(message, SM_WARNING); } else { char title[512]; sprintf(title, "%s Warning", MODULE); MessageBoxA(0, msg, title, MB_OK | MB_ICONWARNING); } } void ShowError(char *msg) { if(ServiceExists(MS_POPUP_SHOWMESSAGE)) { char message[1024]; sprintf(message, "%s: %s", MODULE, msg); PUShowMessage(message, SM_WARNING); } else { char title[512]; sprintf(title, "%s Error", MODULE); MessageBoxA(0, msg, title, MB_OK | MB_ICONERROR); } } bool IsUnicodePopupsEnabled() { return unicode_enabled; } void InitUtils() { hPopupIcon = LoadSkinnedIcon(SKINICON_EVENT_MESSAGE); unicode_enabled = ServiceExists(MS_POPUP_ADDPOPUPW) ? true : false; } void DeinitUtils() { DestroyIcon(hPopupIcon); }