Datagram.cpp
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         //printf("Resized to %d\n",len);
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         //printf("blength = %d -> qel = %d\n",_blength,qextralen);
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         //printf("\nRaw: ");
00218         //write(fp);
00219         printf("\n");
00220 }
00221 
00222 


canon_vbc50i
Author(s): Cedric Pradalier
autogenerated on Mon Jan 6 2014 11:18:27