X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=radiant%2Fwatchbsp.cpp;h=2803ce944ab1d434fb44f56756d2b6f1b51a42fb;hb=fda16399685b08c509b0bcb559a082ed90c527a7;hp=5c170b6662c36f29a10717e22797d5bbc6e4e61a;hpb=61c537beac8ac40367b16a2eec937712b04ad63e;p=xonotic%2Fnetradiant.git diff --git a/radiant/watchbsp.cpp b/radiant/watchbsp.cpp index 5c170b66..2803ce94 100644 --- a/radiant/watchbsp.cpp +++ b/radiant/watchbsp.cpp @@ -1,32 +1,32 @@ /* -Copyright (c) 2001, Loki software, inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -Neither the name of Loki software nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior -written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + Copyright (c) 2001, Loki software, inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + Neither the name of Loki software nor the names of its contributors may be used + to endorse or promote products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ //----------------------------------------------------------------------------- // @@ -34,9 +34,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // monitoring window for running BSP processes (and possibly various other stuff) #include "watchbsp.h" +#include "globaldefs.h" #include -#include #include "cmdlib.h" #include "convert.h" @@ -52,156 +52,159 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "mainframe.h" #include "sockets.h" -void message_flush(message_info_t* self) +void message_flush(message_info_t *self) { - Sys_Print(self->msg_level, self->m_buffer, self->m_length); - self->m_length = 0; + Sys_Print(self->msg_level, self->m_buffer, self->m_length); + self->m_length = 0; } -void message_print(message_info_t* self, const char* characters, std::size_t length) +void message_print(message_info_t *self, const char *characters, std::size_t length) { - const char* end = characters + length; - while(characters != end) - { - std::size_t space = message_info_t::bufsize - 1 - self->m_length; - if(space == 0) - { - message_flush(self); - } - else - { - std::size_t size = std::min(space, std::size_t(end - characters)); - memcpy(self->m_buffer + self->m_length, characters, size); - self->m_length += size; - characters += size; + const char *end = characters + length; + while (characters != end) { + std::size_t space = message_info_t::bufsize - 1 - self->m_length; + if (space == 0) { + message_flush(self); + } else { + std::size_t size = std::min(space, std::size_t(end - characters)); + memcpy(self->m_buffer + self->m_length, characters, size); + self->m_length += size; + characters += size; + } } - } } -#include -#include +#include +#include #include "xmlstuff.h" -class CWatchBSP -{ +class CWatchBSP { private: - // a flag we have set to true when using an external BSP plugin - // the resulting code with that is a bit dirty, cleaner solution would be to seperate the succession of commands from the listening loop - // (in two seperate classes probably) - bool m_bBSPPlugin; - - // EIdle: we are not listening - // DoMonitoringLoop will change state to EBeginStep - // EBeginStep: the socket is up for listening, we are expecting incoming connection - // incoming connection will change state to EWatching - // EWatching: we have a connection, monitor it - // connection closed will see if we start a new step (EBeginStep) or launch Quake3 and end (EIdle) - enum EWatchBSPState { EIdle, EBeginStep, EWatching } m_eState; - socket_t *m_pListenSocket; - socket_t *m_pInSocket; - netmessage_t msg; - GPtrArray *m_pCmd; - // used to timeout EBeginStep - GTimer *m_pTimer; - std::size_t m_iCurrentStep; - // name of the map so we can run the engine - char *m_sBSPName; - // buffer we use in push mode to receive data directly from the network - xmlParserInputBufferPtr m_xmlInputBuffer; - xmlParserInputPtr m_xmlInput; - xmlParserCtxtPtr m_xmlParserCtxt; - // call this to switch the set listening mode - bool SetupListening(); - // start a new EBeginStep - void DoEBeginStep(); - // the xml and sax parser state - char m_xmlBuf[MAX_NETMESSAGE]; - bool m_bNeedCtxtInit; - message_info_t m_message_info; + // a flag we have set to true when using an external BSP plugin + // the resulting code with that is a bit dirty, cleaner solution would be to seperate the succession of commands from the listening loop + // (in two seperate classes probably) + bool m_bBSPPlugin; + + // EIdle: we are not listening + // DoMonitoringLoop will change state to EBeginStep + // EBeginStep: the socket is up for listening, we are expecting incoming connection + // incoming connection will change state to EWatching + // EWatching: we have a connection, monitor it + // connection closed will see if we start a new step (EBeginStep) or launch Quake3 and end (EIdle) + enum EWatchBSPState { EIdle, EBeginStep, EWatching } m_eState; + socket_t *m_pListenSocket; + socket_t *m_pInSocket; + netmessage_t msg; + GPtrArray *m_pCmd; + // used to timeout EBeginStep + GTimer *m_pTimer; + std::size_t m_iCurrentStep; + // name of the map so we can run the engine + char *m_sBSPName; + // buffer we use in push mode to receive data directly from the network + xmlParserInputBufferPtr m_xmlInputBuffer; + xmlParserInputPtr m_xmlInput; + xmlParserCtxtPtr m_xmlParserCtxt; + + // call this to switch the set listening mode + bool SetupListening(); + + // start a new EBeginStep + void DoEBeginStep(); + + // the xml and sax parser state + char m_xmlBuf[MAX_NETMESSAGE]; + bool m_bNeedCtxtInit; + message_info_t m_message_info; public: - CWatchBSP() - { - m_pCmd = 0; - m_bBSPPlugin = false; - m_pListenSocket = NULL; - m_pInSocket = NULL; - m_eState = EIdle; - m_pTimer = g_timer_new(); - m_sBSPName = NULL; - m_xmlInputBuffer = NULL; - m_bNeedCtxtInit = true; - } - virtual ~CWatchBSP() - { - EndMonitoringLoop(); - Net_Shutdown(); - - g_timer_destroy(m_pTimer); - } - - bool HasBSPPlugin() const - { return m_bBSPPlugin; } + CWatchBSP() + { + m_pCmd = 0; + m_bBSPPlugin = false; + m_pListenSocket = NULL; + m_pInSocket = NULL; + m_eState = EIdle; + m_pTimer = g_timer_new(); + m_sBSPName = NULL; + m_xmlInputBuffer = NULL; + m_bNeedCtxtInit = true; + } - // called regularly to keep listening - void RoutineProcessing(); - // start a monitoring loop with the following steps - void DoMonitoringLoop( GPtrArray *pCmd, const char *sBSPName ); - void EndMonitoringLoop() - { - Reset(); - if (m_sBSPName) + virtual ~CWatchBSP() { - string_release(m_sBSPName, string_length(m_sBSPName)); - m_sBSPName = 0; + EndMonitoringLoop(); + Net_Shutdown(); + + g_timer_destroy(m_pTimer); } - if(m_pCmd) + + bool HasBSPPlugin() const + { return m_bBSPPlugin; } + + // called regularly to keep listening + void RoutineProcessing(); + + // start a monitoring loop with the following steps + void DoMonitoringLoop(GPtrArray *pCmd, const char *sBSPName); + + void EndMonitoringLoop() { - g_ptr_array_free(m_pCmd, TRUE); - m_pCmd = 0; + Reset(); + if (m_sBSPName) { + string_release(m_sBSPName, string_length(m_sBSPName)); + m_sBSPName = 0; + } + if (m_pCmd) { + g_ptr_array_free(m_pCmd, TRUE); + m_pCmd = 0; + } } - } - // close everything - may be called from the outside to abort the process - void Reset(); - // start a listening loop for an external process, possibly a BSP plugin - void ExternalListen(); + + // close everything - may be called from the outside to abort the process + void Reset(); + + // start a listening loop for an external process, possibly a BSP plugin + void ExternalListen(); }; -CWatchBSP* g_pWatchBSP; +CWatchBSP *g_pWatchBSP; - // watch the BSP process through network connections - // true: trigger the BSP steps one by one and monitor them through the network - // false: create a BAT / .sh file and execute it. don't bother monitoring it. +// watch the BSP process through network connections +// true: trigger the BSP steps one by one and monitor them through the network +// false: create a BAT / .sh file and execute it. don't bother monitoring it. bool g_WatchBSP_Enabled = true; - // do we stop the compilation process if we come accross a leak? +// do we stop the compilation process if we come accross a leak? bool g_WatchBSP_LeakStop = true; bool g_WatchBSP_RunQuake = false; - // store prefs setting for automatic sleep mode activation +// store prefs setting for automatic sleep mode activation bool g_WatchBSP_DoSleep = true; - // timeout when beginning a step (in seconds) - // if we don't get a connection quick enough we assume something failed and go back to idling +// timeout when beginning a step (in seconds) +// if we don't get a connection quick enough we assume something failed and go back to idling int g_WatchBSP_Timeout = 10; -void Build_constructPreferences(PreferencesPage& page) +void Build_constructPreferences(PreferencesPage &page) { - GtkWidget* monitorbsp = page.appendCheckBox("", "Enable Build Process Monitoring", g_WatchBSP_Enabled); - GtkWidget* leakstop = page.appendCheckBox("", "Stop Compilation on Leak", g_WatchBSP_LeakStop); - GtkWidget* runengine = page.appendCheckBox("", "Run Engine After Compile", g_WatchBSP_RunQuake); - GtkWidget* sleep = page.appendCheckBox("", "Sleep When Running the Engine", g_WatchBSP_DoSleep); - Widget_connectToggleDependency(leakstop, monitorbsp); - Widget_connectToggleDependency(runengine, monitorbsp); - Widget_connectToggleDependency(sleep, runengine); + ui::CheckButton monitorbsp = page.appendCheckBox("", "Enable Build Process Monitoring", g_WatchBSP_Enabled); + ui::CheckButton leakstop = page.appendCheckBox("", "Stop Compilation on Leak", g_WatchBSP_LeakStop); + ui::CheckButton runengine = page.appendCheckBox("", "Run Engine After Compile", g_WatchBSP_RunQuake); + ui::CheckButton sleep = page.appendCheckBox("", "Sleep When Running the Engine", g_WatchBSP_DoSleep); + Widget_connectToggleDependency(leakstop, monitorbsp); + Widget_connectToggleDependency(runengine, monitorbsp); + Widget_connectToggleDependency(sleep, runengine); } -void Build_constructPage(PreferenceGroup& group) + +void Build_constructPage(PreferenceGroup &group) { - PreferencesPage page(group.createPage("Build", "Build Preferences")); - Build_constructPreferences(page); + PreferencesPage page(group.createPage("Build", "Build Preferences")); + Build_constructPreferences(page); } + void Build_registerPreferencesPage() { - PreferencesDialog_addSettingsPage(FreeCaller1()); + PreferencesDialog_addSettingsPage(makeCallbackF(Build_constructPage)); } #include "preferencesystem.h" @@ -209,31 +212,31 @@ void Build_registerPreferencesPage() void BuildMonitor_Construct() { - g_pWatchBSP = new CWatchBSP(); + g_pWatchBSP = new CWatchBSP(); - g_WatchBSP_Enabled = !string_equal(g_pGameDescription->getKeyValue("no_bsp_monitor"), "1"); + g_WatchBSP_Enabled = !string_equal(g_pGameDescription->getKeyValue("no_bsp_monitor"), "1"); - GlobalPreferenceSystem().registerPreference("WatchBSP", BoolImportStringCaller(g_WatchBSP_Enabled), BoolExportStringCaller(g_WatchBSP_Enabled)); - GlobalPreferenceSystem().registerPreference("RunQuake2Run", BoolImportStringCaller(g_WatchBSP_RunQuake), BoolExportStringCaller(g_WatchBSP_RunQuake)); - GlobalPreferenceSystem().registerPreference("LeakStop", BoolImportStringCaller(g_WatchBSP_LeakStop), BoolExportStringCaller(g_WatchBSP_LeakStop)); - GlobalPreferenceSystem().registerPreference("SleepMode", BoolImportStringCaller(g_WatchBSP_DoSleep), BoolExportStringCaller(g_WatchBSP_DoSleep)); + GlobalPreferenceSystem().registerPreference("WatchBSP", make_property_string(g_WatchBSP_Enabled)); + GlobalPreferenceSystem().registerPreference("RunQuake2Run", make_property_string(g_WatchBSP_RunQuake)); + GlobalPreferenceSystem().registerPreference("LeakStop", make_property_string(g_WatchBSP_LeakStop)); + GlobalPreferenceSystem().registerPreference("SleepMode", make_property_string(g_WatchBSP_DoSleep)); - Build_registerPreferencesPage(); + Build_registerPreferencesPage(); } void BuildMonitor_Destroy() { - delete g_pWatchBSP; + delete g_pWatchBSP; } CWatchBSP *GetWatchBSP() { - return g_pWatchBSP; + return g_pWatchBSP; } -void BuildMonitor_Run(GPtrArray* commands, const char* mapName) +void BuildMonitor_Run(GPtrArray *commands, const char *mapName) { - GetWatchBSP()->DoMonitoringLoop(commands, mapName); + GetWatchBSP()->DoMonitoringLoop(commands, mapName); } @@ -242,631 +245,568 @@ void BuildMonitor_Run(GPtrArray* commands, const char* mapName) // utility for saxStartElement below static void abortStream(message_info_t *data) { - GetWatchBSP()->EndMonitoringLoop(); - // tell there has been an error + GetWatchBSP()->EndMonitoringLoop(); + // tell there has been an error #if 0 - if (GetWatchBSP()->HasBSPPlugin()) - g_BSPFrontendTable.m_pfnEndListen(2); + if ( GetWatchBSP()->HasBSPPlugin() ) { + g_BSPFrontendTable.m_pfnEndListen( 2 ); + } #endif - // yeah this doesn't look good.. but it's needed so that everything will be ignored until the stream goes out - data->ignore_depth = -1; - data->recurse++; + // yeah this doesn't look good.. but it's needed so that everything will be ignored until the stream goes out + data->ignore_depth = -1; + data->recurse++; } #include "stream_version.h" -static void saxStartElement(message_info_t *data, const xmlChar *name, const xmlChar **attrs) +static void saxStartElement(message_info_t *data, const xmlChar *name, const xmlChar **attrs) { #if 0 - globalOutputStream() << "<" << name; - if(attrs != 0) - { - for(const xmlChar** p = attrs; *p != 0; p += 2) - { - globalOutputStream() << " " << p[0] << "=" << makeQuoted(p[1]); + globalOutputStream() << "<" << name; + if ( attrs != 0 ) { + for ( const xmlChar** p = attrs; *p != 0; p += 2 ) + { + globalOutputStream() << " " << p[0] << "=" << makeQuoted( p[1] ); + } } - } - globalOutputStream() << ">\n"; + globalOutputStream() << ">\n"; #endif - if (data->ignore_depth == 0) - { - if(data->pGeometry != 0) - // we have a handler - { - data->pGeometry->saxStartElement (data, name, attrs); - } - else - { - if (strcmp(reinterpret_cast(name), "q3map_feedback") == 0) - { - // check the correct version - // old q3map don't send a version attribute - // the ones we support .. send Q3MAP_STREAM_VERSION - if (!attrs[0] || !attrs[1] || (strcmp(reinterpret_cast(attrs[0]), "version") != 0)) - { - message_flush(data); - globalErrorStream() << "No stream version given in the feedback stream, this is an old q3map version.\n" - "Please turn off monitored compiling if you still wish to use this q3map executable\n"; - abortStream(data); - return; - } - else if (strcmp(reinterpret_cast(attrs[1]), Q3MAP_STREAM_VERSION) != 0) - { - message_flush(data); - globalErrorStream() << - "This version of Radiant reads version " Q3MAP_STREAM_VERSION " debug streams, I got an incoming connection with version " << reinterpret_cast(attrs[1]) << "\n" - "Please make sure your versions of Radiant and q3map are matching.\n"; - abortStream(data); - return; - } - } - // we don't treat locally - else if (strcmp(reinterpret_cast(name), "message") == 0) - { - int msg_level = atoi(reinterpret_cast(attrs[1])); - if(msg_level != data->msg_level) - { - message_flush(data); - data->msg_level = msg_level; + if (data->ignore_depth == 0) { + if (data->pGeometry != 0) { + // we have a handler + data->pGeometry->saxStartElement(data, name, attrs); + } else { + if (strcmp(reinterpret_cast( name ), "q3map_feedback") == 0) { + // check the correct version + // old q3map don't send a version attribute + // the ones we support .. send Q3MAP_STREAM_VERSION + if (!attrs[0] || !attrs[1] || (strcmp(reinterpret_cast( attrs[0] ), "version") != 0)) { + message_flush(data); + globalErrorStream() + << "No stream version given in the feedback stream, this is an old q3map version.\n" + "Please turn off monitored compiling if you still wish to use this q3map executable\n"; + abortStream(data); + return; + } else if (strcmp(reinterpret_cast( attrs[1] ), Q3MAP_STREAM_VERSION) != 0) { + message_flush(data); + globalErrorStream() << + "This version of Radiant reads version " Q3MAP_STREAM_VERSION " debug streams, I got an incoming connection with version " + << reinterpret_cast( attrs[1] ) << "\n" + "Please make sure your versions of Radiant and q3map are matching.\n"; + abortStream(data); + return; + } + } + // we don't treat locally + else if (strcmp(reinterpret_cast( name ), "message") == 0) { + int msg_level = atoi(reinterpret_cast( attrs[1] )); + if (msg_level != data->msg_level) { + message_flush(data); + data->msg_level = msg_level; + } + } else if (strcmp(reinterpret_cast( name ), "polyline") == 0) { + // polyline has a particular status .. right now we only use it for leakfile .. + data->geometry_depth = data->recurse; + data->pGeometry = &g_pointfile; + data->pGeometry->saxStartElement(data, name, attrs); + } else if (strcmp(reinterpret_cast( name ), "select") == 0) { + CSelectMsg *pSelect = new CSelectMsg(); + data->geometry_depth = data->recurse; + data->pGeometry = pSelect; + data->pGeometry->saxStartElement(data, name, attrs); + } else if (strcmp(reinterpret_cast( name ), "pointmsg") == 0) { + CPointMsg *pPoint = new CPointMsg(); + data->geometry_depth = data->recurse; + data->pGeometry = pPoint; + data->pGeometry->saxStartElement(data, name, attrs); + } else if (strcmp(reinterpret_cast( name ), "windingmsg") == 0) { + CWindingMsg *pWinding = new CWindingMsg(); + data->geometry_depth = data->recurse; + data->pGeometry = pWinding; + data->pGeometry->saxStartElement(data, name, attrs); + } else { + globalErrorStream() << "Warning: ignoring unrecognized node in XML stream (" + << reinterpret_cast( name ) << ")\n"; + // we don't recognize this node, jump over it + // (NOTE: the ignore mechanism is a bit screwed, only works when starting an ignore at the highest level) + data->ignore_depth = data->recurse; + } } - } - else if (strcmp(reinterpret_cast(name), "polyline") == 0) - // polyline has a particular status .. right now we only use it for leakfile .. - { - data->geometry_depth = data->recurse; - data->pGeometry = &g_pointfile; - data->pGeometry->saxStartElement (data, name, attrs); - } - else if (strcmp(reinterpret_cast(name), "select") == 0) - { - CSelectMsg *pSelect = new CSelectMsg(); - data->geometry_depth = data->recurse; - data->pGeometry = pSelect; - data->pGeometry->saxStartElement (data, name, attrs); - } - else if (strcmp(reinterpret_cast(name), "pointmsg") == 0) - { - CPointMsg *pPoint = new CPointMsg(); - data->geometry_depth = data->recurse; - data->pGeometry = pPoint; - data->pGeometry->saxStartElement (data, name, attrs); - } - else if (strcmp(reinterpret_cast(name), "windingmsg") == 0) - { - CWindingMsg *pWinding = new CWindingMsg(); - data->geometry_depth = data->recurse; - data->pGeometry = pWinding; - data->pGeometry->saxStartElement (data, name, attrs); - } - else - { - globalErrorStream() << "Warning: ignoring unrecognized node in XML stream (" << reinterpret_cast(name) << ")\n"; - // we don't recognize this node, jump over it - // (NOTE: the ignore mechanism is a bit screwed, only works when starting an ignore at the highest level) - data->ignore_depth = data->recurse; - } } - } - data->recurse++; + data->recurse++; } -static void saxEndElement(message_info_t *data, const xmlChar *name) +static void saxEndElement(message_info_t *data, const xmlChar *name) { #if 0 - globalOutputStream() << "<" << name << "/>\n"; + globalOutputStream() << "<" << name << "/>\n"; #endif - data->recurse--; - // we are out of an ignored chunk - if(data->recurse == data->ignore_depth) - { - data->ignore_depth = 0; - return; - } - if(data->pGeometry != 0) - { - data->pGeometry->saxEndElement (data, name); - // we add the object to the debug window - if(data->geometry_depth == data->recurse) - { - g_DbgDlg.Push(data->pGeometry); - data->pGeometry = 0; + data->recurse--; + // we are out of an ignored chunk + if (data->recurse == data->ignore_depth) { + data->ignore_depth = 0; + return; + } + if (data->pGeometry != 0) { + data->pGeometry->saxEndElement(data, name); + // we add the object to the debug window + if (data->geometry_depth == data->recurse) { + g_DbgDlg.Push(data->pGeometry); + data->pGeometry = 0; + } } - } - if (data->recurse == data->stop_depth) - { - message_flush(data); -#ifdef _DEBUG - globalOutputStream() << "Received error msg .. shutting down..\n"; + if (data->recurse == data->stop_depth) { + message_flush(data); +#if GDEF_DEBUG + globalOutputStream() << "Received error msg .. shutting down..\n"; #endif - GetWatchBSP()->EndMonitoringLoop(); - // tell there has been an error + GetWatchBSP()->EndMonitoringLoop(); + // tell there has been an error #if 0 - if (GetWatchBSP()->HasBSPPlugin()) - g_BSPFrontendTable.m_pfnEndListen(2); + if ( GetWatchBSP()->HasBSPPlugin() ) { + g_BSPFrontendTable.m_pfnEndListen( 2 ); + } #endif - return; - } + return; + } } -class MessageOutputStream : public TextOutputStream -{ - message_info_t* m_data; +class MessageOutputStream : public TextOutputStream { + message_info_t *m_data; public: - MessageOutputStream(message_info_t* data) : m_data(data) - { - } - std::size_t write(const char* buffer, std::size_t length) - { - if(m_data->pGeometry != 0) + MessageOutputStream(message_info_t *data) : m_data(data) { - m_data->pGeometry->saxCharacters(m_data, reinterpret_cast(buffer), int(length)); } - else + + std::size_t write(const char *buffer, std::size_t length) { - if (m_data->ignore_depth == 0) - { - // output the message using the level - message_print(m_data, buffer, length); - // if this message has error level flag, we mark the depth to stop the compilation when we get out - // we don't set the msg level if we don't stop on leak - if (m_data->msg_level == 3) - { - m_data->stop_depth = m_data->recurse-1; + if (m_data->pGeometry != 0) { + m_data->pGeometry->saxCharacters(m_data, reinterpret_cast( buffer ), int(length)); + } else { + if (m_data->ignore_depth == 0) { + // output the message using the level + message_print(m_data, buffer, length); + // if this message has error level flag, we mark the depth to stop the compilation when we get out + // we don't set the msg level if we don't stop on leak + if (m_data->msg_level == 3) { + m_data->stop_depth = m_data->recurse - 1; + } + } } - } - } - return length; - } + return length; + } }; template -inline MessageOutputStream& operator<<(MessageOutputStream& ostream, const T& t) +inline MessageOutputStream &operator<<(MessageOutputStream &ostream, const T &t) { - return ostream_write(ostream, t); + return ostream_write(ostream, t); } static void saxCharacters(message_info_t *data, const xmlChar *ch, int len) { - MessageOutputStream ostream(data); - ostream << StringRange(reinterpret_cast(ch), reinterpret_cast(ch + len)); + MessageOutputStream ostream(data); + ostream << StringRange(reinterpret_cast( ch ), reinterpret_cast( ch + len )); } static void saxComment(void *ctx, const xmlChar *msg) { - globalOutputStream() << "XML comment: " << reinterpret_cast(msg) << "\n"; + globalOutputStream() << "XML comment: " << reinterpret_cast( msg ) << "\n"; } static void saxWarning(void *ctx, const char *msg, ...) { - char saxMsgBuffer[4096]; - va_list args; - - va_start(args, msg); - vsprintf (saxMsgBuffer, msg, args); - va_end(args); - globalOutputStream() << "XML warning: " << saxMsgBuffer << "\n"; + char saxMsgBuffer[4096]; + va_list args; + + va_start(args, msg); + vsprintf(saxMsgBuffer, msg, args); + va_end(args); + globalOutputStream() << "XML warning: " << saxMsgBuffer << "\n"; } static void saxError(void *ctx, const char *msg, ...) { - char saxMsgBuffer[4096]; - va_list args; - - va_start(args, msg); - vsprintf (saxMsgBuffer, msg, args); - va_end(args); - globalErrorStream() << "XML error: " << saxMsgBuffer << "\n"; + char saxMsgBuffer[4096]; + va_list args; + + va_start(args, msg); + vsprintf(saxMsgBuffer, msg, args); + va_end(args); + globalErrorStream() << "XML error: " << saxMsgBuffer << "\n"; } static void saxFatal(void *ctx, const char *msg, ...) { - char buffer[4096]; - - va_list args; - - va_start(args, msg); - vsprintf (buffer, msg, args); - va_end(args); - globalErrorStream() << "XML fatal error: " << buffer << "\n"; + char buffer[4096]; + + va_list args; + + va_start(args, msg); + vsprintf(buffer, msg, args); + va_end(args); + globalErrorStream() << "XML fatal error: " << buffer << "\n"; } static xmlSAXHandler saxParser = { - 0, /* internalSubset */ - 0, /* isStandalone */ - 0, /* hasInternalSubset */ - 0, /* hasExternalSubset */ - 0, /* resolveEntity */ - 0, /* getEntity */ - 0, /* entityDecl */ - 0, /* notationDecl */ - 0, /* attributeDecl */ - 0, /* elementDecl */ - 0, /* unparsedEntityDecl */ - 0, /* setDocumentLocator */ - 0, /* startDocument */ - 0, /* endDocument */ - (startElementSAXFunc)saxStartElement, /* startElement */ - (endElementSAXFunc)saxEndElement, /* endElement */ - 0, /* reference */ - (charactersSAXFunc)saxCharacters, /* characters */ - 0, /* ignorableWhitespace */ - 0, /* processingInstruction */ - (commentSAXFunc)saxComment, /* comment */ - (warningSAXFunc)saxWarning, /* warning */ - (errorSAXFunc)saxError, /* error */ - (fatalErrorSAXFunc)saxFatal, /* fatalError */ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 + 0, /* internalSubset */ + 0, /* isStandalone */ + 0, /* hasInternalSubset */ + 0, /* hasExternalSubset */ + 0, /* resolveEntity */ + 0, /* getEntity */ + 0, /* entityDecl */ + 0, /* notationDecl */ + 0, /* attributeDecl */ + 0, /* elementDecl */ + 0, /* unparsedEntityDecl */ + 0, /* setDocumentLocator */ + 0, /* startDocument */ + 0, /* endDocument */ + (startElementSAXFunc) saxStartElement, /* startElement */ + (endElementSAXFunc) saxEndElement, /* endElement */ + 0, /* reference */ + (charactersSAXFunc) saxCharacters, /* characters */ + 0, /* ignorableWhitespace */ + 0, /* processingInstruction */ + (commentSAXFunc) saxComment, /* comment */ + (warningSAXFunc) saxWarning, /* warning */ + (errorSAXFunc) saxError, /* error */ + (fatalErrorSAXFunc) saxFatal, /* fatalError */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 }; // ------------------------------------------------------------------------------------------------ guint s_routine_id; + static gint watchbsp_routine(gpointer data) { - reinterpret_cast(data)->RoutineProcessing(); - return TRUE; + reinterpret_cast( data )->RoutineProcessing(); + return TRUE; } void CWatchBSP::Reset() { - if (m_pInSocket) - { - Net_Disconnect(m_pInSocket); - m_pInSocket = NULL; - } - if (m_pListenSocket) - { - Net_Disconnect(m_pListenSocket); - m_pListenSocket = NULL; - } - if (m_xmlInputBuffer) - { - xmlFreeParserInputBuffer (m_xmlInputBuffer); - m_xmlInputBuffer = NULL; - } - m_eState = EIdle; - if (s_routine_id) - gtk_timeout_remove(s_routine_id); + if (m_pInSocket) { + Net_Disconnect(m_pInSocket); + m_pInSocket = NULL; + } + if (m_pListenSocket) { + Net_Disconnect(m_pListenSocket); + m_pListenSocket = NULL; + } + if (m_xmlInputBuffer) { + xmlFreeParserInputBuffer(m_xmlInputBuffer); + m_xmlInputBuffer = NULL; + } + m_eState = EIdle; + if (s_routine_id) { + g_source_remove(s_routine_id); + } } bool CWatchBSP::SetupListening() { -#ifdef _DEBUG - if (m_pListenSocket) - { - globalOutputStream() << "ERROR: m_pListenSocket != NULL in CWatchBSP::SetupListening\n"; - return false; - } +#if GDEF_DEBUG + if (m_pListenSocket) { + globalOutputStream() << "ERROR: m_pListenSocket != NULL in CWatchBSP::SetupListening\n"; + return false; + } #endif - globalOutputStream() << "Setting up\n"; - Net_Setup(); - m_pListenSocket = Net_ListenSocket(39000); - if (m_pListenSocket == NULL) - return false; - globalOutputStream() << "Listening...\n"; - return true; + globalOutputStream() << "Setting up\n"; + Net_Setup(); + m_pListenSocket = Net_ListenSocket(39000); + if (m_pListenSocket == NULL) { + return false; + } + globalOutputStream() << "Listening...\n"; + return true; } void CWatchBSP::DoEBeginStep() { - Reset(); - if (SetupListening() == false) - { - const char* msg = "Failed to get a listening socket on port 39000.\nTry running with Build monitoring disabled if you can't fix this.\n"; - globalOutputStream() << msg; - gtk_MessageBox(GTK_WIDGET(MainFrame_getWindow()), msg, "Build monitoring", eMB_OK, eMB_ICONERROR); - return; - } - // set the timer for timeouts and step cancellation - g_timer_reset( m_pTimer ); - g_timer_start( m_pTimer ); - - if (!m_bBSPPlugin) - { - globalOutputStream() << "=== running build command ===\n" - << static_cast(g_ptr_array_index( m_pCmd, m_iCurrentStep )) << "\n"; - - if (!Q_Exec(NULL, (char *)g_ptr_array_index( m_pCmd, m_iCurrentStep ), NULL, true, false )) - { - StringOutputStream msg(256); - msg << "Failed to execute the following command: "; - msg << reinterpret_cast(g_ptr_array_index(m_pCmd, m_iCurrentStep)); - msg << "\nCheck that the file exists and that you don't run out of system resources.\n"; - globalOutputStream() << msg.c_str(); - gtk_MessageBox(GTK_WIDGET(MainFrame_getWindow()), msg.c_str(), "Build monitoring", eMB_OK, eMB_ICONERROR ); - return; + Reset(); + if (SetupListening() == false) { + const char *msg = "Failed to get a listening socket on port 39000.\nTry running with Build monitoring disabled if you can't fix this.\n"; + globalOutputStream() << msg; + ui::alert(MainFrame_getWindow(), msg, "Build monitoring", ui::alert_type::OK, ui::alert_icon::Error); + return; } - // re-initialise the debug window - if (m_iCurrentStep == 0) - g_DbgDlg.Init(); - } - m_eState = EBeginStep; - s_routine_id = gtk_timeout_add(25, watchbsp_routine, this); + // set the timer for timeouts and step cancellation + g_timer_reset(m_pTimer); + g_timer_start(m_pTimer); + + if (!m_bBSPPlugin) { + globalOutputStream() << "=== running build command ===\n" + << static_cast(g_ptr_array_index(m_pCmd, m_iCurrentStep) ) << "\n"; + + if (!Q_Exec(NULL, (char *) g_ptr_array_index(m_pCmd, m_iCurrentStep), NULL, true, false)) { + StringOutputStream msg(256); + msg << "Failed to execute the following command: "; + msg << reinterpret_cast(g_ptr_array_index(m_pCmd, m_iCurrentStep) ); + msg << "\nCheck that the file exists and that you don't run out of system resources.\n"; + globalOutputStream() << msg.c_str(); + ui::alert(MainFrame_getWindow(), msg.c_str(), "Build monitoring", ui::alert_type::OK, + ui::alert_icon::Error); + return; + } + // re-initialise the debug window + if (m_iCurrentStep == 0) { + g_DbgDlg.Init(); + } + } + m_eState = EBeginStep; + s_routine_id = g_timeout_add(25, watchbsp_routine, this); } -#if defined(WIN32) -#define ENGINE_ATTRIBUTE "engine_win32" -#define MP_ENGINE_ATTRIBUTE "mp_engine_win32" -#elif defined(__linux__) || defined (__FreeBSD__) -#define ENGINE_ATTRIBUTE "engine_linux" -#define MP_ENGINE_ATTRIBUTE "mp_engine_linux" -#elif defined(__APPLE__) -#define ENGINE_ATTRIBUTE "engine_macos" -#define MP_ENGINE_ATTRIBUTE "mp_engine_macos" +#if GDEF_OS_WINDOWS +const char *ENGINE_ATTRIBUTE = "engine_win32"; +const char *MP_ENGINE_ATTRIBUTE = "mp_engine_win32"; +#elif GDEF_OS_LINUX || GDEF_OS_BSD +const char *ENGINE_ATTRIBUTE = "engine_linux"; +const char *MP_ENGINE_ATTRIBUTE = "mp_engine_linux"; +#elif GDEF_OS_MACOS +const char *ENGINE_ATTRIBUTE = "engine_macos"; +const char *MP_ENGINE_ATTRIBUTE = "mp_engine_macos"; #else #error "unsupported platform" #endif -class RunEngineConfiguration -{ +class RunEngineConfiguration { public: - const char* executable; - const char* mp_executable; - bool do_sp_mp; - - RunEngineConfiguration() : - executable(g_pGameDescription->getRequiredKeyValue(ENGINE_ATTRIBUTE)), - mp_executable(g_pGameDescription->getKeyValue(MP_ENGINE_ATTRIBUTE)) - { - do_sp_mp = !string_empty(mp_executable); - } -}; + const char *executable; + const char *mp_executable; + bool do_sp_mp; -inline void GlobalGameDescription_string_write_mapparameter(StringOutputStream& string, const char* mapname) -{ - if(g_pGameDescription->mGameType == "q2" - || g_pGameDescription->mGameType == "heretic2") - { - string << ". +exec radiant.cfg +map " << mapname; - } - else - { - string << "+set sv_pure 0 "; - // TTimo: a check for vm_* but that's all fine - //cmdline = "+set sv_pure 0 +set vm_ui 0 +set vm_cgame 0 +set vm_game 0 "; - const char* fs_game = gamename_get(); - if (!string_equal(fs_game, basegame_get())) - { - string << "+set fs_game " << fs_game << " "; - } - if(g_pGameDescription->mGameType == "wolf" - || g_pGameDescription->mGameType == "et") + RunEngineConfiguration() : + executable(g_pGameDescription->getRequiredKeyValue(ENGINE_ATTRIBUTE)), + mp_executable(g_pGameDescription->getKeyValue(MP_ENGINE_ATTRIBUTE)) { - if (string_equal(gamemode_get(), "mp")) - { - // MP - string << "+devmap " << mapname; - } - else - { - // SP - string << "+set nextmap \"spdevmap " << mapname << "\""; - } + do_sp_mp = !string_empty(mp_executable); } - else - { - string << "+devmap " << mapname; +}; + +inline void GlobalGameDescription_string_write_mapparameter(StringOutputStream &string, const char *mapname) +{ + if (g_pGameDescription->mGameType == "q2" + || g_pGameDescription->mGameType == "heretic2") { + string << ". +exec radiant.cfg +map " << mapname; + } else { + string << "+set sv_pure 0 "; + // TTimo: a check for vm_* but that's all fine + //cmdline = "+set sv_pure 0 +set vm_ui 0 +set vm_cgame 0 +set vm_game 0 "; + const char *fs_game = gamename_get(); + if (!string_equal(fs_game, basegame_get())) { + string << "+set fs_game " << fs_game << " "; + } + if (g_pGameDescription->mGameType == "wolf") { + //|| g_pGameDescription->mGameType == "et") + if (string_equal(gamemode_get(), "mp")) { + // MP + string << "+devmap " << mapname; + } else { + // SP + string << "+set nextmap \"spdevmap " << mapname << "\""; + } + } else { + string << "+devmap " << mapname; + } } - } } void CWatchBSP::RoutineProcessing() { - switch (m_eState) - { - case EBeginStep: - // timeout: if we don't get an incoming connection fast enough, go back to idle - if ( g_timer_elapsed( m_pTimer, NULL ) > g_WatchBSP_Timeout ) - { - gtk_MessageBox(GTK_WIDGET(MainFrame_getWindow()), "The connection timed out, assuming the build process failed\nMake sure you are using a networked version of Q3Map?\nOtherwise you need to disable BSP Monitoring in prefs.", "BSP process monitoring", eMB_OK ); - EndMonitoringLoop(); + switch (m_eState) { + case EBeginStep: + // timeout: if we don't get an incoming connection fast enough, go back to idle + if (g_timer_elapsed(m_pTimer, NULL) > g_WatchBSP_Timeout) { + ui::alert(MainFrame_getWindow(), + "The connection timed out, assuming the build process failed\nMake sure you are using a networked version of Q3Map?\nOtherwise you need to disable BSP Monitoring in prefs.", + "BSP process monitoring", ui::alert_type::OK); + EndMonitoringLoop(); #if 0 - if (m_bBSPPlugin) - { - // status == 1 : didn't get the connection - g_BSPFrontendTable.m_pfnEndListen(1); - } + if ( m_bBSPPlugin ) { + // status == 1 : didn't get the connection + g_BSPFrontendTable.m_pfnEndListen( 1 ); + } #endif - return; - } -#ifdef _DEBUG - // some debug checks - if (!m_pListenSocket) - { - globalErrorStream() << "ERROR: m_pListenSocket == NULL in CWatchBSP::RoutineProcessing EBeginStep state\n"; - return; - } + return; + } +#if GDEF_DEBUG + // some debug checks + if (!m_pListenSocket) { + globalErrorStream() + << "ERROR: m_pListenSocket == NULL in CWatchBSP::RoutineProcessing EBeginStep state\n"; + return; + } #endif - // we are not connected yet, accept any incoming connection - m_pInSocket = Net_Accept(m_pListenSocket); - if (m_pInSocket) - { - globalOutputStream() << "Connected.\n"; - // prepare the message info struct for diving in - memset (&m_message_info, 0, sizeof(message_info_t)); - // a dumb flag to make sure we init the push parser context when first getting a msg - m_bNeedCtxtInit = true; - m_eState = EWatching; - } - break; - case EWatching: - { -#ifdef _DEBUG - // some debug checks - if (!m_pInSocket) - { - globalErrorStream() << "ERROR: m_pInSocket == NULL in CWatchBSP::RoutineProcessing EWatching state\n"; - return; - } + // we are not connected yet, accept any incoming connection + m_pInSocket = Net_Accept(m_pListenSocket); + if (m_pInSocket) { + globalOutputStream() << "Connected.\n"; + // prepare the message info struct for diving in + memset(&m_message_info, 0, sizeof(message_info_t)); + // a dumb flag to make sure we init the push parser context when first getting a msg + m_bNeedCtxtInit = true; + m_eState = EWatching; + } + break; + case EWatching: { +#if GDEF_DEBUG + // some debug checks + if (!m_pInSocket) { + globalErrorStream() << "ERROR: m_pInSocket == NULL in CWatchBSP::RoutineProcessing EWatching state\n"; + return; + } #endif - int ret = Net_Wait(m_pInSocket, 0, 0); - if (ret == -1) - { - globalOutputStream() << "WARNING: SOCKET_ERROR in CWatchBSP::RoutineProcessing\n"; - globalOutputStream() << "Terminating the connection.\n"; - EndMonitoringLoop(); - return; - } + int ret = Net_Wait(m_pInSocket, 0, 0); + if (ret == -1) { + globalOutputStream() << "WARNING: SOCKET_ERROR in CWatchBSP::RoutineProcessing\n"; + globalOutputStream() << "Terminating the connection.\n"; + EndMonitoringLoop(); + return; + } - if (ret == 1) - { - // the socket has been identified, there's something (message or disconnection) - // see if there's anything in input - ret = Net_Receive( m_pInSocket, &msg ); - if (ret > 0) - { - // unsigned int size = msg.size; //++timo just a check - strcpy (m_xmlBuf, NMSG_ReadString (&msg)); - if (m_bNeedCtxtInit) - { - m_xmlParserCtxt = NULL; - m_xmlParserCtxt = xmlCreatePushParserCtxt (&saxParser, &m_message_info, m_xmlBuf, static_cast(strlen(m_xmlBuf)), NULL); - - if (m_xmlParserCtxt == NULL) - { - globalErrorStream() << "Failed to create the XML parser (incoming stream began with: " << m_xmlBuf << ")\n"; - EndMonitoringLoop(); - } - m_bNeedCtxtInit = false; - } - else - { - xmlParseChunk(m_xmlParserCtxt, m_xmlBuf, static_cast(strlen(m_xmlBuf)), 0); - } - } - else - { - message_flush(&m_message_info); - // error or connection closed/reset - // NOTE: if we get an error down the XML stream we don't reach here - Net_Disconnect( m_pInSocket ); - m_pInSocket = NULL; - globalOutputStream() << "Connection closed.\n"; + if (ret == 1) { + // the socket has been identified, there's something (message or disconnection) + // see if there's anything in input + ret = Net_Receive(m_pInSocket, &msg); + if (ret > 0) { + // unsigned int size = msg.size; //++timo just a check + strcpy(m_xmlBuf, NMSG_ReadString(&msg)); + if (m_bNeedCtxtInit) { + m_xmlParserCtxt = NULL; + m_xmlParserCtxt = xmlCreatePushParserCtxt(&saxParser, &m_message_info, m_xmlBuf, + static_cast( strlen(m_xmlBuf)), NULL); + + if (m_xmlParserCtxt == NULL) { + globalErrorStream() << "Failed to create the XML parser (incoming stream began with: " + << m_xmlBuf << ")\n"; + EndMonitoringLoop(); + } + m_bNeedCtxtInit = false; + } else { + xmlParseChunk(m_xmlParserCtxt, m_xmlBuf, static_cast( strlen(m_xmlBuf)), 0); + } + } else { + message_flush(&m_message_info); + // error or connection closed/reset + // NOTE: if we get an error down the XML stream we don't reach here + Net_Disconnect(m_pInSocket); + m_pInSocket = NULL; + globalOutputStream() << "Connection closed.\n"; #if 0 - if (m_bBSPPlugin) - { - EndMonitoringLoop(); - // let the BSP plugin know that the job is done - g_BSPFrontendTable.m_pfnEndListen(0); - return; - } + if ( m_bBSPPlugin ) { + EndMonitoringLoop(); + // let the BSP plugin know that the job is done + g_BSPFrontendTable.m_pfnEndListen( 0 ); + return; + } #endif - // move to next step or finish - m_iCurrentStep++; - if (m_iCurrentStep < m_pCmd->len ) - { - DoEBeginStep(); - } - else - { - // launch the engine .. OMG - if (g_WatchBSP_RunQuake) - { + // move to next step or finish + m_iCurrentStep++; + if (m_iCurrentStep < m_pCmd->len) { + DoEBeginStep(); + } else { + // launch the engine .. OMG + if (g_WatchBSP_RunQuake) { #if 0 - // do we enter sleep mode before? - if (g_WatchBSP_DoSleep) - { - globalOutputStream() << "Going into sleep mode..\n"; - g_pParentWnd->OnSleep(); - } + // do we enter sleep mode before? + if ( g_WatchBSP_DoSleep ) { + globalOutputStream() << "Going into sleep mode..\n"; + g_pParentWnd->OnSleep(); + } #endif - globalOutputStream() << "Running engine...\n"; - StringOutputStream cmd(256); - // build the command line - cmd << EnginePath_get(); - // this is game dependant - - RunEngineConfiguration engineConfig; - - if(engineConfig.do_sp_mp) - { - if (string_equal(gamemode_get(), "mp")) - { - cmd << engineConfig.mp_executable; - } - else - { - cmd << engineConfig.executable; - } - } - else - { - cmd << engineConfig.executable; + globalOutputStream() << "Running engine...\n"; + StringOutputStream cmd(256); + // build the command line + cmd << EnginePath_get(); + // this is game dependant + + RunEngineConfiguration engineConfig; + + if (engineConfig.do_sp_mp) { + if (string_equal(gamemode_get(), "mp")) { + cmd << engineConfig.mp_executable; + } else { + cmd << engineConfig.executable; + } + } else { + cmd << engineConfig.executable; + } + + StringOutputStream cmdline; + + GlobalGameDescription_string_write_mapparameter(cmdline, m_sBSPName); + + globalOutputStream() << cmd.c_str() << " " << cmdline.c_str() << "\n"; + + // execute now + if (!Q_Exec(cmd.c_str(), (char *) cmdline.c_str(), EnginePath_get(), false, false)) { + StringOutputStream msg; + msg << "Failed to execute the following command: " << cmd.c_str() << cmdline.c_str(); + globalOutputStream() << msg.c_str(); + ui::alert(MainFrame_getWindow(), msg.c_str(), "Build monitoring", ui::alert_type::OK, + ui::alert_icon::Error); + } + } + EndMonitoringLoop(); + } + } } - - StringOutputStream cmdline; - - GlobalGameDescription_string_write_mapparameter(cmdline, m_sBSPName); - - globalOutputStream() << cmd.c_str() << " " << cmdline.c_str() << "\n"; - - // execute now - if (!Q_Exec(cmd.c_str(), (char *)cmdline.c_str(), EnginePath_get(), false, false)) - { - StringOutputStream msg; - msg << "Failed to execute the following command: " << cmd.c_str() << cmdline.c_str(); - globalOutputStream() << msg.c_str(); - gtk_MessageBox(GTK_WIDGET(MainFrame_getWindow()), msg.c_str(), "Build monitoring", eMB_OK, eMB_ICONERROR ); - } - } - EndMonitoringLoop(); } - } - } + break; + default: + break; } - break; - default: - break; - } } -GPtrArray* str_ptr_array_clone(GPtrArray* array) +GPtrArray *str_ptr_array_clone(GPtrArray *array) { - GPtrArray* cloned = g_ptr_array_sized_new(array->len); - for(guint i = 0; i < array->len; ++i) - { - g_ptr_array_add(cloned, g_strdup((char*)g_ptr_array_index(array, i))); - } - return cloned; + GPtrArray *cloned = g_ptr_array_sized_new(array->len); + for (guint i = 0; i < array->len; ++i) { + g_ptr_array_add(cloned, g_strdup((char *) g_ptr_array_index(array, i))); + } + return cloned; } -void CWatchBSP::DoMonitoringLoop( GPtrArray *pCmd, const char *sBSPName ) +void CWatchBSP::DoMonitoringLoop(GPtrArray *pCmd, const char *sBSPName) { - m_sBSPName = string_clone(sBSPName); - if (m_eState != EIdle) - { - globalOutputStream() << "WatchBSP got a monitoring request while not idling...\n"; - // prompt the user, should we cancel the current process and go ahead? - if (gtk_MessageBox(GTK_WIDGET(MainFrame_getWindow()), "I am already monitoring a Build process.\nDo you want me to override and start a new compilation?", - "Build process monitoring", eMB_YESNO ) == eIDYES) - { - // disconnect and set EIdle state - Reset(); + m_sBSPName = string_clone(sBSPName); + if (m_eState != EIdle) { + globalOutputStream() << "WatchBSP got a monitoring request while not idling...\n"; + // prompt the user, should we cancel the current process and go ahead? + if (ui::alert(MainFrame_getWindow(), + "I am already monitoring a Build process.\nDo you want me to override and start a new compilation?", + "Build process monitoring", ui::alert_type::YESNO) == ui::alert_response::YES) { + // disconnect and set EIdle state + Reset(); + } } - } - m_pCmd = str_ptr_array_clone(pCmd); - m_iCurrentStep = 0; - DoEBeginStep(); + m_pCmd = str_ptr_array_clone(pCmd); + m_iCurrentStep = 0; + DoEBeginStep(); } void CWatchBSP::ExternalListen() { - m_bBSPPlugin = true; - DoEBeginStep(); + m_bBSPPlugin = true; + DoEBeginStep(); } // the part of the watchbsp interface we export to plugins @@ -874,6 +814,6 @@ void CWatchBSP::ExternalListen() // for now we provide something really basic and limited, the essential is to have something that works fine and fast (for 1.1 final) void QERApp_Listen() { - // open the listening socket - GetWatchBSP()->ExternalListen(); + // open the listening socket + GetWatchBSP()->ExternalListen(); }