libt2n: (gerd) refactored connection classes
[libt2n] / src / connection.cpp
diff --git a/src/connection.cpp b/src/connection.cpp
new file mode 100644 (file)
index 0000000..0b445ef
--- /dev/null
@@ -0,0 +1,72 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Gerd v. Egidy                                   *
+ *   gve@intra2net.com                                                     *
+ *                                                                         *
+ *   This library is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Lesser General Public License version   *
+ *   2.1 as published by the Free Software Foundation.                     *
+ *                                                                         *
+ *   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 program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+
+#include <string>
+#include <sstream>
+
+#include "connection.hxx"
+
+namespace libt2n
+{
+
+connection::packet_size_indicator connection::bytes_available()
+{
+    // max packet size is unsigned int
+
+    // no size information -> no packet
+    if (buffer.size() < sizeof(unsigned int))
+        return false;
+
+    packet_size_indicator psize=*((packet_size_indicator*)(buffer.data()));
+
+    // enough data for one packet in buffer?
+    if (buffer.size() < sizeof(unsigned int)+psize)
+        return false;
+
+    // ok, full packet there
+    return true;
+}
+
+bool connection::get_packet(std::string& data)
+{
+    packet_size_indicator psize;
+
+    if ((psize=bytes_available()))
+    {
+        data.assign(buffer,sizeof(unsigned int),psize);
+        buffer.erase(0,sizeof(unsigned int)+psize);
+        return true;
+    }
+    else
+        return false;
+}
+
+void connection::write(const std::string& data)
+{
+    // prepend packet size to data
+    packet_size_indicator psize=data.size();
+    std::string send_data(data);
+    send_data.insert(0,(char*)psize,sizeof(packet_size_indicator));
+
+    real_write(send_data);
+}
+
+
+
+}