]> git.tdb.fi Git - gldbg.git/blobdiff - source/tracer.cpp
Properly handle reception of multiple packets at once
[gldbg.git] / source / tracer.cpp
index 7ce00fea376d5052bb7f2d02bc34cf94bbf9f752..9f703f1e673cd7a78d90dbebc084b3bbb9c4b435 100644 (file)
@@ -1,61 +1,93 @@
 /* $Id$
 
 This file is part of gldbg
-Copyright © 2009  Mikko Rasa, Mikkosoft Productions
+Copyright © 2009-2010  Mikko Rasa, Mikkosoft Productions
 Distributed under the GPL
 */
 
+#include <msp/io/file.h>
 #include <msp/io/print.h>
+#include "gldbg.h"
 #include "glprint.h"
 #include "tracer.h"
 
+using namespace std;
 using namespace Msp;
 
-Tracer::Tracer():
+Tracer::Tracer(GlDbg &dbg):
        glprint(new GlPrint(0, 16384)),
        out(0),
        delete_out(true),
        enabled(true)
-{ }
+{
+       dbg.get_command_interpreter().register_command("trace", this, &Tracer::cmd_trace)
+               .set_help("Traces GL function calls",
+                       "trace\n"
+                       "  Send trace output to stdout.\n\n"
+                       "trace FILE\n"
+                       "  Send trace output to FILE (- for stdout).\n\n"
+                       "trace {off|on}\n"
+                       "  Temporarily suspend or resume trace without closing the file.\n\n"
+                       "trace end\n"
+                       "  Terminate trace, closing the file.\n");
+}
 
 Tracer::~Tracer()
 {
+       delete glprint;
        if(delete_out)
                delete out;
 }
 
-void Tracer::set_output(IO::Base *o)
+void Tracer::set_output(IO::Base *o, bool d)
 {
        if(delete_out)
                delete out;
        out = o;
-       delete_out = true;
+       delete_out = d;
 }
 
-void Tracer::set_output(IO::Base &o)
+void Tracer::decode(const char *data, unsigned len)
 {
-       set_output(&o);
-       delete_out = false;
-}
-
-void Tracer::enable()
-{
-       if(!out)
-               throw InvalidState("Output is not set");
-       enabled = true;
-}
+       if(!enabled || !out)
+               return;
 
-void Tracer::disable()
-{
-       enabled = false;
+       int ret = glprint->decode(data, len);
+       if(ret>=0)
+       {
+               const char *buf = glprint->get_buffer();
+               if(buf[0])
+                       IO::print(*out, "%s\n", buf);
+       }
 }
 
-int Tracer::decode(const char *data, unsigned len)
+void Tracer::cmd_trace(const string &args)
 {
-       if(!enabled || !out)
-               return 0;
-       int ret = glprint->decode(data, len);
-       if(ret>=0)
-               IO::print(*out, "%s\n", glprint->get_buffer());
-       return ret;
+       if(args.empty() || args=="-")
+       {
+               set_output(&IO::cout, false);
+               IO::print("Tracing to stdout\n");
+       }
+       else if(args=="on")
+       {
+               if(!out)
+                       throw InvalidState("Output is not set");
+               enabled = true;
+               IO::print("Tracing enabled\n");
+       }
+       else if(args=="off")
+       {
+               enabled = false;
+               IO::print("Tracing disabled\n");
+       }
+       else if(args=="end")
+       {
+               set_output(0, true);
+               IO::print("Tracing terminated\n");
+       }
+       else
+       {
+               set_output(new IO::File(args, IO::M_WRITE), true);
+               IO::print("Tracing to %s\n", args);
+       }
 }