00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifdef HAVE_CONFIG_H
00025 #include <config.h>
00026 #endif
00027
00028
00029 #include <dbus-c++/pipe.h>
00030 #include <dbus-c++/util.h>
00031 #include <dbus-c++/error.h>
00032
00033
00034 #include <unistd.h>
00035 #include <sys/poll.h>
00036 #include <fcntl.h>
00037 #include <errno.h>
00038 #include <cassert>
00039
00040 using namespace DBus;
00041 using namespace std;
00042
00043 Pipe::Pipe(void(*handler)(const void *data, void *buffer, unsigned int nbyte), const void *data) :
00044 _handler(handler),
00045 _fd_write(0),
00046 _fd_read(0),
00047 _data(data)
00048 {
00049 int fd[2];
00050
00051 if (pipe(fd) == 0)
00052 {
00053 _fd_read = fd[0];
00054 _fd_write = fd[1];
00055 fcntl(_fd_read, F_SETFL, O_NONBLOCK);
00056 }
00057 else
00058 {
00059 throw Error("PipeError:errno", toString(errno).c_str());
00060 }
00061 }
00062
00063 void Pipe::write(const void *buffer, unsigned int nbytes)
00064 {
00065
00066
00067 ::write(_fd_write, static_cast <const void *>(&nbytes), sizeof(nbytes));
00068
00069
00070 ::write(_fd_write, buffer, nbytes);
00071 }
00072
00073 ssize_t Pipe::read(void *buffer, unsigned int &nbytes)
00074 {
00075
00076
00077 ::read(_fd_read, &nbytes, sizeof(nbytes));
00078
00079
00080 return ::read(_fd_read, buffer, nbytes);
00081 }
00082
00083 void Pipe::signal()
00084 {
00085
00086 ::write(_fd_write, '\0', 1);
00087 }