pipe.cpp
Go to the documentation of this file.
1 /*
2  *
3  * D-Bus++ - C++ bindings for D-Bus
4  *
5  * Copyright (C) 2005-2007 Paolo Durante <shackan@gmail.com>
6  *
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21  *
22  */
23 
24 #ifdef HAVE_CONFIG_H
25 #include <config.h>
26 #endif
27 
28 /* Project */
29 #include <dbus-c++/pipe.h>
30 #include <dbus-c++/util.h>
31 #include <dbus-c++/error.h>
32 
33 /* STD */
34 #include <unistd.h>
35 #include <sys/poll.h>
36 #include <fcntl.h>
37 #include <errno.h>
38 #include <cassert>
39 
40 using namespace DBus;
41 using namespace std;
42 
43 Pipe::Pipe(void(*handler)(const void *data, void *buffer, unsigned int nbyte), const void *data) :
44  _handler(handler),
45  _fd_write(0),
46  _fd_read(0),
47  _data(data)
48 {
49  int fd[2];
50 
51  if (pipe(fd) == 0)
52  {
53  _fd_read = fd[0];
54  _fd_write = fd[1];
55  fcntl(_fd_read, F_SETFL, O_NONBLOCK);
56  }
57  else
58  {
59  throw Error("PipeError:errno", toString(errno).c_str());
60  }
61 }
62 
63 void Pipe::write(const void *buffer, unsigned int nbytes)
64 {
65  // TODO: ignoring return of read/write generates warning; maybe relevant for eventloop work...
66  // first write the size into the pipe...
67  ::write(_fd_write, static_cast <const void *>(&nbytes), sizeof(nbytes));
68 
69  // ...then write the real data
70  ::write(_fd_write, buffer, nbytes);
71 }
72 
73 ssize_t Pipe::read(void *buffer, unsigned int &nbytes)
74 {
75  // TODO: ignoring return of read/write generates warning; maybe relevant for eventloop work...
76  // first read the size from the pipe...
77  ::read(_fd_read, &nbytes, sizeof(nbytes));
78 
79  //ssize_t size = 0;
80  return ::read(_fd_read, buffer, nbytes);
81 }
82 
84 {
85  // TODO: ignoring return of read/write generates warning; maybe relevant for eventloop work...
86  ::write(_fd_write, "\0", 1);
87 }
Pipe(void(*handler)(const void *data, void *buffer, unsigned int nbyte), const void *data)
Definition: pipe.cpp:43
void write(const void *buffer, unsigned int nbytes)
Definition: pipe.cpp:63
int _fd_read
Definition: pipe.h:58
ssize_t read(void *buffer, unsigned int &nbytes)
Definition: pipe.cpp:73
void signal()
Definition: pipe.cpp:83
std::string toString(const T &thing, int w=0, int p=0)
create std::string from any number
Definition: util.h:297
int _fd_write
Definition: pipe.h:57