// mfcplugintestDlg.cpp : Implementation file
//
#include "stdafx.h"
#include "mfcplugintest.h"
#include "mfcplugintestDlg.h"
#include ".\mfcplugintestdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CmfcplugintestDlg::CmfcplugintestDlg( CWnd* pParent /*=NULL*/ )
: CDialog( CmfcplugintestDlg::IDD, pParent )
, m_strOutput( _T("") )
, m_strInput( _T("") )
{
m_hIcon = AfxGetApp()->LoadIcon( IDR_MAINFRAME );
}
void CmfcplugintestDlg::DoDataExchange( CDataExchange* pDX )
{
CDialog::DoDataExchange(pDX);
DDX_Control( pDX, IDC_PLUGIN_INFO, m_ctrlListPluginInfo );
DDX_Control( pDX, IDC_LOADED_PLUGINS, m_ctrlListLoadedPlugins );
DDX_Text( pDX, IDC_INPUT, m_strInput );
DDX_Text( pDX, IDC_OUTPUT, m_strOutput );
DDX_Control( pDX, IDC_OUTPUT, m_ctrlEditOutput );
DDX_Control( pDX, IDC_INPUT, m_ctrlEditInput );
}
BEGIN_MESSAGE_MAP( CmfcplugintestDlg, CDialog )
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_COMMAND( ID_PLUGINS_EXIT, OnPluginsExit )
ON_COMMAND( ID_PLUGINS_LOADALL, OnPluginsLoadall )
ON_COMMAND( ID_PLUGINS_LOADONE, OnPluginsLoadone )
ON_COMMAND( ID_PLUGINS_UNLOADALL, OnPluginsUnloadall )
ON_COMMAND( ID_PLUGINS_UNLOADONE, OnPluginsUnloadone )
ON_BN_CLICKED( IDOK, OnBnClickedOk )
ON_BN_CLICKED( IDCANCEL, OnBnClickedCancel )
ON_LBN_SELCHANGE( IDC_LOADED_PLUGINS, OnLbnSelchangeLoadedPlugins )
ON_COMMAND( ID_PLUGINS_REFRESH, OnPluginsRefresh )
ON_COMMAND(ID_PLUGINS_LOADALL_FROMPATH, OnPluginsLoadallFrompath)
END_MESSAGE_MAP()
/*********************************************************************************************************/
//
// MESSAGE-HANDLER
//
/*********************************************************************************************************/
BOOL CmfcplugintestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon( m_hIcon, TRUE );
SetIcon( m_hIcon, FALSE );
//
// SET FOCUS TO INPUT CONTROL
//
m_ctrlEditInput.SetFocus();
//
// RETURN TRUE OR AN CONTROL NEEDS THE FOCUS
//
return FALSE;
}
void CmfcplugintestDlg::OnPaint()
{
if (IsIconic())
{
//
// DEVICE FOR PAINTING
//
CPaintDC dc( this );
SendMessage( WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc( ) ), 0 );
//
// CENTER TO CLIENT RECTANGLE
//
int cxIcon = GetSystemMetrics( SM_CXICON );
int cyIcon = GetSystemMetrics( SM_CYICON );
CRect rect;
GetClientRect( &rect );
int x = ( rect.Width() - cxIcon + 1 ) / 2;
int y = ( rect.Height() - cyIcon + 1 ) / 2;
//
// DRAW ICON
//
dc.DrawIcon( x, y, m_hIcon );
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CmfcplugintestDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>( m_hIcon );
}
void CmfcplugintestDlg::OnPluginsExit()
{
this->m_pluginServer.UnloadAllPlugins();
OnCancel();
}
void CmfcplugintestDlg::OnPluginsLoadall()
{
//
// CLEANUP ALL PLUGIN INFOS AND ALL LOADED PLUGINS
//
this->m_ctrlListPluginInfo.ResetContent();
this->m_ctrlListLoadedPlugins.ResetContent();
this->m_pluginServer.UnloadAllPlugins();
//
// LOAD ALL FOUNDED PLUGINS FROM PATH
//
this->m_pluginServer.LoadAllPlugins( "../plugins", "*.dll" );
this->m_pluginServer.GetAllPluginInfos();
this->PutLoadedPlugins();
}
void CmfcplugintestDlg::OnPluginsLoadone()
{
CFileDialog dlg( TRUE, NULL, NULL, OFN_EXPLORER, "Plugins (*.dll)|*.dll|all files (*.*)|*.*||" );
if( IDOK != dlg.DoModal() )
return;
if( this->m_pluginServer.LoadPlugin( dlg.GetPathName().operator LPCTSTR() ) )
{
this->m_pluginInfo = this->m_pluginServer.GetPluginInfo( this->m_pluginServer.GetLoadedPlugins() - 1 );
this->m_ctrlListLoadedPlugins.AddString( this->m_pluginInfo.GetName().c_str() );
}
this->PutLoadedPlugins();
}
void CmfcplugintestDlg::OnPluginsUnloadall()
{
this->m_pluginServer.UnloadAllPlugins();
this->PutLoadedPlugins();
}
void CmfcplugintestDlg::OnPluginsUnloadone()
{
long lNumber = this->m_ctrlListLoadedPlugins.GetCurSel();
if( LB_ERR == lNumber )
{
AfxMessageBox( "Please select a plugin to unload first!", MB_ICONERROR );
return;
}
this->m_pluginServer.UnloadPlugin( lNumber );
this->PutLoadedPlugins();
}
void CmfcplugintestDlg::OnBnClickedOk()
{
//
// Puffer to save all selected plugin ids.
//
int* piSelPlugins = NULL;
UpdateData();
this->m_strOutput = this->m_strInput;
this->m_ctrlEditInput.SetWindowText( "" );
//
// Get count of selected plugins.
//
int iCount = this->m_ctrlListLoadedPlugins.GetCount();
//
// Check if any plugins selected.
//
if( ( iCount > 0 ) && ( this->m_ctrlListLoadedPlugins.GetSelCount() > 0 ) )
{
//
// Reserve memory to save all selected plugin numbers.
//
piSelPlugins = new int[ this->m_ctrlListLoadedPlugins.GetSelCount() + 1 ];
if( NULL == piSelPlugins )
return;
//
// Save all selected plugins
//
this->m_ctrlListLoadedPlugins.GetSelItems( this->m_ctrlListLoadedPlugins.GetSelCount(), piSelPlugins );
//
// Now run all loaded plugins to modify text
//
long i = 0;
for( i = 0 ; i < this->m_ctrlListLoadedPlugins.GetSelCount(); i++ )
{
char* pszResult = new char[ m_strInput.GetLength() + 1 ];
ASSERT( pszResult );
memset( pszResult, 0, sizeof( char ) * ( m_strInput.GetLength() + 1 ) );
this->m_pluginArgs.SetArg( 0, (void*) m_strInput.operator LPCTSTR() );
this->m_pluginArgs.SetArg( 1, pszResult );
this->m_pluginServer.RunPlugin( piSelPlugins[ i ], &m_pluginArgs );
this->m_strOutput = this->m_strInput = pszResult;
this->m_ctrlEditOutput.SetWindowText( this->m_strOutput );
this->m_pluginArgs.Clear();
delete [] pszResult;
}
this->m_ctrlEditOutput.SetWindowText( this->m_strOutput );
this->m_ctrlEditInput.SetFocus();
delete [] piSelPlugins;
piSelPlugins = NULL;
}
}
void CmfcplugintestDlg::OnBnClickedCancel()
{
//
// UNLOAD ALL LOADED PLUGINS
//
this->m_pluginServer.UnloadAllPlugins();
OnCancel();
}
void CmfcplugintestDlg::OnLbnSelchangeLoadedPlugins()
{
//
// GET CURRENT SELCTION FROM LOADED PLUGIN VIEW
//
long lPos = this->m_ctrlListLoadedPlugins.GetCurSel();
//
// CHECK IF VALID AND LOAD PLUGIN INFO FROM SELECTED PLUGIN
//
if( LB_ERR != lPos )
{
this->m_pluginInfo = this->m_pluginServer.GetSafedPluginInfo( lPos );
this->PutPluginInfo( this->m_pluginInfo );
}
}
void CmfcplugintestDlg::OnPluginsRefresh()
{
//
// REFRESH ONLY IF ANY PLUGINS LOADED
//
if( this->m_pluginServer.GetLoadedPlugins() == 0 )
return;
this->m_pluginServer.Refresh( "../plugins", "*.dll*" );
this->m_pluginServer.GetAllPluginInfos();
this->PutLoadedPlugins();
}
void CmfcplugintestDlg::OnPluginsLoadallFrompath()
{
BROWSEINFO bi = { 0 };
TCHAR szPath[ MAX_PATH ];
//
// MODIFYING OF DIRECTORY TREE VISUALS
//
bi.lpszTitle = "Please select plugin path:";
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_NONEWFOLDERBUTTON | BIF_EDITBOX;
//
// SHOW DIRECTORY-TREE
//
LPITEMIDLIST pidl = SHBrowseForFolder( &bi );
if ( pidl != 0 )
{
//
// GET SELECTED PATH
//
if ( SHGetPathFromIDList( pidl, szPath ) )
{
//
// CLEANUP ALL PLUGIN INFOS AND ALL LOADED PLUGINS
//
this->m_ctrlListPluginInfo.ResetContent();
this->m_ctrlListLoadedPlugins.ResetContent();
this->m_pluginServer.UnloadAllPlugins();
//
// LOAD ALL FOUNDED PLUGINS FROM PATH
//
this->m_pluginServer.LoadAllPlugins( szPath, "*.dll" );
this->m_pluginServer.GetAllPluginInfos();
this->PutLoadedPlugins();
}
}
}
/*********************************************************************************************************/
//
// HELPER FUNCTIONS
//
/*********************************************************************************************************/
//
// PUT AN PLUGININFO TO INFO VIEW CONTROL
//
void CmfcplugintestDlg::PutPluginInfo( slcPluginInfo& pluginInfo )
{
//
// STRING FORMAT HELPER
//
CString strTemp;
//
// CLEANUP ALL PLUGIN INFO
//
this->m_ctrlListPluginInfo.ResetContent();
//
// STORE ALL INFOS TO LIST
//
this->m_ctrlListPluginInfo.AddString( (CString) "Name:\t\t" + pluginInfo.GetName().c_str() );
this->m_ctrlListPluginInfo.AddString( (CString) "Vendor:\t\t" + pluginInfo.GetVendor().c_str() );
this->m_ctrlListPluginInfo.AddString( (CString) "Description:\t" + pluginInfo.GetDescription().c_str() );
this->m_ctrlListPluginInfo.AddString( (CString) "UUID:\t\t" + pluginInfo.GetUUID().c_str() );
strTemp.Format( "%d", pluginInfo.GetMajorVersion() );
this->m_ctrlListPluginInfo.AddString( (CString) "Version Major:\t" + strTemp );
strTemp.Format( "%d", pluginInfo.GetMinorVersion() );
this->m_ctrlListPluginInfo.AddString( (CString) "Version Minor:\t" + strTemp );
strTemp.Format( "%d", pluginInfo.GetBuildVersion() );
this->m_ctrlListPluginInfo.AddString( (CString) "Version Build:\t" + strTemp );
this->m_ctrlListPluginInfo.AddString( (CString) "Homepage:\t" + pluginInfo.GetHomepage().c_str() );
this->m_ctrlListPluginInfo.AddString( (CString) "Email:\t\t" + pluginInfo.GetEmail().c_str() );
//
// SET FOCUS TO INPUT CONTROL
//
this->m_ctrlEditInput.SetFocus();
}
//
// MAKE A NEW LIST OF LOADED PLUGINS
//
void CmfcplugintestDlg::PutLoadedPlugins( void )
{
int i = 0;
//
// CLEANUP LOADED PLUGIN LIST
//
this->m_ctrlListLoadedPlugins.ResetContent();
//
// GET ALL PLUGIN INFOS FROM LOADED PLUGINS
//
for( ; i < this->m_pluginServer.GetLoadedPlugins(); i++ )
{
this->m_pluginInfo = this->m_pluginServer.GetSafedPluginInfo( i );
this->m_ctrlListLoadedPlugins.AddString( this->m_pluginInfo.GetName().c_str() );
}
//
// CHECK IF SOME PLUGINS WERE LOADED
//
if( i > 0 )
{
//
// SELECT FIRST LOADED PLUGIN AND PRINT PLUGIN INFOS
//
this->m_ctrlListLoadedPlugins.SetCurSel( 0 );
this->m_pluginInfo = this->m_pluginServer.GetSafedPluginInfo( 0 );
this->PutPluginInfo( this->m_pluginInfo );
}
else
{
//
// NO PLUGINS LOADED, CLEANUP PLUGIN INFO LIST
//
this->m_ctrlListPluginInfo.ResetContent();
}
//
// SET FOCUS TO INPUT CONTROL
//
this->m_ctrlEditInput.SetFocus();
}