\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
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
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
#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
{\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
{\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
-/*\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
{\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
{\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
FreenetMasterThread();\r
~FreenetMasterThread();\r
\r
- const bool HandleMessage(FCPMessage &message);\r
+ const bool HandleMessage(FCPv2::Message &message);\r
\r
void run();\r
\r
\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
{\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
{\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
{\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
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
{\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
{\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
virtual void FCPConnected()=0;\r
\r
protected:\r
- FCPv2 *m_fcp;\r
+ FCPv2::Connection *m_fcp;\r
};\r
\r
#endif // _ifcpconnected_\r
\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
{\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
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
}\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
}\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
{\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
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
}\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
}\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
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
{\r
public:\r
InactiveMessageListRequester();\r
- InactiveMessageListRequester(FCPv2 *fcp);\r
+ InactiveMessageListRequester(FCPv2::Connection *fcp);\r
\r
private:\r
virtual void Initialize();\r
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\r
public:\r
UnknownIdentityRequester();\r
- UnknownIdentityRequester(FCPv2 *fcp);\r
+ UnknownIdentityRequester(FCPv2::Connection *fcp);\r
\r
private:\r
void Initialize();\r
\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
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
{\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
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
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
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
}\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
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
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
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
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
}\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
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
\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
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
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
#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
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
\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
}\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
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
}\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
\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
\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
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
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
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
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
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
\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
message["ReturnType"]="direct";\r
message["MaxSize"]="30000"; // 30K\r
\r
- m_fcp->SendMessage(message);\r
+ m_fcp->Send(message);\r
\r
}\r
\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
\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
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
{\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
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
{\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
// 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
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
Initialize();\r
}\r
\r
-IdentityInserter::IdentityInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
+IdentityInserter::IdentityInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
\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
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
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
Initialize();\r
}\r
\r
-IdentityIntroductionInserter::IdentityIntroductionInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
+IdentityIntroductionInserter::IdentityIntroductionInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
\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
\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
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
Initialize();\r
}\r
\r
-IdentityIntroductionRequester::IdentityIntroductionRequester(FCPv2 *fcp):IFCPConnected(fcp)\r
+IdentityIntroductionRequester::IdentityIntroductionRequester(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
\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
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
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
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
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
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
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
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
\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
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
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
Initialize();\r
}\r
\r
-InactiveMessageListRequester::InactiveMessageListRequester(FCPv2 *fcp):MessageListRequester(fcp)\r
+InactiveMessageListRequester::InactiveMessageListRequester(FCPv2::Connection *fcp):MessageListRequester(fcp)\r
{\r
Initialize();\r
}\r
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
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
\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
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
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
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
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
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
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
\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
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
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
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
}\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
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
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
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
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
\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
\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
\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
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
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
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
}\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
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
\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
}\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
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
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
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
}\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
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
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
\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
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
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
}\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
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
\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
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
Initialize();\r
}\r
\r
-TrustListInserter::TrustListInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
+TrustListInserter::TrustListInserter(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
\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
\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
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
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
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
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
\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
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
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
Initialize();\r
}\r
\r
-UnkeyedIDCreator::UnkeyedIDCreator(FCPv2 *fcp):IFCPConnected(fcp)\r
+UnkeyedIDCreator::UnkeyedIDCreator(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
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
\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
Initialize();\r
}\r
\r
-UnknownIdentityRequester::UnknownIdentityRequester(FCPv2 *fcp):IdentityRequester(fcp)\r
+UnknownIdentityRequester::UnknownIdentityRequester(FCPv2::Connection *fcp):IdentityRequester(fcp)\r
{\r
Initialize();\r
}\r
\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,"<","<");\r
output=StringFunctions::Replace(output,">",">");\r
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
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+"¤tpage="+currentpagestr+"\">Mark Unread</a>";\r
+ content+="</td>";\r
content+="</tr>";\r
content+="</table>\r\n";\r
\r
#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
\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
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
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
\r
if(rval!=conversionOK)\r
{\r
- return false; \r
+ return false;\r
}\r
\r
wcstring.assign(dest.begin(),dest.end()-(destend-deststart));\r
}\r
else\r
{\r
- return false; \r
+ return false;\r
}\r
\r
return true;\r
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
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
\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
\r
if(rval!=conversionOK)\r
{\r
- return false; \r
+ return false;\r
}\r
\r
utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r