1 MODULE = Thrift::XS   PACKAGE = Thrift::XS::MemoryBuffer
2 
3 SV *
new(char * klass,...)4 new(char *klass, ...)
5 CODE:
6 {
7   int bufsize = 8192;
8   TMemoryBuffer *mbuf;
9   New(0, mbuf, sizeof(TMemoryBuffer), TMemoryBuffer);
10   New(0, mbuf->buffer, sizeof(Buffer), Buffer);
11 
12   MEM_TRACE("new()\n");
13   MEM_TRACE("  New mbuf @ %p\n", mbuf);
14   MEM_TRACE("  New buffer @ %p\n", mbuf->buffer);
15 
16   if (items > 1 && SvIOK_UV(ST(1)))
17     bufsize = SvIV(ST(1));
18 
19   buffer_init(mbuf->buffer, bufsize);
20 
21   RETVAL = xs_object_magic_create(
22     aTHX_
23     (void *)mbuf,
24     gv_stashpv(klass, 0)
25   );
26 }
27 OUTPUT:
28   RETVAL
29 
30 int
isOpen(SV *)31 isOpen(SV *)
32 CODE:
33 {
34   RETVAL = 1;
35 }
36 OUTPUT:
37   RETVAL
38 
39 void
open(SV *)40 open(SV *)
41 CODE:
42 { }
43 
44 void
close(SV *)45 close(SV *)
46 CODE:
47 { }
48 
49 void
flush(SV *)50 flush(SV *)
51 CODE:
52 { }
53 
54 int
available(TMemoryBuffer * mbuf)55 available(TMemoryBuffer *mbuf)
56 CODE:
57 {
58   RETVAL = buffer_len(mbuf->buffer);
59 }
60 OUTPUT:
61   RETVAL
62 
63 SV *
read(TMemoryBuffer * mbuf,int len)64 read(TMemoryBuffer *mbuf, int len)
65 CODE:
66 {
67   int avail = buffer_len(mbuf->buffer);
68 
69   if (avail == 0) {
70     RETVAL = newSVpvn("", 0);
71   }
72   else {
73     if (avail < len)
74       len = avail;
75 
76     DEBUG_TRACE("read(%d)\n", len);
77     RETVAL = newSVpvn( buffer_ptr(mbuf->buffer), len );
78     buffer_consume(mbuf->buffer, len);
79   }
80 }
81 OUTPUT:
82   RETVAL
83 
84 SV *
readAll(TMemoryBuffer * mbuf,int len)85 readAll(TMemoryBuffer *mbuf, int len)
86 CODE:
87 {
88   int avail = buffer_len(mbuf->buffer);
89 
90   if (avail < len) {
91     THROW_SV("TTransportException", newSVpvf("Attempt to readAll(%d) found only %d available", len, avail));
92   }
93 
94   DEBUG_TRACE("readAll(%d)\n", len);
95 #ifdef XS_DEBUG
96   //buffer_dump(mbuf->buffer, len);
97 #endif
98 
99   RETVAL = newSVpvn( buffer_ptr(mbuf->buffer), len );
100   buffer_consume(mbuf->buffer, len);
101 }
102 OUTPUT:
103   RETVAL
104 
105 void
write(TMemoryBuffer * mbuf,SV * buf,...)106 write(TMemoryBuffer *mbuf, SV *buf, ...)
107 CODE:
108 {
109   int len;
110 
111   if (items > 2)
112     len = SvIV(ST(2));
113   else
114     len = sv_len(buf);
115 
116   buffer_append(mbuf->buffer, (void *)SvPVX(buf), len);
117 
118   DEBUG_TRACE("write(%d)\n", len);
119 #ifdef XS_DEBUG
120   //buffer_dump(mbuf->buffer, 0);
121 #endif
122 }
123 
124 void
DESTROY(TMemoryBuffer * mbuf)125 DESTROY(TMemoryBuffer *mbuf)
126 CODE:
127 {
128   MEM_TRACE("DESTROY()\n");
129   MEM_TRACE("  free buffer @ %p\n", mbuf->buffer);
130   MEM_TRACE("  free mbuf @ %p\n", mbuf);
131 
132   buffer_free(mbuf->buffer);
133   Safefree(mbuf->buffer);
134   Safefree(mbuf);
135 }
136