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