diff --git a/radiant/watchbsp.cpp b/radiant/watchbsp.cpp index 5039963c..8a639b10 100644 --- a/radiant/watchbsp.cpp +++ b/radiant/watchbsp.cpp @@ -537,7 +537,7 @@ void CWatchBSP::DoEBeginStep(){ } } m_eState = EBeginStep; - s_routine_id = gtk_timeout_add( 25, watchbsp_routine, this ); + s_routine_id = gtk_timeout_add( 8, watchbsp_routine, this ); } diff --git a/tools/quake3/common/inout.c b/tools/quake3/common/inout.c index 827bdceb..b736280d 100644 --- a/tools/quake3/common/inout.c +++ b/tools/quake3/common/inout.c @@ -45,12 +45,6 @@ // utf8 conversion #include -#ifdef WIN32 -HWND hwndOut = NULL; -qboolean lookedForServer = qfalse; -UINT wm_BroadcastCommand = -1; -#endif - socket_t *brdcst_socket; netmessage_t msg; @@ -95,10 +89,12 @@ void xml_SendNode( xmlNodePtr node ){ while ( pos < (int)xml_buf->use ) { // what size are we gonna send now? - ( xml_buf->use - pos < MAX_NETMESSAGE - 10 ) ? ( size = xml_buf->use - pos ) : ( size = MAX_NETMESSAGE - 10 ); - //++timo just a debug thing - if ( size == MAX_NETMESSAGE - 10 ) { - Sys_FPrintf( SYS_NOXML, "Got to split the buffer\n" ); + if( xml_buf->use - pos < MAX_NETMESSAGE - 10 ){ + size = xml_buf->use - pos; + } + else{ + size = MAX_NETMESSAGE - 10; + Sys_FPrintf( SYS_NOXML, "Got to split the buffer\n" ); //++timo just a debug thing } memcpy( xmlbuf, xml_buf->content + pos, size ); xmlbuf[size] = '\0'; @@ -252,16 +248,63 @@ void Broadcast_Setup( const char *dest ){ void Broadcast_Shutdown(){ if ( brdcst_socket ) { Sys_Printf( "Disconnecting\n" ); + xml_message_flush(); Net_Disconnect( brdcst_socket ); brdcst_socket = NULL; } } +#define MAX_MESEGE MAX_NETMESSAGE / 2 +char mesege[MAX_MESEGE]; +size_t mesege_len = 0; +int mesege_flag = SYS_STD; + +void xml_message_flush(){ + if( mesege_len == 0 ) + return; + xmlNodePtr node; + node = xmlNewNode( NULL, (xmlChar*)"message" ); + { + mesege[mesege_len] = '\0'; + mesege_len = 0; + gchar* utf8 = g_locale_to_utf8( mesege, -1, NULL, NULL, NULL ); + xmlNodeAddContent( node, (xmlChar*)utf8 ); + g_free( utf8 ); + } + char level[2]; + level[0] = (int)'0' + mesege_flag; + level[1] = 0; + xmlSetProp( node, (xmlChar*)"level", (xmlChar *)&level ); + + xml_SendNode( node ); +} + +void xml_message_push( int flag, const char* characters, size_t length ){ + if( flag != mesege_flag ){ + xml_message_flush(); + mesege_flag = flag; + } + + const char* end = characters + length; + while ( characters != end ) + { + size_t space = MAX_MESEGE - 1 - mesege_len; + if ( space == 0 ) { + xml_message_flush(); + } + else + { + size_t size = ( space < ( size_t )( end - characters ) ) ? space : ( size_t )( end - characters ); + memcpy( mesege + mesege_len, characters, size ); + mesege_len += size; + characters += size; + } + } +} + // all output ends up through here void FPrintf( int flag, char *buf ){ - xmlNodePtr node; static qboolean bGotXML = qfalse; - char level[2]; printf( "%s", buf ); @@ -284,17 +327,7 @@ void FPrintf( int flag, char *buf ){ doc->children = xmlNewDocRawNode( doc, NULL, (xmlChar*)"q3map_feedback", NULL ); bGotXML = qtrue; } - node = xmlNewNode( NULL, (xmlChar*)"message" ); - { - gchar* utf8 = g_locale_to_utf8( buf, -1, NULL, NULL, NULL ); - xmlNodeAddContent( node, (xmlChar*)utf8 ); - g_free( utf8 ); - } - level[0] = (int)'0' + flag; - level[1] = 0; - xmlSetProp( node, (xmlChar*)"level", (xmlChar *)&level ); - - xml_SendNode( node ); + xml_message_push( flag, buf, strlen( buf ) ); } #ifdef DBG_XML @@ -341,13 +374,14 @@ void Error( const char *error, ... ){ char tmp[4096]; va_list argptr; - va_start( argptr,error ); + va_start( argptr, error ); vsprintf( tmp, error, argptr ); va_end( argptr ); sprintf( out_buffer, "************ ERROR ************\n%s\n", tmp ); FPrintf( SYS_ERR, out_buffer ); + xml_message_flush(); #ifdef DBG_XML DumpXML(); @@ -357,7 +391,5 @@ void Error( const char *error, ... ){ // a clean solution is to send a sync request node in the stream and wait for an answer before exiting Sys_Sleep( 1000 ); - Broadcast_Shutdown(); - exit( 1 ); } diff --git a/tools/quake3/common/inout.h b/tools/quake3/common/inout.h index 4efe0dac..396e6c2d 100644 --- a/tools/quake3/common/inout.h +++ b/tools/quake3/common/inout.h @@ -29,6 +29,7 @@ // some useful xml routines xmlNodePtr xml_NodeForVec( vec3_t v ); void xml_SendNode( xmlNodePtr node ); +void xml_message_flush(); // print a message in q3map output and send the corresponding select information down the xml stream // bError: do we end with an error on this one or do we go ahead? void xml_Select( char *msg, int entitynum, int brushnum, qboolean bError ); diff --git a/tools/quake3/q3map2/bsp.c b/tools/quake3/q3map2/bsp.c index b9344a3a..45cf7276 100644 --- a/tools/quake3/q3map2/bsp.c +++ b/tools/quake3/q3map2/bsp.c @@ -348,6 +348,7 @@ void ProcessWorldModel( void ){ Sys_FPrintf( SYS_NOXML, "******* leaked *******\n" ); Sys_FPrintf( SYS_NOXML, "**********************\n" ); polyline = LeakFile( tree ); + xml_message_flush(); leaknode = xmlNewNode( NULL, (xmlChar*)"message" ); xmlNodeAddContent( leaknode, (xmlChar*)"MAP LEAKED\n" ); xmlAddChild( leaknode, polyline ); @@ -356,7 +357,7 @@ void ProcessWorldModel( void ){ xmlSetProp( leaknode, (xmlChar*)"level", (xmlChar*) &level ); xml_SendNode( leaknode ); if ( leaktest ) { - Sys_Printf( "--- MAP LEAKED, ABORTING LEAKTEST ---\n" ); + Sys_FPrintf( SYS_WRN, "--- MAP LEAKED, ABORTING LEAKTEST ---\n" ); exit( 0 ); } } diff --git a/tools/quake3/q3map2/main.c b/tools/quake3/q3map2/main.c index ff95bbdf..913e301e 100644 --- a/tools/quake3/q3map2/main.c +++ b/tools/quake3/q3map2/main.c @@ -87,6 +87,8 @@ char *Q_strncat( char *dst, size_t dlen, const char *src, size_t slen ) { */ static void ExitQ3Map( void ){ + /* flush xml send buffer, shut down connection */ + Broadcast_Shutdown(); BSPFilesCleanup(); if ( mapDrawSurfs != NULL ) { free( mapDrawSurfs ); @@ -3904,9 +3906,6 @@ int main( int argc, char **argv ){ end = I_FloatTime(); Sys_Printf( "%9.0f seconds elapsed\n", end - start ); - /* shut down connection */ - Broadcast_Shutdown(); - /* return any error code */ return r; }