summaryrefslogtreecommitdiff
path: root/src/pipe.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pipe.cpp')
-rw-r--r--src/pipe.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/pipe.cpp b/src/pipe.cpp
new file mode 100644
index 0000000..96f1b30
--- /dev/null
+++ b/src/pipe.cpp
@@ -0,0 +1,84 @@
+/*
+ *
+ * D-Bus++ - C++ bindings for D-Bus
+ *
+ * Copyright (C) 2005-2007 Paolo Durante <shackan@gmail.com>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/* Project */
+#include <dbus-c++/pipe.h>
+#include <dbus-c++/util.h>
+#include <dbus-c++/error.h>
+
+/* STD */
+#include <unistd.h>
+#include <sys/poll.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <cassert>
+
+using namespace DBus;
+using namespace std;
+
+Pipe::Pipe(void(*handler)(const void *data, void *buffer, unsigned int nbyte), const void *data) :
+ _handler(handler),
+ _fd_write (0),
+ _fd_read (0),
+ _data(data)
+{
+ int fd[2];
+
+ if(pipe(fd) == 0)
+ {
+ _fd_read = fd[0];
+ _fd_write = fd[1];
+ fcntl(_fd_read, F_SETFL, O_NONBLOCK);
+ }
+ else
+ {
+ throw Error("PipeError:errno", toString(errno).c_str());
+ }
+}
+
+void Pipe::write(const void *buffer, unsigned int nbytes)
+{
+ // first write the size into the pipe...
+ ::write(_fd_write, static_cast <const void*> (&nbytes), sizeof(nbytes));
+
+ // ...then write the real data
+ ::write(_fd_write, buffer, nbytes);
+}
+
+ssize_t Pipe::read(void *buffer, unsigned int &nbytes)
+{
+ // first read the size from the pipe...
+ ::read(_fd_read, &nbytes, sizeof (nbytes));
+
+ //ssize_t size = 0;
+ return ::read(_fd_read, buffer, nbytes);
+}
+
+void Pipe::signal()
+{
+ ::write(_fd_write, '\0', 1);
+}