1#
2# Licensed to the Apache Software Foundation (ASF) under one
3# or more contributor license agreements. See the NOTICE file
4# distributed with this work for additional information
5# regarding copyright ownership. The ASF licenses this file
6# to you under the Apache License, Version 2.0 (the
7# "License"); you may not use this file except in compliance
8# with the License. You may obtain a copy of the License at
9#
10#   http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing,
13# software distributed under the License is distributed on an
14# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15# KIND, either express or implied. See the License for the
16# specific language governing permissions and limitations
17# under the License.
18#
19
20require 5.6.0;
21use strict;
22use warnings;
23
24use Net::GenThrift::Thrift;
25use Net::GenThrift::Thrift::Transport;
26
27package Net::GenThrift::Thrift::MemoryBuffer;
28use base('Net::GenThrift::Thrift::Transport');
29
30sub new
31{
32    my $classname = shift;
33
34    my $bufferSize= shift || 1024;
35
36    my $self = {
37        buffer    => '',
38        bufferSize=> $bufferSize,
39        wPos      => 0,
40        rPos      => 0,
41    };
42
43    return bless($self,$classname);
44}
45
46sub isOpen
47{
48    return 1;
49}
50
51sub open
52{
53
54}
55
56sub close
57{
58
59}
60
61sub peek
62{
63    my $self = shift;
64    return($self->{rPos} < $self->{wPos});
65}
66
67
68sub getBuffer
69{
70    my $self = shift;
71    return $self->{buffer};
72}
73
74sub resetBuffer
75{
76    my $self = shift;
77
78    my $new_buffer  = shift || '';
79
80    $self->{buffer}     = $new_buffer;
81    $self->{bufferSize} = length($new_buffer);
82    $self->{wPos}       = length($new_buffer);
83    $self->{rPos}       = 0;
84}
85
86sub available
87{
88    my $self = shift;
89    return ($self->{wPos} - $self->{rPos});
90}
91
92sub read
93{
94    my $self = shift;
95    my $len  = shift;
96    my $ret;
97
98    my $avail = ($self->{wPos} - $self->{rPos});
99    return '' if $avail == 0;
100
101    #how much to give
102    my $give = $len;
103    $give = $avail if $avail < $len;
104
105    $ret = substr($self->{buffer},$self->{rPos},$give);
106
107    $self->{rPos} += $give;
108
109    return $ret;
110}
111
112sub readAll
113{
114    my $self = shift;
115    my $len  = shift;
116
117    my $avail = ($self->{wPos} - $self->{rPos});
118    if ($avail < $len) {
119        die new TTransportException("Attempt to readAll($len) found only $avail available");
120    }
121
122    my $data = '';
123    my $got = 0;
124
125    while (($got = length($data)) < $len) {
126        $data .= $self->read($len - $got);
127    }
128
129    return $data;
130}
131
132sub write
133{
134    my $self = shift;
135    my $buf  = shift;
136
137    $self->{buffer} .= $buf;
138    $self->{wPos}   += length($buf);
139}
140
141sub flush
142{
143
144}
145
1461;
147