PluginTemplate.cpp

From LIVECHAT Developer Zone Wiki

Jump to: navigation, search
#include "stdafx.h"
#include "PluginTemplate.h"

CPlugin* gpPlugin = 0;

CPlugin::CPlugin(void) 
	: mInstance(0)
    , mAppVersion(0)	
	, mAppWindow(0)
	, mWindow(0)
	, mClosed(false)
{
	gpPlugin = this;
}

LPCTSTR CPlugin::name()
{
	PLUGININFO* info = get_plugin_info();
	ASSERT(info);
	if (info)
		return info->name;
	return 0;
}

LPCTSTR CPlugin::dispname()
{
	PLUGININFO* info = get_plugin_info();
	ASSERT(info);
	if (info)
		return info->dispname;
	return 0;
}

bool CPlugin::DllMain(HINSTANCE hInst, DWORD reason)
{
    if(DLL_PROCESS_ATTACH == reason)
    {
        mInstance = hInst;
    }

    return true;
}

PLUGININFO* CPlugin::plugin_info(DWORD version)
{
    mAppVersion = version;	

    return get_plugin_info();
}


HWND CPlugin::load(HINSTANCE instance, HWND hwnd)
{
	ASSERT( gpPlugin != 0 );

	mInstance = instance;
	mAppWindow = hwnd;

	PLUGININFO* info = get_plugin_info();
	
	if (info && create_window( info->name ) == API_SUCCESS )
	{
		on_load();

		return mWindow;
	}

	return 0;
}

int CPlugin::unload()
{   
	mClosed = true;
	mAppWindow = 0;
	VERIFY( destroy_window() == API_SUCCESS );
    return on_unload();
}

int CPlugin::on_load()
{
    return API_SUCCESS;
}

int CPlugin::on_unload()
{
	// You don't need to destroy toolbar. It's done by the application.
	return API_SUCCESS;
}

int CPlugin::call(LPCTSTR cmd)
{
	if (mClosed) return API_ERROR;

	ASSERT( mAppWindow );
	ASSERT( mWindow );
	ASSERT( cmd );
	
	if (mAppWindow && mWindow && cmd )
	{	
		COPYDATASTRUCT oCopyData = {0};

		oCopyData.dwData = 0;
		oCopyData.lpData = (PVOID)cmd;
		oCopyData.cbData = (DWORD)_tcslen(cmd)+1;
		
		if( oCopyData.cbData!=1 )
		{
			if( SendMessage( mAppWindow, WM_COPYDATA, (WPARAM) mWindow, (LPARAM)&oCopyData) == TRUE )
			{
				return API_SUCCESS;			
			}	
		}
	}
	
	TRACE("Failed to send message\n");			
	return API_ERROR;
}

int CPlugin::call(LPCTSTR name, WPARAM wParam, LPARAM lParam)
{
	if (mClosed) return API_ERROR;

	ASSERT( mAppWindow );
	ASSERT( mWindow );
	ASSERT( name );

	PLUGININFO* info = get_plugin_info();
	
	if (mAppWindow && mWindow && name && info)
	{	
		LIVECHAT_RPC data = {0};

		data.nSize = sizeof(LIVECHAT_RPC);
		data.name = name;
		data.wParam = wParam;
		data.lParam = lParam;		
		
		if( SendMessage( mAppWindow, WM_LIVECHAT_RPC, (WPARAM) info->name, (LPARAM)&data) == TRUE )
		{
			return API_SUCCESS;			
		}			
	}
	
	TRACE("Failed to send message\n");			
	return API_ERROR;
}

int CPlugin::on_command(LPCTSTR cmd)
{
	return API_SUCCESS;
}

int CPlugin::on_command(LPCTSTR cmd, WPARAM wParam, LPARAM lParam)
{
	return API_SUCCESS;
}

int CPlugin::create_window(LPCTSTR name)
{
	WNDCLASS wc;

	wc.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
	wc.lpfnWndProc=(WNDPROC)&PluginWindowProc;
	wc.cbClsExtra=0;
	wc.cbWndExtra=0;
	wc.hInstance= mInstance;
	wc.hIcon=NULL;
	wc.hCursor=NULL;
	wc.hbrBackground=NULL;
	wc.lpszMenuName=NULL;
	wc.lpszClassName= name;

	if( RegisterClass(&wc) != 0 )
	{
		mWindow = CreateWindowEx( WS_EX_APPWINDOW|WS_EX_WINDOWEDGE,
						name, _T(""), WS_BORDER|WS_SYSMENU|WS_MINIMIZEBOX,
						CW_USEDEFAULT, CW_USEDEFAULT, 128, 128, NULL, 0, mInstance, 0);

		if (mWindow)
			return API_SUCCESS;
	}

	return API_ERROR;
}

int CPlugin::destroy_window()
{
	if (mWindow)
	{
		DestroyWindow(mWindow);
		mWindow = 0;
		return API_SUCCESS;
	}

	return API_ERROR;
}

static LRESULT APIENTRY PluginWindowProc(HWND hWindow, UINT uiMessage, WPARAM wParam, LPARAM lParam)
{
	LRESULT ret = 0;
	bool bDefProc = false;
	
	switch(uiMessage)
	{
	case WM_LIVECHAT_RPC:
		{
			LPCTSTR name = (LPCTSTR) wParam;
			LIVECHAT_RPC* rpc = (LIVECHAT_RPC*) lParam;

			ASSERT( name );
			ASSERT( rpc );

			if (gpPlugin && !gpPlugin->closed() && name && rpc)
			{
				if ( gpPlugin->on_command(rpc->name, rpc->wParam, rpc->lParam) == API_SUCCESS)
					ret = 1;
			}

			break;
		}

	case WM_COPYDATA:
		if( gpPlugin && !gpPlugin->closed() && gpPlugin->app_hwnd() == (HWND) wParam)
		{
			PCOPYDATASTRUCT poCopyData = (PCOPYDATASTRUCT) lParam;
			
			if ( gpPlugin->on_command( (LPCTSTR)poCopyData->lpData ) == API_SUCCESS )
			{
				ret = 1;
			}
		}
		break;

	default:

		bDefProc = true;
		break;
	}
	if( bDefProc )
		ret = DefWindowProc( hWindow, uiMessage, wParam, lParam);
	
	return ret;
}
Personal tools