/* $OpenXM: OpenXM_contrib2/asir2000/io/tcpf_win_mini.c,v 1.2 2006/09/26 05:50:31 noro Exp $ */ #include "ca.h" #include "parse.h" #include "com.h" #include #include #include "ox.h" #include #include #include static int control_port,server_port; int win_ox_launch(); void win_spawn_server(char *control_port_str,char *server_port_str); void win_get_rootdir(rootdir); char *win_pop_string(); static int launched=0; extern int terminate; int win_ox_launch() { int cs,ss,cn,sn; char control_port_str[BUFSIZ]; char server_port_str[BUFSIZ]; if ( launched ) return 0; control_port_str[0] = 0; server_port_str[0] = 0; do { generate_port(0,control_port_str); generate_port(0,server_port_str); cs = try_bind_listen(0,control_port_str); if ( cs < 0 ) continue; ss = try_bind_listen(0,server_port_str); if ( ss < 0 ) continue; win_spawn_server(control_port_str,server_port_str); cs = try_accept(0,cs); if ( cs < 0 ) continue; ss = try_accept(0,ss); if ( ss < 0 ) continue; } while ( cs < 0 || ss < 0 ); /* client mode */ cn = get_iofp(cs,control_port_str,0); sn = get_iofp(ss,server_port_str,0); /* get_iofp returns -1 if the laucher could not spawn the server */ if ( sn < 0 ) { /* we should terminate the launcher */ ox_send_cmd(cn,SM_shutdown); ox_flush_stream_force(cn); return -1; } /* register server to the server list */ control_port = cn; server_port = sn; launched = 1; return 0; } void win_get_rootdir(char *dir); void win_spawn_server(char *control_port_str,char *server_port_str) { char AsirExe[BUFSIZ]; char AsirExePath[BUFSIZ]; char rootdir[BUFSIZ]; char *av[BUFSIZ]; win_get_rootdir(rootdir); // strcpy(rootdir,"c:\\program files\\asir"); sprintf(AsirExe,"%s\\bin\\engine.exe",rootdir); sprintf(AsirExePath,"\"%s\"",AsirExe); av[0] = "ox_launch"; av[1] = "127.0.0.1"; av[2] = "0"; av[3] = control_port_str; av[4] = server_port_str; av[5] = "ox_asir_wfep"; av[6] = "1"; av[7] = AsirExePath; av[8] = 0; _spawnv(_P_NOWAIT,AsirExe,av); } void win_get_rootdir(char *dir) { char *slash; GetCurrentDirectory(BUFSIZ,dir); slash = strrchr(dir,'\\'); if ( slash ) *slash = 0; } char *win_pop_string() { Obj obj; int id,serial; if ( !launched ) return ""; serial = ox_recv(server_port,&id,&obj); if ( serial < 0 ) return 0; if ( id == OX_DATA ) { if ( obj && OID(obj) == O_STR ) return BDY((STRING)obj); else return ""; } else if ( id == OX_SYNC_BALL ) { ox_send_sync(server_port); ox_flush_stream_force(server_port); return ""; } else return ""; } void win_execute_string(char *cmd) { struct oSTRING str; if ( !launched ) return; OID(&str) = O_STR; BDY(&str) = cmd; ox_send_data(server_port,&str); ox_send_cmd(server_port,SM_executeStringByLocalParser); ox_send_cmd(server_port,SM_popString); ox_flush_stream_force(server_port); } void ox_reset() { USINT t; int id; Obj obj; if ( !launched ) return; ox_send_cmd(control_port,SM_control_reset_connection); ox_flush_stream_force(control_port); ox_recv(control_port,&id,&obj); t = (USINT)obj; Sleep(100); ox_send_cmd(server_port,SM_nop); ox_flush_stream_force(server_port); } void ox_shutdown() { if ( !launched ) return; terminate = 1; ox_send_cmd(server_port,SM_shutdown); Sleep(100); ox_send_cmd(control_port,SM_shutdown); }