]> git.tdb.fi Git - gldbg.git/blob - source/gldecoder.c
Use a centralized packet framework
[gldbg.git] / source / gldecoder.c
1 /* $Id$
2
3 This file is part of gldbg
4 Copyright © 2009-2010  Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
6 */
7
8 #include <stdlib.h>
9 #include <string.h>
10 #include "functions.h"
11 #include "gldecoder.h"
12 #include "packet.h"
13
14 static int decode_func(GlDecoder *, unsigned short, GlPacket *);
15 static int decode_gldfunc(GlDecoder *, unsigned short, GlPacket *);
16
17 GlDecoder *gldecoder_new(void *user_data, void (*destroy)(void *))
18 {
19         GlDecoder *dec;
20
21         dec = (GlDecoder *)malloc(sizeof(GlDecoder));
22         memset(dec, 0, sizeof(GlDecoder));
23         dec->user_data = user_data;
24         dec->destroy = destroy;
25
26         return dec;
27 }
28
29 void gldecoder_delete(GlDecoder *dec)
30 {
31         if(dec->destroy)
32                 dec->destroy(dec->user_data);
33         free(dec);
34 }
35
36 int gldecoder_decode(GlDecoder *dec, const char *data, unsigned len)
37 {
38         GlPacket *pkt;
39         unsigned short func;
40
41         pkt = packet_receive_str(data, &len);
42         if(!pkt)
43                 return -1;
44
45         packet_read_short(pkt, (short *)&func);
46
47         if(dec)
48         {
49                 int ret = 0;
50
51                 if(func&0x8000)
52                         ret = decode_gldfunc(dec, func, pkt);
53                 else
54                         ret = decode_func(dec, func, pkt);
55                 if(ret<0)
56                         return -1;
57         }
58
59         return len;
60 }
61
62 #include "gensrc/gldecoder.funcs"
63
64 static void decode_gldError(GlDecoder *dec, GlPacket *pkt)
65 {
66         GLenum code;
67         packet_read_int(pkt, (int *)&code);
68         if(dec->gldError)
69                 dec->gldError(dec->user_data, code);
70 }
71
72 static int decode_gldfunc(GlDecoder *dec, unsigned short func, GlPacket *pkt)
73 {
74         switch(func)
75         {
76         case FUNC_GLDERROR: decode_gldError(dec, pkt); break;
77         default: return -1;
78         }
79         return 0;
80 }