source: Sophya/trunk/AddOn/TAcq/sockrawstream.cc@ 3542

Last change on this file since 3542 was 3542, checked in by ansari, 17 years ago

Ajouts fichiers du repertoire Remote (Classes Socket, ServerSocker RawInOutSocketStream ...) et fichier README , Reza 23/10/2008

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