summaryrefslogtreecommitdiff
path: root/x11/ipc
Unidiff
Diffstat (limited to 'x11/ipc') (more/less context) (ignore whitespace changes)
-rw-r--r--x11/ipc/client/ocopclient.cpp8
-rw-r--r--x11/ipc/server/ocopserver.cpp38
2 files changed, 23 insertions, 23 deletions
diff --git a/x11/ipc/client/ocopclient.cpp b/x11/ipc/client/ocopclient.cpp
index 91827e7..f59fa41 100644
--- a/x11/ipc/client/ocopclient.cpp
+++ b/x11/ipc/client/ocopclient.cpp
@@ -86,71 +86,71 @@ void OCOPClient::newData() {
86 case OCOPPacket::IsRegistered: 86 case OCOPPacket::IsRegistered:
87 break; 87 break;
88 /* emit the signal */ 88 /* emit the signal */
89 case OCOPPacket::Call: 89 case OCOPPacket::Call:
90 emit called( pack.channel(), pack.header(), pack.content() ); 90 emit called( pack.channel(), pack.header(), pack.content() );
91 break; 91 break;
92 } 92 }
93} 93}
94OCOPPacket OCOPClient::packet() const{ 94OCOPPacket OCOPClient::packet() const{
95 QCString chan; 95 QCString chan;
96 QCString func; 96 QCString func;
97 QByteArray ar; 97 QByteArray ar;
98 OCOPHead head; 98 OCOPHead head;
99 memset(&head, 0, sizeof(head) ); 99 memset(&head, 0, sizeof(head) );
100 read(m_socket, &head, sizeof(head) ); 100 read(m_socket, &head, sizeof(head) );
101 if ( head.magic == 47 ) { 101 if ( head.magic == 47 ) {
102 qWarning("Client:Magic Match"); 102// qWarning("Client:Magic Match");
103 chan = QCString( head.chlen+1); 103 chan = QCString( head.chlen+1);
104 func = QCString( head.funclen+1 ); 104 func = QCString( head.funclen+1 );
105 ar = QByteArray( head.datalen); 105 ar = QByteArray( head.datalen);
106 read(m_socket, chan.data(), head.chlen ); 106 read(m_socket, chan.data(), head.chlen );
107 read(m_socket, func.data(), head.funclen ); 107 read(m_socket, func.data(), head.funclen );
108 read(m_socket, ar.data(), head.datalen ); 108 read(m_socket, ar.data(), head.datalen );
109 qWarning("Client:%d %s",head.chlen,chan.data() ); 109 //qWarning("Client:%d %s",head.chlen,chan.data() );
110 } 110 }
111 OCOPPacket pack(head.type, chan, func, ar ); 111 OCOPPacket pack(head.type, chan, func, ar );
112 return pack; 112 return pack;
113} 113}
114/* 114/*
115 * we've blocking IO here on these sockets 115 * we've blocking IO here on these sockets
116 * so we send and go on read 116 * so we send and go on read
117 * this will be blocked 117 * this will be blocked
118 */ 118 */
119bool OCOPClient::isRegistered( const QCString& chan ) const{ 119bool OCOPClient::isRegistered( const QCString& chan ) const{
120 qWarning("OCopClient::isRegistered %s", chan.data() ); 120// qWarning("OCopClient::isRegistered %s", chan.data() );
121 /* should I disconnect the socket notfier? */ 121 /* should I disconnect the socket notfier? */
122 OCOPPacket packe(OCOPPacket::IsRegistered, chan ); 122 OCOPPacket packe(OCOPPacket::IsRegistered, chan );
123 OCOPHead head = packe.head(); 123 OCOPHead head = packe.head();
124 write(m_socket, &head, sizeof(head) ); 124 write(m_socket, &head, sizeof(head) );
125 write(m_socket, chan.data(), chan.size() ); 125 write(m_socket, chan.data(), chan.size() );
126 /* block */ 126 /* block */
127 OCOPPacket pack = packet(); 127 OCOPPacket pack = packet();
128 qWarning("unblock %s %s", pack.channel().data(), chan.data() ); 128 qWarning("unblock %s %s", pack.channel().data(), chan.data() );
129 129
130 /* connect here again */ 130 /* connect here again */
131 if ( pack.channel() == chan ) { 131 if ( pack.channel() == chan ) {
132 QCString func = pack.header(); 132 QCString func = pack.header();
133 if (func[0] == 1 ) 133 if (func[0] == 1 )
134 return true; 134 return true;
135 } 135 }
136 136
137 return false; 137 return false;
138}; 138};
139void OCOPClient::send( const QCString& chan, const QCString& fu, const QByteArray& arr ) { 139void OCOPClient::send( const QCString& chan, const QCString& fu, const QByteArray& arr ) {
140 qWarning("ClientSending %s %s", chan.data(), fu.data() ); 140// qWarning("ClientSending %s %s", chan.data(), fu.data() );
141 OCOPPacket pack(OCOPPacket::Call, chan, fu, arr ); 141 OCOPPacket pack(OCOPPacket::Call, chan, fu, arr );
142 call( pack ); 142 call( pack );
143} 143}
144void OCOPClient::addChannel(const QCString& channel) { 144void OCOPClient::addChannel(const QCString& channel) {
145 OCOPPacket pack(OCOPPacket::RegisterChannel, channel ); 145 OCOPPacket pack(OCOPPacket::RegisterChannel, channel );
146 call( pack ); 146 call( pack );
147} 147}
148void OCOPClient::delChannel(const QCString& chan ) { 148void OCOPClient::delChannel(const QCString& chan ) {
149 OCOPPacket pack(OCOPPacket::UnregisterChannel, chan ); 149 OCOPPacket pack(OCOPPacket::UnregisterChannel, chan );
150 call( pack ); 150 call( pack );
151} 151}
152void OCOPClient::call( const OCOPPacket& pack ) { 152void OCOPClient::call( const OCOPPacket& pack ) {
153 OCOPHead head = pack.head(); 153 OCOPHead head = pack.head();
154 write(m_socket, &head, sizeof(head) ); 154 write(m_socket, &head, sizeof(head) );
155 write(m_socket, pack.channel().data(), pack.channel().size() ); 155 write(m_socket, pack.channel().data(), pack.channel().size() );
156 write(m_socket, pack.header().data(), pack.header().size() ); 156 write(m_socket, pack.header().data(), pack.header().size() );
diff --git a/x11/ipc/server/ocopserver.cpp b/x11/ipc/server/ocopserver.cpp
index ee5ea18..992cb8c 100644
--- a/x11/ipc/server/ocopserver.cpp
+++ b/x11/ipc/server/ocopserver.cpp
@@ -18,33 +18,33 @@ OCopServer::OCopServer()
18 18
19 /* 19 /*
20 * init the server 20 * init the server
21 */ 21 */
22 init(); 22 init();
23 initSocket(); 23 initSocket();
24} 24}
25OCopServer::~OCopServer() { 25OCopServer::~OCopServer() {
26// socket notifiers should be deleted 26// socket notifiers should be deleted
27 close(m_serverfd ); 27 close(m_serverfd );
28} 28}
29void OCopServer::init() { 29void OCopServer::init() {
30 /* 30 /*
31 * we set SIGPIPE to SIG_IGN 31 * we set SIGPIPE to SIG_IGN
32 * to get EPIPE on reads ;) 32 * to get EPIPE on reads ;)
33 */ 33 */
34 qWarning("SIGPIPE to be ignored"); 34// qWarning("SIGPIPE to be ignored");
35 signal(SIGPIPE, SIG_IGN ); 35 signal(SIGPIPE, SIG_IGN );
36 36
37 /* 37 /*
38 * initialize some variables 38 * initialize some variables
39 */ 39 */
40 m_server = 0l; 40 m_server = 0l;
41 m_serverError = 0l; 41 m_serverError = 0l;
42} 42}
43 43
44/** 44/**
45 * here we will init our server 45 * here we will init our server
46 * socket and bind and do the listen 46 * socket and bind and do the listen
47 */ 47 */
48void OCopServer::initSocket() { 48void OCopServer::initSocket() {
49 /* get the home dir */ 49 /* get the home dir */
50 QCString home( getenv("HOME") ); 50 QCString home( getenv("HOME") );
@@ -108,33 +108,33 @@ void OCopServer::initSocket() {
108 * on a client side 108 * on a client side
109 * we will accept it 109 * we will accept it
110 * add it to our list 110 * add it to our list
111 */ 111 */
112void OCopServer::newOnServer() { 112void OCopServer::newOnServer() {
113 int fd = accept(); 113 int fd = accept();
114 if ( fd < 0 ) 114 if ( fd < 0 )
115 return; 115 return;
116 116
117 /* 117 /*
118 * we got a successfull new connection 118 * we got a successfull new connection
119 * be happy 119 * be happy
120 * set SocketNotifier 120 * set SocketNotifier
121 * connect it 121 * connect it
122 * and a OCOPClient 122 * and a OCOPClient
123 */ 123 */
124 qWarning("Heureka new connection %d", fd ); 124// qWarning("Heureka new connection %d", fd );
125 125
126 126
127 registerClient( fd ); 127 registerClient( fd );
128} 128}
129int OCopServer::accept() { 129int OCopServer::accept() {
130 /* 130 /*
131 * accept it 131 * accept it
132 * the socket is currently blocking IIRC 132 * the socket is currently blocking IIRC
133 */ 133 */
134 return ::accept( m_serverfd, (struct sockaddr*)&m_address, &m_adrlaenge ); 134 return ::accept( m_serverfd, (struct sockaddr*)&m_address, &m_adrlaenge );
135} 135}
136void OCopServer::newOnClient( int fd ) { 136void OCopServer::newOnClient( int fd ) {
137 errno = 0; 137 errno = 0;
138 OCOPHead head; 138 OCOPHead head;
139 memset(&head, 0, sizeof(head) ); 139 memset(&head, 0, sizeof(head) );
140 int rea = ::read(fd, &head, sizeof(head) ); 140 int rea = ::read(fd, &head, sizeof(head) );
@@ -181,233 +181,233 @@ void OCopServer::newOnClient( int fd ) {
181 /* debug output */ 181 /* debug output */
182// qWarning("channel %s %d", channel.data(), head.chlen ); 182// qWarning("channel %s %d", channel.data(), head.chlen );
183// qWarning("func %s %d", func.data(), head.funclen ); 183// qWarning("func %s %d", func.data(), head.funclen );
184 /* debug end */ 184 /* debug end */
185 185
186 /* 186 /*
187 * now that we got the complete body 187 * now that we got the complete body
188 * we need to make a package 188 * we need to make a package
189 * and then we need to send it to clients 189 * and then we need to send it to clients
190 * making a package is done here 190 * making a package is done here
191 * dispatching it not 191 * dispatching it not
192 */ 192 */
193 OCOPPacket packet( head.type, channel, func, data ); 193 OCOPPacket packet( head.type, channel, func, data );
194 dispatch( packet, fd ); 194 dispatch( packet, fd );
195 195
196 }else{ 196 }else{
197 qWarning("magic does not match"); 197// qWarning("magic does not match");
198 qWarning("magic %d", head.magic ); 198// qWarning("magic %d", head.magic );
199 } 199 }
200} 200}
201void OCopServer::registerClient( int fd ) { 201void OCopServer::registerClient( int fd ) {
202 if (m_clients.contains(fd) ) 202 if (m_clients.contains(fd) )
203 return; 203 return;
204 204
205 QSocketNotifier* notify = new QSocketNotifier(fd, QSocketNotifier::Read, this ); 205 QSocketNotifier* notify = new QSocketNotifier(fd, QSocketNotifier::Read, this );
206 connect(notify, SIGNAL(activated(int) ), 206 connect(notify, SIGNAL(activated(int) ),
207 this, SLOT(newOnClient(int) ) ); 207 this, SLOT(newOnClient(int) ) );
208 OCOPClient client; 208 OCOPClient client;
209 client.fd = fd; 209 client.fd = fd;
210 client.notify = notify; 210 client.notify = notify;
211 m_clients.insert( client.fd, client ); 211 m_clients.insert( client.fd, client );
212 qWarning("clients are up to %d", m_clients.count() ); 212// qWarning("clients are up to %d", m_clients.count() );
213}; 213};
214void OCopServer::deregisterClient(int fd ) { 214void OCopServer::deregisterClient(int fd ) {
215 QMap<int, OCOPClient>::Iterator it = m_clients.find( fd ); 215 QMap<int, OCOPClient>::Iterator it = m_clients.find( fd );
216 if (it != m_clients.end() ) { 216 if (it != m_clients.end() ) {
217 /* 217 /*
218 * TIME_ME 218 * TIME_ME
219 * 219 *
220 * now delete from all channels 220 * now delete from all channels
221 * go through all channels 221 * go through all channels
222 * remove the fd from the list 222 * remove the fd from the list
223 * if count becomes 0 remove the channel 223 * if count becomes 0 remove the channel
224 * otherwise replace QArray<int> 224 * otherwise replace QArray<int>
225 */ 225 */
226 QMap<QCString, QValueList<int> >::Iterator it2; 226 QMap<QCString, QValueList<int> >::Iterator it2;
227 repeatIt: 227 repeatIt:
228 for ( it2 = m_channels.begin(); it2 != m_channels.end(); ++it2 ) { 228 for ( it2 = m_channels.begin(); it2 != m_channels.end(); ++it2 ) {
229 /* 229 /*
230 * The channel contains this fd 230 * The channel contains this fd
231 */ 231 */
232 qWarning("Channel %s %d", it2.key().data(), it2.data().count() ); 232// qWarning("Channel %s %d", it2.key().data(), it2.data().count() );
233 if ( it2.data().contains( fd ) ) { 233 if ( it2.data().contains( fd ) ) {
234 qWarning("contains"); 234 qWarning("contains");
235 QValueList<int> array = it2.data(); 235 QValueList<int> array = it2.data();
236 236
237 /* 237 /*
238 * remove channel or just replace 238 * remove channel or just replace
239 */ 239 */
240 if ( array.count() == 1 || array.count() == 0) { 240 if ( array.count() == 1 || array.count() == 0) {
241 qWarning("Invalidate!"); 241// qWarning("Invalidate!");
242 /* is the list now invalidatet? */ 242 /* is the list now invalidatet? */
243 m_channels.remove( it2 ); 243 m_channels.remove( it2 );
244 /* That is the first go to of my life 244 /* That is the first go to of my life
245 * but Iterator remove( Iterator ) 245 * but Iterator remove( Iterator )
246 * does not exist 246 * does not exist
247 * it2 = --it2; 247 * it2 = --it2;
248 * does not work reliable too 248 * does not work reliable too
249 * so the only way is to reiterate :( 249 * so the only way is to reiterate :(
250 */ 250 */
251 goto repeatIt; 251 goto repeatIt;
252 }else{ 252 }else{
253 qWarning("removing count %d %d",fd, array.count() ); 253// qWarning("removing count %d %d",fd, array.count() );
254 QValueList<int>::Iterator it3 = array.find( fd ); 254 QValueList<int>::Iterator it3 = array.find( fd );
255 it3 = array.remove( it3 ); 255 it3 = array.remove( it3 );
256 QCString key = it2.key().copy(); 256 QCString key = it2.key().copy();
257 it2 = m_channels.replace( key, array ); 257 it2 = m_channels.replace( key, array );
258 } 258 }
259 } 259 }
260 } // off all channels 260 } // off all channels
261 OCOPClient client = it.data(); 261 OCOPClient client = it.data();
262 delete client.notify; 262 delete client.notify;
263 m_clients.remove(fd ); 263 m_clients.remove(fd );
264 close(fd ); 264 close(fd );
265 } 265 }
266 qWarning("clients are now at %d", m_clients.count() ); 266// qWarning("clients are now at %d", m_clients.count() );
267}; 267}
268/** 268/**
269 * this function will evaluate 269 * this function will evaluate
270 * the package and then do the appropriate thins 270 * the package and then do the appropriate thins
271 */ 271 */
272void OCopServer::dispatch( const OCOPPacket& packet, int sourceFD ) { 272void OCopServer::dispatch( const OCOPPacket& packet, int sourceFD ) {
273 qWarning("packet.type() == %d", packet.type() ); 273// qWarning("packet.type() == %d", packet.type() );
274 switch( packet.type() ) { 274 switch( packet.type() ) {
275 case OCOPPacket::Register: 275 case OCOPPacket::Register:
276 registerClient(sourceFD ); 276 registerClient(sourceFD );
277 break; 277 break;
278 case OCOPPacket::Unregister: 278 case OCOPPacket::Unregister:
279 deregisterClient(sourceFD ); 279 deregisterClient(sourceFD );
280 break; 280 break;
281 case OCOPPacket::Call: 281 case OCOPPacket::Call:
282 call( packet, sourceFD ); 282 call( packet, sourceFD );
283 break; 283 break;
284 /* not implemented */ 284 /* not implemented */
285 case OCOPPacket::Method: 285 case OCOPPacket::Method:
286 break; 286 break;
287 /* nit implemented */ 287 /* nit implemented */
288 case OCOPPacket::Reply: 288 case OCOPPacket::Reply:
289 break; 289 break;
290 case OCOPPacket::RegisterChannel: 290 case OCOPPacket::RegisterChannel:
291 addChannel( packet.channel() , sourceFD ); 291 addChannel( packet.channel() , sourceFD );
292 break; 292 break;
293 case OCOPPacket::UnregisterChannel: 293 case OCOPPacket::UnregisterChannel:
294 delChannel( packet.channel(), sourceFD ); 294 delChannel( packet.channel(), sourceFD );
295 break; 295 break;
296 /* not implemented */ 296 /* not implemented */
297 case OCOPPacket::Return: 297 case OCOPPacket::Return:
298 break; 298 break;
299 /* not implemented :( */ 299 /* not implemented :( */
300 case OCOPPacket::Signal: 300 case OCOPPacket::Signal:
301 break; 301 break;
302 case OCOPPacket::IsRegistered: 302 case OCOPPacket::IsRegistered:
303 qWarning("Server:IsRegistered %s", packet.channel().data() ); 303// qWarning("Server:IsRegistered %s", packet.channel().data() );
304 isRegistered( packet.channel(), sourceFD ); 304 isRegistered( packet.channel(), sourceFD );
305 break; 305 break;
306 }; 306 };
307} 307}
308void OCopServer::errorOnServer() { 308void OCopServer::errorOnServer() {
309 /* 309 /*
310 * something is wrong on the server socket? 310 * something is wrong on the server socket?
311 * what should we do? 311 * what should we do?
312 * FIXME 312 * FIXME
313 */ 313 */
314} 314}
315QStringList OCopServer::channels() { 315QStringList OCopServer::channels() {
316 QStringList list; 316 QStringList list;
317 { 317 {
318 QMap<QCString, QValueList<int> >::Iterator it; 318 QMap<QCString, QValueList<int> >::Iterator it;
319 for (it = m_channels.begin(); it != m_channels.end(); ++it ) { 319 for (it = m_channels.begin(); it != m_channels.end(); ++it ) {
320 list << it.key(); 320 list << it.key();
321 }; 321 };
322 } 322 }
323 return list; 323 return list;
324} 324}
325bool OCopServer::isChannelRegistered( const QCString& chan ) const{ 325bool OCopServer::isChannelRegistered( const QCString& chan ) const{
326 return m_channels.contains( chan ); 326 return m_channels.contains( chan );
327} 327}
328void OCopServer::addChannel( const QCString& channel, 328void OCopServer::addChannel( const QCString& channel,
329 int fd ) { 329 int fd ) {
330 QMap<QCString, QValueList<int> >::Iterator it; 330 QMap<QCString, QValueList<int> >::Iterator it;
331 it = m_channels.find( channel ); 331 it = m_channels.find( channel );
332 if ( it != m_channels.end() ) { 332 if ( it != m_channels.end() ) {
333 /* could be empty */ 333 /* could be empty */
334 QValueList<int> list = it.data(); 334 QValueList<int> list = it.data();
335 list.append( fd ); 335 list.append( fd );
336 qWarning("count is now in addChannel %d %s", list.count(), channel.data() ); 336 qWarning("Server:count is now in addChannel %d %s", list.count(), channel.data() );
337 it = m_channels.replace( channel, list ); 337 it = m_channels.replace( channel, list );
338 }else { 338 }else {
339 QValueList<int> ints; 339 QValueList<int> ints;
340 ints.append( fd ); 340 ints.append( fd );
341 m_channels.insert( channel, ints ); 341 m_channels.insert( channel, ints );
342 } 342 }
343}; 343};
344void OCopServer::delChannel( const QCString& channel, 344void OCopServer::delChannel( const QCString& channel,
345 int fd ) { 345 int fd ) {
346 qWarning("remove %s, %d", channel.data(), fd ); 346// qWarning("remove %s, %d", channel.data(), fd );
347 if (!m_channels.contains( channel ) ) 347 if (!m_channels.contains( channel ) )
348 return; 348 return;
349 349
350 QMap<QCString, QValueList<int> >::Iterator it; 350 QMap<QCString, QValueList<int> >::Iterator it;
351 it = m_channels.find( channel ); 351 it = m_channels.find( channel );
352 352
353 if ( it.data().contains(fd) ) { 353 if ( it.data().contains(fd) ) {
354 QValueList<int> ints = it.data(); 354 QValueList<int> ints = it.data();
355 if ( ints.count() == 1 ) 355 if ( ints.count() == 1 )
356 m_channels.remove( channel ); 356 m_channels.remove( channel );
357 else{ 357 else{
358 QValueList<int> ints = it.data(); 358 QValueList<int> ints = it.data();
359 QValueList<int>::Iterator rem = ints.find( fd ); 359 QValueList<int>::Iterator rem = ints.find( fd );
360 rem = ints.remove( rem ); 360 rem = ints.remove( rem );
361 QCString str = it.key().copy(); 361 QCString str = it.key().copy();
362 m_channels.replace( str, ints ); 362 m_channels.replace( str, ints );
363 } 363 }
364 qWarning(" channel count is now %d", ints.count() ); 364// qWarning(" channel count is now %d", ints.count() );
365 } 365 }
366} 366}
367void OCopServer::isRegistered( const QCString& channel, int fd) { 367void OCopServer::isRegistered( const QCString& channel, int fd) {
368 qWarning("Server:isRegistered %s", channel.data() ); 368// qWarning("Server:isRegistered %s", channel.data() );
369 OCOPHead head; 369 OCOPHead head;
370 QCString func(2); 370 QCString func(2);
371 371
372 memset(&head, 0, sizeof(head ) ); 372 memset(&head, 0, sizeof(head ) );
373 head.magic = 47; 373 head.magic = 47;
374 head.type = OCOPPacket::IsRegistered; 374 head.type = OCOPPacket::IsRegistered;
375 head.chlen = channel.size(); 375 head.chlen = channel.size();
376 head.funclen = func.size(); 376 head.funclen = func.size();
377 head.datalen = 0; 377 head.datalen = 0;
378 378
379 if ( isChannelRegistered( channel ) ) { 379 if ( isChannelRegistered( channel ) ) {
380 //is registered 380 //is registered
381 func[0] = 1; 381 func[0] = 1;
382 qWarning("Server:Channel is Registered %d", head.chlen); 382 //qWarning("Server:Channel is Registered %d", head.chlen);
383 }else{ 383 }else{
384 func[0] = 0; 384 func[0] = 0;
385 qWarning("Server:Channel is NotRegistered"); 385 //qWarning("Server:Channel is NotRegistered");
386 } 386 }
387 387
388 /** 388 /**
389 * write the head 389 * write the head
390 * and then channel 390 * and then channel
391 * success/failure inside func 391 * success/failure inside func
392 */ 392 */
393 write(fd, &head, sizeof(head) ); 393 write(fd, &head, sizeof(head) );
394 write(fd, channel.data(), channel.size() ); 394 write(fd, channel.data(), channel.size() );
395 write(fd, func.data(), func.size() ); 395 write(fd, func.data(), func.size() );
396} 396}
397QValueList<int> OCopServer::clients( const QCString& channel ) { 397QValueList<int> OCopServer::clients( const QCString& channel ) {
398 return m_channels[channel]; 398 return m_channels[channel];
399} 399}
400void OCopServer::call( const OCOPPacket& p, int ) { 400void OCopServer::call( const OCOPPacket& p, int ) {
401 QValueList<int> cli = clients( p.channel() ); 401 QValueList<int> cli = clients( p.channel() );
402 QValueList<int>::Iterator it; 402 QValueList<int>::Iterator it;
403 403
404 OCOPHead head = p.head(); 404 OCOPHead head = p.head();
405 for (it = cli.begin(); it != cli.end(); ++it ) { 405 for (it = cli.begin(); it != cli.end(); ++it ) {
406 qWarning("Server:calling %d %s %s", (*it), p.channel().data(), p.header().data() ); 406// qWarning("Server:calling %d %s %s", (*it), p.channel().data(), p.header().data() );
407 write( (*it), &head, sizeof(head ) ); 407 write( (*it), &head, sizeof(head ) );
408 /* expl. shared! */ 408 /* expl. shared! */
409 write( (*it), p.channel().data(), p.channel().size() ); 409 write( (*it), p.channel().data(), p.channel().size() );
410 write( (*it), p.header().data(), p.header().size() ); 410 write( (*it), p.header().data(), p.header().size() );
411 write( (*it), p.content().data(), p.content().size() ); 411 write( (*it), p.content().data(), p.content().size() );
412 }; 412 };
413} 413}