Commit 388da1f5a6ad1462eba63859c4fe9fa2860133cc

Authored by perry.werneck@gmail.com
1 parent 3e424bdd

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 {
... ...