Go to the documentation of this file.00001 #include <assert.h>
00002
00003 #include <stdlib.h>
00004 #include <string.h>
00005
00006 #include "canon_vbc50i/libCanon/Datagram.h"
00007
00008 RawDatagram::RawDatagram()
00009 {
00010 _blength = 16;
00011 _data = (unsigned char *)malloc(16);
00012 assert(_data != NULL);
00013 reset();
00014 }
00015
00016 RawDatagram::RawDatagram(const RawDatagram & dgm)
00017 {
00018 _blength = dgm._blength;
00019 _data = (unsigned char *)malloc(_blength);
00020 assert(_data != NULL);
00021 memcpy(_data,dgm._data,_blength);
00022 }
00023
00024 const RawDatagram & RawDatagram::operator=(const RawDatagram & dgm)
00025 {
00026 _blength = dgm._blength;
00027 _data = (unsigned char *)realloc(_data,_blength);
00028 assert(_data != NULL);
00029 memcpy(_data,dgm._data,_blength);
00030 return *this;
00031 }
00032
00033
00034 RawDatagram::~RawDatagram()
00035 {
00036 free(_data);
00037 }
00038
00039 void RawDatagram::reset()
00040 {
00041 memset(_data,0,_blength);
00042 }
00043
00044 void RawDatagram::resize(unsigned int len)
00045 {
00046 if (len < 16) len = 16;
00047 if ((len % 4) != 0) len += 4 - (len % 4);
00048 _blength = len;
00049
00050 _data = (unsigned char *)realloc(_data,_blength);
00051 assert(_data != NULL);
00052 }
00053
00054 bool RawDatagram::read(FILE * fp)
00055 {
00056 unsigned int i,len;
00057 unsigned int x0,x1;
00058 if (fp == NULL) return false;
00059 if (fscanf(fp," %X %X ",&x0,&x1) != 2)
00060 return false;
00061 _data[0] = x0; _data[1] = x1;
00062 len = _data[0];
00063 len = (len << 8) | _data[1];
00064 resize(16 + 4*len);
00065 for (i=2;i<16+4*len;i++) {
00066 if (fscanf(fp," %X ",&x0) != 1)
00067 return false;
00068 _data[i] = x0;
00069 }
00070 return true;
00071 }
00072
00073 bool RawDatagram::read(const std::vector<unsigned char> & s)
00074 {
00075 std::vector<unsigned char> c = s;
00076 unsigned int i,len;
00077 unsigned int x0,x1;
00078 if (c.size() < 16) {
00079 while (c.size() < 16) c.push_back(0);
00080 }
00081 x0 = c[0]; x1 = c[1];
00082 _data[0] = x0; _data[1] = x1;
00083 len = _data[0];
00084 len = (len << 8) | _data[1];
00085 resize(16 + 4*len);
00086 for (i=2;i<16+4*len;i++) {
00087 if (i >= c.size()) break;
00088 _data[i] = c[i];
00089 }
00090 return true;
00091 }
00092
00093 bool RawDatagram::read(const unsigned char * s, unsigned int slen)
00094 {
00095 unsigned int i,len;
00096 unsigned int x0,x1;
00097 if (slen < 16) return false;
00098
00099 x0 = s[0]; x1 = s[1];
00100 _data[0] = x0; _data[1] = x1;
00101 len = _data[0];
00102 len = (len << 8) | _data[1];
00103 resize(16 + 4*len);
00104 for (i=2;i<16+4*len;i++) {
00105 if (i >= slen) break;
00106 _data[i] = s[i];
00107 }
00108 return true;
00109 }
00110
00111 bool RawDatagram::write(FILE * fp) const
00112 {
00113 unsigned int i,len;
00114 if (fp == NULL) return false;
00115 len = _data[0];
00116 len = (len << 8) | _data[1];
00117 for (i=0;i<16+4*len;i++) {
00118 fprintf(fp,"%02X ",_data[i]);
00119 }
00120 return true;
00121 }
00122
00123 bool RawDatagram::receive(Socket * sock, unsigned int timeout, bool verbose)
00124 {
00125 unsigned int len;
00126 if (sock == NULL) return false;
00127 if (!sock->WaitBuffer(_data,2,timeout)) {
00128 if (verbose) printf("Can't receive length\n");
00129 return false;
00130 }
00131 len = _data[0];
00132 len = (len << 8) | _data[1];
00133 if (len > 1000) {
00134 if (verbose) printf("Inconsistent message body length\n");
00135 return false;
00136 }
00137 resize(16 + 4*len);
00138 if (!sock->WaitBuffer(_data+2,14+4*len,100)) {
00139 if (verbose) printf("Can't receive message body\n");
00140 return false;
00141 }
00142 return true;
00143 }
00144
00145 bool RawDatagram::send(Socket * sock)
00146 {
00147 unsigned int len;
00148 if (sock == NULL) return false;
00149 len = _data[0];
00150 len = (len << 8) | _data[1];
00151 return sock->SendAll(_data,16+4*len,100);
00152 }
00153
00154 void Datagram::setId(unsigned char id)
00155 {
00156 _data[5] = id;
00157 }
00158
00159 void Datagram::setStatus(unsigned char s1, unsigned char s2)
00160 {
00161 _data[6] = s1;
00162 _data[7] = s2;
00163 }
00164
00165 void Datagram::setStatus(unsigned short s)
00166 {
00167 _data[6] = s >> 8;
00168 _data[7] = s & 0xFF;
00169 }
00170
00171 unsigned char Datagram::getId() const
00172 {
00173 return _data[5];
00174 }
00175
00176 unsigned short Datagram::getStatus() const
00177 {
00178 return (((unsigned short)_data[6])<<8) | _data[7];
00179 }
00180
00181 void Datagram::setData(unsigned char c, unsigned int pos)
00182 {
00183 if ((pos + 8) >= _blength) {
00184 resize(pos+8);
00185 }
00186 _data[pos+8] = c;
00187 }
00188
00189 void Datagram::setData(unsigned char * bd, unsigned int nb)
00190 {
00191 resize(nb+8);
00192 memcpy(_data+8,bd,nb);
00193 unsigned int qlen = _blength/4;
00194 unsigned int qextralen = qlen - 4;
00195
00196 _data[0] = qextralen >> 8;
00197 _data[1] = qextralen & 0xFF;
00198 }
00199
00200 unsigned int Datagram::getBLength() const
00201 {
00202 return _blength - 8;
00203 }
00204
00205 const unsigned char * Datagram::bdata() const
00206 {
00207 return _data + 8;
00208 }
00209
00210 void Datagram::print(FILE * fp) const
00211 {
00212 unsigned int i;
00213 printf("Id %02X Status %04X Data: ",getId(),getStatus());
00214 for (i=0;i<getBLength();i++) {
00215 printf("%02X ",bdata()[i]);
00216 }
00217
00218
00219 printf("\n");
00220 }
00221
00222