aboutsummaryrefslogtreecommitdiffstats
//=============================================================================
//
//   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 <windows.h>
#include <process.h>

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