NEURON
ddeclnt.cpp
Go to the documentation of this file.
1 
2 #define STRICT
3 
4 #include <windows.h>
5 #pragma hdrstop
6 #include <ddeml.h>
7 #include <dde.h>
8 #include <windowsx.h>
9 
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 
14 #include "ddeclnt.h"
15 #include "nrnbbs.h"
16 
17 /*
18  The DDE variables
19 */
20 
21 DWORD idInst = 0L; /* Instance of app for DDEML */
22 FARPROC lpDdeProc; /* DDE callback function */
25 HSZ hszUser;
26 HSZ hszItem;
27 HCONV hConv = (HCONV)NULL; /*Handle of established conversation*/
28 HCONV hConvAdmin = (HCONV)NULL;
29 HDDEDATA hData;
30 DWORD dwResult;
31 WORD wFmt = CF_TEXT; /* Clipboard format */
32 char szDDEString[256]; /* Local allocation of data buffer */
33 char szDDEData[256]; /* Local receive data buffer */
34 int iClientCount = 0; /* Client to Server message counter*/
35 char tbuf[5]; /* Temporary, to hold count */
36 
37 /***********/
38 static void post(HCONV hc, const char* name);
39 
40 void nrnbbs_post(const char* name) {
41  sprintf(szDDEString, "");
42  post(hConv, name);
43 }
44 void nrnbbs_post_int(const char* name, int i) {
45  sprintf(szDDEString, "%d", i);
46  post(hConv, name);
47 }
48 void nrnbbs_post_string(const char* name, const char* data) {
49  sprintf(szDDEString, "%s", data);
50  post(hConv, name);
51 }
52 
53 static BOOL take(HCONV hc, const char* name, BOOL look);
54 
55 BOOL nrnbbs_take(const char* name){
56  return take(hConv, name, 0);
57 }
58 BOOL nrnbbs_look(const char* name){
59  return take(hConv, name, 1);
60 }
61 BOOL nrnbbs_take_int(const char* name, int* pi) {
62  int ok;
63  ok = nrnbbs_take(name);
64  if (ok) {
65  sscanf(szDDEData+1, "%d", pi);
66  }
67  return ok;
68 }
69 
70 BOOL nrnbbs_take_string(const char* name, char* val) {
71  int ok;
72  ok = nrnbbs_take(name);
73  if (ok) {
74  strcpy(val, szDDEData+1);
75  }
76  return ok;
77 }
78 
79 void nrnbbs_exec(const char* cmd) {
80  WinExec(cmd, SW_SHOW);
81 }
82 
83 //void nrnbbs_callback(NrnBBSCallback f, const char* trigger) {
84 
85 /***************************************************************************/
87 
88 void nrnbbs_notify(const char* name, NrnBBSCallback f) {
89  cbfunc_ = f;
90  DdeFreeStringHandle(idInst, hszItem);
91  hszItem = DdeCreateStringHandle ( idInst, (LPTSTR)name, CP_WINANSI );
92  hData = DdeClientTransaction ( NULL, 0, hConv,
93  hszItem, wFmt, XTYP_ADVSTART, 1000, &dwResult );
94  if (!hData) {
95  HandleOutput("notify failed\n");
96  }
97 }
98 
99 static int started;
101  return (idInst && hConv) ? 1 : 0;
102 }
103 
105  if (!idInst) {
106  lpDdeProc = MakeProcInstance ( (FARPROC) DDECallback, hInst );
107  if ( DdeInitialize ( (LPDWORD)&idInst, (PFNCALLBACK)lpDdeProc,
108  APPCMD_CLIENTONLY, 0L ) ){
109  HandleOutput ( "Client DDE initialization failure.\n" );
110  return ( FALSE );
111  }
112 
113  hszService = DdeCreateStringHandle ( idInst, "NrnBBS", CP_WINANSI );
114  hszAdmin = DdeCreateStringHandle ( idInst, "Admin", CP_WINANSI );
115  hszUser = DdeCreateStringHandle ( idInst, "User", CP_WINANSI );
116  hszItem = DdeCreateStringHandle ( idInst, "DDEData", CP_WINANSI );
117  }
118  while ( hConv == (HCONV)NULL ){
119  hConv = DdeConnect ( idInst, hszService, hszUser,
120  (PCONVCONTEXT) NULL );
121  if ( hConv == (HCONV)NULL ){
122  HandleError ( DdeGetLastError ( idInst ) );
123  HandleOutput ( "Unsuccessful connection.\n" );
124  if (started++ == 0) {
125  char buf[256];
126  HandleOutput("Starting NrnBBS server.\n");
127 // WinExec("nrnbbs", SW_HIDE);
128  sprintf(buf, "%s\\bin\\nrnbbs", getenv("NEURONHOME"));
129  WinExec(buf, SW_MINIMIZE);
130  }
131  if (started < 5) {
132  Sleep(500);
133  HandleOutput("Retrying connection.\n");
134  }else{
135  started = 0;
136  return FALSE;
137  }
138  }else{
139  HandleOutput ( "Successful connection.\n" );
140  }
141  }
142  return TRUE;
143 }
144 
146  if ( hConv != (HCONV)NULL ){
147  DdeDisconnect ( hConv );
148  hConv = (HCONV)NULL;
149  if (hConvAdmin != (HCONV)NULL) {
150  DdeDisconnect(hConvAdmin);
151  hConvAdmin = (HCONV)NULL;
152  }
153  HandleOutput ( "Disconnected from server.\n" );
154  }
155  if (idInst) {
156  DdeFreeStringHandle ( idInst, hszService );
157  DdeFreeStringHandle ( idInst, hszAdmin );
158  DdeFreeStringHandle ( idInst, hszUser );
159  DdeFreeStringHandle ( idInst, hszItem );
160  FreeProcInstance ( lpDdeProc );
161  HandleOutput("DdeUninitialize\n");
162  DdeUninitialize ( idInst );
163  }
164 }
165 
166 static void post(HCONV hc, const char* name) {
167  if ( hc != (HCONV)NULL ){
168  DdeFreeStringHandle(idInst, hszItem);
169  hszItem = DdeCreateStringHandle ( idInst, (LPTSTR)name, CP_WINANSI );
170 
171  hData = DdeCreateDataHandle ( idInst, (LPBYTE) szDDEString,
172  sizeof ( szDDEString ), 0L, hszItem, wFmt, 0 );
173 
174  if ( hData != (HDDEDATA)NULL ) {
175  hData = DdeClientTransaction ( (LPBYTE)hData, -1, hc,
176  hszItem, wFmt, XTYP_POKE, 1000, &dwResult );
177  }else{
178  HandleOutput( "Could not create data handle.\n" );
179  }
180  }else{
181  HandleOutput ( "A connection to a DDE Server has not been established.\n" );
182  }
183 }
184 
185 static BOOL take(HCONV hc, const char* name, BOOL look) {
186  if ( hc != (HCONV)NULL ){
187  DdeFreeStringHandle(idInst, hszItem);
188  sprintf(szDDEData, "%d%s", look, name);
189  hszItem = DdeCreateStringHandle ( idInst, (LPTSTR)szDDEData, CP_WINANSI );
190 
191  hData = DdeClientTransaction ( NULL, 0, hc,
192  hszItem, wFmt, XTYP_REQUEST, 1000, &dwResult );
193 
194  if ( !hData ){
195  HandleOutput ( "Data not available from server.\n" );
196  }else{
197  DdeGetData ( hData, (LPBYTE) szDDEData, 80L, 0L );
198 
199  if ( szDDEData != NULL ){
200  int ok;
201  ok = szDDEData[0] - '0';
202  return ok;
203  }else{
204  HandleOutput ( "Message from server is null.\n" );
205  }
206  }
207  }else{
208  HandleOutput ( "A connection to a DDE Server has not been established.\n" );
209  }
210  return 0;
211 }
212 
213 void nrnbbs_wait(BOOL* pflag) {
214  MSG msg;
215  BOOL f = FALSE;
216  BOOL* pf;
217  pf = (pflag) ? pflag : &f;
218  while (!(*pf) && nrnbbs_connected()) {
219  f = TRUE; // once only if no arg
220  while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
221  TranslateMessage(&msg);
222  DispatchMessage(&msg);
223  }
224  }
225 }
226 
227 /***************************************************************************/
228 #if defined(__MWERKS__)
229 #undef _export
230 #define _export /**/
231 #endif
232 
233 #pragma argsused
234 HDDEDATA EXPENTRY _export DDECallback ( WORD wType, WORD wFmt, HCONV hConvX, HSZ hsz1,
235  HSZ hsz2, HDDEDATA hData, DWORD dwData1,
236  DWORD dwData2 )
237 {
238  switch ( wType )
239  {
240  case XTYP_DISCONNECT:
241  hConv = (HCONV)NULL;
242  HandleOutput ( "The server forced a disconnect.\n" );
243  return ( (HDDEDATA) NULL );
244 
245  case XTYP_ERROR:
246  break;
247 
248  case XTYP_XACT_COMPLETE:
249  // compare transaction identifier, indicate transaction complete
250  break;
251  case XTYP_ADVDATA:
252  if (cbfunc_){
253  char buf[100];
254  DdeQueryString(idInst, hsz2, buf, 100, CP_WINANSI);
255  (*cbfunc_)(buf);
256  }
257  }
258 
259  return ( (HDDEDATA) NULL );
260 }
261 
262 /***************************************************************************/
263 
264 void HandleError ( DWORD DdeError )
265 {
266  switch ( DdeError )
267  {
268  case DMLERR_DLL_NOT_INITIALIZED:
269  HandleOutput ( "DLL not initialized.\n" );
270  break;
271 
272  case DMLERR_INVALIDPARAMETER:
273  HandleOutput ( "Invalid parameter.\n" );
274  break;
275 
276  case DMLERR_NO_CONV_ESTABLISHED:
277  HandleOutput( "No conversation established.\n" );
278  break;
279 
280  case DMLERR_NO_ERROR:
281  HandleOutput ( "No error.\n" );
282  break;
283  }
284 }
285 
#define data
Definition: rbtqueue.cpp:49
HANDLE hInst
Definition: ddesrvr.cpp:35
void nrnbbs_notify(const char *name, NrnBBSCallback f)
Definition: ddeclnt.cpp:88
HSZ hszService
Definition: ddeclnt.cpp:23
void nrnbbs_exec(const char *cmd)
Definition: ddeclnt.cpp:79
void HandleError(DWORD DdeError)
Definition: ddeclnt.cpp:264
void nrnbbs_disconnect()
Definition: ddeclnt.cpp:145
void nrnbbs_post(const char *name)
Definition: ddeclnt.cpp:40
HSZ hszUser
Definition: ddeclnt.cpp:25
static BOOL take(HCONV hc, const char *name, BOOL look)
Definition: ddeclnt.cpp:185
void nrnbbs_wait(BOOL *pflag)
Definition: ddeclnt.cpp:213
HSZ hszItem
Definition: ddeclnt.cpp:26
#define TRUE
Definition: err.c:57
char tbuf[5]
Definition: ddeclnt.cpp:35
BOOL nrnbbs_take_int(const char *name, int *pi)
Definition: ddeclnt.cpp:61
HCONV hConv
Definition: ddeclnt.cpp:27
sprintf(buf," if (secondorder) {\ " int _i;\" " for(_i=0;_i< %d;++_i) {\" " _p[_slist%d[_i]]+=dt *_p[_dlist%d[_i]];\" " }}\", numeqn, listnum, listnum)
void nrnbbs_post_int(const char *name, int i)
Definition: ddeclnt.cpp:44
DWORD idInst
Definition: ddeclnt.cpp:21
char szDDEString[256]
Definition: ddeclnt.cpp:32
DWORD dwResult
Definition: ddeclnt.cpp:30
BOOL nrnbbs_connect()
Definition: ddeclnt.cpp:104
HDDEDATA hData
Definition: ddeclnt.cpp:29
void HandleOutput(const char *buf)
Definition: hel2mos.cpp:18
BOOL nrnbbs_take(const char *name)
Definition: ddeclnt.cpp:55
FARPROC lpDdeProc
Definition: ddeclnt.cpp:22
BOOL nrnbbs_connected()
Definition: ddeclnt.cpp:100
int val
Definition: dll.cpp:167
BOOL nrnbbs_look(const char *name)
Definition: ddeclnt.cpp:58
char * getenv(const char *s)
Definition: macprt.cpp:67
static int started
Definition: ddeclnt.cpp:99
char * name
Definition: init.cpp:16
int iClientCount
Definition: ddeclnt.cpp:34
void(* NrnBBSCallback)(const char *)
Definition: ivocmac.cpp:23
static NrnBBSCallback cbfunc_
Definition: ddeclnt.cpp:86
WORD wFmt
Definition: ddeclnt.cpp:31
void nrnbbs_post_string(const char *name, const char *data)
Definition: ddeclnt.cpp:48
static double look(void *v)
Definition: ocbbs.cpp:458
#define FALSE
Definition: err.c:56
#define i
Definition: md1redef.h:12
char buf[512]
Definition: init.cpp:13
HDDEDATA EXPENTRY _export DDECallback(WORD wType, WORD wFmt, HCONV hConvX, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2)
Definition: ddeclnt.cpp:234
HCONV hConvAdmin
Definition: ddeclnt.cpp:28
BOOL nrnbbs_take_string(const char *name, char *val)
Definition: ddeclnt.cpp:70
HSZ hszAdmin
Definition: ddeclnt.cpp:24
static void post(HCONV hc, const char *name)
Definition: ddeclnt.cpp:166
return NULL
Definition: cabcode.cpp:461
char szDDEData[256]
Definition: ddeclnt.cpp:33