//============================================================================= // // File : winamp.cpp // Creation date : Tue Nov 6 23:01:12 2001 GMT by Szymon Stefanek // // This file is part of the KVIrc IRC client distribution // Copyright (C) 2001-2010 Szymon Stefanek (pragma at kvirc dot net) // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the HOPE that it will be USEFUL, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, write to the Free Software Foundation, // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //============================================================================= #include #include // // This is a winamp-kvirc interface plugin // // This stuff is compiled only on windows, as a separate dll module struct winampGeneralPurposePlugin { int version; char * description; int (*init)(); void (*config)(); void (*quit)(); HWND hwndParent; HINSTANCE hDllInstance; }; #define GPPHDR_VER 0x10 extern winampGeneralPurposePlugin * gen_plugins[256]; typedef winampGeneralPurposePlugin * (*winampGeneralPurposePluginGetter)(); int init(); void quit(); void config(); winampGeneralPurposePlugin plugin = { GPPHDR_VER, "KVIrc interface plugin 1.0", init, config, quit, }; #define KVIRC_WM_USER 63112 #define KVIRC_WM_USER_GETTITLE 5000 #define KVIRC_WM_USER_GETFILE 10000 #define KVIRC_WM_USER_TRANSFER 15000 #define IPC_GETPLAYLISTFILE 211 #define IPC_GETPLAYLISTTITLE 212 #define IPC_GETLISTPOS 125 #define KVIRC_WM_USER_CHECK 13123 #define KVIRC_WM_USER_CHECK_REPLY 13124 void * lpWndProcOld = nullptr; char szBuffer[4096]; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if(message == WM_USER) { if(wParam == KVIRC_WM_USER) { if(lParam == KVIRC_WM_USER_CHECK) { return KVIRC_WM_USER_CHECK_REPLY; } if(lParam == KVIRC_WM_USER_GETTITLE) { int idx = (int)SendMessage(hwnd, WM_USER, 0, IPC_GETLISTPOS); if(idx != -1) { char * szTitle = (char *)SendMessage(hwnd, WM_USER, idx, IPC_GETPLAYLISTTITLE); strcpy(szBuffer, szTitle); return strlen(szBuffer); } } else if(lParam == KVIRC_WM_USER_GETFILE) { int idx = (int)SendMessage(hwnd, WM_USER, 0, IPC_GETLISTPOS); if(idx != -1) { char * szTitle = (char *)SendMessage(hwnd, WM_USER, idx, IPC_GETPLAYLISTFILE); strcpy(szBuffer, szTitle); return strlen(szBuffer); } } else if((lParam >= KVIRC_WM_USER_TRANSFER) && (lParam < (KVIRC_WM_USER_TRANSFER + 4096))) { return (LRESULT)szBuffer[lParam - KVIRC_WM_USER_TRANSFER]; } } } return CallWindowProc((WNDPROC)lpWndProcOld, hwnd, message, wParam, lParam); } int init() { lpWndProcOld = (void *)GetWindowLong(plugin.hwndParent, GWLP_WNDPROC); SetWindowLongPtr(plugin.hwndParent, GWLP_WNDPROC, (intptr_t)WndProc); return 0; } void quit() { } void config() { } extern "C" __declspec(dllexport) winampGeneralPurposePlugin * winampGetGeneralPurposePlugin() { return &plugin; }