OnLine -> OnRawData
[anytun.git] / buffer.cpp
blobf0d7940de85fd93afc2c7b12f9f9cd0458b22a0b
1 /*
2 * anytun
4 * The secure anycast tunneling protocol (satp) defines a protocol used
5 * for communication between any combination of unicast and anycast
6 * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel
7 * mode and allows tunneling of every ETHER TYPE protocol (e.g.
8 * ethernet, ip, arp ...). satp directly includes cryptography and
9 * message authentication based on the methodes used by SRTP. It is
10 * intended to deliver a generic, scaleable and secure solution for
11 * tunneling and relaying of packets of any protocol.
14 * Copyright (C) 2007 anytun.org <satp@wirdorange.org>
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2
18 * as published by the Free Software Foundation.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program (see the file COPYING included with this
27 * distribution); if not, write to the Free Software Foundation, Inc.,
28 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include <stdexcept>
32 #include <string>
33 #include <cstdio>
34 #include <iostream>
35 #include <boost/archive/text_oarchive.hpp>
36 #include <boost/archive/text_iarchive.hpp>
37 #include "datatypes.h"
38 #include "buffer.h"
40 Buffer::Buffer() : buf_(0), length_(0)
44 Buffer::Buffer(u_int32_t length) : length_(length)
46 buf_ = new u_int8_t[length_];
47 if(buf_)
48 std::memset(buf_, 0, length_);
49 else
50 length_ = 0;
53 Buffer::Buffer(u_int8_t* data, u_int32_t length) : length_(length)
55 buf_ = new u_int8_t[length_];
56 if(buf_)
57 std::memcpy(buf_, data, length_);
58 else
59 length_ = 0;
62 Buffer::~Buffer()
64 if(buf_)
65 delete[] buf_;
68 Buffer::Buffer(const Buffer &src) : length_(src.length_)
70 buf_ = new u_int8_t[length_];
71 if(buf_)
72 std::memcpy(buf_, src.buf_, length_);
73 else
74 length_ = 0;
77 void Buffer::operator=(const Buffer &src)
79 if(buf_)
80 delete[] buf_;
82 length_ = src.length_;
84 buf_ = new u_int8_t[length_];
85 if(buf_)
86 std::memcpy(buf_, src.buf_, length_);
87 else
88 length_ = 0;
93 bool Buffer::operator==(const Buffer &cmp) const
95 if(length_ != cmp.length_)
96 return false;
98 if(!std::memcmp(buf_, cmp.buf_, length_))
99 return true;
101 return false;
105 u_int32_t Buffer::resizeFront(u_int32_t new_length)
107 if(length_ == new_length)
108 return length_;
110 u_int8_t *tmp = new u_int8_t[new_length];
111 if(!tmp)
112 return length_;
114 if(buf_)
116 u_int8_t *src=buf_, *dest=tmp;
117 if(length_ < new_length)
118 dest = &dest[new_length - length_];
119 else
120 src = &src[length_ - new_length];
121 u_int32_t len = length_ < new_length ? length_ : new_length;
122 std::memcpy(dest, src, len);
123 delete[] buf_;
126 length_ = new_length;
127 buf_ = tmp;
128 return length_;
131 u_int32_t Buffer::resizeBack(u_int32_t new_length)
133 if(length_ == new_length)
134 return length_;
136 u_int8_t *tmp = new u_int8_t[new_length];
137 if(!tmp)
138 return length_;
140 if(buf_)
142 u_int32_t len = length_ < new_length ? length_ : new_length;
143 std::memcpy(tmp, buf_, len);
144 delete[] buf_;
147 length_ = new_length;
148 buf_ = tmp;
149 return length_;
152 u_int32_t Buffer::getLength() const
154 return length_;
157 u_int8_t* Buffer::getBuf()
159 return buf_;
162 u_int8_t& Buffer::operator[](u_int32_t index)
164 if(index >= length_)
165 throw std::out_of_range("buffer::operator[]");
167 return buf_[index];
170 u_int8_t Buffer::operator[](u_int32_t index) const
172 if(index >= length_)
173 throw std::out_of_range("buffer::operator[] const");
175 return buf_[index];
178 Buffer::operator u_int8_t*() // just for write/read tun
180 return buf_;
183 std::string Buffer::getHexDump() const
185 char text[10];
186 std::string ret = "";
188 for( u_int32_t index = 0; index < length_; index++ )
190 std::sprintf(text, "%#4x", buf_[index]);
191 ret += text;
192 ret += "";
193 if( ((index+1) % 10) == 0 )
194 ret += '\n';
196 return ret;
199 Buffer Buffer::operator^(const Buffer &xor_by) const
201 Buffer res(length_);
202 if( xor_by.getLength() > length_ )
203 throw std::out_of_range("buffer::operator^ const");
205 for( u_int32_t index = 0; index < xor_by.getLength(); index++ )
206 res[index] = buf_[index] ^ xor_by[index];
208 return res;
211 Buffer Buffer::leftByteShift(u_int32_t width) const
213 Buffer res(length_+width);
215 for( u_int32_t index = 0; index < length_; index++ )
216 res[index+width] = buf_[index];
218 return res;
221 Buffer Buffer::rightByteShift(u_int32_t width) const
223 Buffer res(length_);
225 for( u_int32_t index = 0; index < length_-width; index++ )
226 res[index] = buf_[index+width];
228 return res;