version 0.3.28
authorSomeDude <SomeDude@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw>
Sun, 4 Jan 2009 17:43:00 +0000 (18:43 +0100)
committerDavid ‘Bombe’ Roden <bombe@freenetproject.org>
Sun, 4 Jan 2009 17:43:00 +0000 (18:43 +0100)
57 files changed:
CMakeLists.txt
include/db/sqlite3db/sqlite3db.h
include/freenet/boardlistinserter.h
include/freenet/boardlistrequester.h
include/freenet/fcpv2.h
include/freenet/fileinserter.h
include/freenet/fmsversionrequester.h
include/freenet/freenetmasterthread.h
include/freenet/identityinserter.h
include/freenet/identityintroductioninserter.h
include/freenet/identityintroductionrequester.h
include/freenet/identityrequester.h
include/freenet/ifcpconnected.h
include/freenet/ifcpmessagehandler.h
include/freenet/iindexinserter.h
include/freenet/iindexrequester.h
include/freenet/inactivemessagelistrequester.h
include/freenet/introductionpuzzleinserter.h
include/freenet/introductionpuzzlerequester.h
include/freenet/messageinserter.h
include/freenet/messagelistinserter.h
include/freenet/messagelistrequester.h
include/freenet/messagerequester.h
include/freenet/siteinserter.h
include/freenet/trustlistinserter.h
include/freenet/trustlistrequester.h
include/freenet/unkeyedidcreator.h
include/freenet/unknownidentityrequester.h
include/global.h
include/unicode/unicodeformatter.h
include/unicode/utfconversion.h
readme.txt
src/freenet/boardlistinserter.cpp
src/freenet/boardlistrequester.cpp
src/freenet/fcpv2.cpp
src/freenet/fileinserter.cpp
src/freenet/fmsversionrequester.cpp
src/freenet/freenetmasterthread.cpp
src/freenet/identityinserter.cpp
src/freenet/identityintroductioninserter.cpp
src/freenet/identityintroductionrequester.cpp
src/freenet/identityrequester.cpp
src/freenet/inactivemessagelistrequester.cpp
src/freenet/introductionpuzzleinserter.cpp
src/freenet/introductionpuzzlerequester.cpp
src/freenet/messageinserter.cpp
src/freenet/messagelistinserter.cpp
src/freenet/messagelistrequester.cpp
src/freenet/messagerequester.cpp
src/freenet/siteinserter.cpp
src/freenet/trustlistinserter.cpp
src/freenet/trustlistrequester.cpp
src/freenet/unkeyedidcreator.cpp
src/freenet/unknownidentityrequester.cpp
src/http/pages/forumviewthreadpage.cpp
src/unicode/unicodeformatter.cpp
src/unicode/utfconversion.cpp

index 3c9997e..6412e14 100644 (file)
@@ -5,7 +5,7 @@ ENDIF(COMMAND CMAKE_POLICY)
 \r
 PROJECT(fms)\r
 \r
-OPTION(USE_BUNDLED_SQLITE "Use the bundled SQLite3 library." OFF)\r
+OPTION(USE_BUNDLED_SQLITE "Use the bundled SQLite3 library." ON)\r
 IF(APPLE)\r
        SET(USE_BUNDLED_SQLITE ON)\r
 ENDIF(APPLE)\r
@@ -131,11 +131,27 @@ ELSE(ALTERNATE_CAPTCHA)
        MESSAGE(STATUS "You are using the old captcha generator.  Add a -D ALTERNATE_CAPTCHA=ON to the command line to use the alternate captcha generator.")\r
 ENDIF(ALTERNATE_CAPTCHA)\r
 \r
+# Get a relative list of include files.\r
+FILE(GLOB_RECURSE FMS_INC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} include/*.h)\r
+\r
+# Create source groups for all sources and includes, in their original directory structure.\r
+FOREACH(SRC ${FMS_SRC} ${FMS_INC})\r
+       STRING(REGEX REPLACE ${CMAKE_CURRENT_SOURCE_DIR} "Files" REL_DIR "${SRC}")\r
+       STRING(REGEX REPLACE "[\\\\/][^\\\\/]*$" "" REL_DIR "${REL_DIR}")\r
+       STRING(REGEX REPLACE "^[\\\\/]" "" REL_DIR "${REL_DIR}")\r
+       IF(REL_DIR)\r
+               STRING(REPLACE "/" "\\" REL_DIR "${REL_DIR}")\r
+               SOURCE_GROUP(${REL_DIR} FILES ${SRC})\r
+       ELSE(REL_DIR)\r
+               SOURCE_GROUP(Files FILES ${SRC})\r
+       ENDIF(REL_DIR)\r
+ENDFOREACH(SRC)\r
+\r
 IF(NOT I_HAVE_READ_THE_README)\r
        MESSAGE(FATAL_ERROR "You must fully read the readme.txt before continuing.")\r
 ENDIF(NOT I_HAVE_READ_THE_README)\r
 \r
-ADD_EXECUTABLE(fms ${FMS_SRC} ${FMS_PLATFORM_SRC})\r
+ADD_EXECUTABLE(fms ${FMS_SRC} ${FMS_PLATFORM_SRC} ${FMS_INC})\r
 \r
 # link dl - For SQLite3 and shttpd - not for FreeBSD\r
 IF(CMAKE_COMPILER_IS_GNUCC)\r
@@ -181,23 +197,32 @@ IF(ALTERNATE_CAPTCHA)
 ENDIF(ALTERNATE_CAPTCHA)\r
 \r
 IF(POCO_FOUNDATION_LIBRARY)\r
-       TARGET_LINK_LIBRARIES(fms ${POCO_FOUNDATION_LIBRARY})\r
+       # We don't need to explicitly link under MSVC, POCO uses #pragmas to specify linked libraries.\r
+       IF(NOT MSVC)\r
+               TARGET_LINK_LIBRARIES(fms ${POCO_FOUNDATION_LIBRARY})\r
+       ENDIF(NOT MSVC)\r
        ADD_DEFINITIONS(-DPOCO_HAVE_IPv6)\r
        IF(WIN32)\r
                ADD_DEFINITIONS(-DPOCO_STATIC)\r
        ENDIF(WIN32)\r
        IF(POCO_UTIL_LIBRARY)\r
-               TARGET_LINK_LIBRARIES(fms ${POCO_UTIL_LIBRARY})\r
+               IF(NOT MSVC)\r
+                       TARGET_LINK_LIBRARIES(fms ${POCO_UTIL_LIBRARY})\r
+               ENDIF(NOT MSVC)\r
        ELSE(POCO_UTIL_LIBRARY)\r
                MESSAGE(FATAL_ERROR "Could not find system Poco Util library.  You must set the location manually.")\r
        ENDIF(POCO_UTIL_LIBRARY)\r
        IF(POCO_NET_LIBRARY)\r
-               TARGET_LINK_LIBRARIES(fms ${POCO_NET_LIBRARY})\r
+               IF(NOT MSVC)\r
+                       TARGET_LINK_LIBRARIES(fms ${POCO_NET_LIBRARY})\r
+               ENDIF(NOT MSVC)\r
        ELSE(POCO_NET_LIBRARY)\r
                MESSAGE(FATAL_ERROR "Could not find system Poco Net library.  You must set the location manually.")\r
        ENDIF(POCO_NET_LIBRARY)\r
        IF(POCO_XML_LIBRARY)\r
-               TARGET_LINK_LIBRARIES(fms ${POCO_XML_LIBRARY})\r
+               IF(NOT MSVC)\r
+                       TARGET_LINK_LIBRARIES(fms ${POCO_XML_LIBRARY})\r
+               ENDIF(NOT MSVC)\r
        ELSE(POCO_XML_LIBRARY)\r
                MESSAGE(FATAL_ERROR "Could not find system Poco XML library.  You must set the location manually.")\r
        ENDIF(POCO_XML_LIBRARY)\r
index 8c2ee39..f60961b 100644 (file)
@@ -7,8 +7,8 @@
 #include "../sqlite3db.h"\r
 #include "../../threadwrapper/singleton.h"\r
 \r
-#if SQLITE_VERSION_NUMBER<3005000\r
-#error "Your version of SQLite is too old!  3.5.0 or later is required."\r
+#if SQLITE_VERSION_NUMBER<3006006\r
+#error "Your version of SQLite is too old!  3.6.6.2 or later is required."\r
 #endif\r
 \r
 namespace SQLite3DB\r
index d041cdb..f0883a1 100644 (file)
@@ -7,12 +7,12 @@ class BoardListInserter:public IIndexInserter<long>
 {\r
 public:\r
        BoardListInserter();\r
-       BoardListInserter(FCPv2 *fcp);\r
+       BoardListInserter(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
-       const bool HandlePutSuccessful(FCPMessage &message);\r
-       const bool HandlePutFailed(FCPMessage &message);\r
+       const bool HandlePutSuccessful(FCPv2::Message &message);\r
+       const bool HandlePutFailed(FCPv2::Message &message);\r
        const bool StartInsert(const long &localidentityid);\r
        void CheckForNeededInsert();\r
 };\r
index b2cacb2..3eb7823 100644 (file)
@@ -7,14 +7,14 @@ class BoardListRequester:public IIndexRequester<long>
 {\r
 public:\r
        BoardListRequester();\r
-       BoardListRequester(FCPv2 *fcp);\r
+       BoardListRequester(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
        void PopulateIDList();\r
        void StartRequest(const long &identityid);\r
-       const bool HandleAllData(FCPMessage &message);\r
-       const bool HandleGetFailed(FCPMessage &message);\r
+       const bool HandleAllData(FCPv2::Message &message);\r
+       const bool HandleGetFailed(FCPv2::Message &message);\r
 \r
        std::string GetIdentityName(const long identityid);\r
 \r
index 864b14f..1f033a9 100644 (file)
@@ -1,14 +1,24 @@
-/*\r
+/**\r
+\r
+       \mainpage FCPv2 library\r
 \r
        FCPv2 C++ library\r
        \r
-       link with ws2_32.lib in Windows\r
+       link with ws2_32.lib and iphlpapi.lib in Windows\r
+\r
+*/\r
 \r
+/**\r
+       \file fcpv2.h\r
 */\r
 \r
 #ifndef _fcpv2_\r
 #define _fcpv2_\r
 \r
+#include <map>\r
+#include <vector>\r
+#include <string>\r
+\r
 #ifdef _WIN32\r
        #include <winsock2.h>\r
        #include <windows.h>\r
        #include <arpa/inet.h>\r
 #endif\r
 \r
-#include <string>\r
-#include <vector>\r
-#include <map>\r
+/**\r
+       \brief %FCPv2 namespace\r
 \r
+       This namespace contains the %FCPv2 library\r
+*/\r
+namespace FCPv2\r
+{\r
 \r
-class FCPMessage:public std::map<std::string, std::string >\r
+/**\r
+       \brief An FCP message\r
+\r
+       FCP Messages are comprised of a name and zero or more field/value pairs.\r
+*/\r
+class Message\r
 {\r
 public:\r
-       FCPMessage() {};\r
-       FCPMessage(const std::string &name) {m_name=name;}\r
+       /**\r
+               \brief Default constructor\r
+       */\r
+       Message();\r
+       /**\r
+               \brief Construct message with a specific name\r
+\r
+               \param name The name of the message\r
+       */\r
+       Message(const std::string &name);\r
+       /**\r
+               \brief Construct message with a specific name and fields\r
 \r
-       const std::string GetName() const { return m_name; }\r
-       void SetName(const std::string &name) { m_name=name; }\r
+               The number of field/value pairs must match the fieldcount parameter.\r
+\r
+               \param name The name of the message\r
+               \param fieldcount The number of field/value pairs that follow\r
+       */\r
+       Message(const std::string &name, const int fieldcount, ...);\r
+\r
+       /**\r
+               \brief Gets the name of the message\r
+\r
+               \return The name of the message\r
+       */\r
+       const std::string &GetName() const                                                      { return m_name; }\r
+       /**\r
+               \brief Sets the name of the message\r
+\r
+               \param name The name of the message\r
+       */\r
+       void SetName(const std::string &name)                                           { m_name=name; }\r
+\r
+       /**\r
+               \brief Accesses the field/value pairs\r
+\r
+               \param field The field to access\r
+               \return Reference to the value of the field\r
+       */\r
+       std::string &operator[](const std::string &field)                       { return m_fields[field]; }\r
+\r
+       /**\r
+               \brief Non-const accessor for field map\r
+\r
+               \return field map\r
+       */\r
+       std::map<std::string,std::string> &GetFields()                          { return m_fields; }\r
+       /**\r
+               \brief Const accessor for field map\r
+\r
+               \return field map\r
+       */\r
+       const std::map<std::string,std::string> &GetFields() const      { return m_fields; }\r
+       \r
+       /**\r
+               \brief Clears the name and fields of the message\r
+       */\r
+       void Clear()                                                                                            { m_name=""; m_fields.clear(); }\r
+       \r
+       const bool operator==(const Message &rhs) const                         { return (m_name==rhs.m_name && m_fields==rhs.m_fields); }\r
+       const bool operator!=(const Message &rhs) const                         { return !(*this==rhs); }\r
+       const bool operator<(const Message &rhs) const                          { return (m_name<rhs.m_name || (m_name==rhs.m_name && m_fields<rhs.m_fields)); }\r
+       const bool operator<=(const Message &rhs) const                         { return (*this==rhs || *this<rhs); }\r
+       const bool operator>(const Message &rhs) const                          { return !(*this<=rhs); }\r
+       const bool operator>=(const Message &rhs) const                         { return !(*this<rhs); }\r
        \r
-       void Reset() { m_name=""; clear(); }\r
+       /**\r
+               \brief Gets the string representing this message in FCP\r
+\r
+               This string is what is actually sent/received from the node through FCP\r
+       */\r
+       const std::string GetFCPString() const;\r
+\r
+private:\r
 \r
-protected:\r
        std::string m_name;\r
+       std::map<std::string,std::string> m_fields;\r
+\r
 };\r
 \r
-class FCPv2\r
+/**\r
+       \brief An FCP connection to a Freenet node\r
+*/\r
+class Connection\r
 {\r
 public:\r
-       FCPv2();\r
-       ~FCPv2();\r
+       /**\r
+               \brief Default constructor\r
+       */\r
+       Connection();\r
+       /**\r
+               \brief Construct connection with an existing socket\r
+\r
+               \param sock An existing socket connection to a Freenet node\r
+       */\r
+       Connection(const int sock);\r
+       /**\r
+               \brief Default constructor\r
+\r
+               The deconstructor will close the connection if it is open\r
+       */\r
+       ~Connection();\r
+\r
+       /**\r
+               \brief Creates an FCP connection to a Freenet node\r
+\r
+               If the instaciated object has an existing connection open, it will be closed.\r
+\r
+               \param fcphost The IP Address, hostname, FQDN, or other resolvable name that points to the Freenet node\r
+               \param fcpport The port that the Freenet node is listening for FCP connections on\r
+               \return true if the connection was established, false if it was not\r
+       */\r
+       const bool Connect(const std::string &fcphost, const int fcpport);\r
+       /**\r
+               \brief Checks if the connection is currently connected\r
+\r
+               \return true if there is a connection, false if there is not\r
+       */\r
+       const bool IsConnected() const                                                          { return m_socket!=-1; }\r
+       /**\r
+               \brief Disconnects the connection\r
 \r
-       const bool Connect(const char *host, const int port);\r
+               \return always true\r
+       */\r
        const bool Disconnect();\r
+       \r
+       /**\r
+               \brief Sends and receives data on the connection\r
+\r
+               \param ms Maximum number of milliseconds to wait for the send and receive buffers to become available\r
+               \return true if the connection remains connected, false if the connection is disconnected\r
+       */\r
+       const bool Update(const unsigned long ms);\r
 \r
-       const bool Connected() const { return m_serversocket!=-1 ? true : false ; }\r
+       /**\r
+               \brief Checks if an FCP message is ready to be received\r
 \r
-       const bool Update(const long waittime);\r
+               \return true if an FCP message is ready to be received, false otherwise\r
+       */\r
+       const bool MessageReady() const;\r
+       \r
+       /**\r
+               \brief Gets the number of bytes on the receive buffer\r
 \r
-       const int SendMessage(const char *messagename, const int fieldcount, ...);\r
-       const int SendMessage(FCPMessage &message);\r
-       const int SendRaw(const char *data, const int datalen);\r
-       const std::vector<char>::size_type SendBufferSize()     const { return m_sendbuffer.size(); }\r
+               \return The number of bytes on the receive buffer\r
+       */\r
+       const std::vector<char>::size_type ReceiveBufferSize() const    { return m_receivebuffer.size(); }\r
+       /**\r
+               \brief Receives an FCP message\r
+               \r
+               \param[out] message The FCP message\r
+               \return true if an FCP message was received, false otherwise\r
+       */\r
+       const bool Receive(Message &message);\r
+       /**\r
+               \brief Receives raw data\r
+               \r
+               The received data is inserted at the end of the supplied vector\r
 \r
-       FCPMessage ReceiveMessage();\r
-       const long ReceiveRaw(char *data, long &datalen);       // data must be preallocated, with datalen being max length of data.  Returns length of data received\r
-       const std::vector<char>::size_type ReceiveBufferSize() const { return m_receivebuffer.size(); }\r
+               \param[out] data vector to place received data in\r
+               \param len number of bytes to receive\r
+               \return true if the bytes were received, false otherwise\r
+       */\r
+       const bool Receive(std::vector<char> &data, const std::vector<char>::size_type len);\r
+       /**\r
+               \brief Receives raw data\r
 \r
-private:\r
+               \param[out] data char array to place received data in\r
+               \param len number of bytes to receive\r
+               \return true if the bytes were received, false otherwise\r
+       */\r
+       const bool Receive(char *data, const size_t len);\r
+       /**\r
+               \brief Discards data on receive buffer\r
+\r
+               \param len The number of bytes on the receive buffer to discard\r
+               \return true if the bytes were discarded, false otherwise\r
+       */\r
+       const bool ReceiveIgnore(const size_t len);\r
        \r
-       void SocketReceive();\r
-       void SocketSend();\r
+       /**\r
+               \brief Gets the number of bytes waiting to be sent to the node\r
+\r
+               \return The number of bytes waiting to be sent to the node\r
+       */\r
+       const std::vector<char>::size_type SendBufferSize() const               { return m_sendbuffer.size(); }\r
+       /**\r
+               \brief Sends an FCP Message\r
+\r
+               \param message The Message to send\r
+               \return true if the Message was buffered for sending successfully, false otherwise\r
+       */\r
+       const bool Send(const Message &message);\r
+       /**\r
+               \brief Sends raw data\r
 \r
-       void SendBufferedText(const char *text);                // puts text on send buffer\r
-       void SendBufferedRaw(const char *data, const long len); // puts raw data on send buffer\r
+               \param data A vector of the data to send\r
+               \return true if the data was buffered for sending successfully, false otherwise\r
+       */\r
+       const bool Send(const std::vector<char> &data);\r
+       /**\r
+               \brief Sends raw data\r
 \r
-       int FindOnReceiveBuffer(const char *text);              // finds text string on receive buffer and returns index to first char position, -1 if not found\r
+               \param data A char array of data to send\r
+               \param len The number of bytes on the array to send\r
+               \return true if the data was buffered for sending successfully, false otherwise\r
+       */\r
+       const bool Send(const char *data, const size_t len);\r
 \r
+       /**\r
+               \brief Gets the socket identifier of the connection\r
+\r
+               \return The socket identifier.  It will be -1 if the socket is invalid.\r
+       */\r
+       const int Socket()                                                                                              { return m_socket; }\r
+       \r
+       /**\r
+               \brief Waits until the receive buffer contains a specified number of bytes\r
+               \r
+               This will continuously call Update until either the specific number of bytes have been received,\r
+               or the connection becomes disconnected\r
+               \r
+               \param ms The number of milliseconds for each call to Update\r
+               \param len The number of bytes to wait for\r
+               \return true if the number of bytes is waiting on the receive buffer, false if the connection was closed\r
+       */\r
+       const bool WaitForBytes(const unsigned long ms, const size_t len);\r
+\r
+private:\r
+       // can't be copied\r
+       Connection(const Connection &connection);\r
+       Connection &operator=(const Connection &connection);\r
+\r
+       const bool MessageReady(std::vector<char>::const_iterator &endpos, std::vector<char>::size_type &endlen) const;\r
+       const bool MessageReady(std::vector<char>::iterator &endpos, std::vector<char>::size_type &endlen);\r
+       void Split(const std::string &str, const std::string &separators, std::vector<std::string> &elements);\r
+\r
+       void DoSend();\r
+       void DoReceive();\r
 \r
 #ifdef _WIN32\r
        static bool m_wsastartup;\r
 #endif\r
 \r
-       int m_serversocket;\r
-\r
-       char *m_tempbuffer;                     // temp buffer used for recv\r
-\r
-       std::vector<char> m_sendbuffer;\r
+       int m_socket;\r
        std::vector<char> m_receivebuffer;\r
-\r
+       std::vector<char> m_sendbuffer;\r
+       std::vector<char> m_tempbuffer;\r
        fd_set m_readfs;\r
        fd_set m_writefs;\r
        struct timeval m_timeval;\r
-\r
+       \r
 };\r
 \r
-#endif // _fcpv2_\r
+}      // namespace\r
+\r
+#endif // _fcpv2_connection_\r
index c02b0ea..6ac76bd 100644 (file)
@@ -7,12 +7,12 @@ class FileInserter:public IIndexInserter<long>
 {\r
 public:\r
        FileInserter();\r
-       FileInserter(FCPv2 *fcp);\r
+       FileInserter(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
-       const bool HandlePutSuccessful(FCPMessage &message);\r
-       const bool HandlePutFailed(FCPMessage &message);\r
+       const bool HandlePutSuccessful(FCPv2::Message &message);\r
+       const bool HandlePutFailed(FCPv2::Message &message);\r
        const bool StartInsert(const long &fileinsertid);\r
        void CheckForNeededInsert();\r
 \r
index 6a6d5f7..afe18ca 100644 (file)
@@ -14,19 +14,19 @@ class FMSVersionRequester:public IFreenetRegistrable,public IFCPConnected,public
 {\r
 public:\r
        FMSVersionRequester();\r
-       FMSVersionRequester(FCPv2 *fcp);\r
+       FMSVersionRequester(FCPv2::Connection *fcp);\r
 \r
        void FCPConnected()                     {}\r
        void FCPDisconnected()          {}\r
-       const bool HandleMessage(FCPMessage &message);\r
+       const bool HandleMessage(FCPv2::Message &message);\r
 \r
        void Process();\r
 \r
        void RegisterWithThread(FreenetMasterThread *thread);\r
 \r
 private:\r
-       const bool HandleAllData(FCPMessage &message);\r
-       const bool HandleGetFailed(FCPMessage &message);\r
+       const bool HandleAllData(FCPv2::Message &message);\r
+       const bool HandleGetFailed(FCPv2::Message &message);\r
        void Initialize();\r
        void StartRequest();\r
 \r
index f604fde..3e9cae5 100644 (file)
@@ -18,7 +18,7 @@ public:
        FreenetMasterThread();\r
        ~FreenetMasterThread();\r
        \r
-       const bool HandleMessage(FCPMessage &message);\r
+       const bool HandleMessage(FCPv2::Message &message);\r
 \r
        void run();\r
 \r
@@ -34,7 +34,7 @@ private:
 \r
        std::string m_fcphost;\r
        int m_fcpport;\r
-       FCPv2 m_fcp;\r
+       FCPv2::Connection m_fcp;\r
        std::vector<IFreenetRegistrable *> m_registrables;\r
        std::vector<IPeriodicProcessor *> m_processors;\r
        std::vector<IFCPConnected *> m_fcpconnected;\r
index e0e974d..1170e99 100644 (file)
@@ -14,12 +14,12 @@ class IdentityInserter:public IFreenetRegistrable,public IFCPConnected,public IF
 {\r
 public:\r
        IdentityInserter();\r
-       IdentityInserter(FCPv2 *fcp);\r
+       IdentityInserter(FCPv2::Connection *fcp);\r
 \r
        void FCPConnected();\r
        void FCPDisconnected();\r
 \r
-       const bool HandleMessage(FCPMessage &message);\r
+       const bool HandleMessage(FCPv2::Message &message);\r
 \r
        void Process();\r
 \r
index 17c3728..77f2bba 100644 (file)
@@ -14,12 +14,12 @@ class IdentityIntroductionInserter:public IFreenetRegistrable,public IFCPConnect
 {\r
 public:\r
        IdentityIntroductionInserter();\r
-       IdentityIntroductionInserter(FCPv2 *fcp);\r
+       IdentityIntroductionInserter(FCPv2::Connection *fcp);\r
 \r
        void FCPConnected();\r
        void FCPDisconnected();\r
 \r
-       const bool HandleMessage(FCPMessage &message);\r
+       const bool HandleMessage(FCPv2::Message &message);\r
 \r
        void Process();\r
 \r
index f6dac85..cd66727 100644 (file)
@@ -14,11 +14,11 @@ class IdentityIntroductionRequester:public IFreenetRegistrable,public IFCPConnec
 {\r
 public:\r
        IdentityIntroductionRequester();\r
-       IdentityIntroductionRequester(FCPv2 *fcp);\r
+       IdentityIntroductionRequester(FCPv2::Connection *fcp);\r
 \r
        void FCPDisconnected();\r
        void FCPConnected();\r
-       const bool HandleMessage(FCPMessage &message);\r
+       const bool HandleMessage(FCPv2::Message &message);\r
 \r
        void Process();\r
 \r
@@ -30,8 +30,8 @@ private:
        void StartRequest(const std::string &UUID);\r
        void PopulateIDList();\r
        void RemoveFromRequestList(const std::string &UUID);\r
-       const bool HandleGetFailed(FCPMessage &message);\r
-       const bool HandleAllData(FCPMessage &message);\r
+       const bool HandleGetFailed(FCPv2::Message &message);\r
+       const bool HandleAllData(FCPv2::Message &message);\r
 \r
        Poco::DateTime m_tempdate;\r
        std::map<long,bool> m_ids;\r
index b371d11..0b70abd 100644 (file)
@@ -7,14 +7,14 @@ class IdentityRequester:public IIndexRequester<long>
 {\r
 public:\r
        IdentityRequester();\r
-       IdentityRequester(FCPv2 *fcp);\r
+       IdentityRequester(FCPv2::Connection *fcp);\r
 \r
 private:\r
        virtual void Initialize();\r
        virtual void PopulateIDList();                          // clear and re-populate m_ids with identities we want to query\r
        void StartRequest(const long &identityid);\r
-       const bool HandleAllData(FCPMessage &message);\r
-       const bool HandleGetFailed(FCPMessage &message);\r
+       const bool HandleAllData(FCPv2::Message &message);\r
+       const bool HandleGetFailed(FCPv2::Message &message);\r
 \r
 };\r
 \r
index 19bea17..9ecf015 100644 (file)
@@ -10,10 +10,10 @@ class IFCPConnected
 {\r
 public:\r
        IFCPConnected():m_fcp(NULL) {}\r
-       IFCPConnected(FCPv2 *fcp):m_fcp(fcp)    {}\r
+       IFCPConnected(FCPv2::Connection *fcp):m_fcp(fcp)        {}\r
        \r
-       virtual void SetFCPConnection(FCPv2 *fcp)       { m_fcp=fcp; }\r
-       virtual FCPv2 *GetFCPConnection()                       { return m_fcp; }\r
+       virtual void SetFCPConnection(FCPv2::Connection *fcp)   { m_fcp=fcp; }\r
+       virtual FCPv2::Connection *GetFCPConnection()                   { return m_fcp; }\r
        \r
        /**\r
                \brief called when the FCP connection becomes disconnected\r
@@ -29,7 +29,7 @@ public:
        virtual void FCPConnected()=0;\r
        \r
 protected:\r
-       FCPv2 *m_fcp;\r
+       FCPv2::Connection *m_fcp;\r
 };\r
 \r
 #endif // _ifcpconnected_\r
index 01525d7..30147ba 100644 (file)
@@ -14,7 +14,7 @@ public:
                \param message FCP message to handle\r
                \return true if the message was handled, false if it was not\r
        */\r
-       virtual const bool HandleMessage(FCPMessage &message)=0;\r
+       virtual const bool HandleMessage(FCPv2::Message &message)=0;\r
 };\r
 \r
 #endif // _ifcpmessagehandler_\r
index ba5c988..fb65b0e 100644 (file)
@@ -23,12 +23,12 @@ class IIndexInserter:public IFreenetRegistrable,public IFCPConnected,public IFCP
 {\r
 public:\r
        IIndexInserter();\r
-       IIndexInserter(FCPv2 *fcp);\r
+       IIndexInserter(FCPv2::Connection *fcp);\r
        virtual ~IIndexInserter()               {}\r
 \r
        virtual void FCPConnected();\r
        virtual void FCPDisconnected();\r
-       virtual const bool HandleMessage(FCPMessage &message);\r
+       virtual const bool HandleMessage(FCPv2::Message &message);\r
 \r
        virtual void Process();\r
 \r
@@ -37,8 +37,8 @@ public:
 protected:\r
        void InitializeIIndexInserter();\r
        virtual void Initialize()=0;            // initialize m_fcpuniquename\r
-       virtual const bool HandlePutSuccessful(FCPMessage &message)=0;\r
-       virtual const bool HandlePutFailed(FCPMessage &message)=0;\r
+       virtual const bool HandlePutSuccessful(FCPv2::Message &message)=0;\r
+       virtual const bool HandlePutFailed(FCPv2::Message &message)=0;\r
        virtual const bool StartInsert(const IDTYPE &id)=0;\r
        virtual void CheckForNeededInsert()=0;\r
        virtual void RemoveFromInsertList(const IDTYPE id);\r
@@ -58,7 +58,7 @@ IIndexInserter<IDTYPE>::IIndexInserter()
 }\r
 \r
 template <class IDTYPE>\r
-IIndexInserter<IDTYPE>::IIndexInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
+IIndexInserter<IDTYPE>::IIndexInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
 {\r
        InitializeIIndexInserter();\r
 }\r
@@ -86,7 +86,7 @@ void IIndexInserter<IDTYPE>::FCPDisconnected()
 }\r
 \r
 template <class IDTYPE>\r
-const bool IIndexInserter<IDTYPE>::HandleMessage(FCPMessage &message)\r
+const bool IIndexInserter<IDTYPE>::HandleMessage(FCPv2::Message &message)\r
 {\r
 \r
        if(message["Identifier"].find(m_fcpuniquename)==0)\r
index 6173868..37dcdda 100644 (file)
@@ -25,12 +25,12 @@ class IIndexRequester:public IFreenetRegistrable,public IFCPConnected,public IFC
 {\r
 public:\r
        IIndexRequester();\r
-       IIndexRequester(FCPv2 *fcp);\r
+       IIndexRequester(FCPv2::Connection *fcp);\r
        virtual ~IIndexRequester()              {}\r
 \r
        virtual void FCPConnected();\r
        virtual void FCPDisconnected();\r
-       virtual const bool HandleMessage(FCPMessage &message);\r
+       virtual const bool HandleMessage(FCPv2::Message &message);\r
 \r
        virtual void Process();\r
 \r
@@ -41,8 +41,8 @@ protected:
        virtual void Initialize()=0;            // initialize m_maxrequests and m_fcpuniquename\r
        virtual void PopulateIDList()=0;\r
        virtual void StartRequest(const IDTYPE &id)=0;\r
-       virtual const bool HandleAllData(FCPMessage &message)=0;\r
-       virtual const bool HandleGetFailed(FCPMessage &message)=0;\r
+       virtual const bool HandleAllData(FCPv2::Message &message)=0;\r
+       virtual const bool HandleGetFailed(FCPv2::Message &message)=0;\r
        virtual void RemoveFromRequestList(const IDTYPE id);\r
 \r
        Poco::DateTime m_tempdate;\r
@@ -65,7 +65,7 @@ IIndexRequester<IDTYPE>::IIndexRequester()
 }\r
 \r
 template <class IDTYPE>\r
-IIndexRequester<IDTYPE>::IIndexRequester(FCPv2 *fcp):IFCPConnected(fcp)\r
+IIndexRequester<IDTYPE>::IIndexRequester(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
 {\r
        InitializeIIndexRequester();\r
 }\r
@@ -100,7 +100,7 @@ void IIndexRequester<IDTYPE>::FCPDisconnected()
 }\r
 \r
 template <class IDTYPE>\r
-const bool IIndexRequester<IDTYPE>::HandleMessage(FCPMessage &message)\r
+const bool IIndexRequester<IDTYPE>::HandleMessage(FCPv2::Message &message)\r
 {\r
 \r
        if(message["Identifier"].find(m_fcpuniquename)==0)\r
@@ -210,14 +210,6 @@ void IIndexRequester<IDTYPE>::RegisterWithThread(FreenetMasterThread *thread)
 template <class IDTYPE>\r
 void IIndexRequester<IDTYPE>::RemoveFromRequestList(const IDTYPE id)\r
 {\r
-/*\r
-       typename std::vector<IDTYPE>::iterator i=m_requesting.begin();\r
-       while(i!=m_requesting.end() && (*i)!=id)\r
-       {\r
-               i++;\r
-       }\r
-*/\r
-       // better\r
        typename std::vector<IDTYPE>::iterator i=std::find(m_requesting.begin(),m_requesting.end(),id);\r
 \r
        if(i!=m_requesting.end())\r
index 8891fec..f7787a9 100644 (file)
@@ -9,7 +9,7 @@ class InactiveMessageListRequester:public MessageListRequester
 {\r
 public:\r
        InactiveMessageListRequester();\r
-       InactiveMessageListRequester(FCPv2 *fcp);\r
+       InactiveMessageListRequester(FCPv2::Connection *fcp);\r
 \r
 private:\r
        virtual void Initialize();\r
index 9cd88e3..a65d96d 100644 (file)
@@ -10,15 +10,15 @@ class IntroductionPuzzleInserter:public IIndexInserter<long>
 {\r
 public:\r
        IntroductionPuzzleInserter();\r
-       IntroductionPuzzleInserter(FCPv2 *fcp);\r
+       IntroductionPuzzleInserter(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
        void CheckForNeededInsert();\r
        const bool StartInsert(const long &localidentityid);\r
        void GenerateCaptcha(std::string &encodeddata, std::string &solution);\r
-       const bool HandlePutSuccessful(FCPMessage &message);\r
-       const bool HandlePutFailed(FCPMessage &message);\r
+       const bool HandlePutSuccessful(FCPv2::Message &message);\r
+       const bool HandlePutFailed(FCPv2::Message &message);\r
 \r
        Poco::DateTime m_lastchecked;\r
        int m_maxpuzzleinserts;\r
index dc24327..e2ca076 100644 (file)
@@ -9,14 +9,14 @@ class IntroductionPuzzleRequester:public IIndexRequester<long>
 {\r
 public:\r
        IntroductionPuzzleRequester();\r
-       IntroductionPuzzleRequester(FCPv2 *fcp);\r
+       IntroductionPuzzleRequester(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
        void StartRequest(const long &identityid);\r
        void PopulateIDList();                          // clear and re-populate m_ids with identities we want to query\r
-       const bool HandleAllData(FCPMessage &message);\r
-       const bool HandleGetFailed(FCPMessage &message);\r
+       const bool HandleAllData(FCPv2::Message &message);\r
+       const bool HandleGetFailed(FCPv2::Message &message);\r
 \r
 };\r
 \r
index a73813e..04d6169 100644 (file)
@@ -8,12 +8,12 @@ class MessageInserter:public IIndexInserter<std::string>
 {\r
 public:\r
        MessageInserter();\r
-       MessageInserter(FCPv2 *fcp);\r
+       MessageInserter(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
-       const bool HandlePutSuccessful(FCPMessage &message);\r
-       const bool HandlePutFailed(FCPMessage &message);\r
+       const bool HandlePutSuccessful(FCPv2::Message &message);\r
+       const bool HandlePutFailed(FCPv2::Message &message);\r
        const bool StartInsert(const std::string &messageuuid);\r
        void CheckForNeededInsert();\r
 \r
index 8658960..4afed68 100644 (file)
@@ -7,12 +7,12 @@ class MessageListInserter:public IIndexInserter<long>
 {\r
 public:\r
        MessageListInserter();\r
-       MessageListInserter(FCPv2 *fcp);\r
+       MessageListInserter(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
-       const bool HandlePutSuccessful(FCPMessage &message);\r
-       const bool HandlePutFailed(FCPMessage &message);\r
+       const bool HandlePutSuccessful(FCPv2::Message &message);\r
+       const bool HandlePutFailed(FCPv2::Message &message);\r
        const bool StartInsert(const long &localidentityid);\r
        void CheckForNeededInsert();\r
 \r
index ccd463c..1b324e2 100644 (file)
@@ -9,15 +9,15 @@ class MessageListRequester:public IIndexRequester<long>
 {\r
 public:\r
        MessageListRequester();\r
-       MessageListRequester(FCPv2 *fcp);\r
+       MessageListRequester(FCPv2::Connection *fcp);\r
 \r
 private:\r
        virtual void Initialize();\r
        virtual void PopulateIDList();\r
        void StartRequest(const long &id);\r
-       void StartRedirectRequest(FCPMessage &message);\r
-       const bool HandleAllData(FCPMessage &message);\r
-       const bool HandleGetFailed(FCPMessage &message);\r
+       void StartRedirectRequest(FCPv2::Message &message);\r
+       const bool HandleAllData(FCPv2::Message &message);\r
+       const bool HandleGetFailed(FCPv2::Message &message);\r
        void GetBoardList(std::map<std::string,bool> &boards);\r
        const bool CheckDateNotFuture(const std::string &datestr) const;\r
        const bool CheckDateWithinMaxDays(const std::string &datestr) const;\r
index d458ccb..76feb71 100644 (file)
@@ -7,14 +7,14 @@ class MessageRequester:public IIndexRequester<std::string>
 {\r
 public:\r
        MessageRequester();\r
-       MessageRequester(FCPv2 *fcp);\r
+       MessageRequester(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
        void PopulateIDList();\r
        void StartRequest(const std::string &requestid);\r
-       const bool HandleAllData(FCPMessage &message);\r
-       const bool HandleGetFailed(FCPMessage &message);\r
+       const bool HandleAllData(FCPv2::Message &message);\r
+       const bool HandleGetFailed(FCPv2::Message &message);\r
 \r
        const long GetBoardID(const std::string &boardname, const std::string &identityname);\r
        const bool SaveToBoard(const std::string &boardname);\r
index a24f3a5..5c17e79 100644 (file)
@@ -7,12 +7,12 @@ class SiteInserter:public IIndexInserter<long>
 {\r
 public:\r
        SiteInserter();\r
-       SiteInserter(FCPv2 *fcp);\r
+       SiteInserter(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
-       const bool HandlePutSuccessful(FCPMessage &message);\r
-       const bool HandlePutFailed(FCPMessage &message);\r
+       const bool HandlePutSuccessful(FCPv2::Message &message);\r
+       const bool HandlePutFailed(FCPv2::Message &message);\r
        const bool StartInsert(const long &localidentityid);\r
        void CheckForNeededInsert();\r
        const std::string SanitizeOutput(const std::string &input);\r
index 6c5003a..26cdd52 100644 (file)
@@ -14,12 +14,12 @@ class TrustListInserter:public IFreenetRegistrable,public IFCPConnected,public I
 {\r
 public:\r
        TrustListInserter();\r
-       TrustListInserter(FCPv2 *fcp);\r
+       TrustListInserter(FCPv2::Connection *fcp);\r
 \r
        void FCPConnected();\r
        void FCPDisconnected();\r
 \r
-       const bool HandleMessage(FCPMessage &message);\r
+       const bool HandleMessage(FCPv2::Message &message);\r
 \r
        void Process();\r
 \r
index 516f3f5..0bbf69f 100644 (file)
@@ -7,14 +7,14 @@ class TrustListRequester:public IIndexRequester<long>//public IFreenetRegistrabl
 {\r
 public:\r
        TrustListRequester();\r
-       TrustListRequester(FCPv2 *fcp);\r
+       TrustListRequester(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
        void PopulateIDList();                          // clear and re-populate m_ids with identities we want to query\r
        void StartRequest(const long &identityid);\r
-       const bool HandleAllData(FCPMessage &message);\r
-       const bool HandleGetFailed(FCPMessage &message);\r
+       const bool HandleAllData(FCPv2::Message &message);\r
+       const bool HandleGetFailed(FCPv2::Message &message);\r
 \r
 };\r
 \r
index d0db037..054a95d 100644 (file)
@@ -18,9 +18,9 @@ class UnkeyedIDCreator:public IFreenetRegistrable,public IFCPConnected,public IF
 {\r
 public:\r
        UnkeyedIDCreator();\r
-       UnkeyedIDCreator(FCPv2 *fcp);\r
+       UnkeyedIDCreator(FCPv2::Connection *fcp);\r
 \r
-       const bool HandleMessage(FCPMessage &message);\r
+       const bool HandleMessage(FCPv2::Message &message);\r
 \r
        void FCPDisconnected();\r
        void FCPConnected();\r
index 883f183..67c8372 100644 (file)
@@ -7,7 +7,7 @@ class UnknownIdentityRequester:public IdentityRequester
 {\r
 public:\r
        UnknownIdentityRequester();\r
-       UnknownIdentityRequester(FCPv2 *fcp);\r
+       UnknownIdentityRequester(FCPv2::Connection *fcp);\r
 \r
 private:\r
        void Initialize();\r
index e453851..eb0deae 100644 (file)
@@ -7,10 +7,10 @@
 \r
 #define VERSION_MAJOR          "0"\r
 #define VERSION_MINOR          "3"\r
-#define VERSION_RELEASE                "27"\r
+#define VERSION_RELEASE                "28"\r
 #define FMS_VERSION                    VERSION_MAJOR"."VERSION_MINOR"."VERSION_RELEASE\r
-#define FMS_FREESITE_USK       "USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/89/"\r
-#define FMS_VERSION_EDITION    "29"\r
+#define FMS_FREESITE_USK       "USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/90/"\r
+#define FMS_VERSION_EDITION    "30"\r
 \r
 typedef Poco::ScopedLock<Poco::FastMutex> Guard;\r
 \r
index 1f2d31c..0194b02 100644 (file)
@@ -12,7 +12,7 @@ public:
 private:\r
 \r
        static std::wstring m_unicodenewline;\r
-       static wchar_t m_unicodewhitespace[];\r
+       static std::wstring::value_type m_unicodewhitespace[];\r
 \r
 };\r
 \r
index 2ebe864..d5eb77d 100644 (file)
@@ -15,7 +15,7 @@ namespace UTFConversion
 {\r
 \r
 // UTF-8 byte sequence to UTF-16 or UTF-32, depending on size of wchar_t\r
-const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring);\r
+const bool FromUTF8(const std::vector<std::string::value_type> &utf8string, std::wstring &wcstring);\r
 const bool FromUTF8(const std::string &utf8string, std::wstring &wcstring);\r
 // UTF-16 or UTF-32 to UTF-8 byte sequence\r
 const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string);\r
index 4968c47..5e5cf8c 100644 (file)
@@ -7,13 +7,13 @@ To compile, run these commands from the source directory:
 cmake -D I_HAVE_READ_THE_README=ON .\r
 make\r
 \r
-If you want to use the bundled SQLite3 library, add a -D USE_BUNDLED_SQLITE=ON\r
-to the cmake command.  Use of the bundled SQLite3 library is on by default when\r
-compiling on a Mac.  To turn off charset conversion to UTF-8 when sending\r
-messages, add a -D DO_CHARSET_CONVERSION=OFF.  Compiling with charset\r
-conversion turned on is recommended.  If you would like to compile using the\r
-alternate captchas, add a -D ALTERNATE_CAPTCHA=ON to the cmake command line.\r
-This option requires the FreeImage library to be installed.\r
+Compiling with the bundled SQLite library is on by default.  If you do not want\r
+to use the bundled SQLite library, add a -D USE_BUNDLED_SQLITE=OFF to the cmake\r
+command.  To turn off charset conversion to UTF-8 when sending messages, add a\r
+-D DO_CHARSET_CONVERSION=OFF.  Compiling with charset conversion turned on is\r
+recommended.  If you would like to compile using the alternate captchas, add a\r
+-D ALTERNATE_CAPTCHA=ON to the cmake command line. This option requires the\r
+FreeImage library to be installed.\r
 \r
 UPGRADING\r
 ---------\r
@@ -42,6 +42,11 @@ argument when installing the service to set the service name to whatever you
 want.  You will need to manually start the service unless you change the\r
 startup type in the service properties.\r
 \r
+FMS must run a good portion of the day every day to work properly.  The slower\r
+your Freenet connection is, the longer FMS must be run to find the\r
+communications of other identities.  You will not have a good experience only\r
+running FMS a few hours a day.\r
+\r
 If you are experiencing a problem with FMS that you can't solve, and you've\r
 already rebooted your machine, restarted FMS, and have reproduced the problem\r
 with a brand new database, follow these instructions.  Set the logging option\r
index 69ca362..a3b9b22 100644 (file)
@@ -14,7 +14,7 @@ BoardListInserter::BoardListInserter()
        Initialize();\r
 }\r
 \r
-BoardListInserter::BoardListInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
+BoardListInserter::BoardListInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -45,7 +45,7 @@ void BoardListInserter::CheckForNeededInsert()
        }\r
 }\r
 \r
-const bool BoardListInserter::HandlePutFailed(FCPMessage &message)\r
+const bool BoardListInserter::HandlePutFailed(FCPv2::Message &message)\r
 {\r
        std::vector<std::string> idparts;\r
        long localidentityid;\r
@@ -69,7 +69,7 @@ const bool BoardListInserter::HandlePutFailed(FCPMessage &message)
        return true;\r
 }\r
 \r
-const bool BoardListInserter::HandlePutSuccessful(FCPMessage &message)\r
+const bool BoardListInserter::HandlePutSuccessful(FCPv2::Message &message)\r
 {\r
        Poco::DateTime now;\r
        std::vector<std::string> idparts;\r
@@ -108,7 +108,7 @@ const bool BoardListInserter::StartInsert(const long &localidentityid)
        Poco::DateTime daysback;\r
        Poco::DateTime now;\r
        BoardListXML xml;\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string data;\r
        std::string datasizestr;\r
        std::string privatekey="";\r
@@ -172,8 +172,8 @@ const bool BoardListInserter::StartInsert(const long &localidentityid)
        message["Identifier"]=m_fcpuniquename+"|"+localidentityidstr+"|"+indexstr+"|"+message["URI"];\r
        message["UploadFrom"]="direct";\r
        message["DataLength"]=datasizestr;\r
-       m_fcp->SendMessage(message);\r
-       m_fcp->SendRaw(data.c_str(),data.size());\r
+       m_fcp->Send(message);\r
+       m_fcp->Send(std::vector<char>(data.begin(),data.end()));\r
 \r
        m_inserting.push_back(localidentityid);\r
 \r
index abcc473..21e82b7 100644 (file)
@@ -13,7 +13,7 @@ BoardListRequester::BoardListRequester()
        Initialize();\r
 }\r
 \r
-BoardListRequester::BoardListRequester(FCPv2 *fcp):IIndexRequester<long>(fcp)\r
+BoardListRequester::BoardListRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -48,7 +48,7 @@ std::string BoardListRequester::GetIdentityName(const long identityid)
        }\r
 }\r
 \r
-const bool BoardListRequester::HandleAllData(FCPMessage &message)\r
+const bool BoardListRequester::HandleAllData(FCPv2::Message &message)\r
 {      \r
        Poco::DateTime now;\r
        SQLite3DB::Statement st;\r
@@ -68,23 +68,16 @@ const bool BoardListRequester::HandleAllData(FCPMessage &message)
        identityname=GetIdentityName(identityid);\r
 \r
        // wait for all data to be received from connection\r
-       while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()<datalength)\r
-       {\r
-               m_fcp->Update(1);\r
-       }\r
+       m_fcp->WaitForBytes(1000,datalength);\r
 \r
        // if we got disconnected- return immediately\r
-       if(m_fcp->Connected()==false)\r
+       if(m_fcp->IsConnected()==false)\r
        {\r
                return false;\r
        }\r
 \r
        // receive the file\r
-       data.resize(datalength);\r
-       if(data.size()>0)\r
-       {\r
-               m_fcp->ReceiveRaw(&data[0],datalength);\r
-       }\r
+       m_fcp->Receive(data,datalength);\r
 \r
        // parse file into xml and update the database\r
        if(data.size()>0 && xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
@@ -163,7 +156,7 @@ const bool BoardListRequester::HandleAllData(FCPMessage &message)
 \r
 }\r
 \r
-const bool BoardListRequester::HandleGetFailed(FCPMessage &message)\r
+const bool BoardListRequester::HandleGetFailed(FCPv2::Message &message)\r
 {\r
        SQLite3DB::Statement st;\r
        std::vector<std::string> idparts;\r
@@ -264,7 +257,7 @@ void BoardListRequester::PopulateIDList()
 void BoardListRequester::StartRequest(const long &identityid)\r
 {\r
        Poco::DateTime now;\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string publickey;\r
        std::string indexstr;\r
        int index;\r
@@ -303,7 +296,7 @@ void BoardListRequester::StartRequest(const long &identityid)
                message["ReturnType"]="direct";\r
                message["MaxSize"]="100000";                    // 100 KB\r
 \r
-               m_fcp->SendMessage(message);\r
+               m_fcp->Send(message);\r
 \r
                m_requesting.push_back(identityid);\r
 \r
index 16a7348..ecd81e7 100644 (file)
@@ -1,8 +1,8 @@
 #include "../../include/freenet/fcpv2.h"\r
-#include <cstdio>\r
-#include <cstdarg>\r
+\r
 #include <sstream>\r
-#include <cstring>\r
+#include <algorithm>\r
+#include <cstdarg>\r
 \r
 #ifdef _WIN32\r
        #include <ws2tcpip.h>\r
        #include <netinet/in.h>\r
 #endif\r
 \r
-/* XMEM doesn't play nice with strtok - should replace strtok with something else anyway\r
-#ifdef XMEM\r
-       #include <xmem.h>\r
-#endif\r
+namespace FCPv2\r
+{\r
+\r
+/*\r
+\r
+       Message Methods\r
+\r
 */\r
 \r
-#ifdef _WIN32\r
-       bool FCPv2::m_wsastartup=false;\r
-#endif\r
+Message::Message():m_name("")\r
+{\r
 \r
+}\r
 \r
+Message::Message(const std::string &name):m_name(name)\r
+{\r
+       \r
+}\r
 \r
-FCPv2::FCPv2()\r
+Message::Message(const std::string &name, const int fieldcount, ...):m_name(name)\r
+{\r
+       const char *field=0;\r
+       const char *val=0;\r
+       va_list args;\r
+       va_start(args,fieldcount);\r
+\r
+       for(int i=0; i<fieldcount; i++)\r
+       {\r
+               field=va_arg(args,const char *);\r
+               val=va_arg(args,const char *);\r
+\r
+               if(field && val)\r
+               {\r
+                       m_fields[field]=val;\r
+               }\r
+       }\r
+\r
+       va_end(args);\r
+\r
+}\r
+\r
+const std::string Message::GetFCPString() const\r
+{\r
+       std::string rval=m_name;\r
+       rval+="\r\n";\r
+       for(std::map<std::string,std::string>::const_iterator i=m_fields.begin(); i!=m_fields.end(); i++)\r
+       {\r
+               rval+=(*i).first;\r
+               rval+="="+(*i).second;\r
+               rval+="\n";\r
+       }\r
+       if(m_name=="AllData")\r
+       {\r
+               rval+="Data\n";\r
+       }\r
+       else\r
+       {\r
+               rval+="EndMessage\n";\r
+       }\r
+       return rval;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+/*\r
+       \r
+       Connection Methods\r
+\r
+*/\r
+\r
+#ifdef _WIN32\r
+       bool Connection::m_wsastartup=false;\r
+#endif\r
+\r
+Connection::Connection():m_socket(-1),m_tempbuffer(65535,0)\r
 {\r
 #ifdef _WIN32\r
        if(m_wsastartup==false)\r
@@ -33,68 +97,66 @@ FCPv2::FCPv2()
                m_wsastartup=true;\r
        }\r
 #endif\r
-\r
-       // initialize socket to server\r
-       m_serversocket=-1;\r
-\r
-       // initialize buffers\r
-       m_tempbuffer=new char[65535];\r
-\r
 }\r
 \r
+Connection::Connection(const int sock):m_socket(sock),m_tempbuffer(65535,0)\r
+{\r
+#ifdef _WIN32\r
+       if(m_wsastartup==false)\r
+       {\r
+               WSAData wsadata;\r
+               WSAStartup(MAKEWORD(2,2),&wsadata);\r
+               m_wsastartup=true;\r
+       }\r
+#endif\r
+}\r
 \r
-FCPv2::~FCPv2()\r
+Connection::~Connection()\r
 {\r
        Disconnect();\r
 #ifdef _WIN32\r
        WSACleanup();\r
 #endif\r
-\r
-       delete [] m_tempbuffer;\r
-\r
 }\r
 \r
-\r
-const bool FCPv2::Connect(const char *host, const int port)\r
+const bool Connection::Connect(const std::string &fcphost, const int fcpport)\r
 {\r
-       // disconnect socket to server if it is currently open\r
-       if(Connected())\r
+\r
+       m_sendbuffer.clear();\r
+       m_receivebuffer.clear();\r
+\r
+       if(IsConnected()==true)\r
        {\r
                Disconnect();\r
        }\r
 \r
        int rval=-1;\r
-       struct sockaddr_storage m_serveraddr;\r
-\r
        std::ostringstream portstring;\r
        addrinfo hint,*result,*current;\r
-       result=NULL;\r
-       portstring << port;\r
 \r
-       memset(&hint,0,sizeof(addrinfo));\r
+       result=current=0;\r
+       portstring << fcpport;\r
+       std::memset(&hint,0,sizeof(hint));\r
        hint.ai_socktype=SOCK_STREAM;\r
-       rval=getaddrinfo(host,portstring.str().c_str(),&hint,&result);\r
 \r
-       // erase any data in buffers\r
-       m_sendbuffer.clear();\r
-       m_receivebuffer.clear();\r
+       rval=getaddrinfo(fcphost.c_str(),portstring.str().c_str(),&hint,&result);\r
 \r
        if(result)\r
        {\r
-               for(current=result; current!=NULL && m_serversocket==-1; current=current->ai_next)\r
+               for(current=result; current!=0 && m_socket==-1; current=current->ai_next)\r
                {\r
-                       memset(&m_serveraddr,0,sizeof(struct sockaddr_storage));\r
 \r
-                       m_serversocket=socket(current->ai_family,current->ai_socktype,current->ai_protocol);\r
+                       m_socket=socket(current->ai_family,current->ai_socktype,current->ai_protocol);\r
 \r
-                       if(m_serversocket!=-1)\r
+                       if(m_socket!=-1)\r
                        {\r
-                               rval=connect(m_serversocket,current->ai_addr,current->ai_addrlen);\r
+                               rval=connect(m_socket,current->ai_addr,current->ai_addrlen);\r
                                if(rval==-1)\r
                                {\r
                                        Disconnect();\r
                                }\r
                        }\r
+\r
                }\r
 \r
                freeaddrinfo(result);\r
@@ -111,333 +173,293 @@ const bool FCPv2::Connect(const char *host, const int port)
 \r
 }\r
 \r
-const bool FCPv2::Disconnect()\r
+const bool Connection::Disconnect()\r
 {\r
-       if(Connected())\r
+       m_sendbuffer.clear();\r
+       m_receivebuffer.clear();\r
+       if(IsConnected())\r
        {\r
        #ifdef _WIN32\r
-               closesocket(m_serversocket);\r
+               closesocket(m_socket);\r
        #else\r
-               close(m_serversocket);\r
+               close(m_socket);\r
        #endif\r
-               m_serversocket=-1;\r
+               m_socket=-1;\r
        }\r
        return true;\r
 }\r
 \r
-int FCPv2::FindOnReceiveBuffer(const char *text)\r
+void Connection::DoReceive()\r
 {\r
-       bool found;\r
-       std::vector<char>::size_type i,j;\r
-       size_t tlen=strlen(text);\r
-\r
-       if(m_receivebuffer.size()>=tlen)\r
+       if(IsConnected())\r
        {\r
-               for(i=0; i<=m_receivebuffer.size()-tlen; i++)\r
+               int len=recv(m_socket,&m_tempbuffer[0],m_tempbuffer.size(),0);\r
+               if(len>0)\r
                {\r
-                       found=true;\r
-                       for(j=0; j<tlen; j++)\r
-                       {\r
-                               if(m_receivebuffer[i+j]!=text[j])\r
-                               {\r
-                                       found=false;\r
-                                       j=tlen;\r
-                               }\r
-                       }\r
-                       if(found==true)\r
-                       {\r
-                               return i;\r
-                       }\r
+                       m_receivebuffer.insert(m_receivebuffer.end(),m_tempbuffer.begin(),m_tempbuffer.begin()+len);\r
+               }\r
+               else\r
+               {\r
+                       Disconnect();\r
                }\r
        }\r
+}\r
 \r
-       return -1;\r
+void Connection::DoSend()\r
+{\r
+       if(IsConnected() && m_sendbuffer.size()>0)\r
+       {\r
+               int len=send(m_socket,&m_sendbuffer[0],m_sendbuffer.size(),0);\r
+               if(len>0)\r
+               {\r
+                       m_sendbuffer.erase(m_sendbuffer.begin(),m_sendbuffer.begin()+len);\r
+               }\r
+               else\r
+               {\r
+                       Disconnect();\r
+               }\r
+       }\r
 }\r
 \r
-FCPMessage FCPv2::ReceiveMessage()\r
+const bool Connection::MessageReady() const\r
 {\r
-       int field=0;\r
-       int len=0;\r
-       int endlen=0;\r
-       int endmessage=-1;\r
-       char *buffpos;\r
-       char *prevpos;\r
-       char *buffer;\r
+       std::vector<char>::const_iterator tempi;\r
+       std::vector<char>::size_type temp;\r
+       return MessageReady(tempi,temp);\r
+}\r
 \r
-       FCPMessage message;\r
+const bool Connection::MessageReady(std::vector<char>::const_iterator &endpos, std::vector<char>::size_type &endlen) const\r
+{\r
+       static std::string alldatastring="AllData\n";\r
+       static std::string datastring="\nData\n";       // need the \n at the beginning to differentiate from AllData\n\r
+       static std::string endmessagestring="EndMessage\n";\r
+       std::vector<char>::const_iterator tempendpos=m_receivebuffer.end();\r
+       std::vector<char>::size_type tempendlen=0;\r
 \r
-       // there is data on the receive buffer\r
        if(m_receivebuffer.size()>0)\r
        {\r
-\r
-               // find Data on a line by itself following AllData\r
-               if(FindOnReceiveBuffer("AllData\n")==0)\r
+               tempendpos=std::search(m_receivebuffer.begin(),m_receivebuffer.end(),alldatastring.begin(),alldatastring.end());\r
+               if(tempendpos==m_receivebuffer.begin())\r
                {\r
-                       endmessage=FindOnReceiveBuffer("\nData\n");\r
-                       if(endmessage!=-1)\r
+                       tempendpos=std::search(m_receivebuffer.begin(),m_receivebuffer.end(),datastring.begin(),datastring.end());\r
+                       if(tempendpos!=m_receivebuffer.end())\r
                        {\r
-                               endmessage++;\r
-                               endlen=5;\r
+                               tempendpos+=1;\r
+                               tempendlen=datastring.size()-1;\r
                        }\r
                }\r
-               // otherwise this is a regular message - search for EndMessage\r
                else\r
                {\r
-                       endmessage=FindOnReceiveBuffer("EndMessage\n");\r
-                       endlen=11;\r
+                       tempendpos=std::search(m_receivebuffer.begin(),m_receivebuffer.end(),endmessagestring.begin(),endmessagestring.end());\r
+                       tempendlen=endmessagestring.size();\r
                }\r
 \r
-               // continue if we found "EndMessage\n" or "Data\n"\r
-               if(endmessage!=-1)\r
+               if(tempendpos!=m_receivebuffer.end())\r
                {\r
-                       // total length of message (including ending \n)\r
-                       len=endmessage+endlen;\r
-\r
-                       // allocate space for message\r
-                       buffer=new char[len+1];\r
-\r
-                       // copy message from receive buffer to message buffer\r
-                       std::copy(m_receivebuffer.begin(),m_receivebuffer.begin()+len,buffer);\r
-                       buffer[len]='\0';\r
-\r
-                       // remove from receive buffer\r
-                       m_receivebuffer.erase(m_receivebuffer.begin(),m_receivebuffer.begin()+len);\r
-\r
-                       // set buffer position\r
-                       buffpos=buffer;\r
-\r
-                       // find message name\r
-                       buffpos=strtok(buffer,"\n");\r
-                       message.SetName(buffer);\r
-\r
-                       do\r
-                       {\r
-                               // find next field\r
-                               prevpos=buffpos;\r
-                               buffpos=strtok(NULL,"=");\r
-\r
-                               // continue if we aren't at the end of a regular message, or at Data for an AllData message\r
-                               if(strncmp(buffpos,"EndMessage\n",11)!=0 && strncmp(buffpos,"Data\n",5)!=0)     //!(strncmp(message->MessageName,"AllData",7)==0 && strncmp(buffpos,"Data\n",5)==0))\r
-                               {\r
-\r
-                                       // find next value\r
-                                       prevpos=buffpos;\r
-                                       buffpos=strtok(NULL,"\n");\r
-\r
-                                       if(prevpos && buffpos)\r
-                                       {\r
-                                               message[prevpos]=buffpos;\r
-                                       }\r
-\r
-                                       field++;\r
-                               }\r
-                               else\r
-                               {\r
-                                       buffpos=0;\r
-                               }\r
-\r
-                       }while(buffpos!=0);\r
-\r
-                       delete [] buffer;\r
-\r
+                       endpos=tempendpos;\r
+                       endlen=tempendlen;\r
+                       return true;\r
                }\r
+\r
        }\r
 \r
-       return message;\r
+       return false;\r
 }\r
 \r
-const long FCPv2::ReceiveRaw(char *data, long &datalen)\r
+const bool Connection::MessageReady(std::vector<char>::iterator &endpos, std::vector<char>::size_type &endlen)\r
 {\r
-       long len=0;\r
-       if(m_receivebuffer.size()>0 && datalen>0)\r
+       static std::string alldatastring="AllData\n";\r
+       static std::string datastring="\nData\n";       // need the \n at the beginning to differentiate from AllData\n\r
+       static std::string endmessagestring="EndMessage\n";\r
+       std::vector<char>::iterator tempendpos=m_receivebuffer.end();\r
+       std::vector<char>::size_type tempendlen=0;\r
+\r
+       if(m_receivebuffer.size()>0)\r
        {\r
-               if(datalen>m_receivebuffer.size())\r
+               tempendpos=std::search(m_receivebuffer.begin(),m_receivebuffer.end(),alldatastring.begin(),alldatastring.end());\r
+               if(tempendpos==m_receivebuffer.begin())\r
                {\r
-                       len=m_receivebuffer.size();\r
+                       tempendpos=std::search(m_receivebuffer.begin(),m_receivebuffer.end(),datastring.begin(),datastring.end());\r
+                       if(tempendpos!=m_receivebuffer.end())\r
+                       {\r
+                               tempendpos+=1;\r
+                               tempendlen=datastring.size()-1;\r
+                       }\r
                }\r
                else\r
                {\r
-                       len=datalen;\r
+                       tempendpos=std::search(m_receivebuffer.begin(),m_receivebuffer.end(),endmessagestring.begin(),endmessagestring.end());\r
+                       tempendlen=endmessagestring.size();\r
                }\r
 \r
-               std::copy(m_receivebuffer.begin(),m_receivebuffer.begin()+len,data);\r
-\r
-               // erase bytes from receive buffer\r
-               m_receivebuffer.erase(m_receivebuffer.begin(),m_receivebuffer.begin()+len);\r
+               if(tempendpos!=m_receivebuffer.end())\r
+               {\r
+                       endpos=tempendpos;\r
+                       endlen=tempendlen;\r
+                       return true;\r
+               }\r
 \r
        }\r
-       datalen=len;\r
-       return datalen;\r
-}\r
 \r
-void FCPv2::SendBufferedText(const char *text)\r
-{\r
-       unsigned int i;\r
-       for(i=0; i<strlen(text); i++)\r
-       {\r
-               m_sendbuffer.push_back(text[i]);\r
-       }\r
+       return false;\r
 }\r
 \r
-void FCPv2::SendBufferedRaw(const char *data, const long len)\r
+const bool Connection::Receive(Message &message)\r
 {\r
-       int i;\r
-       for(i=0; i<len; i++)\r
+       std::vector<char>::iterator endpos;\r
+       std::vector<char>::size_type endlen;\r
+       if(MessageReady(endpos,endlen)==true)\r
        {\r
-               m_sendbuffer.push_back(data[i]);\r
-       }\r
-}\r
+               std::vector<std::string> fields;\r
 \r
-const int FCPv2::SendMessage(const char *messagename, const int fieldcount, ...)\r
-{\r
-       va_list args;\r
-       const char *field;\r
-       const char *val;\r
-       std::vector<char>::size_type bytecount=0;\r
-       int i;\r
-       std::vector<char>::size_type startlen;\r
+               Split(std::string(m_receivebuffer.begin(),endpos),"\n=",fields);\r
+               m_receivebuffer.erase(m_receivebuffer.begin(),endpos+endlen);\r
 \r
-       startlen=m_sendbuffer.size();\r
+               message.Clear();\r
 \r
-       SendBufferedText(messagename);\r
-       SendBufferedText("\n");\r
-\r
-       va_start(args,fieldcount);\r
+               if(fields.size()>0)\r
+               {\r
+                       message.SetName(fields[0]);\r
+               }\r
 \r
-       for(i=0; i<fieldcount; i++)\r
-       {\r
-               field=va_arg(args,const char *);\r
-               val=va_arg(args,const char *);\r
+               if(fields.size()>1)\r
+               {\r
+                       for(std::vector<std::string>::iterator i=fields.begin()+1; i!=fields.end();)\r
+                       {\r
+                               if(i+1!=fields.end())\r
+                               {\r
+                                       message.GetFields()[(*i)]=(*(i+1));\r
+                                       i+=2;\r
+                               }\r
+                               else\r
+                               {\r
+                                       i++;\r
+                               }\r
+                       }\r
+               }\r
 \r
-               SendBufferedText(field);\r
-               SendBufferedText("=");\r
-               SendBufferedText(val);\r
-               SendBufferedText("\n");\r
        }\r
-\r
-       SendBufferedText("EndMessage\n");\r
-\r
-       bytecount=m_sendbuffer.size()-startlen;\r
-       \r
-       va_end(args);\r
-\r
-       return bytecount;\r
+       return false;\r
 }\r
 \r
-const int FCPv2::SendMessage(FCPMessage &message)\r
+const bool Connection::Receive(std::vector<char> &data, const std::vector<char>::size_type len)\r
 {\r
-       std::vector<char>::size_type bytecount=0;\r
-       std::vector<char>::size_type startlen;\r
-       FCPMessage::iterator i;\r
-\r
-       startlen=m_sendbuffer.size();\r
-\r
-       if(message.GetName()!="")\r
+       if(m_receivebuffer.size()>=len && len>=0)\r
        {\r
-               SendBufferedText(message.GetName().c_str());\r
-               SendBufferedText("\n");\r
-\r
-               for(i=message.begin(); i!=message.end(); i++)\r
-               {\r
-                       SendBufferedText((*i).first.c_str());\r
-                       SendBufferedText("=");\r
-                       SendBufferedText((*i).second.c_str());\r
-                       SendBufferedText("\n");\r
-               }\r
-\r
-               SendBufferedText("EndMessage\n");\r
+               data.insert(data.end(),m_receivebuffer.begin(),m_receivebuffer.begin()+len);\r
+               m_receivebuffer.erase(m_receivebuffer.begin(),m_receivebuffer.begin()+len);\r
+               return true;\r
+       }\r
+       else\r
+       {\r
+               return false;\r
        }\r
-\r
-       bytecount=m_sendbuffer.size()-startlen;\r
-\r
-       return bytecount;\r
 }\r
 \r
-\r
-const int FCPv2::SendRaw(const char *data, const int datalen)\r
+const bool Connection::Receive(char *data, const size_t len)\r
 {\r
-       int bytecount=datalen;\r
-\r
-       if(bytecount>0)\r
+       if(m_receivebuffer.size()>=len && len>=0)\r
        {\r
-               SendBufferedRaw(data,datalen);\r
+               std::copy(m_receivebuffer.begin(),m_receivebuffer.begin()+len,data);\r
+               m_receivebuffer.erase(m_receivebuffer.begin(),m_receivebuffer.begin()+len);\r
+               return true;\r
+       }\r
+       else\r
+       {\r
+               return false;\r
        }\r
-\r
-       return bytecount;\r
-\r
 }\r
 \r
-void FCPv2::SocketReceive()\r
+const bool Connection::ReceiveIgnore(const size_t len)\r
 {\r
-       int len=0;\r
-\r
-       len=recv(m_serversocket,m_tempbuffer,65535,0);\r
-\r
-       if(len>0)\r
+       if(m_receivebuffer.size()>=len && len>=0)\r
        {\r
-\r
-               m_receivebuffer.resize(m_receivebuffer.size()+len);\r
-               std::copy(m_tempbuffer,&m_tempbuffer[len],m_receivebuffer.end()-len);\r
-\r
+               m_receivebuffer.erase(m_receivebuffer.begin(),m_receivebuffer.begin()+len);\r
+               return true;\r
        }\r
-       // there was an error or server closed connection  - disconnect socket\r
        else\r
        {\r
-               Disconnect();\r
+               return false;\r
        }\r
 }\r
 \r
-void FCPv2::SocketSend()\r
+const bool Connection::Send(const Message &message)\r
 {\r
-       int len=0;\r
-       if(m_sendbuffer.size()>0)\r
+       if(message.GetName()!="")\r
        {\r
-               len=send(m_serversocket,&m_sendbuffer[0],m_sendbuffer.size(),0);\r
-               if(len>0)\r
-               {\r
-                       // move remaining data in buffer to beginning of buffer (erase the bytes we just sent)\r
-                       m_sendbuffer.erase(m_sendbuffer.begin(),m_sendbuffer.begin()+len);\r
-               }\r
-               // there was an error with send - disconnect socket\r
-               else\r
-               {\r
-                       Disconnect();\r
-               }\r
+               std::string fcpstring=message.GetFCPString();\r
+               m_sendbuffer.insert(m_sendbuffer.end(),fcpstring.begin(),fcpstring.end());\r
+               return true;\r
        }\r
+       return false;\r
 }\r
 \r
+const bool Connection::Send(const std::vector<char> &data)\r
+{\r
+       m_sendbuffer.insert(m_sendbuffer.end(),data.begin(),data.end());\r
+       return true;\r
+}\r
 \r
-const bool FCPv2::Update(const long waittime)\r
+const bool Connection::Send(const char *data, const size_t len)\r
 {\r
+       if(data)\r
+       {\r
+               m_sendbuffer.insert(m_sendbuffer.end(),data[0],data[0]+len);\r
+               return true;    \r
+       }\r
+       return false;\r
+}\r
 \r
-       if(Connected())\r
+void Connection::Split(const std::string &str, const std::string &separators, std::vector<std::string> &elements)\r
+{\r
+       std::string::size_type offset = 0;\r
+       std::string::size_type delimIndex = 0;\r
+    \r
+       delimIndex = str.find_first_of(separators, offset);\r
+\r
+    while (delimIndex != std::string::npos)\r
+    {\r
+        elements.push_back(str.substr(offset, delimIndex - offset));\r
+        offset += delimIndex - offset + 1;\r
+        delimIndex = str.find_first_of(separators, offset);\r
+    }\r
+\r
+    elements.push_back(str.substr(offset));\r
+}\r
+\r
+const bool Connection::Update(const unsigned long ms)\r
+{\r
+       if(IsConnected())\r
        {\r
-               m_timeval.tv_sec=waittime;\r
-               m_timeval.tv_usec=0;\r
+               m_timeval.tv_sec=ms/1000;\r
+               m_timeval.tv_usec=(ms%1000)*1000;\r
 \r
                FD_ZERO(&m_readfs);\r
                FD_ZERO(&m_writefs);\r
 \r
-               FD_SET(m_serversocket,&m_readfs);\r
-               \r
+               FD_SET(m_socket,&m_readfs);\r
+\r
                if(m_sendbuffer.size()>0)\r
                {\r
-                       FD_SET(m_serversocket,&m_writefs);\r
+                       FD_SET(m_socket,&m_writefs);\r
                }\r
 \r
-               select(m_serversocket+1,&m_readfs,&m_writefs,0,&m_timeval);\r
+               select(m_socket+1,&m_readfs,&m_writefs,0,&m_timeval);\r
 \r
-               if(FD_ISSET(m_serversocket,&m_readfs))\r
+               if(FD_ISSET(m_socket,&m_readfs))\r
                {\r
-                       SocketReceive();\r
+                       DoReceive();\r
                }\r
-               if(Connected() && FD_ISSET(m_serversocket,&m_writefs))\r
+               if(IsConnected() && FD_ISSET(m_socket,&m_writefs))\r
                {\r
-                       SocketSend();\r
+                       DoSend();\r
                }\r
 \r
-               return true;\r
+       }\r
 \r
+       if(IsConnected())\r
+       {\r
+               return true;\r
        }\r
        else\r
        {\r
@@ -445,3 +467,22 @@ const bool FCPv2::Update(const long waittime)
        }\r
 \r
 }\r
+\r
+const bool Connection::WaitForBytes(const unsigned long ms, const size_t len)\r
+{\r
+       while(IsConnected() && m_receivebuffer.size()<len)\r
+       {\r
+               Update(ms);\r
+       }\r
+       \r
+       if(IsConnected() && m_receivebuffer.size()>=len)\r
+       {\r
+               return true;    \r
+       }\r
+       else\r
+       {\r
+               return false;   \r
+       }\r
+}\r
+\r
+}      // namespace\r
index 437543d..0ed526c 100644 (file)
@@ -9,7 +9,7 @@ FileInserter::FileInserter()
        Initialize();\r
 }\r
 \r
-FileInserter::FileInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
+FileInserter::FileInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -30,7 +30,7 @@ void FileInserter::CheckForNeededInsert()
        }\r
 }\r
 \r
-const bool FileInserter::HandlePutFailed(FCPMessage &message)\r
+const bool FileInserter::HandlePutFailed(FCPv2::Message &message)\r
 {\r
        std::vector<std::string> idparts;\r
        long fileinsertid;\r
@@ -46,7 +46,7 @@ const bool FileInserter::HandlePutFailed(FCPMessage &message)
 \r
 }\r
 \r
-const bool FileInserter::HandlePutSuccessful(FCPMessage &message)\r
+const bool FileInserter::HandlePutSuccessful(FCPv2::Message &message)\r
 {\r
        std::vector<std::string> idparts;\r
        long fileinsertid;\r
@@ -71,7 +71,7 @@ void FileInserter::Initialize()
 \r
 const bool FileInserter::StartInsert(const long &fileinsertid)\r
 {\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string fileinsertidstr="";\r
        std::string sizestr="";\r
        std::string filename="";\r
@@ -105,8 +105,8 @@ const bool FileInserter::StartInsert(const long &fileinsertid)
        message["Identifier"]=m_fcpuniquename+"|"+fileinsertidstr;\r
        message["UploadFrom"]="direct";\r
        message["DataLength"]=sizestr;\r
-       m_fcp->SendMessage(message);\r
-       m_fcp->SendRaw(&data[0],data.size());\r
+       m_fcp->Send(message);\r
+       m_fcp->Send(data);\r
 \r
        m_inserting.push_back(fileinsertid);\r
 \r
index 7632998..39fb027 100644 (file)
@@ -11,12 +11,12 @@ FMSVersionRequester::FMSVersionRequester()
        Initialize();\r
 }\r
 \r
-FMSVersionRequester::FMSVersionRequester(FCPv2 *fcp):IFCPConnected(fcp)\r
+FMSVersionRequester::FMSVersionRequester(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
 {\r
        Initialize();\r
 }\r
 \r
-const bool FMSVersionRequester::HandleAllData(FCPMessage &message)\r
+const bool FMSVersionRequester::HandleAllData(FCPv2::Message &message)\r
 {\r
        std::vector<char> data;\r
        long datalength;\r
@@ -25,23 +25,16 @@ const bool FMSVersionRequester::HandleAllData(FCPMessage &message)
        StringFunctions::Convert(message["DataLength"],datalength);\r
 \r
        // wait for all data to be received from connection\r
-       while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()<datalength)\r
-       {\r
-               m_fcp->Update(1);\r
-       }\r
+       m_fcp->WaitForBytes(1000,datalength);\r
 \r
        // if we got disconnected- return immediately\r
-       if(m_fcp->Connected()==false)\r
+       if(m_fcp->IsConnected()==false)\r
        {\r
                return false;\r
        }\r
 \r
        // receive the file\r
-       data.resize(datalength);\r
-       if(data.size()>0)\r
-       {\r
-               m_fcp->ReceiveRaw(&data[0],datalength);\r
-       }\r
+       m_fcp->Receive(data,datalength);\r
 \r
        // update latest edition #\r
        std::vector<std::string> parts;\r
@@ -76,7 +69,7 @@ const bool FMSVersionRequester::HandleAllData(FCPMessage &message)
        return true;\r
 }\r
 \r
-const bool FMSVersionRequester::HandleGetFailed(FCPMessage &message)\r
+const bool FMSVersionRequester::HandleGetFailed(FCPv2::Message &message)\r
 {\r
        std::vector<std::string> parts;\r
        StringFunctions::Split(message["Identifier"],"/",parts);\r
@@ -95,7 +88,7 @@ const bool FMSVersionRequester::HandleGetFailed(FCPMessage &message)
        return true;\r
 }\r
 \r
-const bool FMSVersionRequester::HandleMessage(FCPMessage &message)\r
+const bool FMSVersionRequester::HandleMessage(FCPv2::Message &message)\r
 {\r
        if(message["Identifier"].find(m_fcpuniquename)==0)\r
        {\r
@@ -154,7 +147,7 @@ void FMSVersionRequester::RegisterWithThread(FreenetMasterThread *thread)
 \r
 void FMSVersionRequester::StartRequest()\r
 {\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string key="";\r
        std::string editionstr="0";\r
        int edition=0;\r
@@ -174,6 +167,6 @@ void FMSVersionRequester::StartRequest()
        message["ReturnType"]="direct";\r
        message["MaxSize"]="30000";             // 30K\r
 \r
-       m_fcp->SendMessage(message);\r
+       m_fcp->Send(message);\r
 \r
 }\r
index c0feb6a..4890339 100644 (file)
@@ -95,7 +95,7 @@ const bool FreenetMasterThread::FCPConnect()
 \r
                std::string clientname="FMSClient-"+uuid.toString();\r
                // send ClientHello message to node\r
-               m_fcp.SendMessage("ClientHello",2,"Name",clientname.c_str(),"ExpectedVersion","2.0");\r
+               m_fcp.Send(FCPv2::Message("ClientHello",2,"Name",clientname.c_str(),"ExpectedVersion","2.0"));\r
 \r
                m_log->information("FreenetMasterThread::FCPConnect connected to node");\r
 \r
@@ -108,7 +108,7 @@ const bool FreenetMasterThread::FCPConnect()
 \r
 }\r
 \r
-const bool FreenetMasterThread::HandleMessage(FCPMessage &message)\r
+const bool FreenetMasterThread::HandleMessage(FCPv2::Message &message)\r
 {\r
        if(message.GetName()=="NodeHello")\r
        {\r
@@ -136,7 +136,7 @@ const bool FreenetMasterThread::HandleMessage(FCPMessage &message)
                if(handled==false)\r
                {\r
                        std::string info("");\r
-                       for(std::map<std::string,std::string>::iterator mi=message.begin(); mi!=message.end(); mi++)\r
+                       for(std::map<std::string,std::string>::iterator mi=message.GetFields().begin(); mi!=message.GetFields().end(); mi++)\r
                        {\r
                                info+="\t\t\t\t"+(*mi).first+"="+(*mi).second+"\r\n";\r
                        }\r
@@ -147,15 +147,11 @@ const bool FreenetMasterThread::HandleMessage(FCPMessage &message)
                        {\r
                                long length;\r
                                StringFunctions::Convert(message["DataLength"],length);\r
-                               while(m_fcp.Connected() && m_fcp.ReceiveBufferSize()<length)\r
-                               {\r
-                                       m_fcp.Update(1);\r
-                               }\r
-                               if(m_fcp.Connected() && length>0)\r
+                               m_fcp.WaitForBytes(1000,length);\r
+\r
+                               if(m_fcp.IsConnected() && length>0)\r
                                {\r
-                                       char *data=new char[length];\r
-                                       m_fcp.ReceiveRaw(data,length);\r
-                                       delete [] data;\r
+                                       m_fcp.ReceiveIgnore(length);\r
                                }\r
                        }\r
                }\r
@@ -192,7 +188,7 @@ void FreenetMasterThread::run()
        Poco::DateTime lastreceivedmessage;\r
        Poco::DateTime lastconnected;\r
        Poco::DateTime now;\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        bool done=false;\r
 \r
        lastconnected-=Poco::Timespan(0,0,1,0,0);\r
@@ -205,7 +201,7 @@ void FreenetMasterThread::run()
        {\r
                try\r
                {\r
-                       if(m_fcp.Connected()==false)\r
+                       if(m_fcp.IsConnected()==false)\r
                        {\r
                                // wait at least 1 minute since last successful connect\r
                                now=Poco::Timestamp();\r
@@ -235,13 +231,13 @@ void FreenetMasterThread::run()
                        // fcp is connected\r
                        else\r
                        {\r
-                               m_fcp.Update(1);\r
+                               m_fcp.Update(1000);\r
 \r
                                // check for message on receive buffer and handle it\r
-                               if(m_fcp.ReceiveBufferSize()>0)\r
+                               if(m_fcp.MessageReady()==true)\r
                                {\r
-                                       message.Reset();\r
-                                       message=m_fcp.ReceiveMessage();\r
+                                       message.Clear();\r
+                                       m_fcp.Receive(message);\r
 \r
                                        if(message.GetName()!="")\r
                                        {\r
@@ -264,7 +260,7 @@ void FreenetMasterThread::run()
                                        m_fcp.Disconnect();\r
                                }\r
 \r
-                               if(m_fcp.Connected()==false)\r
+                               if(m_fcp.IsConnected()==false)\r
                                {\r
                                        m_log->information("FreenetMasterThread::Run Disconnected from Freenet node.");\r
                                }\r
index f28a738..15e52aa 100644 (file)
@@ -15,7 +15,7 @@ IdentityInserter::IdentityInserter()
        Initialize();\r
 }\r
 \r
-IdentityInserter::IdentityInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
+IdentityInserter::IdentityInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -55,7 +55,7 @@ void IdentityInserter::FCPDisconnected()
        \r
 }\r
 \r
-const bool IdentityInserter::HandleMessage(FCPMessage &message)\r
+const bool IdentityInserter::HandleMessage(FCPv2::Message &message)\r
 {\r
 \r
        if(message["Identifier"].find("IdentityInserter")==0)\r
@@ -154,7 +154,7 @@ void IdentityInserter::StartInsert(const long localidentityid)
        if(rs.Empty()==false)\r
        {\r
                IdentityXML idxml;\r
-               FCPMessage mess;\r
+               FCPv2::Message mess;\r
                Poco::DateTime now;\r
                std::string messagebase;\r
                std::string data;\r
@@ -232,8 +232,8 @@ void IdentityInserter::StartInsert(const long localidentityid)
                mess["Identifier"]="IdentityInserter|"+idstring+"|"+indexstr+"|"+mess["URI"];\r
                mess["UploadFrom"]="direct";\r
                mess["DataLength"]=datasizestr;\r
-               m_fcp->SendMessage(mess);\r
-               m_fcp->SendRaw(data.c_str(),data.size());\r
+               m_fcp->Send(mess);\r
+               m_fcp->Send(std::vector<char>(data.begin(),data.end()));\r
 \r
                m_db->Execute("UPDATE tblLocalIdentity SET InsertingIdentity='true' WHERE LocalIdentityID="+idstring+";");\r
 \r
index 7537c91..78a0f93 100644 (file)
@@ -15,7 +15,7 @@ IdentityIntroductionInserter::IdentityIntroductionInserter()
        Initialize();\r
 }\r
 \r
-IdentityIntroductionInserter::IdentityIntroductionInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
+IdentityIntroductionInserter::IdentityIntroductionInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -42,7 +42,7 @@ void IdentityIntroductionInserter::FCPDisconnected()
 \r
 }\r
 \r
-const bool IdentityIntroductionInserter::HandleMessage(FCPMessage &message)\r
+const bool IdentityIntroductionInserter::HandleMessage(FCPv2::Message &message)\r
 {\r
 \r
        if(message["Identifier"].find("IdentityIntroductionInserter")==0)\r
@@ -115,12 +115,11 @@ void IdentityIntroductionInserter::RegisterWithThread(FreenetMasterThread *threa
 \r
 void IdentityIntroductionInserter::StartInsert(const long localidentityid, const std::string &day, const std::string &UUID, const std::string &solution)\r
 {\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        IdentityIntroductionXML xml;\r
        std::string publickey;\r
        std::string data;\r
        std::string datasizestr;\r
-//     std::vector<unsigned char> hash;\r
        std::string encodedhash;\r
        \r
        SQLite3DB::Statement st=m_db->Prepare("SELECT PublicKey FROM tblLocalIdentity WHERE PublicKey IS NOT NULL AND PublicKey<>'' AND LocalIdentityID=?;");\r
@@ -140,18 +139,14 @@ void IdentityIntroductionInserter::StartInsert(const long localidentityid, const
                encodedhash=Poco::DigestEngine::digestToHex(sha1.digest());\r
                StringFunctions::UpperCase(encodedhash,encodedhash);\r
 \r
-//             hash.resize(20);\r
-//             sha1((unsigned char *)solution.c_str(),solution.size(),&hash[0]);\r
-//             Hex::Encode(hash,encodedhash);\r
-\r
                message.SetName("ClientPut");\r
                message["URI"]="KSK@"+m_messagebase+"|"+day+"|"+UUID+"|"+encodedhash+".xml";\r
                message["Identifier"]="IdentityIntroductionInserter|"+message["URI"];\r
                message["UploadFrom"]="direct";\r
                message["DataLength"]=datasizestr;\r
 \r
-               m_fcp->SendMessage(message);\r
-               m_fcp->SendRaw(data.c_str(),data.size());\r
+               m_fcp->Send(message);\r
+               m_fcp->Send(std::vector<char>(data.begin(),data.end()));\r
 \r
                m_inserting=true;\r
        }\r
index 951e12d..20fb31f 100644 (file)
@@ -19,7 +19,7 @@ IdentityIntroductionRequester::IdentityIntroductionRequester()
        Initialize();\r
 }\r
 \r
-IdentityIntroductionRequester::IdentityIntroductionRequester(FCPv2 *fcp):IFCPConnected(fcp)\r
+IdentityIntroductionRequester::IdentityIntroductionRequester(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -35,7 +35,7 @@ void IdentityIntroductionRequester::FCPDisconnected()
        \r
 }\r
 \r
-const bool IdentityIntroductionRequester::HandleAllData(FCPMessage &message)\r
+const bool IdentityIntroductionRequester::HandleAllData(FCPv2::Message &message)\r
 {\r
        FreenetSSK ssk;\r
        Poco::DateTime date;\r
@@ -48,23 +48,16 @@ const bool IdentityIntroductionRequester::HandleAllData(FCPMessage &message)
        StringFunctions::Convert(message["DataLength"],datalength);\r
 \r
        // wait for all data to be received from connection\r
-       while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()<datalength)\r
-       {\r
-               m_fcp->Update(1);\r
-       }\r
+       m_fcp->WaitForBytes(1000,datalength);\r
 \r
        // if we got disconnected- return immediately\r
-       if(m_fcp->Connected()==false)\r
+       if(m_fcp->IsConnected()==false)\r
        {\r
                return false;\r
        }\r
 \r
        // receive the file\r
-       data.resize(datalength);\r
-       if(data.size()>0)\r
-       {\r
-               m_fcp->ReceiveRaw(&data[0],datalength);\r
-       }\r
+       m_fcp->Receive(data,datalength);\r
 \r
        // parse file into xml and update the database\r
        if(data.size()>0 && xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
@@ -123,7 +116,7 @@ const bool IdentityIntroductionRequester::HandleAllData(FCPMessage &message)
        return true;\r
 }\r
 \r
-const bool IdentityIntroductionRequester::HandleGetFailed(FCPMessage &message)\r
+const bool IdentityIntroductionRequester::HandleGetFailed(FCPv2::Message &message)\r
 {\r
        std::vector<std::string> idparts;\r
 \r
@@ -146,7 +139,7 @@ const bool IdentityIntroductionRequester::HandleGetFailed(FCPMessage &message)
        return true;\r
 }\r
 \r
-const bool IdentityIntroductionRequester::HandleMessage(FCPMessage &message)\r
+const bool IdentityIntroductionRequester::HandleMessage(FCPv2::Message &message)\r
 {\r
 \r
        if(message["Identifier"].find("IdentityIntroductionRequester")==0)\r
@@ -280,7 +273,7 @@ void IdentityIntroductionRequester::StartRequest(const std::string &UUID)
        std::string day;\r
        std::string solution;\r
        std::string encodedhash;\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        SQLite3DB::Statement st=m_db->Prepare("SELECT Day, PuzzleSolution FROM tblIntroductionPuzzleInserts WHERE FoundSolution='false' AND UUID=?;");\r
        st.Bind(0,UUID);\r
        st.Step();\r
@@ -303,7 +296,7 @@ void IdentityIntroductionRequester::StartRequest(const std::string &UUID)
                message["ReturnType"]="direct";\r
                message["MaxSize"]="10000";\r
 \r
-               m_fcp->SendMessage(message);\r
+               m_fcp->Send(message);\r
 \r
                m_requesting.push_back(UUID);\r
 \r
index 0738698..9e7a769 100644 (file)
@@ -17,12 +17,12 @@ IdentityRequester::IdentityRequester()
        Initialize();\r
 }\r
 \r
-IdentityRequester::IdentityRequester(FCPv2 *fcp):IIndexRequester<long>(fcp)\r
+IdentityRequester::IdentityRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
 \r
-const bool IdentityRequester::HandleAllData(FCPMessage &message)\r
+const bool IdentityRequester::HandleAllData(FCPv2::Message &message)\r
 {\r
        Poco::DateTime now;\r
        SQLite3DB::Statement st;\r
@@ -41,23 +41,16 @@ const bool IdentityRequester::HandleAllData(FCPMessage &message)
        StringFunctions::Convert(idparts[2],index);\r
 \r
        // wait for all data to be received from connection\r
-       while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()<datalength)\r
-       {\r
-               m_fcp->Update(1);\r
-       }\r
+       m_fcp->WaitForBytes(1000,datalength);\r
 \r
        // if we got disconnected- return immediately\r
-       if(m_fcp->Connected()==false)\r
+       if(m_fcp->IsConnected()==false)\r
        {\r
                return false;\r
        }\r
 \r
        // receive the file\r
-       data.resize(datalength);\r
-       if(data.size()>0)\r
-       {\r
-               m_fcp->ReceiveRaw(&data[0],datalength);\r
-       }\r
+       m_fcp->Receive(data,datalength);\r
 \r
        // parse file into xml and update the database\r
        if(data.size()>0 && xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
@@ -136,7 +129,7 @@ const bool IdentityRequester::HandleAllData(FCPMessage &message)
 \r
 }\r
 \r
-const bool IdentityRequester::HandleGetFailed(FCPMessage &message)\r
+const bool IdentityRequester::HandleGetFailed(FCPv2::Message &message)\r
 {\r
        SQLite3DB::Statement st;\r
        std::vector<std::string> idparts;\r
@@ -210,7 +203,7 @@ void IdentityRequester::PopulateIDList()
 void IdentityRequester::StartRequest(const long &identityid)\r
 {\r
        Poco::DateTime now;\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string publickey;\r
        int index;\r
        std::string indexstr;\r
@@ -251,7 +244,7 @@ void IdentityRequester::StartRequest(const long &identityid)
                message["ReturnType"]="direct";\r
                message["MaxSize"]="10000";                     // 10 KB\r
 \r
-               m_fcp->SendMessage(message);\r
+               m_fcp->Send(message);\r
 \r
                m_requesting.push_back(identityid);\r
        }\r
index 7cbfbe8..2a47d81 100644 (file)
@@ -11,7 +11,7 @@ InactiveMessageListRequester::InactiveMessageListRequester()
        Initialize();\r
 }\r
 \r
-InactiveMessageListRequester::InactiveMessageListRequester(FCPv2 *fcp):MessageListRequester(fcp)\r
+InactiveMessageListRequester::InactiveMessageListRequester(FCPv2::Connection *fcp):MessageListRequester(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -25,7 +25,7 @@ void InactiveMessageListRequester::Initialize()
        Option::Instance()->GetInt("MaxMessageListRequests",m_maxrequests);\r
 \r
        // inactive identities get 1/2 of the max requests option -  active identities get 1/2 + any remaining if not evenly divisible\r
-       m_maxrequests=(m_maxrequests/2)+(m_maxrequests%2);\r
+       m_maxrequests=(m_maxrequests/2);\r
 \r
        if(m_maxrequests<1)\r
        {\r
index 5ccb25e..089e4ac 100644 (file)
@@ -22,7 +22,7 @@ IntroductionPuzzleInserter::IntroductionPuzzleInserter():IIndexInserter<long>()
        Initialize();\r
 }\r
 \r
-IntroductionPuzzleInserter::IntroductionPuzzleInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
+IntroductionPuzzleInserter::IntroductionPuzzleInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -106,7 +106,7 @@ void IntroductionPuzzleInserter::GenerateCaptcha(std::string &encodeddata, std::
 \r
 }\r
 \r
-const bool IntroductionPuzzleInserter::HandlePutFailed(FCPMessage &message)\r
+const bool IntroductionPuzzleInserter::HandlePutFailed(FCPv2::Message &message)\r
 {\r
        SQLite3DB::Statement st;\r
        std::vector<std::string> idparts;\r
@@ -132,7 +132,7 @@ const bool IntroductionPuzzleInserter::HandlePutFailed(FCPMessage &message)
        return true;\r
 }\r
 \r
-const bool IntroductionPuzzleInserter::HandlePutSuccessful(FCPMessage &message)\r
+const bool IntroductionPuzzleInserter::HandlePutSuccessful(FCPv2::Message &message)\r
 {\r
        Poco::DateTime now;\r
        SQLite3DB::Statement st;\r
@@ -187,7 +187,7 @@ const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid)
        IntroductionPuzzleXML xml;\r
        std::string encodedpuzzle="";\r
        std::string solutionstring="";\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string xmldata="";\r
        std::string xmldatasizestr="";\r
        std::string privatekey="";\r
@@ -257,11 +257,11 @@ const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid)
                message["Identifier"]=m_fcpuniquename+"|"+idstring+"|"+indexstr+"|"+xml.GetUUID()+"|"+message["URI"];\r
                message["UploadFrom"]="direct";\r
                message["DataLength"]=xmldatasizestr;\r
-               m_fcp->SendMessage(message);\r
-               m_fcp->SendRaw(xmldata.c_str(),xmldata.size());\r
+               m_fcp->Send(message);\r
+               m_fcp->Send(std::vector<char>(xmldata.begin(),xmldata.end()));\r
 \r
                // insert to USK\r
-               message.Reset();\r
+               message.Clear();\r
                message.SetName("ClientPutComplexDir");\r
                message["URI"]="USK"+privatekey.substr(3)+messagebase+"|"+Poco::DateTimeFormatter::format(now,"%Y.%m.%d")+"|IntroductionPuzzle/0/";\r
                message["Identifier"]=m_fcpuniquename+"USK|"+message["URI"];\r
@@ -269,8 +269,8 @@ const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid)
                message["Files.0.Name"]="IntroductionPuzzle.xml";\r
                message["Files.0.UplaodFrom"]="direct";\r
                message["Files.0.DataLength"]=xmldatasizestr;\r
-               m_fcp->SendMessage(message);\r
-               m_fcp->SendRaw(xmldata.c_str(),xmldata.size());\r
+               m_fcp->Send(message);\r
+               m_fcp->Send(std::vector<char>(xmldata.begin(),xmldata.end()));\r
 \r
                m_db->Execute("INSERT INTO tblIntroductionPuzzleInserts(UUID,Type,MimeType,LocalIdentityID,PuzzleData,PuzzleSolution) VALUES('"+xml.GetUUID()+"','captcha','image/bmp',"+idstring+",'"+encodedpuzzle+"','"+solutionstring+"');");\r
 \r
index 80aacb1..fd81f14 100644 (file)
@@ -19,12 +19,12 @@ IntroductionPuzzleRequester::IntroductionPuzzleRequester()
        Initialize();\r
 }\r
 \r
-IntroductionPuzzleRequester::IntroductionPuzzleRequester(FCPv2 *fcp):IIndexRequester<long>(fcp)\r
+IntroductionPuzzleRequester::IntroductionPuzzleRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
 \r
-const bool IntroductionPuzzleRequester::HandleAllData(FCPMessage &message)\r
+const bool IntroductionPuzzleRequester::HandleAllData(FCPv2::Message &message)\r
 {\r
        Poco::DateTime now;\r
        SQLite3DB::Statement st;\r
@@ -42,23 +42,16 @@ const bool IntroductionPuzzleRequester::HandleAllData(FCPMessage &message)
        StringFunctions::Convert(idparts[2],index);\r
 \r
        // wait for all data to be received from connection\r
-       while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()<datalength)\r
-       {\r
-               m_fcp->Update(1);\r
-       }\r
+       m_fcp->WaitForBytes(1000,datalength);\r
 \r
        // if we got disconnected- return immediately\r
-       if(m_fcp->Connected()==false)\r
+       if(m_fcp->IsConnected()==false)\r
        {\r
                return false;\r
        }\r
 \r
        // receive the file\r
-       data.resize(datalength);\r
-       if(data.size()>0)\r
-       {\r
-               m_fcp->ReceiveRaw(&data[0],datalength);\r
-       }\r
+       m_fcp->Receive(data,datalength);\r
 \r
        // parse file into xml and update the database\r
        if(data.size()>0 && xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
@@ -158,7 +151,7 @@ const bool IntroductionPuzzleRequester::HandleAllData(FCPMessage &message)
 \r
 }\r
 \r
-const bool IntroductionPuzzleRequester::HandleGetFailed(FCPMessage &message)\r
+const bool IntroductionPuzzleRequester::HandleGetFailed(FCPv2::Message &message)\r
 {\r
        SQLite3DB::Statement st;\r
        std::vector<std::string> idparts;\r
@@ -237,7 +230,7 @@ void IntroductionPuzzleRequester::PopulateIDList()
 void IntroductionPuzzleRequester::StartRequest(const long &identityid)\r
 {\r
        Poco::DateTime now;\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string publickey;\r
        int index;\r
        std::string indexstr;\r
@@ -278,7 +271,7 @@ void IntroductionPuzzleRequester::StartRequest(const long &identityid)
                message["ReturnType"]="direct";\r
                message["MaxSize"]="1000000";           // 1 MB\r
 \r
-               m_fcp->SendMessage(message);\r
+               m_fcp->Send(message);\r
                \r
                m_requesting.push_back(identityid);\r
        }\r
index d248cd3..c1688f3 100644 (file)
@@ -10,7 +10,7 @@ MessageInserter::MessageInserter()
        Initialize();\r
 }\r
 \r
-MessageInserter::MessageInserter(FCPv2 *fcp):IIndexInserter<std::string>(fcp)\r
+MessageInserter::MessageInserter(FCPv2::Connection *fcp):IIndexInserter<std::string>(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -46,7 +46,7 @@ void MessageInserter::CheckForNeededInsert()
        }\r
 }\r
 \r
-const bool MessageInserter::HandlePutFailed(FCPMessage &message)\r
+const bool MessageInserter::HandlePutFailed(FCPv2::Message &message)\r
 {\r
        int index;\r
        int localidentityid;\r
@@ -72,7 +72,7 @@ const bool MessageInserter::HandlePutFailed(FCPMessage &message)
        return true;\r
 }\r
 \r
-const bool MessageInserter::HandlePutSuccessful(FCPMessage &message)\r
+const bool MessageInserter::HandlePutSuccessful(FCPv2::Message &message)\r
 {\r
        MessageXML xml;\r
        Poco::DateTime date;\r
@@ -149,7 +149,7 @@ const bool MessageInserter::StartInsert(const std::string &messageuuid)
                std::string xmlsizestr;\r
                std::string privatekey;\r
                std::string publickey;\r
-               FCPMessage message;\r
+               FCPv2::Message message;\r
                std::string indexstr;\r
                int index=0;\r
                \r
@@ -208,8 +208,8 @@ const bool MessageInserter::StartInsert(const std::string &messageuuid)
                message["Identifier"]=m_fcpuniquename+"|"+messageuuid+"|"+idstr+"|"+indexstr+"|"+xmlfile.GetMessageID()+"|"+message["URI"];\r
                message["UploadFrom"]="direct";\r
                message["DataLength"]=xmlsizestr;\r
-               m_fcp->SendMessage(message);\r
-               m_fcp->SendRaw(xml.c_str(),xml.size());\r
+               m_fcp->Send(message);\r
+               m_fcp->Send(std::vector<char>(xml.begin(),xml.end()));\r
 \r
                m_inserting.push_back(messageuuid);\r
 \r
index 786fffe..04ab9f3 100644 (file)
@@ -15,7 +15,7 @@ MessageListInserter::MessageListInserter()
        Initialize();\r
 }\r
 \r
-MessageListInserter::MessageListInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
+MessageListInserter::MessageListInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -60,7 +60,7 @@ void MessageListInserter::CheckForNeededInsert()
 \r
 }\r
 \r
-const bool MessageListInserter::HandlePutFailed(FCPMessage &message)\r
+const bool MessageListInserter::HandlePutFailed(FCPv2::Message &message)\r
 {\r
        std::vector<std::string> idparts;\r
        long localidentityid;\r
@@ -97,7 +97,7 @@ const bool MessageListInserter::HandlePutFailed(FCPMessage &message)
 \r
 }\r
 \r
-const bool MessageListInserter::HandlePutSuccessful(FCPMessage &message)\r
+const bool MessageListInserter::HandlePutSuccessful(FCPv2::Message &message)\r
 {\r
        Poco::DateTime now;\r
        std::vector<std::string> idparts;\r
@@ -162,7 +162,7 @@ void MessageListInserter::Initialize()
 \r
 const bool MessageListInserter::StartInsert(const long &localidentityid)\r
 {\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        Poco::DateTime date;\r
        Poco::DateTime now;\r
        std::string privatekey;\r
@@ -262,10 +262,10 @@ const bool MessageListInserter::StartInsert(const long &localidentityid)
                message["Identifier"]=m_fcpuniquename+"|"+localidentityidstr+"|"+indexstr+"|"+message["URI"];\r
                message["UploadFrom"]="direct";\r
                message["DataLength"]=xmlsizestr;\r
-               m_fcp->SendMessage(message);\r
-               m_fcp->SendRaw(xmlstr.c_str(),xmlstr.size());\r
+               m_fcp->Send(message);\r
+               m_fcp->Send(std::vector<char>(xmlstr.begin(),xmlstr.end()));\r
 \r
-               message.Reset();\r
+               message.Clear();\r
                message.SetName("ClientPutComplexDir");\r
                message["URI"]="USK"+privatekey.substr(3)+m_messagebase+"|"+Poco::DateTimeFormatter::format(now,"%Y.%m.%d")+"|MessageList/0/";\r
                message["Identifier"]=m_fcpuniquename+"USK|"+message["URI"];\r
@@ -273,8 +273,8 @@ const bool MessageListInserter::StartInsert(const long &localidentityid)
                message["Files.0.Name"]="MessageList.xml";\r
                message["Files.0.UploadFrom"]="direct";\r
                message["Files.0.DataLength"]=xmlsizestr;\r
-               m_fcp->SendMessage(message);\r
-               m_fcp->SendRaw(xmlstr.c_str(),xmlstr.size());\r
+               m_fcp->Send(message);\r
+               m_fcp->Send(std::vector<char>(xmlstr.begin(),xmlstr.end()));\r
 \r
                m_inserting.push_back(localidentityid);\r
                m_lastinsertedxml[localidentityid]=xmlstr;\r
index d8ed8aa..17aba0a 100644 (file)
@@ -15,7 +15,7 @@ MessageListRequester::MessageListRequester()
        Initialize();\r
 }\r
 \r
-MessageListRequester::MessageListRequester(FCPv2 *fcp):IIndexRequester<long>(fcp)\r
+MessageListRequester::MessageListRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -97,7 +97,7 @@ void MessageListRequester::GetBoardList(std::map<std::string,bool> &boards)
        }\r
 }\r
 \r
-const bool MessageListRequester::HandleAllData(FCPMessage &message)\r
+const bool MessageListRequester::HandleAllData(FCPv2::Message &message)\r
 {      \r
        SQLite3DB::Statement st;\r
        SQLite3DB::Statement trustst;\r
@@ -121,23 +121,16 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
        StringFunctions::Convert(idparts[2],index);\r
 \r
        // wait for all data to be received from connection\r
-       while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()<datalength)\r
-       {\r
-               m_fcp->Update(1);\r
-       }\r
+       m_fcp->WaitForBytes(1000,datalength);\r
 \r
        // if we got disconnected- return immediately\r
-       if(m_fcp->Connected()==false)\r
+       if(m_fcp->IsConnected()==false)\r
        {\r
                return false;\r
        }\r
 \r
        // receive the file\r
-       data.resize(datalength);\r
-       if(data.size()>0)\r
-       {\r
-               m_fcp->ReceiveRaw(&data[0],datalength);\r
-       }\r
+       m_fcp->Receive(data,datalength);\r
 \r
        // parse file into xml and update the database\r
        if(data.size()>0 && xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
@@ -300,7 +293,7 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
 \r
 }\r
 \r
-const bool MessageListRequester::HandleGetFailed(FCPMessage &message)\r
+const bool MessageListRequester::HandleGetFailed(FCPv2::Message &message)\r
 {\r
        SQLite3DB::Statement st;\r
        std::vector<std::string> idparts;\r
@@ -416,13 +409,13 @@ void MessageListRequester::PopulateIDList()
        }\r
 }\r
 \r
-void MessageListRequester::StartRedirectRequest(FCPMessage &message)\r
+void MessageListRequester::StartRedirectRequest(FCPv2::Message &message)\r
 {\r
        std::vector<std::string> parts;\r
        std::string indexstr="";\r
        std::string identityidstr="";\r
        std::string datestr="";\r
-       FCPMessage newmessage;\r
+       FCPv2::Message newmessage;\r
 \r
        // get the new edition #\r
        StringFunctions::Split(message["RedirectURI"],"/",parts);\r
@@ -450,14 +443,14 @@ void MessageListRequester::StartRedirectRequest(FCPMessage &message)
        newmessage["ReturnType"]="direct";\r
        newmessage["MaxSize"]="1000000";\r
 \r
-       m_fcp->SendMessage(newmessage);\r
+       m_fcp->Send(newmessage);\r
 \r
 }\r
 \r
 void MessageListRequester::StartRequest(const long &id)\r
 {\r
        Poco::DateTime now;\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string publickey;\r
        int index=0;\r
        std::string indexstr;\r
@@ -500,7 +493,7 @@ void MessageListRequester::StartRequest(const long &id)
                message["ReturnType"]="direct";\r
                message["MaxSize"]="1000000";\r
 \r
-               m_fcp->SendMessage(message);\r
+               m_fcp->Send(message);\r
 \r
                m_requesting.push_back(id);\r
        }\r
index c5361ec..fbd767c 100644 (file)
@@ -16,7 +16,7 @@ MessageRequester::MessageRequester()
        Initialize();\r
 }\r
 \r
-MessageRequester::MessageRequester(FCPv2 *fcp):IIndexRequester<std::string>(fcp)\r
+MessageRequester::MessageRequester(FCPv2::Connection *fcp):IIndexRequester<std::string>(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -85,7 +85,7 @@ const std::string MessageRequester::GetIdentityName(const long identityid)
        }\r
 }\r
 \r
-const bool MessageRequester::HandleAllData(FCPMessage &message)\r
+const bool MessageRequester::HandleAllData(FCPv2::Message &message)\r
 {\r
        SQLite3DB::Statement st;\r
        std::vector<std::string> idparts;\r
@@ -104,23 +104,16 @@ const bool MessageRequester::HandleAllData(FCPMessage &message)
        StringFunctions::Convert(idparts[4],index);\r
 \r
        // wait for all data to be received from connection\r
-       while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()<datalength)\r
-       {\r
-               m_fcp->Update(1);\r
-       }\r
+       m_fcp->WaitForBytes(1000,datalength);\r
 \r
        // if we got disconnected- return immediately\r
-       if(m_fcp->Connected()==false)\r
+       if(m_fcp->IsConnected()==false)\r
        {\r
                return false;\r
        }\r
 \r
        // receive the file\r
-       data.resize(datalength);\r
-       if(data.size()>0)\r
-       {\r
-               m_fcp->ReceiveRaw(&data[0],datalength);\r
-       }\r
+       m_fcp->Receive(data,datalength);\r
 \r
        // mark this index as received\r
        st=m_db->Prepare("UPDATE tblMessageRequests SET Found='true' WHERE IdentityID=? AND Day=? AND RequestIndex=?;");\r
@@ -291,7 +284,7 @@ const bool MessageRequester::HandleAllData(FCPMessage &message)
        return true;\r
 }\r
 \r
-const bool MessageRequester::HandleGetFailed(FCPMessage &message)\r
+const bool MessageRequester::HandleGetFailed(FCPv2::Message &message)\r
 {\r
        SQLite3DB::Statement st;\r
        std::vector<std::string> idparts;\r
@@ -479,7 +472,7 @@ const bool MessageRequester::SaveToBoard(const std::string &boardname)
 \r
 void MessageRequester::StartRequest(const std::string &requestid)\r
 {\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::vector<std::string> parts;\r
        std::string tempval;\r
        long identityid;\r
@@ -507,7 +500,7 @@ void MessageRequester::StartRequest(const std::string &requestid)
                message["MaxSize"]="1000000";           // 1 MB\r
                message["MaxRetries"]="-1";                     // use ULPR since we are fairly sure message exists since the author says it does\r
 \r
-               m_fcp->SendMessage(message);\r
+               m_fcp->Send(message);\r
 \r
                m_requesting.push_back(requestid);\r
 \r
index 99a96c7..0ae9fc5 100644 (file)
@@ -14,7 +14,7 @@ SiteInserter::SiteInserter()
        Initialize();\r
 }\r
 \r
-SiteInserter::SiteInserter(FCPv2 *fcp):IIndexInserter<long>(fcp)\r
+SiteInserter::SiteInserter(FCPv2::Connection *fcp):IIndexInserter<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -354,7 +354,7 @@ const std::string SiteInserter::GetClassString(const std::string &trustlevel)
        }\r
 }\r
 \r
-const bool SiteInserter::HandlePutFailed(FCPMessage &message)\r
+const bool SiteInserter::HandlePutFailed(FCPv2::Message &message)\r
 {\r
        std::vector<std::string> idparts;\r
        long localidentityid;\r
@@ -369,7 +369,7 @@ const bool SiteInserter::HandlePutFailed(FCPMessage &message)
        return true;\r
 }\r
 \r
-const bool SiteInserter::HandlePutSuccessful(FCPMessage &message)\r
+const bool SiteInserter::HandlePutSuccessful(FCPv2::Message &message)\r
 {\r
        std::vector<std::string> idparts;\r
        std::vector<std::string> uriparts;\r
@@ -418,7 +418,7 @@ const std::string SiteInserter::SanitizeOutput(const std::string &input)
 \r
 const bool SiteInserter::StartInsert(const long &localidentityid)\r
 {\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string localidentityidstr="";\r
        std::string sizestr="";\r
        std::string uskkey="";\r
@@ -450,12 +450,12 @@ const bool SiteInserter::StartInsert(const long &localidentityid)
                filenum++;\r
        }\r
 \r
-       m_fcp->SendMessage(message);\r
+       m_fcp->Send(message);\r
 \r
        // send data of each page\r
        for(std::map<std::string,std::string>::iterator pagei=pages.begin(); pagei!=pages.end(); pagei++)\r
        {\r
-               m_fcp->SendRaw(&(*pagei).second[0],(*pagei).second.size());\r
+               m_fcp->Send(std::vector<char>((*pagei).second.begin(),(*pagei).second.end()));\r
        }\r
 \r
        m_inserting.push_back(localidentityid);\r
index fc02e8b..0851c61 100644 (file)
@@ -16,7 +16,7 @@ TrustListInserter::TrustListInserter()
        Initialize();\r
 }\r
 \r
-TrustListInserter::TrustListInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
+TrustListInserter::TrustListInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -49,7 +49,7 @@ void TrustListInserter::FCPDisconnected()
 \r
 }\r
 \r
-const bool TrustListInserter::HandleMessage(FCPMessage &message)\r
+const bool TrustListInserter::HandleMessage(FCPv2::Message &message)\r
 {\r
 \r
        if(message["Identifier"].find("TrustListInserter")==0)\r
@@ -133,7 +133,7 @@ void TrustListInserter::RegisterWithThread(FreenetMasterThread *thread)
 \r
 void TrustListInserter::StartInsert(const long localidentityid, const std::string &privatekey)\r
 {\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        TrustListXML xml;\r
        std::string data;\r
        std::string datasizestr;\r
@@ -257,11 +257,11 @@ void TrustListInserter::StartInsert(const long localidentityid, const std::strin
        message["Identifier"]="TrustListInserter|"+localidentityidstr+"|"+indexstr+"|"+message["URI"];\r
        message["UploadFrom"]="direct";\r
        message["DataLength"]=datasizestr;\r
-       m_fcp->SendMessage(message);\r
-       m_fcp->SendRaw(data.c_str(),data.size());\r
+       m_fcp->Send(message);\r
+       m_fcp->Send(std::vector<char>(data.begin(),data.end()));\r
 \r
        // insert to USK\r
-       message.Reset();\r
+       message.Clear();\r
        message.SetName("ClientPutComplexDir");\r
        message["URI"]="USK"+privatekey.substr(3)+m_messagebase+"|"+Poco::DateTimeFormatter::format(now,"%Y.%m.%d")+"|TrustList/0/";\r
        message["Identifier"]="TrustListInserterUSK|"+message["URI"];\r
@@ -269,8 +269,8 @@ void TrustListInserter::StartInsert(const long localidentityid, const std::strin
        message["Files.0.Name"]="TrustList.xml";\r
        message["Files.0.UplaodFrom"]="direct";\r
        message["Files.0.DataLength"]=datasizestr;\r
-       m_fcp->SendMessage(message);\r
-       m_fcp->SendRaw(data.c_str(),data.size());\r
+       m_fcp->Send(message);\r
+       m_fcp->Send(std::vector<char>(data.begin(),data.end()));\r
 \r
        m_db->Execute("UPDATE tblLocalIdentity SET InsertingTrustList='true' WHERE LocalIdentityID="+localidentityidstr+";");\r
 \r
index 77f4f4e..bedc845 100644 (file)
@@ -15,12 +15,12 @@ TrustListRequester::TrustListRequester()
        Initialize();\r
 }\r
 \r
-TrustListRequester::TrustListRequester(FCPv2 *fcp):IIndexRequester<long>(fcp)\r
+TrustListRequester::TrustListRequester(FCPv2::Connection *fcp):IIndexRequester<long>(fcp)\r
 {\r
        Initialize();\r
 }\r
 \r
-const bool TrustListRequester::HandleAllData(FCPMessage &message)\r
+const bool TrustListRequester::HandleAllData(FCPv2::Message &message)\r
 {\r
        Poco::DateTime now;\r
        SQLite3DB::Statement st;\r
@@ -41,23 +41,16 @@ const bool TrustListRequester::HandleAllData(FCPMessage &message)
        StringFunctions::Convert(idparts[2],index);\r
 \r
        // wait for all data to be received from connection\r
-       while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()<datalength)\r
-       {\r
-               m_fcp->Update(1);\r
-       }\r
+       m_fcp->WaitForBytes(1000,datalength);\r
 \r
        // if we got disconnected- return immediately\r
-       if(m_fcp->Connected()==false)\r
+       if(m_fcp->IsConnected()==false)\r
        {\r
                return false;\r
        }\r
 \r
        // receive the file\r
-       data.resize(datalength);\r
-       if(data.size()>0)\r
-       {\r
-               m_fcp->ReceiveRaw(&data[0],datalength);\r
-       }\r
+       m_fcp->Receive(data,datalength);\r
 \r
        // get count of identities added in last 24 hours\r
        st=m_db->Prepare("SELECT COUNT(*) FROM tblIdentity WHERE DateAdded>=?;");\r
@@ -238,7 +231,7 @@ const bool TrustListRequester::HandleAllData(FCPMessage &message)
 \r
 }\r
 \r
-const bool TrustListRequester::HandleGetFailed(FCPMessage &message)\r
+const bool TrustListRequester::HandleGetFailed(FCPv2::Message &message)\r
 {\r
        SQLite3DB::Statement st;\r
        std::vector<std::string> idparts;\r
@@ -315,7 +308,7 @@ void TrustListRequester::PopulateIDList()
 void TrustListRequester::StartRequest(const long &identityid)\r
 {\r
        Poco::DateTime now;\r
-       FCPMessage message;\r
+       FCPv2::Message message;\r
        std::string publickey;\r
        int index;\r
        std::string indexstr;\r
@@ -354,7 +347,7 @@ void TrustListRequester::StartRequest(const long &identityid)
                message["ReturnType"]="direct";\r
                message["MaxSize"]="1000000";                   // 1 MB\r
 \r
-               m_fcp->SendMessage(message);\r
+               m_fcp->Send(message);\r
 \r
                m_requesting.push_back(identityid);\r
        }\r
index e23a81c..e873dad 100644 (file)
@@ -14,7 +14,7 @@ UnkeyedIDCreator::UnkeyedIDCreator()
        Initialize();\r
 }\r
 \r
-UnkeyedIDCreator::UnkeyedIDCreator(FCPv2 *fcp):IFCPConnected(fcp)\r
+UnkeyedIDCreator::UnkeyedIDCreator(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
 {\r
        Initialize();\r
 }\r
@@ -42,10 +42,10 @@ void UnkeyedIDCreator::CheckForUnkeyedID()
                long id=rs.GetInt(0);\r
                idstr << id;\r
 \r
-               FCPMessage message;\r
+               FCPv2::Message message;\r
                message.SetName("GenerateSSK");\r
                message["Identifier"]="UnkeyedIDRequest|"+idstr.str();\r
-               m_fcp->SendMessage(message);\r
+               m_fcp->Send(message);\r
 \r
                m_waiting=true;\r
 \r
@@ -56,7 +56,7 @@ void UnkeyedIDCreator::CheckForUnkeyedID()
 \r
 }\r
 \r
-const bool UnkeyedIDCreator::HandleMessage(FCPMessage &message)\r
+const bool UnkeyedIDCreator::HandleMessage(FCPv2::Message &message)\r
 {\r
        if(message["Identifier"].find("UnkeyedIDRequest")==0)\r
        {\r
index 765eb3f..63e12c3 100644 (file)
@@ -10,7 +10,7 @@ UnknownIdentityRequester::UnknownIdentityRequester()
        Initialize();\r
 }\r
 \r
-UnknownIdentityRequester::UnknownIdentityRequester(FCPv2 *fcp):IdentityRequester(fcp)\r
+UnknownIdentityRequester::UnknownIdentityRequester(FCPv2::Connection *fcp):IdentityRequester(fcp)\r
 {\r
        Initialize();\r
 }\r
index a680bfe..e4447d4 100644 (file)
@@ -8,32 +8,11 @@
 \r
 const std::string ForumViewThreadPage::FixBody(const std::string &body)\r
 {\r
-       static std::string whitespace=" \t\r\n";\r
        std::string output=body;\r
 \r
        output=StringFunctions::Replace(output,"\r\n","\n");\r
 \r
        UnicodeFormatter::LineWrap(output,80,"",output);\r
-       /*\r
-       // put \n after 80 contiguous characters in the body\r
-       std::string::size_type prevpos=0;\r
-       std::string::size_type pos=output.find_first_of(whitespace);\r
-       while(pos!=std::string::npos)\r
-       {\r
-               while(pos-prevpos>80)\r
-               {\r
-                       output.insert(prevpos+80,"\n");\r
-                       prevpos+=81;    // 81 because of the extra newline we just inserted\r
-               }\r
-               prevpos=pos;\r
-               pos=output.find_first_of(whitespace,pos+1);\r
-       }\r
-       while(output.size()-prevpos>80) // check the last line of the message (no whitespace after it)\r
-       {\r
-               output.insert(prevpos+80,"\n");\r
-               prevpos+=81;\r
-       }\r
-       */\r
 \r
        output=StringFunctions::Replace(output,"<","&lt;");\r
        output=StringFunctions::Replace(output,">","&gt;");\r
@@ -73,9 +52,18 @@ const std::string ForumViewThreadPage::GeneratePage(const std::string &method, c
                firstunreadst.ResultText(0,firstunreadidstr);\r
        }\r
 \r
-       SQLite3DB::Statement updateread=m_db->Prepare("UPDATE tblMessage SET Read=1 WHERE tblMessage.MessageID IN (SELECT MessageID FROM tblThreadPost WHERE ThreadID=?);");\r
-       updateread.Bind(0,threadidstr);\r
-       updateread.Step();\r
+       if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="markunread")\r
+       {\r
+               SQLite3DB::Statement updateread=m_db->Prepare("UPDATE tblMessage SET Read=0 WHERE tblMessage.MessageID IN (SELECT MessageID FROM tblThreadPost WHERE ThreadID=?);");\r
+               updateread.Bind(0,threadidstr);\r
+               updateread.Step();\r
+       }\r
+       else\r
+       {\r
+               SQLite3DB::Statement updateread=m_db->Prepare("UPDATE tblMessage SET Read=1 WHERE tblMessage.MessageID IN (SELECT MessageID FROM tblThreadPost WHERE ThreadID=?);");\r
+               updateread.Bind(0,threadidstr);\r
+               updateread.Step();\r
+       }\r
 \r
        SQLite3DB::Statement trustst=m_db->Prepare("SELECT LocalMessageTrust, LocalTrustListTrust, PeerMessageTrust, PeerTrustListTrust, Name FROM tblIdentity WHERE IdentityID=?;");\r
 \r
@@ -97,6 +85,9 @@ const std::string ForumViewThreadPage::GeneratePage(const std::string &method, c
                content+="<a href=\"#"+firstunreadidstr+"\">First Unread Message</a>";\r
                content+="</td>";\r
        }\r
+       content+="<td>";\r
+       content+="<a href=\""+m_pagename+"?formaction=markunread&threadid="+threadidstr+"&boardid="+boardidstr+"&currentpage="+currentpagestr+"\">Mark Unread</a>";\r
+       content+="</td>";\r
        content+="</tr>";\r
        content+="</table>\r\n";\r
 \r
index c89cc7c..bc6a238 100644 (file)
@@ -2,7 +2,7 @@
 #include "../../include/unicode/utfconversion.h"\r
 \r
 std::wstring UnicodeFormatter::m_unicodenewline=L"\n";\r
-wchar_t UnicodeFormatter::m_unicodewhitespace[]={0x0009,0x000A,0x000B,0x000C,0x000D,\r
+std::wstring::value_type UnicodeFormatter::m_unicodewhitespace[]={0x0009,0x000A,0x000B,0x000C,0x000D,\r
                                                                                                0x0020,0x0085,0x00A0,0x1680,0x180E,\r
                                                                                                0x2000,0x2001,0x2002,0x2003,0x2004,\r
                                                                                                0x2005,0x2006,0x2007,0x2008,0x2009,\r
@@ -11,8 +11,8 @@ wchar_t UnicodeFormatter::m_unicodewhitespace[]={0x0009,0x000A,0x000B,0x000C,0x0
 \r
 const bool UnicodeFormatter::LineWrap(const std::string &utf8input, const int linelength, const std::string &ignorechars, std::string &utf8output)\r
 {\r
-       std::wstring wcstring;\r
-       std::wstring wcignorechars;\r
+       std::wstring wcstring=L"";\r
+       std::wstring wcignorechars=L"";\r
 \r
        if(UTFConversion::FromUTF8(utf8input,wcstring) && UTFConversion::FromUTF8(ignorechars,wcignorechars))\r
        {\r
index 112ed17..5d7c835 100644 (file)
@@ -3,7 +3,7 @@
 namespace UTFConversion\r
 {\r
 \r
-const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)\r
+const bool FromUTF8(const std::vector<std::string::value_type> &utf8string, std::wstring &wcstring)\r
 {\r
        if(utf8string.size()==0)\r
        {\r
@@ -11,7 +11,7 @@ const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)
                return true;\r
        }\r
 \r
-       std::vector<wchar_t> dest(utf8string.size(),0);         // dest will never be bigger than the input but could be smaller\r
+       std::vector<std::wstring::value_type> dest(utf8string.size(),0);                // dest will never be bigger than the input but could be smaller\r
        \r
        const UTF8 *sourcestart=reinterpret_cast<const UTF8 *>(&utf8string[0]);\r
        const UTF8 *sourceend=sourcestart+utf8string.size();\r
@@ -40,7 +40,7 @@ const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)
 \r
                if(rval!=conversionOK)\r
                {\r
-                       return false;   \r
+                       return false;\r
                }\r
                \r
                wcstring.assign(dest.begin(),dest.end()-(destend-deststart));\r
@@ -48,7 +48,7 @@ const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)
        }\r
        else\r
        {\r
-               return false;   \r
+               return false;\r
        }\r
 \r
        return true;\r
@@ -57,7 +57,15 @@ const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)
 const bool FromUTF8(const std::string &utf8string, std::wstring &wcstring)\r
 {\r
 \r
-       return FromUTF8(std::vector<char>(utf8string.begin(),utf8string.end()),wcstring);\r
+       if(utf8string.size()>0)\r
+       {\r
+               return FromUTF8(std::vector<std::string::value_type>(utf8string.begin(),utf8string.end()),wcstring);\r
+       }\r
+       else\r
+       {\r
+               wcstring.assign(L"");\r
+               return true;\r
+       }\r
 \r
 }\r
 \r
@@ -69,11 +77,11 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)
                return true;\r
        }\r
 \r
-       std::vector<wchar_t> source(wcstring.begin(),wcstring.end());\r
+       std::vector<std::wstring::value_type> source(wcstring.begin(),wcstring.end());\r
        \r
-       if(sizeof(wchar_t)==2)\r
+       if(sizeof(std::wstring::value_type)==2)\r
        {\r
-               std::vector<char> dest(wcstring.size()*2,0);\r
+               std::vector<std::string::value_type> dest(wcstring.size()*2,0);\r
                \r
                const UTF16 *sourcestart=reinterpret_cast<const UTF16 *>(&source[0]);\r
                const UTF16 *sourceend=sourcestart+source.size();\r
@@ -85,15 +93,15 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)
                \r
                if(rval!=conversionOK)\r
                {\r
-                       return false;   \r
+                       return false;\r
                }\r
                \r
                utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r
                \r
        }\r
-       else if(sizeof(wchar_t)==4)\r
+       else if(sizeof(std::wstring::value_type)==4)\r
        {\r
-               std::vector<char> dest(wcstring.size()*4,0);\r
+               std::vector<std::string::value_type> dest(wcstring.size()*4,0);\r
                \r
                const UTF32 *sourcestart=reinterpret_cast<const UTF32 *>(&source[0]);\r
                const UTF32 *sourceend=sourcestart+source.size();\r
@@ -105,7 +113,7 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)
                \r
                if(rval!=conversionOK)\r
                {\r
-                       return false;   \r
+                       return false;\r
                }\r
                \r
                utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r