source: Sophya/trunk/AddOn/TAcq/burawstream.cc@ 3960

Last change on this file since 3960 was 3639, checked in by cmv, 16 years ago

ajout des #include C pour compil sur dernieres versions gcc/g++, cmv 27/05/2009

File size: 4.5 KB
RevLine 
[3639]1#include <stdlib.h>
2#include <string.h>
3
[3542]4#include "burawstream.h"
5#include "sopnamsp.h"
6#include "pexceptions.h"
7
8/*!
9 \class SOPHYA::RawInOutBuffStream
10 \ingroup SysTools
11 This class implements the interface defined by RawInOutStream
12 over a socket (read and write operations)
13*/
14
15#define SWRB_SIZE 1024 /* Taille des buffers I/O */
16
17/* --Methode-- */
18RawInOutBuffStream::RawInOutBuffStream(const char * nom)
19 : RawInOutStream()
20{
21 _fip = fopen(nom, "w+b");
22 _rdbuff.buff = new char[SWRB_SIZE];
23 _rdbuff.sz = SWRB_SIZE;
24 _rdbuff.cpos = SWRB_SIZE;
25
26 _wrbuff.buff = new char[SWRB_SIZE];
27 _wrbuff.sz = SWRB_SIZE;
28 _wrbuff.cpos = 0;
29 _totnwr = 0;
30 _totnrd = 0;
31}
32
33/* --Methode-- */
34RawInOutBuffStream::~RawInOutBuffStream()
35{
36 cout << " ---- DESTRUCTEUR ---- ~RawInOutBuffStream() " << endl;
37 if (_wrbuff.cpos > 0) {
38 for (size_t k= _wrbuff.cpos; k<_wrbuff.sz; k++)
39 _wrbuff.buff[k] = '\0';
40 _wrbuff.cpos = _wrbuff.sz;
41 SendBuffer();
42 }
43 fclose(_fip);
44 delete [] _rdbuff.buff;
45 delete [] _wrbuff.buff;
46}
47
48/* --Methode-- */
49size_t RawInOutBuffStream::CopyToSendBuffer(const char* s, size_t n)
50{
51
52 size_t len = _wrbuff.sz-_wrbuff.cpos;
53 if (len > n) len = n;
54 if ( (_wrbuff.cpos == 0) && (len == _wrbuff.sz) ) {
55 cout << "RawInOutBuffStream::CopyToSend/DBG-1 - n="
56 << n << " len=" << len << endl;
57 Send(s, len);
58 }
59 else {
60 cout << "RawInOutBuffStream::CopyToSend/DBG-2 - n="
61 << n << " len=" << len << " cpos=" << _wrbuff.cpos << endl;
62 memcpy(_wrbuff.buff+_wrbuff.cpos, s, len);
63 cout << " memcpy OK - cpos= " << _wrbuff.cpos << endl;
64 _wrbuff.cpos += len;
65 if (_wrbuff.cpos == _wrbuff.sz) SendBuffer();
66 }
67 return len;
68}
69
70/* --Methode-- */
71size_t RawInOutBuffStream::CopyFromRecvBuffer(char* s, size_t n)
72{
73 if ( (_rdbuff.cpos == _rdbuff.sz) && ( n >= _rdbuff.sz)) {
74 size_t len = _rdbuff.sz;
75 cout << "RawInOutBuffStream::CopyFromRecv/DBG-1 - n=" << n
76 << " len=" << len << endl;
77 Receive(s, len);
78 return len;
79 }
80 else {
81 cout << "RawInOutBuffStream::CopyFromRecv/DBG-2 - n=" << n << endl;
82 if (_rdbuff.cpos == _rdbuff.sz) ReceiveBuffer();
83 size_t len = _rdbuff.sz-_rdbuff.cpos;
84 if (len > n) len = n;
85 memcpy(s, _rdbuff.buff+_rdbuff.cpos, len);
86 _rdbuff.cpos += len;
87 return len;
88 }
89}
90
91/* --Methode-- */
92void RawInOutBuffStream::SendBuffer()
93{
94 cout << "RawInOutBuffStream::SendBuffer/DBG - cpos="
95 << _wrbuff.cpos << " sz=" << _wrbuff.sz << endl;
96 // if (_wrbuff.cpos != _wrbuff.sz) return;
97 Send(_wrbuff.buff, _wrbuff.sz);
98 _wrbuff.cpos = 0;
99}
100
101/* --Methode-- */
102void RawInOutBuffStream::ReceiveBuffer()
103{
104 // if (_rdbuff.cpos != _rdbuff.sz) return;
105 cout << "RawInOutBuffStream::ReceiveBuffer/DBG - cpos="
106 << _rdbuff.cpos << " sz=" << _rdbuff.sz << endl;
107 Receive(_rdbuff.buff, _rdbuff.sz);
108 _rdbuff.cpos = 0;
109
110}
111
112/* --Methode-- */
113size_t RawInOutBuffStream::Send(const char* s, size_t n)
114{
115 size_t nst = 0;
116 while (nst < n) {
117 size_t ns = fwrite(s, 1, n, _fip);;
118 if (ns < 1) break;
119 nst += ns;
120 }
121 if ( nst < n)
122 throw IOExc("RawInOutBuffStream::Send()/write() Error nwrite < n");
123 return nst;
124}
125
126/* --Methode-- */
127size_t RawInOutBuffStream::Receive(char* s, size_t n)
128{
129 size_t nst = 0;
130 int ntry = 0;
131 while (nst < n) {
132 size_t ns = fread(s, 1, n, _fip);
133 ntry++;
134 if (ns < 1) break;
135 nst += ns;
136 }
137 if ( nst < n) {
138 cout << " RawInOutBuffStream::Receive() / Pb ! ntry=" << ntry
139 << " nst=" << nst << " n=" << n << endl;
140 throw IOExc("RawInOutBuffStream::Receive/read() Error nread < n");
141 }
142 return nst;
143}
144
145/* --Methode-- */
146int_8 RawInOutBuffStream::tellg()
147{
148 return _totnrd;
149}
150
151/* --Methode-- */
152RawInOutStream& RawInOutBuffStream::read(char* s, uint_8 n)
153{
154 cout << "RawInOutBuffStream::read()/DBG - n=" << n << endl;
155 size_t nst = 0;
156 while (nst < n) {
157 size_t ns = CopyFromRecvBuffer(s+nst, n-nst);
158 if (ns < 1) break;
159 nst += ns;
160 }
161 if ( nst < n)
162 throw IOExc("RawInOutBuffStream::read() Error nread < n");
163 _totnrd += n;
164 return *this;
165}
166
167/* --Methode-- */
168int_8 RawInOutBuffStream::tellp()
169{
170 return _totnwr;
171}
172
173/* --Methode-- */
174RawInOutStream& RawInOutBuffStream::write(const char* s, uint_8 n)
175{
176 cout << "RawInOutBuffStream::write()/DBG - n=" << n << endl;
177 size_t nst = 0;
178 while (nst < n) {
179 size_t ns = CopyToSendBuffer(s+nst, n-nst);
180 if (ns < 1) break;
181 nst += ns;
182 }
183 cout << "RawInOutBuffStream::write()/DBG ---> nst=" << nst << endl;
184
185 if ( nst < n)
186 throw IOExc("RawInOutBuffStream::write() Error nwrite < n");
187 _totnwr += n;
188 return *this;
189}
190
191
Note: See TracBrowser for help on using the repository browser.