From LIVECHAT Developer Zone Wiki
#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;
}