Commit 388da1f5a6ad1462eba63859c4fe9fa2860133cc
1 parent
3e424bdd
Exists in
master
and in
5 other branches
Classe de acesso remoto também passa a permitir a criação de uma janela do emulador em windows
Showing
1 changed file
with
80 additions
and
14 deletions
Show diff stats
src/classlib/remote.cc
... | ... | @@ -46,6 +46,7 @@ |
46 | 46 | #if defined(WIN32) |
47 | 47 | #include <windows.h> |
48 | 48 | #include <pw3270/ipcpackets.h> |
49 | + #include <process.h> | |
49 | 50 | #else |
50 | 51 | #define HLLAPI_PACKET_IS_CONNECTED "isConnected" |
51 | 52 | #define HLLAPI_PACKET_GET_CSTATE "getConnectionState" |
... | ... | @@ -277,34 +278,99 @@ |
277 | 278 | remote(const char *session) |
278 | 279 | { |
279 | 280 | #if defined(WIN32) |
280 | - static DWORD dwMode = PIPE_READMODE_MESSAGE; | |
281 | - char buffer[4096]; | |
282 | - char * str = strdup(session); | |
283 | - char * ptr; | |
281 | + static DWORD dwMode = PIPE_READMODE_MESSAGE; | |
282 | + char buffer[4096]; | |
283 | + char * str; | |
284 | + char * ptr; | |
285 | + time_t timer; | |
286 | + WIN32_FIND_DATA FindFileData; | |
287 | + | |
284 | 288 | |
285 | 289 | hPipe = INVALID_HANDLE_VALUE; |
286 | 290 | |
287 | - for(ptr=str;*ptr;ptr++) | |
291 | + if(strcasecmp(session,"start") == 0 || strcasecmp(session,"new") == 0) | |
288 | 292 | { |
289 | - if(*ptr == ':') | |
290 | - *ptr = '_'; | |
293 | + // Start a new session | |
294 | + char buffer[80]; | |
295 | + char appName[4096]; | |
296 | + HKEY hKey = 0; | |
297 | + unsigned long datalen = 4096; | |
298 | + STARTUPINFO si; | |
299 | + PROCESS_INFORMATION pi; | |
300 | + | |
301 | + // Get application path | |
302 | + *appName = 0; | |
303 | + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) == ERROR_SUCCESS) | |
304 | + { | |
305 | + unsigned long datatype; // #defined in winnt.h (predefined types 0-11) | |
306 | + if(RegQueryValueExA(hKey,"appName",NULL,&datatype,(LPBYTE) appName,&datalen) != ERROR_SUCCESS) | |
307 | + *appName = 0; | |
308 | + RegCloseKey(hKey); | |
309 | + } | |
310 | + | |
311 | + trace("%s appname=%s\n",__FUNCTION__,appName); | |
312 | + | |
313 | + snprintf(buffer,79,"%s --session=\"H%06d\"",appName,getpid()); | |
314 | + | |
315 | + ZeroMemory( &si, sizeof(si) ); | |
316 | + si.cb = sizeof(si); | |
317 | + ZeroMemory( &pi, sizeof(pi) ); | |
318 | + | |
319 | + // si.dwFlags = STARTF_PREVENTPINNING; | |
320 | + trace("App: %s",appName); | |
321 | + trace("CmdLine: %s",buffer); | |
322 | + | |
323 | + if(CreateProcess(NULL,buffer,NULL,NULL,0,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi)) | |
324 | + { | |
325 | + CloseHandle( pi.hProcess ); | |
326 | + CloseHandle( pi.hThread ); | |
327 | + } | |
291 | 328 | else |
292 | - *ptr = tolower(*ptr); | |
329 | + { | |
330 | + throw exception("Can't start %s session",PACKAGE_NAME); | |
331 | + return; | |
332 | + } | |
333 | + | |
334 | + snprintf(buffer,4095,"H%06d_a",getpid()); | |
335 | + str = strdup(buffer); | |
336 | + | |
337 | + } | |
338 | + else | |
339 | + { | |
340 | + // Use an existing session | |
341 | + str = strdup(session); | |
342 | + | |
343 | + // Convert session name | |
344 | + for(ptr=str;*ptr;ptr++) | |
345 | + { | |
346 | + if(*ptr == ':') | |
347 | + *ptr = '_'; | |
348 | + else | |
349 | + *ptr = tolower(*ptr); | |
350 | + } | |
293 | 351 | } |
294 | 352 | |
295 | 353 | snprintf(buffer,4095,"\\\\.\\pipe\\%s",str); |
296 | 354 | |
297 | 355 | free(str); |
298 | 356 | |
299 | - if(!WaitNamedPipe(buffer,NMPWAIT_USE_DEFAULT_WAIT)) | |
357 | + timer = time(0)+5; | |
358 | + while(hPipe == INVALID_HANDLE_VALUE && time(0) < timer) | |
300 | 359 | { |
301 | - exception e = exception(GetLastError(),"Service instance %s unavailable",str); | |
302 | - free(str); | |
303 | - throw e; | |
304 | - return; | |
360 | + Sleep(10); | |
361 | + hPipe = FindFirstFile(buffer, &FindFileData); | |
305 | 362 | } |
306 | 363 | |
307 | - hPipe = CreateFile(buffer,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | |
364 | + if(hPipe != INVALID_HANDLE_VALUE) | |
365 | + { | |
366 | + CloseHandle(hPipe); | |
367 | + hPipe = CreateFile(buffer,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | |
368 | + } | |
369 | + else | |
370 | + { | |
371 | + throw exception(GetLastError(),"Timeout waiting for %s instance",PACKAGE_NAME); | |
372 | + return; | |
373 | + } | |
308 | 374 | |
309 | 375 | if(hPipe == INVALID_HANDLE_VALUE) |
310 | 376 | { | ... | ... |