summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfcolin2010-03-12 16:41:08 +0000
committerfcolin2010-03-12 16:41:08 +0000
commit576ad2b67bced04bde83de91f5e647af868c5fd4 (patch)
tree147725b5c27f1f31da1e879ac949822c75ac49a2
parent74c0ac487332231e8dd6ba35580b07166ffbcfe2 (diff)
downloadivy-cplusplus-576ad2b67bced04bde83de91f5e647af868c5fd4.zip
ivy-cplusplus-576ad2b67bced04bde83de91f5e647af868c5fd4.tar.gz
ivy-cplusplus-576ad2b67bced04bde83de91f5e647af868c5fd4.tar.bz2
ivy-cplusplus-576ad2b67bced04bde83de91f5e647af868c5fd4.tar.xz
mise en conformité des messages ping /pong
Correction pb a la fermeture d'ivy
-rw-r--r--Ivy/Ivy.cxx10
-rw-r--r--Ivy/Ivy.h3
-rw-r--r--Ivy/IvyApplication.cxx6
-rw-r--r--Ivy/IvyApplication.h3
-rw-r--r--Ivy/IvySynchroWnd.cxx139
-rw-r--r--Ivy/IvySynchroWnd.h26
-rw-r--r--Ivy/ThreadedSocket.cxx2
-rw-r--r--IvyProbe/IvyProbe.rc21
-rw-r--r--IvyProbe/IvyProbeDlg.cpp45
-rw-r--r--IvyProbe/IvyProbeDlg.h2
-rw-r--r--IvyProbe/Resource.h4
11 files changed, 206 insertions, 55 deletions
diff --git a/Ivy/Ivy.cxx b/Ivy/Ivy.cxx
index 95035d1..1640b45 100644
--- a/Ivy/Ivy.cxx
+++ b/Ivy/Ivy.cxx
@@ -48,7 +48,7 @@ Ivy::~Ivy()
delete server;
if ( synchronous )
{
- delete IvySynchronousCallback::m_synchro;
+ IvySynchroWnd::Finish();
delete application_callback;
}
}
@@ -59,8 +59,8 @@ Ivy::Ivy(const char* name, const char * ready, IvyApplicationCallback *callback,
InitializeCriticalSection( &m_application_cs );
regexp_id = 0;
synchronous = Synchronous;
- if ( synchronous )
- IvySynchronousCallback::m_synchro = new IvySynchroWnd();
+ IvySynchroWnd::Init(synchronous);
+
ready_message = ready;
ApplicationName = name;
@@ -413,6 +413,10 @@ void Ivy::SetBindCallback( IvyBindingCallback* bind_callback )
{
binding_callback = synchronous ? new IvySynchronousBindingCallback(bind_callback) : bind_callback;
}
+void Ivy::SetDieCallback( IvyDieCallback* die_cb )
+{
+ die_callback = synchronous ? new IvySynchronousDieCallback(die_cb) : die_cb;
+}
void Ivy::SetFilter(int argc, const char **argv )
{
diff --git a/Ivy/Ivy.h b/Ivy/Ivy.h
index 7c51f0b..e408d7e 100644
--- a/Ivy/Ivy.h
+++ b/Ivy/Ivy.h
@@ -95,7 +95,8 @@ protected:
ivy::string ready_message;
public:
-
+
+ void SetDieCallback( IvyDieCallback* die_callback );
void SetBindCallback( IvyBindingCallback* bind_callback );
void SetFilter( int argc, const char **argv );
void SendDieMsg( IvyApplication *app );
diff --git a/Ivy/IvyApplication.cxx b/Ivy/IvyApplication.cxx
index 7b3cd2f..8ba70f6 100644
--- a/Ivy/IvyApplication.cxx
+++ b/Ivy/IvyApplication.cxx
@@ -5,7 +5,7 @@
#include "IvyApplication.h"
#include "IvyBinding.h"
-
+#include "IvySynchroWnd.h"
//#define IVY_DEBUG
@@ -272,11 +272,9 @@ void IvyApplication::OnReceive(char * line)
#ifdef IVY_DEBUG
TRACE("Die Message id=%d msg='%s'\n", id, arg);
#endif //IVY_DEBUG
-
if ( bus->CallDieCallback( this, id, arg ) )
{
- PostMessage( NULL, WM_CLOSE, 0, 0);
- exit(-1);
+ IvySynchroWnd::PostQuit();
}
break;
case Ping:
diff --git a/Ivy/IvyApplication.h b/Ivy/IvyApplication.h
index cd9b123..375ac25 100644
--- a/Ivy/IvyApplication.h
+++ b/Ivy/IvyApplication.h
@@ -5,10 +5,11 @@
//
#include "BufferedSocket.h"
#include "Ivy.h"
-#include "IvyBinding.h"
+//#include "IvyBinding.h"
/////////////////////////////////////////////////////////////////////////////
// IvyApplication command target
+class IvyBinding;
class IvyApplication : public CBufferedSocket
{
diff --git a/Ivy/IvySynchroWnd.cxx b/Ivy/IvySynchroWnd.cxx
index 2c84ad5..374538c 100644
--- a/Ivy/IvySynchroWnd.cxx
+++ b/Ivy/IvySynchroWnd.cxx
@@ -2,15 +2,10 @@
//
#include "IvyStdAfx.h"
-
-
#include "IvySynchroWnd.h"
-
#define WM_IVY_CB WM_USER + 1001
-
-IvySynchroWnd* IvySynchronousCallback::m_synchro = NULL;
IvySynchroWnd* IvySynchroWnd::m_synchro = NULL;
/////////////////////////////////////////////////////////////////////////////
@@ -19,22 +14,22 @@ IvySynchroWnd* IvySynchroWnd::m_synchro = NULL;
IvySynchroWnd::IvySynchroWnd()
{
m_hWnd = NULL;
- m_synchro = this;
+ //m_synchro = this;
WNDCLASS wc;
// Fill in the window class structure with parameters
// that describe the main window.
- wc.style = 0; // noredraw if size changes
- wc.lpfnWndProc = WindowProc; // points to window procedure
- wc.cbClsExtra = 0; // no extra class memory
- wc.cbWndExtra = 0; // no extra window memory
- wc.hInstance = 0; // handle to instance
- wc.hIcon = NULL; // predefined app. icon
- wc.hCursor = NULL; // predefined arrow
- wc.hbrBackground = 0; // white background brush
- wc.lpszMenuName = NULL; // no menu
+ wc.style = 0; // noredraw if size changes
+ wc.lpfnWndProc = WindowProc; // points to window procedure
+ wc.cbClsExtra = 0; // no extra class memory
+ wc.cbWndExtra = 0; // no extra window memory
+ wc.hInstance = 0; // handle to instance
+ wc.hIcon = NULL; // predefined app. icon
+ wc.hCursor = NULL; // predefined arrow
+ wc.hbrBackground = 0; // white background brush
+ wc.lpszMenuName = NULL; // no menu
wc.lpszClassName = TEXT("IvySynchroClass"); // name of window class
// Register the window class.
@@ -59,7 +54,16 @@ IvySynchroWnd::IvySynchroWnd()
IvySynchroWnd::~IvySynchroWnd()
{
}
-
+void IvySynchroWnd::Init(bool synchronous)
+{
+ if ( synchronous && m_synchro == NULL )
+ m_synchro = new IvySynchroWnd();
+}
+void IvySynchroWnd::Finish()
+{
+ if ( m_synchro == NULL )
+ delete m_synchro;
+}
LRESULT CALLBACK IvySynchroWnd::WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
@@ -102,12 +106,57 @@ LRESULT IvySynchroWnd::OnIvyCB(WPARAM wParam, LPARAM lParam)
}
void IvySynchroWnd::PostIvyCB( IvySynchronousCallback *cb )
{
+ BOOL doPost = FALSE;
EnterCriticalSection( &m_CritSection );
- if ( m_synchro->callbacklist.empty() )
- ASSERT(PostMessage(m_synchro->m_hWnd, WM_IVY_CB, 0, 0 ));
- m_synchro->callbacklist.push_back( cb );
+ doPost = callbacklist.empty();
+ callbacklist.push_back( cb );
LeaveCriticalSection( &m_CritSection );
+ if ( doPost )
+ ASSERT(PostMessage(m_hWnd, WM_IVY_CB, 0, 0 ));
+ // give a change to process messages
+ SwitchToThread();
+
}
+BOOL CALLBACK MyQuitWindows( HWND hwnd, LPARAM lParam )
+{
+ BOOL *posted = (BOOL*)lParam;
+ DWORD dwTheardId;
+ DWORD pid;
+ DWORD mypid = GetCurrentProcessId();
+ dwTheardId = ::GetWindowThreadProcessId( hwnd,&pid);
+ if ( pid == mypid )
+ {
+ // give a change to User for closing application safely, save file etc...
+ *posted = PostMessage( hwnd, WM_CLOSE, 0,0 );
+ }
+ return TRUE;
+}
+
+void IvySynchroWnd::PostQuit()
+{
+ BOOL posted = FALSE;
+ BOOL canceled = FALSE;
+ EnumWindows(MyQuitWindows, (LPARAM)&posted );
+ // give a change to process messages
+ if ( !SwitchToThread() )
+ {
+ Sleep( 200 );
+ }
+ if ( !posted )
+ {
+ PostQuitMessage( -1 );
+ // give a change to process messages
+ if ( !SwitchToThread() )
+ {
+ Sleep( 100 );
+ }
+ // ultimate close
+ exit(-1);
+ }
+}
+
+
+ //exit(-1);
//
//
IvySynchronousMessageCallback::IvySynchronousMessageCallback( IvyMessageCallback *cb )
@@ -128,7 +177,6 @@ IvySynchronousMessageCallback::~IvySynchronousMessageCallback()
}
void IvySynchronousMessageCallback::OnMessage(IvyApplication *app, int argc, const char **argv )
{
- static int msg_count = 0;
// duplicate on the Message Queue
IvySynchronousMessageCallback *param = new IvySynchronousMessageCallback(target);
param->app = app;
@@ -142,12 +190,17 @@ void IvySynchronousMessageCallback::OnMessage(IvyApplication *app, int argc, con
param->argv[i] = _strdup( argv[i]);
#endif
}
-// TRACE( "IvySynchronousMessageCallback::OnMessage msg count %d\n",wParam);
- m_synchro->PostIvyCB( param );
+#ifdef IVY_DEBUG
+ TRACE( "IvySynchronousMessageCallback::OnMessage Push callback %s argc=%d\n",typeid( *target).name(), argc);
+#endif
+ IvySynchroWnd::m_synchro->PostIvyCB( param );
}
void IvySynchronousMessageCallback::CallCallback()
{
+#ifdef IVY_DEBUG
+ TRACE( "IvySynchronousMessageCallback::OnMessage Real callback %s argc=%d\n",typeid( *target).name(), argc);
+#endif
target->OnMessage( app, argc, (const char **) argv );
for( int i = 0; i < argc ; i++ )
delete argv[i];
@@ -165,7 +218,7 @@ void IvySynchronousApplicationCallback::OnApplicationConnected( IvyApplication *
IvySynchronousApplicationCallback *param = new IvySynchronousApplicationCallback(target);
param->type = CONNECTED_CB;
param->app = app;
- m_synchro->PostIvyCB( param );
+ IvySynchroWnd::m_synchro->PostIvyCB( param );
}
void IvySynchronousApplicationCallback::OnApplicationDisconnected( IvyApplication *app)
@@ -174,7 +227,7 @@ void IvySynchronousApplicationCallback::OnApplicationDisconnected( IvyApplicati
IvySynchronousApplicationCallback *param = new IvySynchronousApplicationCallback(target);
param->type = DISCONNECTED_CB;
param->app = app;
- m_synchro->PostIvyCB( param );
+ IvySynchroWnd::m_synchro->PostIvyCB( param );
}
void IvySynchronousApplicationCallback::CallCallback()
{
@@ -203,7 +256,7 @@ void IvySynchronousBindingCallback::OnAddBind( IvyApplication *app, int id, cons
param->app = app;
param->id = id;
param->regexp = _strdup(regexp);
- m_synchro->PostIvyCB( param );
+ IvySynchroWnd::m_synchro->PostIvyCB( param );
}
void IvySynchronousBindingCallback::OnRemoveBind( IvyApplication *app, int id, const char *regexp)
@@ -214,7 +267,7 @@ void IvySynchronousBindingCallback::OnRemoveBind( IvyApplication *app, int id,
param->app = app;
param->id = id;
param->regexp = _strdup(regexp);
- m_synchro->PostIvyCB( param );
+ IvySynchroWnd::m_synchro->PostIvyCB( param );
}
void IvySynchronousBindingCallback::OnFilterBind( IvyApplication *app, int id, const char *regexp)
{
@@ -224,7 +277,7 @@ void IvySynchronousBindingCallback::OnFilterBind( IvyApplication *app, int id,
param->app = app;
param->id = id;
param->regexp = _strdup(regexp);
- m_synchro->PostIvyCB( param );
+ IvySynchroWnd::m_synchro->PostIvyCB( param );
}
void IvySynchronousBindingCallback::CallCallback()
{
@@ -244,4 +297,36 @@ void IvySynchronousBindingCallback::CallCallback()
}
}
delete regexp;
+}
+
+IvySynchronousDieCallback::IvySynchronousDieCallback( IvyDieCallback *cb )
+{
+ target = cb;
+}
+bool IvySynchronousDieCallback::OnDie(IvyApplication *app, int id, const char *arg )
+{
+ static int msg_count = 0;
+ // duplicate on the Message Queue
+ IvySynchronousDieCallback *param = new IvySynchronousDieCallback(target);
+ param->app = app;
+ param->id = id;
+
+#ifdef UNDER_CE
+ param->arg = _strdup( argv);
+#else
+ param->arg = _strdup( arg);
+#endif
+
+// TRACE( "IvySynchronousMessageCallback::OnMessage msg count %d\n",wParam);
+ IvySynchroWnd::m_synchro->PostIvyCB( param );
+ return FALSE; // do not exit now wait for Quit on MessageQueue
+}
+void IvySynchronousDieCallback::CallCallback()
+{
+ // duplicate on the Message Queue
+ if ( !target ) return;
+ if ( target->OnDie ( app, id, arg ) )
+ {
+ IvySynchroWnd::m_synchro->PostQuit();
+ }
} \ No newline at end of file
diff --git a/Ivy/IvySynchroWnd.h b/Ivy/IvySynchroWnd.h
index ffa44ba..b90e2a0 100644
--- a/Ivy/IvySynchroWnd.h
+++ b/Ivy/IvySynchroWnd.h
@@ -13,7 +13,7 @@ class IvySynchroWnd
{
// Construction
public:
- IvySynchroWnd();
+
// Attributes
public:
@@ -21,7 +21,10 @@ public:
// Operations
public:
+ static void PostQuit();
void PostIvyCB( IvySynchronousCallback *cb );
+ static void Init(bool synchronous);
+ static void Finish();
// Implementation
public:
@@ -30,8 +33,9 @@ protected:
HWND m_hWnd;
protected:
+ IvySynchroWnd();
// Unique instance of this class
- static IvySynchroWnd *m_synchro;
+ static IvySynchroWnd *m_synchro; // for synchronous Windowed
// Generated message map functions
static LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
@@ -49,13 +53,14 @@ protected:
LRESULT OnIvyCB(WPARAM wParam, LPARAM lParam);
friend class IvySynchronousMessageCallback;
friend class IvySynchronousApplicationCallback;
+ friend class IvySynchronousBindingCallback;
+ friend class IvySynchronousDieCallback;
};
class IvySynchronousCallback
{
protected:
IvyApplication *app;
- static IvySynchroWnd *m_synchro;
friend class Ivy;
public:
virtual void CallCallback() = 0;
@@ -107,3 +112,18 @@ protected:
friend class IvySynchroWnd;
};
+
+class IvySynchronousDieCallback: public IvySynchronousCallback, public IvyDieCallback
+{
+public:
+ IvySynchronousDieCallback( IvyDieCallback *cb );
+ virtual void CallCallback();
+ virtual bool OnDie (IvyApplication *app, int id, const char *arg );
+protected:
+ IvyDieCallback *target;
+
+ int id;
+ const char *arg;
+
+ friend class IvySynchroWnd;
+}; \ No newline at end of file
diff --git a/Ivy/ThreadedSocket.cxx b/Ivy/ThreadedSocket.cxx
index 99caa80..147cb69 100644
--- a/Ivy/ThreadedSocket.cxx
+++ b/Ivy/ThreadedSocket.cxx
@@ -110,7 +110,7 @@ SOCKET CThreadedSocket::Accept(CThreadedSocket& rConnectedSocket,
else
{
rConnectedSocket.m_hSocket = hTemp;
- rConnectedSocket.send_count = CreateSemaphore( NULL, 0, 100, NULL); // unnamed semaphore
+ rConnectedSocket.send_count = CreateSemaphore( NULL, 0, 200, NULL); // unnamed semaphore
if (rConnectedSocket.send_count == NULL)
return SOCKET_ERROR;
diff --git a/IvyProbe/IvyProbe.rc b/IvyProbe/IvyProbe.rc
index 8fc9923..52746ec 100644
--- a/IvyProbe/IvyProbe.rc
+++ b/IvyProbe/IvyProbe.rc
@@ -83,22 +83,23 @@ BEGIN
DEFPUSHBUTTON "OK",IDOK,178,7,32,14,WS_GROUP
END
-IDD_IVYPROBE_DIALOG DIALOGEX 0, 0, 163, 152
+IDD_IVYPROBE_DIALOG DIALOGEX 0, 0, 281, 154
STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "IvyProbe"
MENU IDR_MENU1
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
- EDITTEXT IDC_BUSNUMBER,4,14,120,14,ES_AUTOHSCROLL
- PUSHBUTTON "Start",IDC_START,130,15,25,14
+ EDITTEXT IDC_BUSNUMBER,4,14,240,14,ES_AUTOHSCROLL
+ PUSHBUTTON "Start",IDC_START,248,15,25,14
LTEXT "Bind:",IDC_STATIC_BIND,4,135,17,8
LTEXT "Msg:",IDC_STATIC_MSG,4,117,17,12
- COMBOBOX IDC_MSG,27,117,100,82,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
- DEFPUSHBUTTON "Send",IDC_SEND,128,116,27,14
- PUSHBUTTON "Bind",IDC_BIND,128,132,27,14
- COMBOBOX IDC_REGEXP,27,133,100,66,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
- EDITTEXT IDC_TEXT,4,31,151,82,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_NOHIDESEL | ES_READONLY | WS_VSCROLL
+ COMBOBOX IDC_MSG,27,117,213,82,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "Send",IDC_SEND,246,116,27,14
+ PUSHBUTTON "Bind",IDC_BIND,246,132,27,14
+ COMBOBOX IDC_REGEXP,27,133,214,66,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+ EDITTEXT IDC_TEXT,99,29,171,82,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_NOHIDESEL | ES_READONLY | WS_VSCROLL
+ LISTBOX IDC_CLIENT_LIST,4,29,92,84,LBS_SORT | LBS_MULTIPLESEL | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
END
@@ -159,9 +160,9 @@ BEGIN
IDD_IVYPROBE_DIALOG, DIALOG
BEGIN
LEFTMARGIN, 4
- RIGHTMARGIN, 155
+ RIGHTMARGIN, 273
TOPMARGIN, 1
- BOTTOMMARGIN, 148
+ BOTTOMMARGIN, 150
END
END
#endif // APSTUDIO_INVOKED
diff --git a/IvyProbe/IvyProbeDlg.cpp b/IvyProbe/IvyProbeDlg.cpp
index ef7bff8..35a9fe3 100644
--- a/IvyProbe/IvyProbeDlg.cpp
+++ b/IvyProbe/IvyProbeDlg.cpp
@@ -58,6 +58,7 @@ void CIvyProbeDlg::DoDataExchange(CDataExchange* pDX)
DDX_Control(pDX, IDC_REGEXP, m_expr);
DDX_Control(pDX, IDC_MSG, m_msg);
DDX_Text(pDX, IDC_BUSNUMBER, m_busnumber);
+ DDX_Control(pDX, IDC_CLIENT_LIST, m_clients );
//}}AFX_DATA_MAP
}
@@ -74,6 +75,7 @@ BEGIN_MESSAGE_MAP(CIvyProbeDlg, MyDialog)
//}}AFX_MSG_MAP
ON_COMMAND(ID_FILE_SAVEBINDINGS, &CIvyProbeDlg::OnFileSavebindings)
ON_COMMAND(ID_FILE_LOADBINDINGS, &CIvyProbeDlg::OnFileLoadbindings)
+ ON_LBN_DBLCLK(IDC_CLIENT_LIST, &CIvyProbeDlg::OnLbnDblclkClientList)
END_MESSAGE_MAP()
@@ -136,7 +138,10 @@ BOOL CIvyProbeDlg::OnInitDialog()
<< item ( IDC_BUSNUMBER, GREEDY )
<< item ( IDC_START, NORESIZE )
)
- << item ( IDC_TEXT, GREEDY )
+ << ( pane( HORIZONTAL, GREEDY )
+ << item ( IDC_CLIENT_LIST, ABSOLUTE_HORZ )
+ << item ( IDC_TEXT, GREEDY )
+ )
<< ( pane( HORIZONTAL, ABSOLUTE_VERT )
<< item( IDC_STATIC_MSG, NORESIZE )
<< item( IDC_MSG, GREEDY )
@@ -160,7 +165,7 @@ BOOL CIvyProbeDlg::OnInitDialog()
// Set Argument from Command Line
m_busnumber = cmd.m_busNumber;
- bus = new Ivy( "IvyProbe Windows","IvyProbe Windows Ready",this,FALSE);
+ bus = new Ivy( "IvyProbeWindows","IvyProbeWindows Ready",this,FALSE);
bus->SetBindCallback( this );
// bus->BindMsg("(.*)", BUS_CALLBACK_OF(CTestDlg, IvyCallback ));
@@ -232,11 +237,25 @@ TRACE(TEXT("Direct Msg Receive %d, %s\n"),id,arg );
void CIvyProbeDlg::OnApplicationConnected(IvyApplication *app)
{
- WriteMessage( "Application: %s ready",(LPCSTR)(app->GetName()) );
+ LPCSTR name = (LPCSTR)(app->GetName());
+ WriteMessage( "Application: %s ready", name );
+ int idx = m_clients.AddString( name );
+ m_clients.SetItemDataPtr( idx, app );
}
void CIvyProbeDlg::OnApplicationDisconnected(IvyApplication *app)
{
- WriteMessage( "Application: %s bye",(LPCSTR)(app->GetName()) );
+ LPCSTR name = (LPCSTR)(app->GetName());
+ WriteMessage( "Application: %s bye", name );
+ int nb = m_clients.GetCount();
+ for( int idx = 0; idx < nb ; idx++)
+ {
+ IvyApplication * appToRemove = (IvyApplication * )m_clients.GetItemDataPtr( idx );
+ if ( appToRemove == app )
+ {
+ m_clients.DeleteString( idx );
+ break;
+ }
+ }
}
void CIvyProbeDlg::OnAddBind (IvyApplication *app, int id, const char * regexp)
@@ -392,3 +411,21 @@ void CIvyProbeDlg::OnFileSavebindings()
}
#endif
}
+
+void CIvyProbeDlg::OnLbnDblclkClientList()
+{
+ IvyApplication *app;
+ int nCount = m_clients.GetSelCount();
+ if ( nCount > 0 )
+ {
+ int* selected = new int[ nCount ];
+
+ int nb = m_clients.GetSelItems(nCount, selected );
+ for( int idx = 0; idx < nb ; idx++)
+ {
+ app = (IvyApplication * )m_clients.GetItemDataPtr( selected[idx] );
+ bus->SendDieMsg( app );
+ }
+ delete [] selected;
+ }
+}
diff --git a/IvyProbe/IvyProbeDlg.h b/IvyProbe/IvyProbeDlg.h
index eee40ef..e196f57 100644
--- a/IvyProbe/IvyProbeDlg.h
+++ b/IvyProbe/IvyProbeDlg.h
@@ -61,6 +61,7 @@ public:
CComboBox m_expr;
CComboBox m_msg;
CString m_busnumber;
+ CListBox m_clients;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
@@ -102,6 +103,7 @@ public:
afx_msg void OnFileSavebindings();
public:
afx_msg void OnFileLoadbindings();
+ afx_msg void OnLbnDblclkClientList();
};
//{{AFX_INSERT_LOCATION}}
diff --git a/IvyProbe/Resource.h b/IvyProbe/Resource.h
index afeece2..c88e5b4 100644
--- a/IvyProbe/Resource.h
+++ b/IvyProbe/Resource.h
@@ -30,6 +30,8 @@
#define IDC_REGEXP 1021
#define IDC_CLOCK_FAST_BACKWARD 1026
#define IDC_CLOCK_BACKWARD 1027
+#define IDC_CLIENTLIST 1027
+#define IDC_CLIENT_LIST 1027
#define IDC_CLOCK_START 1028
#define IDC_CLOCK_PAUSE 1029
#define IDC_CLOCK_FORWARD 1030
@@ -46,7 +48,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 134
#define _APS_NEXT_COMMAND_VALUE 32775
-#define _APS_NEXT_CONTROL_VALUE 1027
+#define _APS_NEXT_CONTROL_VALUE 1028
#define _APS_NEXT_SYMED_VALUE 104
#endif
#endif