From mkolar at freenetproject.org Mon Jul 9 09:55:18 2007 From: mkolar at freenetproject.org (mkolar at freenetproject.org) Date: Mon, 9 Jul 2007 09:55:18 +0000 (UTC) Subject: [Cppfcplib] r14000 - trunk/apps/CppFCPLib Message-ID: <20070709095518.CA28747A67A@emu.freenetproject.org> Author: mkolar Date: 2007-07-09 09:55:18 +0000 (Mon, 09 Jul 2007) New Revision: 14000 Added: trunk/apps/CppFCPLib/AdditionalFields.h trunk/apps/CppFCPLib/ConfigDataMessage.h trunk/apps/CppFCPLib/FinishedCompressionMessage.h trunk/apps/CppFCPLib/GetFailedMessage.h trunk/apps/CppFCPLib/IdentifierCollisionMessage.h trunk/apps/CppFCPLib/PersistentRequestRemovedMessage.h trunk/apps/CppFCPLib/ProtocolErrorMessage.h trunk/apps/CppFCPLib/PutFailedMessage.h trunk/apps/CppFCPLib/PutSuccessfulMessage.h trunk/apps/CppFCPLib/SimpleProgressMessage.h trunk/apps/CppFCPLib/StartedCompressionMessage.h trunk/apps/CppFCPLib/URIGeneratedMessage.h trunk/apps/CppFCPLib/UnknownNodeIdentifierMessage.h trunk/apps/CppFCPLib/UnknownPeerNoteTypeMessage.h Modified: trunk/apps/CppFCPLib/EndMessage.h trunk/apps/CppFCPLib/FCPMultiMessageResponse.h trunk/apps/CppFCPLib/FCPResult.cpp trunk/apps/CppFCPLib/JobTicket.cpp trunk/apps/CppFCPLib/Message.cpp trunk/apps/CppFCPLib/Message.h trunk/apps/CppFCPLib/Node.cpp trunk/apps/CppFCPLib/Node.h trunk/apps/CppFCPLib/NodeDataMessage.h trunk/apps/CppFCPLib/NodeHelloMessage.h trunk/apps/CppFCPLib/NodeThread.cpp trunk/apps/CppFCPLib/PeerMessage.h trunk/apps/CppFCPLib/PeerNoteMessage.h trunk/apps/CppFCPLib/PeerRemovedMessage.h trunk/apps/CppFCPLib/ServerMessage.cpp trunk/apps/CppFCPLib/ServerMessage.h trunk/apps/CppFCPLib/main.cpp Log: * worked on client out * implemented few server messages Added: trunk/apps/CppFCPLib/AdditionalFields.h =================================================================== --- trunk/apps/CppFCPLib/AdditionalFields.h (rev 0) +++ trunk/apps/CppFCPLib/AdditionalFields.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,34 @@ +#ifndef ADDITIONALFIELDS_H_INCLUDED +#define ADDITIONALFIELDS_H_INCLUDED + +#include +#include +#include + +namespace FCPLib { + +class AdditionalFields { + std::map fields; +public: + AdditionalFields() {} + void addField(std::string key, int value) { + fields[key] = boost::lexical_cast(value); + } + void addField(std::string key, std::string value) { + fields[key] = value; + } + void addField(std::string key, bool value) { + fields[key] = boost::lexical_cast(value); + } + bool hasField(std::string key) const { + if (fields.find(key) == fields.end()) return false; + return true; + } + const std::string& getField(std::string key) const { + return fields[key]; + } +}; + +} + +#endif // ADDITIONALFIELDS_H_INCLUDED Added: trunk/apps/CppFCPLib/ConfigDataMessage.h =================================================================== --- trunk/apps/CppFCPLib/ConfigDataMessage.h (rev 0) +++ trunk/apps/CppFCPLib/ConfigDataMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,31 @@ +#ifndef CONFIGDATAMESSAGE_H_INCLUDED +#define CONFIGDATAMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class ConfigDataMessage : public ServerMessage { + ConfigDataMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return false; + } + friend class ServerMessage; +}; + +} + +#endif // CONFIGDATAMESSAGE_H_INCLUDED Modified: trunk/apps/CppFCPLib/EndMessage.h =================================================================== --- trunk/apps/CppFCPLib/EndMessage.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/EndMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -16,11 +16,15 @@ return "__global"; } - bool isLastMessage(const std::string &cmd) const + bool isLast(const std::string &cmd) const { return true; } + bool isError() const { + return false; + } + friend class ServerMessage; }; Modified: trunk/apps/CppFCPLib/FCPMultiMessageResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPMultiMessageResponse.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/FCPMultiMessageResponse.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -14,9 +14,10 @@ class FCPMultiMessageResponse : public FCPResult { std::vector messages; - FCPMultiMessageResponse( const std::vector &nodeResponse ) { + FCPMultiMessageResponse( const std::vector &nodeResponse, bool removeLast = true ) { messages = nodeResponse; - messages.pop_back(); + if (removeLast) + messages.pop_back(); } public: typedef boost::shared_ptr FCPMultiMessageResponsePtr; Modified: trunk/apps/CppFCPLib/FCPResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPResult.cpp 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/FCPResult.cpp 2007-07-09 09:55:18 UTC (rev 14000) @@ -18,6 +18,24 @@ } else if (cmd == "ListPeerNotes") { return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse) ); + } else + if (cmd == "ModifyPeer") { + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + } else + if (cmd == "ModifyPeerNote") { + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + } else + if (cmd == "RemovePeer") { + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + } else + if (cmd == "GetNode") { + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + } else + if (cmd == "GetConfig") { + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + } else + if (cmd == "ClientPut") { + return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse, false) ); } throw new std::runtime_error("Not implemented : " + cmd); Added: trunk/apps/CppFCPLib/FinishedCompressionMessage.h =================================================================== --- trunk/apps/CppFCPLib/FinishedCompressionMessage.h (rev 0) +++ trunk/apps/CppFCPLib/FinishedCompressionMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,31 @@ +#ifndef FINISHEDCOMPRESSIONMESSAGE_H_INCLUDED +#define FINISHEDCOMPRESSIONMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class FinishedCompressionMessage : public ServerMessage { + FinishedCompressionMessage() {} +public: + std::string getIdOfJob() const + { + return message->getField("Identifier"); + } + + bool isLast(const std::string &cmd) const + { + return false; + } + bool isError() const { + return false; + } + friend class ServerMessage; +}; + +} + +#endif // FINISHEDCOMPRESSIONMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/GetFailedMessage.h =================================================================== --- trunk/apps/CppFCPLib/GetFailedMessage.h (rev 0) +++ trunk/apps/CppFCPLib/GetFailedMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,31 @@ +#ifndef GETFAILEDMESSAGE_H_INCLUDED +#define GETFAILEDMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class GetFailedMessage : public ServerMessage { + GetFailedMessage() {} +public: + std::string getIdOfJob() const + { + return message->getField("Identifier"); + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return true; + } + friend class ServerMessage; +}; + +} + +#endif // GETFAILEDMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/IdentifierCollisionMessage.h =================================================================== --- trunk/apps/CppFCPLib/IdentifierCollisionMessage.h (rev 0) +++ trunk/apps/CppFCPLib/IdentifierCollisionMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,31 @@ +#ifndef IDENTIFIERCOLLISIONMESSAGE_H_INCLUDED +#define IDENTIFIERCOLLISIONMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class IdentifierCollisionMessage : public ServerMessage { + IdentifierCollisionMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return true; + } + friend class ServerMessage; +}; + +} + +#endif // IDENTIFIERCOLLISIONMESSAGE_H_INCLUDED Modified: trunk/apps/CppFCPLib/JobTicket.cpp =================================================================== --- trunk/apps/CppFCPLib/JobTicket.cpp 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/JobTicket.cpp 2007-07-09 09:55:18 UTC (rev 14000) @@ -139,5 +139,6 @@ void JobTicket::putResult() { result = FCPResult::factory(cmd->getHeader(), nodeResponse); + _hasResult = true; lock.release(); } Modified: trunk/apps/CppFCPLib/Message.cpp =================================================================== --- trunk/apps/CppFCPLib/Message.cpp 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/Message.cpp 2007-07-09 09:55:18 UTC (rev 14000) @@ -1,11 +1,15 @@ #include "Message.h" +#include - using namespace FCPLib; Message::MessagePtr -Message::factory(std::string header){ - Message::MessagePtr m( new Message() ); +Message::factory(std::string header, bool isData){ + Message::MessagePtr m; + if (!isData) + m = Message::MessagePtr( new Message() ); + else + m = Message::MessagePtr( new DataMessage() ); m->header = header; @@ -26,15 +30,19 @@ } } -std::string -Message::getField(const std::string &key) { - return fields[key]; +const std::string& +Message::getField(std::string key) const +{ + std::map::const_iterator it; + it = fields.find(key); + if (it == fields.end()) + return ""; + else + return it->second; } - const std::string& Message::toString() { - static char intToString[30]; if (isReprValid) return repr; repr = header + "\n"; @@ -44,12 +52,12 @@ else repr += it->first + "=" + it->second + "\n"; if (isDataType) { + std::string& data = fields["Data"]; repr += "DataLength="; - sprintf(intToString, "%d", fields["Data"].size()); // FIXME - repr += std::string(intToString); + repr += boost::lexical_cast(data.size()); repr += "\n"; repr += "Data\n"; - repr += fields["Data"]; + repr += data; } else { repr += "EndMessage\n"; } Modified: trunk/apps/CppFCPLib/Message.h =================================================================== --- trunk/apps/CppFCPLib/Message.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/Message.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -15,6 +15,7 @@ std::map fields; +protected: bool isReprValid; bool isDataType; @@ -26,17 +27,23 @@ public: typedef boost::shared_ptr MessagePtr; - static Message::MessagePtr factory(std::string header); + static Message::MessagePtr factory(std::string header, bool isData=false); void setField(std::string key, std::string value); void setFields(const std::map &fields); - inline std::string getField(const std::string &key); + const std::string& getField(std::string key) const; const std::string& getHeader() const; const std::string& toString(); }; +class DataMessage : public Message { +protected: + DataMessage() { isDataType = true;} + friend class Message; +}; + } #endif Modified: trunk/apps/CppFCPLib/Node.cpp =================================================================== --- trunk/apps/CppFCPLib/Node.cpp 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/Node.cpp 2007-07-09 09:55:18 UTC (rev 14000) @@ -8,7 +8,7 @@ Node::_getUniqueId() { char newid[100]; sprintf(newid, "id%d", (int) time(0)); - return string(newid); + return std::string(newid); } Node::Node(std::string name_, std::string host, int port) @@ -44,12 +44,11 @@ } FCPMultiMessageResponse::FCPMultiMessageResponsePtr -Node::listPeers(bool withMetaData = false, - bool withVolatile = false) +Node::listPeers(const AdditionalFields& fields) { Message::MessagePtr m = Message::factory( std::string("ListPeers") ); - m->setField("WithMetadata", withMetaData ? "true" : "false"); - m->setField("WithVolatila", withVolatile ? "true" : "false"); + if (fields.hasField("WithMetadata")) m->setField("WithMetadata", fields.getField("WithMetadata")); + if (fields.hasField("WithVolatile")) m->setField("WithVolatile", fields.getField("WithVolatile")); JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); log().log(DEBUG, job->toString()); @@ -115,21 +114,15 @@ FCPOneMessageResponse::FCPOneMessageResponsePtr Node::modifyPeer(const std::string & nodeIdentifier, - bool allowLocalAddresses = false, - bool isDisabled = false, - bool isListenOnly = false) + const AdditionalFields& fields) { Message::MessagePtr m = Message::factory( std::string("ModifyPeer") ); m->setField("NodeIdentifier", nodeIdentifier); - if (allowLocalAddresses) - m->setField("AllowLocaAddresses", "true"); - if (isDisabled) - m->setField("IsDisabled", "true"); - if (isListenOnly) - m->setField("IsListenOnly", "true"); + if (fields.hasField("AllowLocalAddresses")) m->setField("AllowLocalAddresses", fields.getField("AllowLocalAddresses")); + if (fields.hasField("IsDisabled")) m->setField("IsDisabled", fields.getField("IsDisabled")); + if (fields.hasField("IsListenOnly")) m->setField("IsListenOnly", fields.getField("IsListenOnly")); - JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); log().log(DEBUG, job->toString()); clientReqQueue->put(job); @@ -150,7 +143,7 @@ m->setField("NodeIdentifier", nodeIdentifier); m->setField("NoteText", noteText); - m->setField("PeerNoteType", "1"); + m->setField("PeerNoteType", "1"); // TODO: change to peerNoteType once it is used JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); log().log(DEBUG, job->toString()); @@ -183,15 +176,12 @@ } FCPOneMessageResponse::FCPOneMessageResponsePtr -Node::getNode(bool withPrivate = false, - bool withVolatile = false) +Node::getNode(const AdditionalFields& fields) { Message::MessagePtr m = Message::factory( std::string("GetNode") ); - if (withPrivate) - m->setField("WithPrivate", "True"); - if (withVolatile) - m->setField("WithVolatile", "True"); + if (fields.hasField("WithPrivate")) m->setField("WithPrivate", fields.getField("WithPrivate")); + if (fields.hasField("WithVolatile")) m->setField("WithVolatile", fields.getField("WithVolatile")); JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); log().log(DEBUG, job->toString()); @@ -203,3 +193,88 @@ return boost::dynamic_pointer_cast(job->getResult()); } + +FCPOneMessageResponse::FCPOneMessageResponsePtr +Node::getConfig(const AdditionalFields& fields) +{ + Message::MessagePtr m = Message::factory( std::string("GetConfig") ); + + if (fields.hasField("WithCurrent")) m->setField("WithCurrent", fields.getField("WithCurrent")); + if (fields.hasField("WithDefaul")) m->setField("WithDefaul", fields.getField("WithDefaul")); + if (fields.hasField("WithSortOrder")) m->setField("WithSortOrder", fields.getField("WithSortOrder")); + if (fields.hasField("WithExpertFlag")) m->setField("WithExpertFlag", fields.getField("WithExpertFlag")); + if (fields.hasField("WithForceWriteFlag")) m->setField("WithForceWriteFlag", fields.getField("WithForceWriteFlag")); + if (fields.hasField("WithShortDescription")) m->setField("WithShortDescription", fields.getField("WithShortDescription")); + if (fields.hasField("WithLongDescription")) m->setField("WithLongDescription", fields.getField("WithLongDescription")); + + JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); + log().log(DEBUG, job->toString()); + clientReqQueue->put(job); + + log().log(DEBUG, "waiting for the ConfigData"); + job->wait(0); + log().log(DEBUG, "ConfigData received"); + + return boost::dynamic_pointer_cast(job->getResult()); +} + +FCPMultiMessageResponse::FCPMultiMessageResponsePtr +Node::putData(const std::string URI, const std::string data, const std::string id, const AdditionalFields& fields ) +{ + Message::MessagePtr m = Message::factory( std::string("ClientPut"), true ); + + m->setField("URI", URI); + m->setField("Identifier", id == "" ? _getUniqueId() : id); + if (fields.hasField("mimetype")) m->setField("Metadata.ContentType", fields.getField("mimetype")); + if (fields.hasField("Verbosity")) m->setField("Verbosity", fields.getField("Verbosity")); + if (fields.hasField("MaxRetries")) m->setField("MaxRetries", fields.getField("MaxRetries")); + if (fields.hasField("PriorityClass")) m->setField("PriorityClass", fields.getField("PriorityClass")); + if (fields.hasField("GetCHKOnly")) m->setField("GetCHKOnly", fields.getField("GetCHKOnly")); + if (fields.hasField("Global")) m->setField("Global", fields.getField("Global")); + if (fields.hasField("DontCompress")) m->setField("DontCompress", fields.getField("DontCompress")); + if (fields.hasField("ClientToken")) m->setField("ClientToken", fields.getField("ClientToken")); + if (fields.hasField("Persistence")) m->setField("Persistence", fields.getField("Persistence")); + if (fields.hasField("TargetFilename")) m->setField("TargetFilename", fields.getField("TargetFilename")); + if (fields.hasField("EarlyEncode")) m->setField("EarlyEncode", fields.getField("EarlyEncode")); + m->setField("UploadFrom", "direct"); + m->setField("Data", data); + + JobTicket::JobTicketPtr job = JobTicket::factory( m->getField("Identifier"), m, false, false, false, 0 ); + log().log(DEBUG, job->toString()); + clientReqQueue->put(job); + + log().log(DEBUG, "waiting for the put successful"); + job->wait(0); + log().log(DEBUG, "put successful arrived"); + + return boost::dynamic_pointer_cast(job->getResult()); +} + +FCPMultiMessageResponse::FCPMultiMessageResponsePtr +Node::putData(const std::string URI, const std::string target, const std::string id, const AdditionalFields& fields ) +{ + Message::MessagePtr m = Message::factory( std::string("ClientPut")); + + m->setField("URI", URI); + m->setField("Identifier", id == "" ? _getUniqueId() : id); + if (fields.hasField("mimetype")) m->setField("Metadata.ContentType", fields.getField("mimetype")); + if (fields.hasField("Verbosity")) m->setField("Verbosity", fields.getField("Verbosity")); + if (fields.hasField("MaxRetries")) m->setField("MaxRetries", fields.getField("MaxRetries")); + if (fields.hasField("PriorityClass")) m->setField("PriorityClass", fields.getField("PriorityClass")); + if (fields.hasField("Global")) m->setField("Global", fields.getField("Global")); + if (fields.hasField("ClientToken")) m->setField("ClientToken", fields.getField("ClientToken")); + if (fields.hasField("Persistence")) m->setField("Persistence", fields.getField("Persistence")); + if (fields.hasField("TargetFilename")) m->setField("TargetFilename", fields.getField("TargetFilename")); + if (fields.hasField("EarlyEncode")) m->setField("EarlyEncode", fields.getField("EarlyEncode")); + m->setField("TargetURI", target); + + JobTicket::JobTicketPtr job = JobTicket::factory( m->getField("Identifier"), m, false, false, false, 0 ); + log().log(DEBUG, job->toString()); + clientReqQueue->put(job); + + log().log(DEBUG, "waiting for the put successful"); + job->wait(0); + log().log(DEBUG, "put successful arrived"); + + return boost::dynamic_pointer_cast(job->getResult()); +} Modified: trunk/apps/CppFCPLib/Node.h =================================================================== --- trunk/apps/CppFCPLib/Node.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/Node.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -12,6 +12,7 @@ #include "NodeThread.h" #include "FCPMultiMessageResponse.h" #include "FCPOneMessageResponse.h" +#include "AdditionalFields.h" namespace FCPLib { class Node { @@ -26,14 +27,25 @@ Node(std::string name, std::string host, int port); ~Node(); - FCPMultiMessageResponse::FCPMultiMessageResponsePtr listPeers(bool, bool); + FCPMultiMessageResponse::FCPMultiMessageResponsePtr listPeers(const AdditionalFields& = AdditionalFields()); FCPMultiMessageResponse::FCPMultiMessageResponsePtr listPeerNotes(const std::string&); void addPeer(const std::string &, bool isURL); void addPeer(const std::map &message); - FCPOneMessageResponse::FCPOneMessageResponsePtr modifyPeer(const std::string &, bool, bool, bool); + FCPOneMessageResponse::FCPOneMessageResponsePtr modifyPeer(const std::string &, const AdditionalFields& = AdditionalFields()); FCPOneMessageResponse::FCPOneMessageResponsePtr modifyPeerNote(const std::string &, const std::string &, int); FCPOneMessageResponse::FCPOneMessageResponsePtr removePeer(const std::string &); - FCPOneMessageResponse::FCPOneMessageResponsePtr getNode(bool, bool); + FCPOneMessageResponse::FCPOneMessageResponsePtr getNode(const AdditionalFields& = AdditionalFields()); + FCPOneMessageResponse::FCPOneMessageResponsePtr getConfig(const AdditionalFields& = AdditionalFields()); + FCPMultiMessageResponse::FCPMultiMessageResponsePtr putData(const std::string , // URI + const std::string , // Data + const std::string = "", // Identifier + const AdditionalFields& = AdditionalFields() + ); + FCPMultiMessageResponse::FCPMultiMessageResponsePtr putRedirect(const std::string , // URI + const std::string , // Target + const std::string = "", // Identifier + const AdditionalFields& = AdditionalFields() + ); }; } Modified: trunk/apps/CppFCPLib/NodeDataMessage.h =================================================================== --- trunk/apps/CppFCPLib/NodeDataMessage.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/NodeDataMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -16,11 +16,13 @@ return "__global"; } - bool isLastMessage(const std::string &cmd) const + bool isLast(const std::string &cmd) const { return true; } - + bool isError() const { + return false; + } friend class ServerMessage; }; Modified: trunk/apps/CppFCPLib/NodeHelloMessage.h =================================================================== --- trunk/apps/CppFCPLib/NodeHelloMessage.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/NodeHelloMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -13,10 +13,13 @@ return "__hello"; } - bool isLastMessage(const std::string &cmd) const + bool isLast(const std::string &cmd) const { return true; } + bool isError() const { + return false; + } friend class ServerMessage; }; Modified: trunk/apps/CppFCPLib/NodeThread.cpp =================================================================== --- trunk/apps/CppFCPLib/NodeThread.cpp 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/NodeThread.cpp 2007-07-09 09:55:18 UTC (rev 14000) @@ -41,7 +41,7 @@ } } } catch (ZThread::Synchronization_Exception& e) { - // do some cleanup + log().log(DEBUG, "_mgrThread: Caught Synchronization_Exception"); } } @@ -74,7 +74,7 @@ job = it->second; job->nodeResponse.push_back(message); - if (message->isLastMessage(job->getCommandName())) { + if (message->isLast(job->getCommandName())) { job->putResult(); } } Modified: trunk/apps/CppFCPLib/PeerMessage.h =================================================================== --- trunk/apps/CppFCPLib/PeerMessage.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/PeerMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -16,7 +16,7 @@ return "__global"; } - bool isLastMessage(const std::string &cmd) const + bool isLast(const std::string &cmd) const { if (cmd == "ListPeers") return false; @@ -26,6 +26,10 @@ throw new std::runtime_error("Unknown command"); } + bool isError() const { + return false; + } + friend class ServerMessage; }; Modified: trunk/apps/CppFCPLib/PeerNoteMessage.h =================================================================== --- trunk/apps/CppFCPLib/PeerNoteMessage.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/PeerNoteMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -16,7 +16,7 @@ return "__global"; } - bool isLastMessage(const std::string &cmd) const + bool isLast(const std::string &cmd) const { if (cmd == "ListPeerNotes") return false; @@ -26,6 +26,9 @@ throw new std::runtime_error("Unknown command"); } + bool isError() const { + return false; + } friend class ServerMessage; }; Modified: trunk/apps/CppFCPLib/PeerRemovedMessage.h =================================================================== --- trunk/apps/CppFCPLib/PeerRemovedMessage.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/PeerRemovedMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -16,11 +16,13 @@ return "__global"; } - bool isLastMessage(const std::string &cmd) const + bool isLast(const std::string &cmd) const { return true; } - + bool isError() const { + return false; + } friend class ServerMessage; }; Added: trunk/apps/CppFCPLib/PersistentRequestRemovedMessage.h =================================================================== --- trunk/apps/CppFCPLib/PersistentRequestRemovedMessage.h (rev 0) +++ trunk/apps/CppFCPLib/PersistentRequestRemovedMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,32 @@ +#ifndef PERSISTENTREQUESTREMOVEDMESSAGE_H_INCLUDED +#define PERSISTENTREQUESTREMOVEDMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class PersistentRequestRemovedMessage : public ServerMessage { + PersistentRequestRemovedMessage() {} +public: + std::string getIdOfJob() const + { + return message->getField("Identifier"); + } + + bool isLast(const std::string &cmd) const + { + return false; + } + bool isError() const { + return true; + } + friend class ServerMessage; +}; + +} + + +#endif // PERSISTENTREQUESTREMOVEDMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/ProtocolErrorMessage.h =================================================================== --- trunk/apps/CppFCPLib/ProtocolErrorMessage.h (rev 0) +++ trunk/apps/CppFCPLib/ProtocolErrorMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,32 @@ +#ifndef PROTOCOLERRORMESSAGE_H_INCLUDED +#define PROTOCOLERRORMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class ProtocolErrorMessage : public ServerMessage { + ProtocolErrorMessage() {} +public: + std::string getIdOfJob() const + { + const std::string& ret = message->getField("Identifier"); + return ret.size() ? ret : "__global"; + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return true; + } + friend class ServerMessage; +}; + +} + +#endif // PROTOCOLERRORMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/PutFailedMessage.h =================================================================== --- trunk/apps/CppFCPLib/PutFailedMessage.h (rev 0) +++ trunk/apps/CppFCPLib/PutFailedMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,31 @@ +#ifndef PUTFAILEDMESSAGE_H_INCLUDED +#define PUTFAILEDMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class PutFailedMessage : public ServerMessage { + PutFailedMessage() {} +public: + std::string getIdOfJob() const + { + return message->getField("Identifier"); + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return true; + } + friend class ServerMessage; +}; + +} + +#endif // PUTFAILEDMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/PutSuccessfulMessage.h =================================================================== --- trunk/apps/CppFCPLib/PutSuccessfulMessage.h (rev 0) +++ trunk/apps/CppFCPLib/PutSuccessfulMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,32 @@ +#ifndef PutSuccessfulMessage_H_INCLUDED +#define PutSuccessfulMessage_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class PutSuccessfulMessage : public ServerMessage { + PutSuccessfulMessage() {} +public: + std::string getIdOfJob() const + { + return message->getField("Identifier"); + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return false; + } + friend class ServerMessage; +}; + +} + + +#endif // PutSuccessfulMessage_H_INCLUDED Modified: trunk/apps/CppFCPLib/ServerMessage.cpp =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.cpp 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/ServerMessage.cpp 2007-07-09 09:55:18 UTC (rev 14000) @@ -1,4 +1,5 @@ +#include "Log.h" #include "ServerMessage.h" #include "PeerNoteMessage.h" #include "EndMessage.h" @@ -6,7 +7,19 @@ #include "NodeHelloMessage.h" #include "PeerRemovedMessage.h" #include "NodeDataMessage.h" -#include "Log.h" +#include "ConfigDataMessage.h" +#include "SimpleProgressMessage.h" +#include "StartedCompressionMessage.h" +#include "FinishedCompressionMessage.h" +#include "PutSuccessfulMessage.h" +#include "URIGeneratedMessage.h" +#include "PutFailedMessage.h" +#include "GetFailedMessage.h" +#include "ProtocolErrorMessage.h" +#include "IdentifierCollisionMessage.h" +#include "UnknownNodeIdentifierMessage.h" +#include "UnknownPeerNoteTypeMessage.h" +#include "PersistentRequestRemovedMessage.h" using namespace FCPLib; @@ -42,7 +55,80 @@ } else if (header == "NodeData") { m = ServerMessagePtr( new NodeDataMessage() ); - } + } else + if (header == "ConfigData") { + m = ServerMessagePtr( new ConfigDataMessage() ); + } else + if (header == "TestDDAReply") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "TestDDAComplete") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "SSKKeypair") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "PersistentGet") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "PersistentPut") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "PersistentPutDir") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "URIGenerated") { + m = ServerMessagePtr( new URIGeneratedMessage() ); + } else + if (header == "PutSuccessful") { + m = ServerMessagePtr( new PutSuccessfulMessage() ); + } else + if (header == "PutFetchable") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "DataFound") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "AllData") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "StartedCompression") { + m = ServerMessagePtr( new StartedCompressionMessage() ); + } else + if (header == "FinishedCompression") { + m = ServerMessagePtr( new FinishedCompressionMessage() ); + } else + if (header == "SimpleProgress") { + m = ServerMessagePtr( new SimpleProgressMessage() ); + } else + if (header == "EndListPersistentRequest") { + m = ServerMessagePtr( new EndMessage() ); + } else + if (header == "PersistentRequestRemoved") { + m = ServerMessagePtr( new PersistentRequestRemovedMessage() ); + } else + if (header == "PersistentRequestModified") { + throw new std::runtime_error("Not implemented " + header); + } else + if (header == "PutFailed") { + m = ServerMessagePtr( new PutFailedMessage() ); + } else + if (header == "GetFailed") { + m = ServerMessagePtr( new GetFailedMessage() ); + } else + if (header == "ProtocolError") { + m = ServerMessagePtr( new ProtocolErrorMessage() ); + } else + if (header == "IdentifierCollision") { + m = ServerMessagePtr( new IdentifierCollisionMessage() ); + } else + if (header == "UnknownNodeIdentifier") { + m = ServerMessagePtr( new UnknownNodeIdentifierMessage() ); + } else + if (header == "UnknownPeerNoteType") { + m = ServerMessagePtr( new UnknownPeerNoteTypeMessage() ); + } else + throw new std::runtime_error("Not implemented " + header); m->message = Message::factory(header); Modified: trunk/apps/CppFCPLib/ServerMessage.h =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.h 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/ServerMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -17,7 +17,8 @@ static ServerMessagePtr factory(Server &s); virtual std::string getIdOfJob() const = 0; - virtual bool isLastMessage(const std::string &cmd) const = 0; + virtual bool isLast(const std::string &cmd) const = 0; + virtual bool isError() const = 0; virtual ~ServerMessage() {} const std::string& toString() const; Added: trunk/apps/CppFCPLib/SimpleProgressMessage.h =================================================================== --- trunk/apps/CppFCPLib/SimpleProgressMessage.h (rev 0) +++ trunk/apps/CppFCPLib/SimpleProgressMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,32 @@ +#ifndef SIMPLEPROGRESSMESSAGE_H_INCLUDED +#define SIMPLEPROGRESSMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class SimpleProgressMessage : public ServerMessage { + SimpleProgressMessage() {} +public: + std::string getIdOfJob() const + { + return message->getField("Identifier"); + } + + bool isLast(const std::string &cmd) const + { + return false; + } + bool isError() const { + return false; + } + friend class ServerMessage; +}; + +} + + +#endif // SIMPLEPROGRESSMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/StartedCompressionMessage.h =================================================================== --- trunk/apps/CppFCPLib/StartedCompressionMessage.h (rev 0) +++ trunk/apps/CppFCPLib/StartedCompressionMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,31 @@ +#ifndef STARTEDCOMPRESSIONMESSAGE_H_INCLUDED +#define STARTEDCOMPRESSIONMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class StartedCompressionMessage : public ServerMessage { + StartedCompressionMessage() {} +public: + std::string getIdOfJob() const + { + return message->getField("Identifier"); + } + + bool isLast(const std::string &cmd) const + { + return false; + } + bool isError() const { + return false; + } + friend class ServerMessage; +}; + +} + +#endif // STARTEDCOMPRESSIONMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/URIGeneratedMessage.h =================================================================== --- trunk/apps/CppFCPLib/URIGeneratedMessage.h (rev 0) +++ trunk/apps/CppFCPLib/URIGeneratedMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,31 @@ +#ifndef URIGENERATEDMESSAGE_H_INCLUDED +#define URIGENERATEDMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class URIGeneratedMessage : public ServerMessage { + URIGeneratedMessage() {} +public: + std::string getIdOfJob() const + { + return message->getField("Identifier"); + } + + bool isLast(const std::string &cmd) const + { + return false; + } + bool isError() const { + return false; + } + friend class ServerMessage; +}; + +} + +#endif // URIGENERATEDMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/UnknownNodeIdentifierMessage.h =================================================================== --- trunk/apps/CppFCPLib/UnknownNodeIdentifierMessage.h (rev 0) +++ trunk/apps/CppFCPLib/UnknownNodeIdentifierMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,31 @@ +#ifndef UNKNOWNNODEIDENTIFIERMESSAGE_H_INCLUDED +#define UNKNOWNNODEIDENTIFIERMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class UnknownNodeIdentifierMessage : public ServerMessage { + UnknownNodeIdentifierMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return true; + } + friend class ServerMessage; +}; + +} + +#endif // UNKNOWNNODEIDENTIFIERMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/UnknownPeerNoteTypeMessage.h =================================================================== --- trunk/apps/CppFCPLib/UnknownPeerNoteTypeMessage.h (rev 0) +++ trunk/apps/CppFCPLib/UnknownPeerNoteTypeMessage.h 2007-07-09 09:55:18 UTC (rev 14000) @@ -0,0 +1,31 @@ +#ifndef UNKNOWNPEERNOTETYPEMESSAGE_H_INCLUDED +#define UNKNOWNPEERNOTETYPEMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class UnknownPeerNoteTypeMessage : public ServerMessage { + UnknownPeerNoteTypeMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return true; + } + friend class ServerMessage; +}; + +} + +#endif // UNKNOWNPEERNOTETYPEMESSAGE_H_INCLUDED Modified: trunk/apps/CppFCPLib/main.cpp =================================================================== --- trunk/apps/CppFCPLib/main.cpp 2007-07-08 20:05:12 UTC (rev 13999) +++ trunk/apps/CppFCPLib/main.cpp 2007-07-09 09:55:18 UTC (rev 14000) @@ -3,6 +3,7 @@ #include "Server.h" #include "Node.h" #include "FCPMultiMessageResponse.h" +#include "ServerMessage.h" using namespace std; using namespace FCPLib; @@ -18,8 +19,25 @@ // cout << line; // } + /// list pears +// Node n("123", "", -1); +// FCPMultiMessageResponse::FCPMultiMessageResponsePtr r = n.listPeers(); +// +// const std::vector& mess = r->getMessages(); +// std::vector::const_iterator it; +// for (it= mess.begin(); it!=mess.end(); ++it) { +// cout << (*it)->toString() << "\n"; +// } +// return 0; + + /// put some data Node n("123", "", -1); -// FCPListPeersResult::FCPListPeersResultPtr r = n.listPeers(); + FCPMultiMessageResponse::FCPMultiMessageResponsePtr r = n.putData("CHK@", "Hello!", "Ident-1"); + const std::vector& mess = r->getMessages(); + std::vector::const_iterator it; + for (it= mess.begin(); it!=mess.end(); ++it) { + cout << (*it)->toString() << "\n"; + } return 0; } From mkolar at freenetproject.org Tue Jul 10 10:44:12 2007 From: mkolar at freenetproject.org (mkolar at freenetproject.org) Date: Tue, 10 Jul 2007 10:44:12 +0000 (UTC) Subject: [Cppfcplib] r14012 - trunk/apps/CppFCPLib Message-ID: <20070710104412.DB08347A229@freenetproject.org> Author: mkolar Date: 2007-07-10 10:44:12 +0000 (Tue, 10 Jul 2007) New Revision: 14012 Added: trunk/apps/CppFCPLib/CloseConnectionDuplicateNameMessage.h trunk/apps/CppFCPLib/FCPErrorResponse.h trunk/apps/CppFCPLib/FCPTestDDAReplyResponse.h trunk/apps/CppFCPLib/SSKKeypairMessage.h trunk/apps/CppFCPLib/TestDDACompleteMessage.h trunk/apps/CppFCPLib/TestDDAReplyMessage.h Modified: trunk/apps/CppFCPLib/AdditionalFields.h trunk/apps/CppFCPLib/Exceptions.cpp trunk/apps/CppFCPLib/Exceptions.h trunk/apps/CppFCPLib/FCPMultiMessageResponse.h trunk/apps/CppFCPLib/FCPOneMessageResponse.h trunk/apps/CppFCPLib/FCPResult.cpp trunk/apps/CppFCPLib/IdentifierCollisionMessage.h trunk/apps/CppFCPLib/Message.cpp trunk/apps/CppFCPLib/Message.h trunk/apps/CppFCPLib/Node.cpp trunk/apps/CppFCPLib/Node.h trunk/apps/CppFCPLib/ServerMessage.cpp Log: * FCPErrorResponse created to represent error in communication with node ** FCPException added to represent runtime exceptions * TestDDA first implementation Modified: trunk/apps/CppFCPLib/AdditionalFields.h =================================================================== --- trunk/apps/CppFCPLib/AdditionalFields.h 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/AdditionalFields.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -4,6 +4,7 @@ #include #include #include +#include namespace FCPLib { @@ -24,8 +25,12 @@ if (fields.find(key) == fields.end()) return false; return true; } - const std::string& getField(std::string key) const { - return fields[key]; + const std::string& getField(std::string key) const throw(std::invalid_argument){ + std::map::const_iterator it; + it = fields.find(key); + if (it == fields.end()) + throw new std::invalid_argument("Additional fields object does not contain: " + key); + return it->second; } }; Added: trunk/apps/CppFCPLib/CloseConnectionDuplicateNameMessage.h =================================================================== --- trunk/apps/CppFCPLib/CloseConnectionDuplicateNameMessage.h (rev 0) +++ trunk/apps/CppFCPLib/CloseConnectionDuplicateNameMessage.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -0,0 +1,32 @@ +#ifndef CLOSECONNECTIONDUPLICATENAMEMESSAGE_H_INCLUDED +#define CLOSECONNECTIONDUPLICATENAMEMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class CloseConnectionDuplicateNameMessage : public ServerMessage { + CloseConnectionDuplicateNameMessage() {} +public: + std::string getIdOfJob() const + { + return "__hello"; + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return true; + } + friend class ServerMessage; +}; + +} + + +#endif // CLOSECONNECTIONDUPLICATENAMEMESSAGE_H_INCLUDED Modified: trunk/apps/CppFCPLib/Exceptions.cpp =================================================================== --- trunk/apps/CppFCPLib/Exceptions.cpp 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/Exceptions.cpp 2007-07-10 10:44:12 UTC (rev 14012) @@ -29,3 +29,15 @@ StdError::~StdError() throw() { } + +FCPException::FCPException(Message::MessagePtr m) + : std::runtime_error(m->getHeader()), + message(m) +{ +} + +FCPException::~FCPException() throw() +{ +} + + Modified: trunk/apps/CppFCPLib/Exceptions.h =================================================================== --- trunk/apps/CppFCPLib/Exceptions.h 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/Exceptions.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -4,6 +4,7 @@ #include #include +#include "Message.h" namespace FCPLib { @@ -17,6 +18,17 @@ ~StdError() throw(); }; +class FCPException : public std::runtime_error { + Message::MessagePtr message; +public: + FCPException(std::string msg); + FCPException(Message::MessagePtr m); + const Message::MessagePtr& getMessage() const { + return message; + } + ~FCPException() throw(); +}; + } #endif Added: trunk/apps/CppFCPLib/FCPErrorResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPErrorResponse.h (rev 0) +++ trunk/apps/CppFCPLib/FCPErrorResponse.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -0,0 +1,32 @@ +#ifndef FCPERRORRESPONSE_H_INCLUDED +#define FCPERRORRESPONSE_H_INCLUDED + +#include +#include +#include "Message.h" +#include "FCPResult.h" + + +namespace FCPLib { + + +class FCPErrorResponse : public FCPResult { + +protected: + std::vector messages; + + FCPErrorResponse( const std::vector &nodeResponse) + : messages(nodeResponse) + { + } +public: + typedef boost::shared_ptr FCPErrorResponsePtr; + + const std::vector& getMessages() const { + return messages; + } + friend class FCPResult; +}; +} + +#endif // FCPERRORRESPONSE_H_INCLUDED Modified: trunk/apps/CppFCPLib/FCPMultiMessageResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPMultiMessageResponse.h 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/FCPMultiMessageResponse.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -12,6 +12,8 @@ class FCPMultiMessageResponse : public FCPResult { + +protected: std::vector messages; FCPMultiMessageResponse( const std::vector &nodeResponse, bool removeLast = true ) { @@ -22,7 +24,7 @@ public: typedef boost::shared_ptr FCPMultiMessageResponsePtr; - const std::vector getMessages() const { + const std::vector& getMessages() const { return messages; } friend class FCPResult; Modified: trunk/apps/CppFCPLib/FCPOneMessageResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPOneMessageResponse.h 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/FCPOneMessageResponse.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -9,8 +9,8 @@ namespace FCPLib { class FCPOneMessageResponse : public FCPResult { +protected: Message::MessagePtr message; - FCPOneMessageResponse(Message::MessagePtr message_) : message(message_) {} public: typedef boost::shared_ptr FCPOneMessageResponsePtr; Modified: trunk/apps/CppFCPLib/FCPResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPResult.cpp 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/FCPResult.cpp 2007-07-10 10:44:12 UTC (rev 14012) @@ -4,14 +4,20 @@ #include "FCPMultiMessageResponse.h" #include "FCPOneMessageResponse.h" +#include "FCPTestDDAReplyResponse.h" +#include "FCPErrorResponse.h" using namespace FCPLib; FCPResult::FCPResultPtr FCPResult::factory(const std::string cmd, std::vector &nodeResponse) { + // check for error + if (nodeResponse.back()->isError()) + return FCPErrorResponse::FCPErrorResponsePtr( new FCPErrorResponse(nodeResponse) ); + if (cmd == "ClientHello") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); } else if (cmd == "ListPeers") { return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse) ); @@ -20,20 +26,32 @@ return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse) ); } else if (cmd == "ModifyPeer") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); } else if (cmd == "ModifyPeerNote") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); } else if (cmd == "RemovePeer") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); } else if (cmd == "GetNode") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); } else if (cmd == "GetConfig") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); } else + if (cmd == "ModifyConfig") { + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + } else + if (cmd == "TestDDARequest") { + return FCPTestDDAReplyResponse::FCPTestDDAReplyResponsePtr( new FCPTestDDAReplyResponse( (*nodeResponse.begin())->getMessage() )); + } else + if (cmd == "TestDDAResponse") { + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPTestDDAReplyResponse( (*nodeResponse.begin())->getMessage() )); + } else + if (cmd == "GenerateSSK") { + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + } else if (cmd == "ClientPut") { return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse, false) ); } Added: trunk/apps/CppFCPLib/FCPTestDDAReplyResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPTestDDAReplyResponse.h (rev 0) +++ trunk/apps/CppFCPLib/FCPTestDDAReplyResponse.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -0,0 +1,38 @@ +#ifndef FCPTESTDDAREPLYRESPONSE_H_INCLUDED +#define FCPTESTDDAREPLYRESPONSE_H_INCLUDED + +#include "FCPOneMessageResponse.h" +#include + +namespace FCPLib { + +class FCPTestDDAReplyResponse : public FCPOneMessageResponse { + FCPTestDDAReplyResponse(Message::MessagePtr message_) : FCPOneMessageResponse(message_) {} + + const std::string& getField(std::string field) const { + const std::string& ret = message->getField(field); + if (ret == "") + throw new std::logic_error("TestDDAReply does not contain " + field + " field."); + } +public: + typedef boost::shared_ptr FCPTestDDAReplyResponsePtr; + + const std::string getDirectory() const throw(std::logic_error){ + return message->getField("Directory"); + } + const std::string& getReadFilename() const throw(std::logic_error){ + return getField("ReadFilename"); + } + const std::string& getWriteFilename() const throw(std::logic_error){ + return getField("WriteFilename"); + } + const std::string& getContent () const throw(std::logic_error){ + return getField("Content"); + } + + friend class FCPResult; +}; + +} + +#endif // FCPTESTDDAREPLYRESPONSE_H_INCLUDED Modified: trunk/apps/CppFCPLib/IdentifierCollisionMessage.h =================================================================== --- trunk/apps/CppFCPLib/IdentifierCollisionMessage.h 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/IdentifierCollisionMessage.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -13,7 +13,7 @@ public: std::string getIdOfJob() const { - return "__global"; + return message->getField("Identifier"); } bool isLast(const std::string &cmd) const Modified: trunk/apps/CppFCPLib/Message.cpp =================================================================== --- trunk/apps/CppFCPLib/Message.cpp 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/Message.cpp 2007-07-10 10:44:12 UTC (rev 14012) @@ -30,7 +30,7 @@ } } -const std::string& +const std::string Message::getField(std::string key) const { std::map::const_iterator it; Modified: trunk/apps/CppFCPLib/Message.h =================================================================== --- trunk/apps/CppFCPLib/Message.h 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/Message.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -31,7 +31,7 @@ void setField(std::string key, std::string value); void setFields(const std::map &fields); - const std::string& getField(std::string key) const; + const std::string getField(std::string key) const; const std::string& getHeader() const; const std::string& toString(); Modified: trunk/apps/CppFCPLib/Node.cpp =================================================================== --- trunk/apps/CppFCPLib/Node.cpp 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/Node.cpp 2007-07-10 10:44:12 UTC (rev 14012) @@ -1,6 +1,10 @@ #include "Node.h" #include "Log.h" +#include +#include +#include "Exceptions.h" +#include "FCPErrorResponse.h" using namespace FCPLib; @@ -11,6 +15,23 @@ return std::string(newid); } +const Message::MessagePtr +Node::getNodeHelloMessage() const +{ + return nodeHelloMessage; +} + +void +Node::checkProtocolError(JobTicket::JobTicketPtr &job) +{ + if (typeid(job->getResult()).name() == "FCPErrorResponse") { + Message::MessagePtr lastMessage = + ( boost::dynamic_pointer_cast (job->getResult()) ) + ->getMessages().back()->getMessage(); + throw new FCPException(lastMessage); + } +} + Node::Node(std::string name_, std::string host, int port) : name(name_), clientReqQueue( new TQueue() ) @@ -35,7 +56,11 @@ job->wait(0); log().log(DEBUG, "NodeHello arrived"); - // TODO: put information received from NODE somewhere + // check if CloceConnectionDuplicateName or ProtocolError has arrived + checkProtocolError(job); // throws + + nodeHelloMessage = ( boost::dynamic_pointer_cast (job->getResult()) ) + ->getMessages().back()->getMessage(); } Node::~Node() @@ -58,6 +83,9 @@ job->wait(0); log().log(DEBUG, "EndListPeers arrived"); + // NOTE: error should never happen hear... + checkProtocolError(job); // throws + return boost::dynamic_pointer_cast(job->getResult()); } @@ -75,6 +103,9 @@ job->wait(0); log().log(DEBUG, "EndListPeers arrived"); + // ProtocolError or UnknownNodeIdentifier + checkProtocolError(job); // throws + return boost::dynamic_pointer_cast(job->getResult()); } @@ -93,6 +124,8 @@ log().log(DEBUG, "waiting for AddPeer to be sent"); job->waitTillReqSent(); log().log(DEBUG, "AddPeer to was sent"); + + // should I check for the errors? how do I know that the operation was successful } @@ -110,6 +143,8 @@ log().log(DEBUG, "waiting for AddPeer to be sent"); job->waitTillReqSent(); log().log(DEBUG, "AddPeer to was sent"); + + // should I check for the errors? how do I know that the operation was successful } FCPOneMessageResponse::FCPOneMessageResponsePtr @@ -153,6 +188,9 @@ job->wait(0); log().log(DEBUG, "PeerNote received"); + // ProtocolError or UnknownNodeIdentifier + checkProtocolError(job); // throws + return boost::dynamic_pointer_cast(job->getResult()); } @@ -172,6 +210,9 @@ job->wait(0); log().log(DEBUG, "PeerRemoved received"); + // ProtocolError or UnknownNodeIdentifier + checkProtocolError(job); // throws + return boost::dynamic_pointer_cast(job->getResult()); } @@ -191,6 +232,9 @@ job->wait(0); log().log(DEBUG, "NodeData received"); + // ProtocolError or UnknownNodeIdentifier + checkProtocolError(job); // throws + return boost::dynamic_pointer_cast(job->getResult()); } @@ -200,7 +244,7 @@ Message::MessagePtr m = Message::factory( std::string("GetConfig") ); if (fields.hasField("WithCurrent")) m->setField("WithCurrent", fields.getField("WithCurrent")); - if (fields.hasField("WithDefaul")) m->setField("WithDefaul", fields.getField("WithDefaul")); + if (fields.hasField("WithDefault")) m->setField("WithDefault", fields.getField("WithDefault")); if (fields.hasField("WithSortOrder")) m->setField("WithSortOrder", fields.getField("WithSortOrder")); if (fields.hasField("WithExpertFlag")) m->setField("WithExpertFlag", fields.getField("WithExpertFlag")); if (fields.hasField("WithForceWriteFlag")) m->setField("WithForceWriteFlag", fields.getField("WithForceWriteFlag")); @@ -215,9 +259,93 @@ job->wait(0); log().log(DEBUG, "ConfigData received"); + // ProtocolError or UnknownNodeIdentifier + checkProtocolError(job); // throws + return boost::dynamic_pointer_cast(job->getResult()); } +FCPOneMessageResponse::FCPOneMessageResponsePtr +Node::modifyConfig(Message::MessagePtr m) +{ + if (m->getHeader() != "ModifyConfig") + throw new std::logic_error("ModifyConfig message expected, " + m->getHeader() + " received"); + + JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); + log().log(DEBUG, job->toString()); + clientReqQueue->put(job); + + log().log(DEBUG, "waiting for the ConfigData"); + job->wait(0); + log().log(DEBUG, "ConfigData received"); + + // ProtocolError or UnknownNodeIdentifier + checkProtocolError(job); // throws + + return boost::dynamic_pointer_cast(job->getResult()); +} + +FCPTestDDAReplyResponse::FCPTestDDAReplyResponsePtr +Node::testDDARequest(std::string dir, bool read, bool write) +{ + Message::MessagePtr m = Message::factory( std::string("TestDDARequest") ); + + m->setField("Directory", dir); + m->setField("WantReadDirectory", boost::lexical_cast(read)); + m->setField("WantWriteDirectory", boost::lexical_cast(write)); + + JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); + + log().log(DEBUG, "waiting for the TestDDAReply"); + job->wait(0); + log().log(DEBUG, "TestDDAReply received"); + + // check if protocol error has occured + checkProtocolError(job); // throws + + return boost::dynamic_pointer_cast(job->getResult()); +} + +FCPOneMessageResponse::FCPOneMessageResponsePtr +Node::testDDAResponse(std::string dir, std::string readContent) +{ + Message::MessagePtr m = Message::factory( std::string("TestDDAResponse") ); + + m->setField("Directory", dir); + if (readContent != "") + m->setField("ReadContent", readContent); + + JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); + + log().log(DEBUG, "waiting for the TestDDA"); + job->wait(0); + log().log(DEBUG, "TestDDAResponse received"); + + // check if protocol error has occured + checkProtocolError(job); // throws + + return boost::dynamic_pointer_cast(job->getResult()); +} + +FCPOneMessageResponse::FCPOneMessageResponsePtr +Node::generateSSK(std::string identifier) +{ + Message::MessagePtr m = Message::factory( std::string("GenerateSSK") ); + m->setField("Identifier", identifier); + + JobTicket::JobTicketPtr job = JobTicket::factory( identifier, m, false, false, false, 0 ); + log().log(DEBUG, job->toString()); + clientReqQueue->put(job); + + log().log(DEBUG, "waiting for SSKKeypair"); + job->wait(0); + log().log(DEBUG, "SSKKeypair arrived"); + + checkProtocolError(job); // throws + + return boost::dynamic_pointer_cast(job->getResult()); +} + FCPMultiMessageResponse::FCPMultiMessageResponsePtr Node::putData(const std::string URI, const std::string data, const std::string id, const AdditionalFields& fields ) { @@ -225,7 +353,7 @@ m->setField("URI", URI); m->setField("Identifier", id == "" ? _getUniqueId() : id); - if (fields.hasField("mimetype")) m->setField("Metadata.ContentType", fields.getField("mimetype")); + if (fields.hasField("Metadata.ContentType")) m->setField("Metadata.ContentType", fields.getField("Metadata.ContentType")); if (fields.hasField("Verbosity")) m->setField("Verbosity", fields.getField("Verbosity")); if (fields.hasField("MaxRetries")) m->setField("MaxRetries", fields.getField("MaxRetries")); if (fields.hasField("PriorityClass")) m->setField("PriorityClass", fields.getField("PriorityClass")); @@ -251,7 +379,7 @@ } FCPMultiMessageResponse::FCPMultiMessageResponsePtr -Node::putData(const std::string URI, const std::string target, const std::string id, const AdditionalFields& fields ) +Node::putRedirect(const std::string URI, const std::string target, const std::string id, const AdditionalFields& fields ) { Message::MessagePtr m = Message::factory( std::string("ClientPut")); Modified: trunk/apps/CppFCPLib/Node.h =================================================================== --- trunk/apps/CppFCPLib/Node.h 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/Node.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -12,6 +12,7 @@ #include "NodeThread.h" #include "FCPMultiMessageResponse.h" #include "FCPOneMessageResponse.h" +#include "FCPTestDDAReplyResponse.h" #include "AdditionalFields.h" namespace FCPLib { @@ -23,10 +24,14 @@ static std::string _getUniqueId(); + void checkProtocolError(JobTicket::JobTicketPtr &job); + Message::MessagePtr nodeHelloMessage; public: Node(std::string name, std::string host, int port); ~Node(); + const Message::MessagePtr getNodeHelloMessage() const; + FCPMultiMessageResponse::FCPMultiMessageResponsePtr listPeers(const AdditionalFields& = AdditionalFields()); FCPMultiMessageResponse::FCPMultiMessageResponsePtr listPeerNotes(const std::string&); void addPeer(const std::string &, bool isURL); @@ -36,6 +41,10 @@ FCPOneMessageResponse::FCPOneMessageResponsePtr removePeer(const std::string &); FCPOneMessageResponse::FCPOneMessageResponsePtr getNode(const AdditionalFields& = AdditionalFields()); FCPOneMessageResponse::FCPOneMessageResponsePtr getConfig(const AdditionalFields& = AdditionalFields()); + FCPOneMessageResponse::FCPOneMessageResponsePtr modifyConfig(Message::MessagePtr m); + FCPTestDDAReplyResponse::FCPTestDDAReplyResponsePtr testDDARequest(std::string dir, bool read, bool write); + FCPOneMessageResponse::FCPOneMessageResponsePtr testDDAResponse(std::string dir, std::string readContent = ""); + FCPOneMessageResponse::FCPOneMessageResponsePtr generateSSK(std::string identifier); FCPMultiMessageResponse::FCPMultiMessageResponsePtr putData(const std::string , // URI const std::string , // Data const std::string = "", // Identifier Added: trunk/apps/CppFCPLib/SSKKeypairMessage.h =================================================================== --- trunk/apps/CppFCPLib/SSKKeypairMessage.h (rev 0) +++ trunk/apps/CppFCPLib/SSKKeypairMessage.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -0,0 +1,31 @@ +#ifndef SSKKEYPAIRMESSAGE_H_INCLUDED +#define SSKKEYPAIRMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class SSKKeypairMessage : public ServerMessage { + SSKKeypairMessage() {} +public: + std::string getIdOfJob() const + { + return message->getField("Identifier"); + } + + bool isLast(const std::string &cmd) const + { + return true; + } + bool isError() const { + return false; + } + friend class ServerMessage; +}; + +} + +#endif // SSKKEYPAIRMESSAGE_H_INCLUDED Modified: trunk/apps/CppFCPLib/ServerMessage.cpp =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.cpp 2007-07-09 23:25:33 UTC (rev 14011) +++ trunk/apps/CppFCPLib/ServerMessage.cpp 2007-07-10 10:44:12 UTC (rev 14012) @@ -20,6 +20,10 @@ #include "UnknownNodeIdentifierMessage.h" #include "UnknownPeerNoteTypeMessage.h" #include "PersistentRequestRemovedMessage.h" +#include "TestDDACompleteMessage.h" +#include "TestDDAReplyMessage.h" +#include "SSKKeypairMessage.h" +#include "CloseConnectionDuplicateNameMessage.h" using namespace FCPLib; @@ -38,6 +42,9 @@ if (header == "NodeHello"){ m = ServerMessagePtr( new NodeHelloMessage() ); } else + if (header == "CloseConnectionDuplicateName") { + m = ServerMessagePtr( new CloseConnectionDuplicateNameMessage() ); + } else if (header == "Peer") { m = ServerMessagePtr( new PeerMessage() ); } else @@ -60,13 +67,13 @@ m = ServerMessagePtr( new ConfigDataMessage() ); } else if (header == "TestDDAReply") { - throw new std::runtime_error("Not implemented " + header); + m = ServerMessagePtr( new TestDDAReplyMessage() ); } else if (header == "TestDDAComplete") { - throw new std::runtime_error("Not implemented " + header); + m = ServerMessagePtr( new TestDDACompleteMessage() ); } else if (header == "SSKKeypair") { - throw new std::runtime_error("Not implemented " + header); + m = ServerMessagePtr( new SSKKeypairMessage() ); } else if (header == "PersistentGet") { throw new std::runtime_error("Not implemented " + header); Added: trunk/apps/CppFCPLib/TestDDACompleteMessage.h =================================================================== --- trunk/apps/CppFCPLib/TestDDACompleteMessage.h (rev 0) +++ trunk/apps/CppFCPLib/TestDDACompleteMessage.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -0,0 +1,33 @@ +#ifndef TESTDDACOMPLETEMESSAGE_H_INCLUDED +#define TESTDDACOMPLETEMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class TestDDACompleteMessage : public ServerMessage { + TestDDACompleteMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLast(const std::string &cmd) const + { + return true; + } + + bool isError() const { + return false; + } + + friend class ServerMessage; +}; + +} + +#endif // TESTDDACOMPLETEMESSAGE_H_INCLUDED Added: trunk/apps/CppFCPLib/TestDDAReplyMessage.h =================================================================== --- trunk/apps/CppFCPLib/TestDDAReplyMessage.h (rev 0) +++ trunk/apps/CppFCPLib/TestDDAReplyMessage.h 2007-07-10 10:44:12 UTC (rev 14012) @@ -0,0 +1,33 @@ +#ifndef TESTDDAREPLYMESSAGE_H_INCLUDED +#define TESTDDAREPLYMESSAGE_H_INCLUDED + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class TestDDAReplyMessage : public ServerMessage { + TestDDAReplyMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLast(const std::string &cmd) const + { + return true; + } + + bool isError() const { + return false; + } + + friend class ServerMessage; +}; + +} + +#endif // TESTDDAREPLYMESSAGE_H_INCLUDED From mkolar at freenetproject.org Thu Jul 12 11:02:43 2007 From: mkolar at freenetproject.org (mkolar at freenetproject.org) Date: Thu, 12 Jul 2007 11:02:43 +0000 (UTC) Subject: [Cppfcplib] r14042 - trunk/apps/CppFCPLib Message-ID: <20070712110243.5C07647A239@freenetproject.org> Author: mkolar Date: 2007-07-12 11:02:42 +0000 (Thu, 12 Jul 2007) New Revision: 14042 Modified: trunk/apps/CppFCPLib/JobTicket.h trunk/apps/CppFCPLib/Message.cpp trunk/apps/CppFCPLib/Message.h trunk/apps/CppFCPLib/Node.cpp trunk/apps/CppFCPLib/NodeThread.cpp trunk/apps/CppFCPLib/NodeThread.h trunk/apps/CppFCPLib/Server.cpp trunk/apps/CppFCPLib/Server.h trunk/apps/CppFCPLib/ServerMessage.cpp trunk/apps/CppFCPLib/ServerMessage.h trunk/apps/CppFCPLib/main.cpp Log: Server is implemented using boost.asio library. Modified: trunk/apps/CppFCPLib/JobTicket.h =================================================================== --- trunk/apps/CppFCPLib/JobTicket.h 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/JobTicket.h 2007-07-12 11:02:42 UTC (rev 14042) @@ -61,6 +61,7 @@ const std::string& getCommandName() const; const std::string& getId() const; const std::string& getMessageText() const; + const Message::MessagePtr getCommand() const; void wait(unsigned int timeout_=0); void waitTillReqSent(); Modified: trunk/apps/CppFCPLib/Message.cpp =================================================================== --- trunk/apps/CppFCPLib/Message.cpp 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/Message.cpp 2007-07-12 11:02:42 UTC (rev 14042) @@ -18,7 +18,6 @@ void Message::setField(std::string key, std::string value) { - // TODO: should i check if a message can contain certain field? isReprValid = false; fields[key] = value; } @@ -47,20 +46,9 @@ return repr; repr = header + "\n"; for (std::map::iterator it = fields.begin(); it != fields.end(); ++it) - if (isDataType && it->first == "Data") - continue; - else repr += it->first + "=" + it->second + "\n"; - if (isDataType) { - std::string& data = fields["Data"]; - repr += "DataLength="; - repr += boost::lexical_cast(data.size()); - repr += "\n"; - repr += "Data\n"; - repr += data; - } else { + if (!isDataType) repr += "EndMessage\n"; - } isReprValid = true; return repr; } @@ -71,3 +59,38 @@ return header; } +void +Message::toStream(std::ostream& ostream) +{ + ostream << toString(); +} + +void +DataMessage::setStream(std::istream* s_, int dataLength) +{ + stream_ = s_; + dataLength_ = dataLength; +} + +const std::string& +DataMessage::toString() { + if (isReprValid) + return repr; + Message::toString(); + repr += "DataLength\n" + boost::lexical_cast(dataLength_); + repr += "Data\n"; + isReprValid = true; + return repr; +} + +void +DataMessage::toStream(std::ostream& ostream) +{ + ostream << toString(); + ostream << *stream_; +} + +void operator<<(std::ostream& ostream, Message::MessagePtr m) +{ + ostream << m; +} Modified: trunk/apps/CppFCPLib/Message.h =================================================================== --- trunk/apps/CppFCPLib/Message.h 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/Message.h 2007-07-12 11:02:42 UTC (rev 14042) @@ -5,17 +5,18 @@ #include #include +#include +#include #include namespace FCPLib { class Message { +protected: std::string repr; std::string header; - std::map fields; -protected: bool isReprValid; bool isDataType; @@ -34,13 +35,24 @@ const std::string getField(std::string key) const; const std::string& getHeader() const; - const std::string& toString(); + virtual const std::string& toString(); + virtual void toStream(std::ostream&); + + virtual ~Message() {} }; class DataMessage : public Message { + std::istream *stream_; + int dataLength_; protected: - DataMessage() { isDataType = true;} + DataMessage() { isDataType = true; } + void setStream(std::istream* s_, int dataLength); + const std::string& toString(); + void toStream(std::ostream&); + +public: + ~DataMessage() {} friend class Message; }; Modified: trunk/apps/CppFCPLib/Node.cpp =================================================================== --- trunk/apps/CppFCPLib/Node.cpp 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/Node.cpp 2007-07-12 11:02:42 UTC (rev 14042) @@ -59,8 +59,8 @@ // check if CloceConnectionDuplicateName or ProtocolError has arrived checkProtocolError(job); // throws - nodeHelloMessage = ( boost::dynamic_pointer_cast (job->getResult()) ) - ->getMessages().back()->getMessage(); + nodeHelloMessage = ( boost::dynamic_pointer_cast (job->getResult()) ) + ->getMessage(); } Node::~Node() Modified: trunk/apps/CppFCPLib/NodeThread.cpp =================================================================== --- trunk/apps/CppFCPLib/NodeThread.cpp 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/NodeThread.cpp 2007-07-12 11:02:42 UTC (rev 14042) @@ -11,12 +11,26 @@ int port, ZThread::CountedPtr > &clientReqQueue_) throw() : clientReqQueue(clientReqQueue_), - s(host, port), + host_(host), + port_(port), + isAlive_(true), jobs( new std::map() ) { } void NodeThread::run(){ + // create server + try { + s = boost::shared_ptr (new Server( host_, port_ )); + } + catch (std::exception& e) { + log().log(ERROR, "_mgrThread: serverFail"); + log().log(ERROR, e.what()); + isAlive_ = false; + exception = ZThread::CountedPtr ( new std::exception(e) ); + return; + } + ServerMessage::ServerMessagePtr m; JobTicket::JobTicketPtr job; log().log(DETAIL, "FCPNode: manager thread starting"); @@ -24,7 +38,7 @@ while (!Thread::interrupted()) { //check for incoming message from node log().log(NOISY, "_mgrThread: Testing for incoming message"); - if (s.dataAvailable()){ + if (s->dataAvailable()){ log().log(DEBUG, "_mgrThread: Retrieving incoming message"); m = ServerMessage::factory(s); log().log(DEBUG, "_mgrThread: Got incoming message, dispatching"); @@ -39,10 +53,20 @@ log().log(DEBUG, job->toString()); sendClientReq(job); } + Thread::sleep(100); } } catch (ZThread::Synchronization_Exception& e) { log().log(DEBUG, "_mgrThread: Caught Synchronization_Exception"); +// isAlive_ = false; +// exception = ZThread::CountedPtr ( new std::exception(e) ); + return; + } catch (std::exception& e) { + log().log(DEBUG, "_mgrThreag: Caught std::exception"); + isAlive_ = false; + exception = ZThread::CountedPtr ( new std::exception(e) ); + return; } + // TODO: catch more specific exceptions as well } void @@ -55,7 +79,7 @@ log().log(NOISY, "sendClientReq : added the job to the map"); } - s.send(job->getMessageText()); + s->send(job->getMessageText()); job->timeQueued = (unsigned int) time(0); job->reqSentLock.release(); } Modified: trunk/apps/CppFCPLib/NodeThread.h =================================================================== --- trunk/apps/CppFCPLib/NodeThread.h 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/NodeThread.h 2007-07-12 11:02:42 UTC (rev 14042) @@ -9,6 +9,8 @@ #include #include "JobTicket.h" #include "ServerMessage.h" +#include +#include namespace FCPLib { @@ -18,8 +20,13 @@ class NodeThread : public ZThread::Runnable { ZThread::CountedPtr< JobTicketQueue > clientReqQueue; - FCPLib::Server s; + std::string host_; + int port_; + boost::shared_ptr s; + bool isAlive_; + ZThread::CountedPtr exception; + ZThread::CountedPtr< std::map > jobs; friend class Node; @@ -29,6 +36,12 @@ void doMessage(ServerMessage::ServerMessagePtr &message); public: void run(); + bool isAlive() const { + return isAlive_; + } + ZThread::CountedPtr getFailure() const { + return exception; + } }; } Modified: trunk/apps/CppFCPLib/Server.cpp =================================================================== --- trunk/apps/CppFCPLib/Server.cpp 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/Server.cpp 2007-07-12 11:02:42 UTC (rev 14042) @@ -2,149 +2,68 @@ #include "Server.h" #include "Exceptions.h" #include "DefaultValues.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include #include "Log.h" using namespace FCPLib; -Server::Server(std::string &host, int port){ - /* Use local host as default address */ - if (!host.size()) - host = "127.0.0.1"; +Server::Server(std::string &host, int port) + : response_stream(&response){ + using boost::asio::ip::tcp; - /* Use default port */ - if (port<=0) - port = 9481; + if ( host == "" ) host = "127.0.0.1"; + if ( port == -1 ) port = 9481; - struct hostent *he; - struct sockaddr_in addr; + tcp::resolver resolver(io_service); + tcp::resolver::query query(host, boost::lexical_cast(port)); + tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); + tcp::resolver::iterator end; - /* Resolve hostname */ - if ((he = gethostbyname(host.c_str())) == NULL) - throw StdError(__FUNCTION__, "Failed to resolve", strerror(errno)); - - /* Snag socket */ - if ((sockfd = socket(PF_INET, SOCK_STREAM, 0))<0) - throw StdError(__FUNCTION__, "Failed to get socket", strerror(errno)); - - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - addr.sin_addr = *((struct in_addr *)he->h_addr); - memset(&(addr.sin_zero), '\0', 8); - - /* Connect */ - if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr))<0) { - close(sockfd); - throw StdError(__FUNCTION__, "Failed to connect", strerror(errno)); - } + // Try each endpoint until we successfully establish a connection. + socket_ = auto_ptr( new boost::asio::ip::tcp::socket(io_service) ); + boost::system::error_code error = boost::asio::error::host_not_found; + while (error && endpoint_iterator != end) + { + socket_->close(); + socket_->connect(*endpoint_iterator++, error); + } + if (error) + throw boost::system::system_error(error); } Server::~Server(){ - close(sockfd); } -ssize_t Server::readn(void *vptr, size_t n){ - size_t nleft; - ssize_t nread; - char *ptr; +std::string Server::readln(){ + boost::asio::read_until(*socket_, response, '\n'); - ptr = (char*) vptr; - nleft = n; - while (nleft > 0) { - if ((nread = read(sockfd, ptr, nleft)) < 0) { - if (errno == EINTR) - nread = 0; - else - throw StdError(__FUNCTION__, "", strerror(errno)); - } else if (nread == 0) { - break; // EOF - } - nleft -= nread; - ptr += nread; - } + std::string line; + std::getline(response_stream, line); - return (n - nleft); + return line; } -ssize_t Server::writen(const void *vptr, size_t n){ - size_t nleft; - ssize_t nwritten; - const char *ptr; - - ptr = (const char*) vptr; - nleft = n; - while (nleft > 0) { - if ((nwritten = write(sockfd, ptr, nleft)) <= 0) { - if (errno == EINTR) - nwritten = 0; - else - throw StdError(__FUNCTION__, "", strerror(errno)); - } - nleft -= nwritten; - ptr += nwritten; - } - - return (n); -} - -ssize_t Server::readln(void *vptr, size_t maxlen){ - ssize_t n, rc; - char c, *ptr; - - ptr = (char *)vptr; - for (n = 1; n < maxlen; n++) { - if ((rc = read(sockfd, &c, 1)) == 1) { - *ptr++ = c; - if (c == '\n') - break; - } else if (!rc) { - if (n == 1) - return 0; - else - break; - } - } - *ptr = 0; - return n; -} - void Server::send(const std::string &s){ log().log(DEBUG, "Sending:\n"+s+"-----------------\n"); - writen(s.c_str(), s.length()); + boost::asio::streambuf request; + std::ostream request_stream(&request); + request_stream << s; + boost::asio::write(*socket_, request); } -bool Server::dataAvailable(){ - int pollret; - struct pollfd mypol; - mypol.fd = sockfd; - mypol.events = POLLERR | POLLHUP | POLLIN; +void Server::send(const Message::MessagePtr m) +{ + log().log(DEBUG, "Sending:\n"+m->toString()+"-----------------\n"); + boost::asio::streambuf request; + std::ostream request_stream(&request); + m->toStream(request_stream); + boost::asio::write(*socket_, request); +} - pollret = poll(&mypol, 1, pollTimeout); - - if (pollret<0) - throw new StdError(__FUNCTION__, "poll error", strerror(errno)); - - if (!pollret) - return false; - - /* if we get an error, die */ - if (mypol.revents&POLLERR) - throw new StdError(__FUNCTION__, "poll error", strerror(errno)); - - if (mypol.revents&POLLHUP) - throw new StdError(__FUNCTION__, "poll hangup", strerror(errno)); - - if (mypol.revents&POLLIN) - return true; - - return false; +bool Server::dataAvailable(){ + return socket_->available() != 0 || response.size() != 0; } Modified: trunk/apps/CppFCPLib/Server.h =================================================================== --- trunk/apps/CppFCPLib/Server.h 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/Server.h 2007-07-12 11:02:42 UTC (rev 14042) @@ -3,19 +3,25 @@ #define SERVER_H__ #include +#include +#include "Message.h" namespace FCPLib { class Server { friend class NodeThread; - int sockfd; - Server(std::string &host, int port=-1); + + boost::asio::io_service io_service; + std::auto_ptr socket_; + boost::asio::streambuf response; + std::istream response_stream; + + Server(std::string& host, int port); public: ~Server(); - ssize_t readn(void *vptr, size_t n); - ssize_t readln(void *vptr, size_t maxlen); - ssize_t writen(const void *vptr, size_t n); + std::string readln(); void send(const std::string &s); + void send(Message::MessagePtr m); bool dataAvailable(); }; Modified: trunk/apps/CppFCPLib/ServerMessage.cpp =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.cpp 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/ServerMessage.cpp 2007-07-12 11:02:42 UTC (rev 14042) @@ -29,13 +29,10 @@ ServerMessage::ServerMessagePtr -ServerMessage::factory(Server &s){ +ServerMessage::factory(boost::shared_ptr s){ ServerMessage::ServerMessagePtr m; - static char line[1000]; - s.readln(line, 1000); - line[strlen(line)-1] = 0; - std::string header = std::string(line); + std::string header = s->readln(); log().log(DETAIL, "NODE: " + header); @@ -144,21 +141,21 @@ return m; } -void ServerMessage::read(Server &s) +void ServerMessage::read(boost::shared_ptr s) { - static char line[1000]; - for (;;) { - s.readln(line, 1000); - line[strlen(line)-1] = 0; + std::string line; + for (;;) { + line = s->readln(); - log().log(DETAIL, "NODE: " + std::string(line)); + log().log(DETAIL, "NODE: " + line); - if (!strcmp(line, "End") || !strcmp(line, "EndMessage")) + if ( line == "End" || line == "EndMessage" ) break; - char *val = strchr(line, '='); - *val++ = 0; - message->setField(std::string(line), std::string(val)); + int pos = line.find_first_of('='); + + message->setField(std::string(line.begin(), line.begin() + pos), + std::string(line.begin() + pos + 1, line.end())); } } Modified: trunk/apps/CppFCPLib/ServerMessage.h =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.h 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/ServerMessage.h 2007-07-12 11:02:42 UTC (rev 14042) @@ -3,18 +3,19 @@ #include "Message.h" #include "Server.h" +#include namespace FCPLib { class ServerMessage { - void read(Server &s); + void read(boost::shared_ptr s); protected: Message::MessagePtr message; public: typedef boost::shared_ptr ServerMessagePtr; - static ServerMessagePtr factory(Server &s); + static ServerMessagePtr factory(boost::shared_ptr s); virtual std::string getIdOfJob() const = 0; virtual bool isLast(const std::string &cmd) const = 0; Modified: trunk/apps/CppFCPLib/main.cpp =================================================================== --- trunk/apps/CppFCPLib/main.cpp 2007-07-12 02:23:55 UTC (rev 14041) +++ trunk/apps/CppFCPLib/main.cpp 2007-07-12 11:02:42 UTC (rev 14042) @@ -20,24 +20,24 @@ // } /// list pears + Node n("123", "", -1); + FCPMultiMessageResponse::FCPMultiMessageResponsePtr r = n.listPeers(); + + const std::vector& mess = r->getMessages(); + std::vector::const_iterator it; + for (it= mess.begin(); it!=mess.end(); ++it) { + cout << (*it)->toString() << "\n"; + } + return 0; + + /// put some data // Node n("123", "", -1); -// FCPMultiMessageResponse::FCPMultiMessageResponsePtr r = n.listPeers(); +// FCPMultiMessageResponse::FCPMultiMessageResponsePtr r = n.putData("CHK@", "Hello!", "Ident-1"); // // const std::vector& mess = r->getMessages(); // std::vector::const_iterator it; // for (it= mess.begin(); it!=mess.end(); ++it) { // cout << (*it)->toString() << "\n"; // } -// return 0; - - /// put some data - Node n("123", "", -1); - FCPMultiMessageResponse::FCPMultiMessageResponsePtr r = n.putData("CHK@", "Hello!", "Ident-1"); - - const std::vector& mess = r->getMessages(); - std::vector::const_iterator it; - for (it= mess.begin(); it!=mess.end(); ++it) { - cout << (*it)->toString() << "\n"; - } - return 0; +// return 0; } From mkolar at freenetproject.org Fri Jul 13 10:06:45 2007 From: mkolar at freenetproject.org (mkolar at freenetproject.org) Date: Fri, 13 Jul 2007 10:06:45 +0000 (UTC) Subject: [Cppfcplib] r14059 - trunk/apps/CppFCPLib Message-ID: <20070713100645.A737A3882C3@freenetproject.org> Author: mkolar Date: 2007-07-13 10:06:45 +0000 (Fri, 13 Jul 2007) New Revision: 14059 Modified: trunk/apps/CppFCPLib/Message.cpp trunk/apps/CppFCPLib/Message.h trunk/apps/CppFCPLib/Server.cpp trunk/apps/CppFCPLib/Server.h Log: removed bugs from Server implementation (still some tests are needed with DataMessages) Modified: trunk/apps/CppFCPLib/Message.cpp =================================================================== --- trunk/apps/CppFCPLib/Message.cpp 2007-07-12 22:16:19 UTC (rev 14058) +++ trunk/apps/CppFCPLib/Message.cpp 2007-07-13 10:06:45 UTC (rev 14059) @@ -1,5 +1,7 @@ #include "Message.h" #include +#include +#include using namespace FCPLib; @@ -60,12 +62,19 @@ } void -Message::toStream(std::ostream& ostream) +Message::toStream(std::ostream& output_stream) { - ostream << toString(); + output_stream << toString(); + output_stream.flush(); } void +Message::toSocket(boost::asio::ip::tcp::socket& socket) +{ + boost::asio::write(socket, boost::asio::buffer(toString())); +} + +void DataMessage::setStream(std::istream* s_, int dataLength) { stream_ = s_; @@ -77,20 +86,26 @@ if (isReprValid) return repr; Message::toString(); - repr += "DataLength\n" + boost::lexical_cast(dataLength_); + repr += "DataLength=" + boost::lexical_cast(dataLength_); repr += "Data\n"; isReprValid = true; return repr; } void -DataMessage::toStream(std::ostream& ostream) +DataMessage::toStream(std::ostream& output_stream) { - ostream << toString(); - ostream << *stream_; + output_stream << toString(); + std::copy(std::istream_iterator (*stream_), + std::istream_iterator (), + std::ostream_iterator (output_stream)); + output_stream.flush(); } -void operator<<(std::ostream& ostream, Message::MessagePtr m) +void +DataMessage::toSocket(boost::asio::ip::tcp::socket& socket) { - ostream << m; + boost::asio::write( socket, boost::asio::buffer(toString()) ); + boost::asio::write( socket, boost::asio::buffer(stream_->rdbuf(), dataLength_) ); } + Modified: trunk/apps/CppFCPLib/Message.h =================================================================== --- trunk/apps/CppFCPLib/Message.h 2007-07-12 22:16:19 UTC (rev 14058) +++ trunk/apps/CppFCPLib/Message.h 2007-07-13 10:06:45 UTC (rev 14059) @@ -8,6 +8,7 @@ #include #include #include +#include namespace FCPLib { @@ -37,7 +38,7 @@ virtual const std::string& toString(); virtual void toStream(std::ostream&); - + virtual void toSocket(boost::asio::ip::tcp::socket& socket); virtual ~Message() {} }; @@ -46,12 +47,11 @@ int dataLength_; protected: DataMessage() { isDataType = true; } - +public: void setStream(std::istream* s_, int dataLength); const std::string& toString(); void toStream(std::ostream&); - -public: + void toSocket(boost::asio::ip::tcp::socket& socket); ~DataMessage() {} friend class Message; }; Modified: trunk/apps/CppFCPLib/Server.cpp =================================================================== --- trunk/apps/CppFCPLib/Server.cpp 2007-07-12 22:16:19 UTC (rev 14058) +++ trunk/apps/CppFCPLib/Server.cpp 2007-07-13 10:06:45 UTC (rev 14059) @@ -49,19 +49,15 @@ void Server::send(const std::string &s){ log().log(DEBUG, "Sending:\n"+s+"-----------------\n"); - boost::asio::streambuf request; - std::ostream request_stream(&request); - request_stream << s; - boost::asio::write(*socket_, request); + + boost::asio::write(*socket_, boost::asio::buffer(s)); } void Server::send(const Message::MessagePtr m) { log().log(DEBUG, "Sending:\n"+m->toString()+"-----------------\n"); - boost::asio::streambuf request; - std::ostream request_stream(&request); - m->toStream(request_stream); - boost::asio::write(*socket_, request); + + m->toSocket(*socket_); } bool Server::dataAvailable(){ Modified: trunk/apps/CppFCPLib/Server.h =================================================================== --- trunk/apps/CppFCPLib/Server.h 2007-07-12 22:16:19 UTC (rev 14058) +++ trunk/apps/CppFCPLib/Server.h 2007-07-13 10:06:45 UTC (rev 14059) @@ -4,6 +4,7 @@ #include #include +#include #include "Message.h" namespace FCPLib { @@ -23,6 +24,13 @@ void send(const std::string &s); void send(Message::MessagePtr m); bool dataAvailable(); + + #ifdef _DEBUG_ + static std::auto_ptr create_server(std::string& host, int port) + { + return std::auto_ptr( new Server(host, port) ); + } + #endif }; } From mkolar at freenetproject.org Mon Jul 16 09:17:50 2007 From: mkolar at freenetproject.org (mkolar at freenetproject.org) Date: Mon, 16 Jul 2007 09:17:50 +0000 (UTC) Subject: [Cppfcplib] r14154 - trunk/apps/CppFCPLib Message-ID: <20070716091750.85A634798F7@freenetproject.org> Author: mkolar Date: 2007-07-16 09:17:50 +0000 (Mon, 16 Jul 2007) New Revision: 14154 Added: trunk/apps/CppFCPLib/FCPTestDDAResponse.h Modified: trunk/apps/CppFCPLib/AdditionalFields.h trunk/apps/CppFCPLib/Exceptions.cpp trunk/apps/CppFCPLib/Exceptions.h trunk/apps/CppFCPLib/FCPErrorResponse.h trunk/apps/CppFCPLib/FCPMultiMessageResponse.h trunk/apps/CppFCPLib/FCPOneMessageResponse.h trunk/apps/CppFCPLib/FCPResult.cpp trunk/apps/CppFCPLib/FCPResult.h trunk/apps/CppFCPLib/FCPTestDDAReplyResponse.h trunk/apps/CppFCPLib/JobTicket.cpp trunk/apps/CppFCPLib/JobTicket.h trunk/apps/CppFCPLib/Log.h trunk/apps/CppFCPLib/Message.cpp trunk/apps/CppFCPLib/Message.h trunk/apps/CppFCPLib/Node.cpp trunk/apps/CppFCPLib/Node.h trunk/apps/CppFCPLib/NodeThread.cpp trunk/apps/CppFCPLib/NodeThread.h trunk/apps/CppFCPLib/PeerMessage.h trunk/apps/CppFCPLib/PeerNoteMessage.h trunk/apps/CppFCPLib/Server.cpp trunk/apps/CppFCPLib/Server.h trunk/apps/CppFCPLib/ServerMessage.cpp trunk/apps/CppFCPLib/ServerMessage.h trunk/apps/CppFCPLib/main.cpp trunk/apps/CppFCPLib/todo.txt Log: Modified: trunk/apps/CppFCPLib/AdditionalFields.h =================================================================== --- trunk/apps/CppFCPLib/AdditionalFields.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/AdditionalFields.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -29,7 +29,7 @@ std::map::const_iterator it; it = fields.find(key); if (it == fields.end()) - throw new std::invalid_argument("Additional fields object does not contain: " + key); + throw std::invalid_argument("Additional fields object does not contain: " + key); return it->second; } }; Modified: trunk/apps/CppFCPLib/Exceptions.cpp =================================================================== --- trunk/apps/CppFCPLib/Exceptions.cpp 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/Exceptions.cpp 2007-07-16 09:17:50 UTC (rev 14154) @@ -2,35 +2,7 @@ using namespace FCPLib; -StdError::StdError() : - std::runtime_error(strerror(errno)), - error(errno) -{ -} - -StdError::StdError(int error_) : - std::runtime_error(strerror(error_)), - error(error_) -{ -} - -StdError::StdError(std::string &func, std::string &message, std::string &errstring) : - std::runtime_error(func + " : " + message + " " + errstring), - error(errno) -{ -} - -StdError::StdError(const char *func, const char *message, const char *errstring) : - std::runtime_error(std::string(func) + " : " + std::string(message) + " " + std::string(errstring)), - error(errno) -{ -} - -StdError::~StdError() throw() -{ -} - -FCPException::FCPException(Message::MessagePtr m) +FCPException::FCPException(Message::Ptr m) : std::runtime_error(m->getHeader()), message(m) { Modified: trunk/apps/CppFCPLib/Exceptions.h =================================================================== --- trunk/apps/CppFCPLib/Exceptions.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/Exceptions.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -8,22 +8,11 @@ namespace FCPLib { -class StdError : public std::runtime_error { - int error; -public: - StdError(); - StdError(int error_); - StdError(std::string &func, std::string &message, std::string &errstring); - StdError(const char *func, const char *message, const char *errstring); - ~StdError() throw(); -}; - class FCPException : public std::runtime_error { - Message::MessagePtr message; + Message::Ptr message; public: - FCPException(std::string msg); - FCPException(Message::MessagePtr m); - const Message::MessagePtr& getMessage() const { + FCPException(Message::Ptr m); + const Message::Ptr getMessage() const { return message; } ~FCPException() throw(); Modified: trunk/apps/CppFCPLib/FCPErrorResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPErrorResponse.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/FCPErrorResponse.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -13,16 +13,16 @@ class FCPErrorResponse : public FCPResult { protected: - std::vector messages; + std::vector messages; - FCPErrorResponse( const std::vector &nodeResponse) + FCPErrorResponse( const std::vector& nodeResponse) : messages(nodeResponse) { } public: - typedef boost::shared_ptr FCPErrorResponsePtr; + typedef boost::shared_ptr Ptr; - const std::vector& getMessages() const { + const std::vector& getMessages() const { return messages; } friend class FCPResult; Modified: trunk/apps/CppFCPLib/FCPMultiMessageResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPMultiMessageResponse.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/FCPMultiMessageResponse.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -14,17 +14,17 @@ class FCPMultiMessageResponse : public FCPResult { protected: - std::vector messages; + std::vector messages; - FCPMultiMessageResponse( const std::vector &nodeResponse, bool removeLast = true ) { + FCPMultiMessageResponse( const std::vector &nodeResponse, bool removeLast = true ) { messages = nodeResponse; if (removeLast) messages.pop_back(); } public: - typedef boost::shared_ptr FCPMultiMessageResponsePtr; + typedef boost::shared_ptr Ptr; - const std::vector& getMessages() const { + const std::vector& getMessages() const { return messages; } friend class FCPResult; Modified: trunk/apps/CppFCPLib/FCPOneMessageResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPOneMessageResponse.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/FCPOneMessageResponse.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -10,12 +10,12 @@ class FCPOneMessageResponse : public FCPResult { protected: - Message::MessagePtr message; - FCPOneMessageResponse(Message::MessagePtr message_) : message(message_) {} + Message::Ptr message; + FCPOneMessageResponse(Message::Ptr message_) : message(message_) {} public: - typedef boost::shared_ptr FCPOneMessageResponsePtr; + typedef boost::shared_ptr Ptr; - const Message::MessagePtr getMessage() const { return message; } + const Message::Ptr getMessage() const { return message; } friend class FCPResult; }; Modified: trunk/apps/CppFCPLib/FCPResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPResult.cpp 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/FCPResult.cpp 2007-07-16 09:17:50 UTC (rev 14154) @@ -9,54 +9,54 @@ using namespace FCPLib; -FCPResult::FCPResultPtr -FCPResult::factory(const std::string cmd, std::vector &nodeResponse) +FCPResult::Ptr +FCPResult::factory(const std::string cmd, Response &nodeResponse) { // check for error - if (nodeResponse.back()->isError()) - return FCPErrorResponse::FCPErrorResponsePtr( new FCPErrorResponse(nodeResponse) ); + if (nodeResponse.responses.back()->isError()) + return FCPErrorResponse::Ptr( new FCPErrorResponse(nodeResponse.responses) ); if (cmd == "ClientHello") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + return FCPOneMessageResponse::Ptr( new FCPOneMessageResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "ListPeers") { - return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse) ); + return FCPMultiMessageResponse::Ptr( new FCPMultiMessageResponse(nodeResponse.responses) ); } else if (cmd == "ListPeerNotes") { - return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse) ); + return FCPMultiMessageResponse::Ptr( new FCPMultiMessageResponse(nodeResponse.responses) ); } else if (cmd == "ModifyPeer") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + return FCPOneMessageResponse::Ptr( new FCPOneMessageResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "ModifyPeerNote") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + return FCPOneMessageResponse::Ptr( new FCPOneMessageResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "RemovePeer") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + return FCPOneMessageResponse::Ptr( new FCPOneMessageResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "GetNode") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + return FCPOneMessageResponse::Ptr( new FCPOneMessageResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "GetConfig") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + return FCPOneMessageResponse::Ptr( new FCPOneMessageResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "ModifyConfig") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + return FCPOneMessageResponse::Ptr( new FCPOneMessageResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "TestDDARequest") { - return FCPTestDDAReplyResponse::FCPTestDDAReplyResponsePtr( new FCPTestDDAReplyResponse( (*nodeResponse.begin())->getMessage() )); + return FCPTestDDAReplyResponse::Ptr( new FCPTestDDAReplyResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "TestDDAResponse") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPTestDDAReplyResponse( (*nodeResponse.begin())->getMessage() )); + return FCPOneMessageResponse::Ptr( new FCPTestDDAReplyResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "GenerateSSK") { - return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() )); + return FCPOneMessageResponse::Ptr( new FCPOneMessageResponse( (*nodeResponse.responses.begin())->getMessage() )); } else if (cmd == "ClientPut") { - return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse, false) ); + return FCPMultiMessageResponse::Ptr( new FCPMultiMessageResponse(nodeResponse.responses, false) ); } - throw new std::runtime_error("Not implemented : " + cmd); + throw std::runtime_error("Not implemented : " + cmd); } FCPResult::~FCPResult() {} Modified: trunk/apps/CppFCPLib/FCPResult.h =================================================================== --- trunk/apps/CppFCPLib/FCPResult.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/FCPResult.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -1,22 +1,53 @@ #ifndef FCPRESULT_H__ #define FCPRESULT_H__ -#include "ServerMessage.h" - -#include #include #include +#include +#include "JobTicket.h" + namespace FCPLib { class FCPResult { public: - typedef boost::shared_ptr FCPResultPtr; + typedef boost::shared_ptr Ptr; - static FCPResultPtr factory(const std::string cmd, std::vector &nodeResponse); + static Ptr factory(const std::string cmd, Response &nodeResponse); virtual ~FCPResult() = 0; }; + +//Message::Ptr getMessage(ServerMessage::Ptr sm) { +// return Message::Ptr( sm->getMessage() ); +//} + +Message::Ptr +MessageConverter( Response &resp ) +{ + return Message::Ptr( resp.responses.front()->getMessage() ); } +ServerMessage::Ptr +LastMessage( Response &resp ) +{ + return ServerMessage::Ptr( resp.responses.back() ); +} + +//std::vector +//VectorConverter( Response &resp ) +//{ +// std::vector ret = std::vector( nodeResponse.size() ); +// std::transform(nodeResponse.begin(), nodeResponse.end(), ret.begin(), getMessage); +// return ret; +//} + +template +ReturnT createResult( Response &resp ) +{ + return ConverterT( resp ); +} + +} + #endif Modified: trunk/apps/CppFCPLib/FCPTestDDAReplyResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPTestDDAReplyResponse.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/FCPTestDDAReplyResponse.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -7,27 +7,28 @@ namespace FCPLib { class FCPTestDDAReplyResponse : public FCPOneMessageResponse { - FCPTestDDAReplyResponse(Message::MessagePtr message_) : FCPOneMessageResponse(message_) {} + FCPTestDDAReplyResponse(Message::Ptr message_) : FCPOneMessageResponse(message_) {} const std::string& getField(std::string field) const { const std::string& ret = message->getField(field); if (ret == "") - throw new std::logic_error("TestDDAReply does not contain " + field + " field."); + throw std::logic_error("TestDDAReply does not contain " + field + " field."); + return ret; } public: - typedef boost::shared_ptr FCPTestDDAReplyResponsePtr; + typedef boost::shared_ptr Ptr; const std::string getDirectory() const throw(std::logic_error){ return message->getField("Directory"); } - const std::string& getReadFilename() const throw(std::logic_error){ + const std::string getReadFilename() const throw(std::logic_error){ return getField("ReadFilename"); } - const std::string& getWriteFilename() const throw(std::logic_error){ + const std::string getWriteFilename() const throw(std::logic_error){ return getField("WriteFilename"); } - const std::string& getContent () const throw(std::logic_error){ - return getField("Content"); + const std::string getContent () const throw(std::logic_error){ + return getField("ContentToWrite"); } friend class FCPResult; Added: trunk/apps/CppFCPLib/FCPTestDDAResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPTestDDAResponse.h (rev 0) +++ trunk/apps/CppFCPLib/FCPTestDDAResponse.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -0,0 +1,22 @@ +#ifndef FCPTESTDDARESPONSE_H_INCLUDED +#define FCPTESTDDARESPONSE_H_INCLUDED + +#include + +namespace FCPLib { + +class FCPTestDDAResponse { +public: + FCPTestDDAResponse(std::string dir, bool read, bool write) + : directory(dir), + readDirectory(read), + writeDirectory(write) + {} + std::string directory; + bool readDirectory; + bool writeDirectory; +}; + +} + +#endif // FCPTESTDDARESPONSE_H_INCLUDED Modified: trunk/apps/CppFCPLib/JobTicket.cpp =================================================================== --- trunk/apps/CppFCPLib/JobTicket.cpp 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/JobTicket.cpp 2007-07-16 09:17:50 UTC (rev 14154) @@ -4,30 +4,27 @@ #include + using namespace FCPLib; -JobTicket::JobTicketPtr -JobTicket::factory(std::string id, Message::MessagePtr cmd, - bool async, bool keep, bool waitTillSent, - int timeout) - { - JobTicketPtr ret( new JobTicket() ); +JobTicket::Ptr +JobTicket::factory(std::string id, Message::Ptr cmd, bool keep) +{ + log().log(NOISY, "Creating " + cmd->getHeader()); + Ptr ret( new JobTicket() ); - ret->id = id; - ret->cmd = cmd; + ret->id = id; + ret->cmd = cmd; - ret->async = async; - ret->keep = keep; - ret->waitTillSent = waitTillSent; - ret->timeout = timeout; + ret->keep = keep; + ret->lock.acquire(); + ret->reqSentLock.acquire(); - ret->lock.acquire(); - ret->reqSentLock.acquire(); + log().log(DEBUG, ret->toString()); + return ret; +} - return ret; - } - const std::string& JobTicket::getId() const { return id; @@ -69,7 +66,7 @@ // TODO: should I maybe create a result here, and then when retrieving // result throw an exception?? - throw new std::runtime_error("command timeout"); + throw std::runtime_error("command timeout"); } log().log(DEBUG, "wait:"+this->getCommandName()+":"+this->getId()+": job now dispatched"); while (!lock.tryAcquire(100)){ @@ -82,9 +79,7 @@ } log().log(DEBUG, "wait:"+this->getCommandName()+":"+this->getId()+": timeout on node response"); - // TODO: should I maybe create a result here, and then when retrieving - // result throw an exception?? - throw new std::runtime_error("command timeout"); + throw std::runtime_error("command timeout"); } log().log(DEBUG, "wait:"+this->getCommandName()+":"+this->getId()+": job complete"); lock.release(); @@ -96,12 +91,6 @@ reqSentLock.acquire(); } -const std::vector& -JobTicket::getResponse() const -{ - return nodeResponse; -} - const std::string& JobTicket::toString() { @@ -111,12 +100,9 @@ repr = ""; isReprValid = true; - repr += "Job id=" + id + "\n"; - repr += getMessageText(); - repr += "async=" + boost::lexical_cast(async) + "\n"; - repr += "keepJob=" + boost::lexical_cast(keep) + "\n"; - repr += "waitTillSent=" + boost::lexical_cast(waitTillSent) + "\n"; - repr += "timeout=" + boost::lexical_cast(timeout) + "\n"; + repr += "Job id=" + id + " " + + " keepJob=" + boost::lexical_cast(keep) + "\n"; + repr += "Message=" + cmd->getHeader(); // TODO: // add representation of hasResult and Result @@ -124,21 +110,11 @@ return repr; } -bool -JobTicket::hasResult() const { - return _hasResult; -} -const FCPResult::FCPResultPtr -JobTicket::getResult() const { - if (!_hasResult) - throw new std::runtime_error("Result is not ready."); - return result; -} - void -JobTicket::putResult() { - result = FCPResult::factory(cmd->getHeader(), nodeResponse); - _hasResult = true; +JobTicket::putResult() +{ + ZThread::Guard g(access); + _isFinished = true; lock.release(); } Modified: trunk/apps/CppFCPLib/JobTicket.h =================================================================== --- trunk/apps/CppFCPLib/JobTicket.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/JobTicket.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -11,72 +11,94 @@ #include +#include "zthread/Guard.h" #include "zthread/FastMutex.h" +#include "zthread/Mutex.h" +#include + namespace FCPLib { class NodeThread; +class Response { +public: + Response( std::vector &r) : responses(r) {} + std::vector responses; +}; + class JobTicket { std::string id; - Message::MessagePtr cmd; + Message::Ptr cmd; - std::vector nodeResponse; + std::vector nodeResponse; - bool async; bool keep; - bool waitTillSent; - int timeout; std::string repr; bool isReprValid; - FCPResult::FCPResultPtr result; - bool _hasResult; + bool _isFinished; -// bool hasStream; -// ostream stream; + ZThread::Mutex access; - ZThread::FastMutex lock; + ZThread::FastMutex lock; // used to be able to wait until isFinished ZThread::FastMutex reqSentLock; int timeQueued; + boost::function f; + void putResult(); + // status... last message -- 0, not last message -- 1 + void putResponse(int status, ServerMessage::Ptr m) + { + ZThread::Guard g(access); + if (f) f(status, m); + nodeResponse.push_back(m); + } + JobTicket() : isReprValid(false), _isFinished(false) {} +public: + typedef boost::shared_ptr Ptr; - JobTicket() + static Ptr factory(std::string id, Message::Ptr cmd, bool keep); + + void setCallback( boost::function f ) { - _hasResult = false; - isReprValid = false; + this->f = f; } -public: - typedef boost::shared_ptr JobTicketPtr; - static - JobTicketPtr factory(std::string id, Message::MessagePtr cmd, - bool async, bool keep, bool waitTillSent, - int timeout); + void setCallback( void (*f)(int, const ServerMessage::Ptr) ) + { + this->f = f; + } const std::string& getCommandName() const; const std::string& getId() const; const std::string& getMessageText() const; - const Message::MessagePtr getCommand() const; + const Message::Ptr getCommand() const; void wait(unsigned int timeout_=0); void waitTillReqSent(); - const std::vector& getResponse() const; + Response getResponse() + { + ZThread::Guard g(access); + return Response( nodeResponse ); + } const std::string& toString(); - const FCPResult::FCPResultPtr getResult() const; - bool hasResult() const; + bool isFinished() + { + ZThread::Guard g(access); + return _isFinished; + } friend class NodeThread; }; - } #endif Modified: trunk/apps/CppFCPLib/Log.h =================================================================== --- trunk/apps/CppFCPLib/Log.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/Log.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -35,6 +35,6 @@ } -FCPLib::Logger& log(ostream &out_=cerr, FCPLib::verbosityLevel logLevel_=FCPLib::NOISY); +FCPLib::Logger& log(ostream &out_=cerr, FCPLib::verbosityLevel logLevel_=FCPLib::DEBUG); #endif Modified: trunk/apps/CppFCPLib/Message.cpp =================================================================== --- trunk/apps/CppFCPLib/Message.cpp 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/Message.cpp 2007-07-16 09:17:50 UTC (rev 14154) @@ -5,13 +5,13 @@ using namespace FCPLib; -Message::MessagePtr +Message::Ptr Message::factory(std::string header, bool isData){ - Message::MessagePtr m; + Message::Ptr m; if (!isData) - m = Message::MessagePtr( new Message() ); + m = Message::Ptr( new Message() ); else - m = Message::MessagePtr( new DataMessage() ); + m = Message::Ptr( new DataMessage() ); m->header = header; @@ -42,6 +42,12 @@ return it->second; } +void +Message::setStream(std::istream* s_, int dataLength) +{ + throw std::runtime_error("Message::setStream not implemented"); +} + const std::string& Message::toString() { if (isReprValid) @@ -61,12 +67,6 @@ return header; } -void -Message::toStream(std::ostream& output_stream) -{ - output_stream << toString(); - output_stream.flush(); -} void Message::toSocket(boost::asio::ip::tcp::socket& socket) @@ -86,26 +86,26 @@ if (isReprValid) return repr; Message::toString(); - repr += "DataLength=" + boost::lexical_cast(dataLength_); + repr += "DataLength=" + boost::lexical_cast(dataLength_) + "\n"; repr += "Data\n"; isReprValid = true; return repr; } -void -DataMessage::toStream(std::ostream& output_stream) -{ - output_stream << toString(); - std::copy(std::istream_iterator (*stream_), - std::istream_iterator (), - std::ostream_iterator (output_stream)); - output_stream.flush(); -} void DataMessage::toSocket(boost::asio::ip::tcp::socket& socket) { + char buf[1024]; + int tmp = dataLength_; boost::asio::write( socket, boost::asio::buffer(toString()) ); - boost::asio::write( socket, boost::asio::buffer(stream_->rdbuf(), dataLength_) ); + while (tmp > 0) { + int m = std::min(tmp, 1024); + stream_->read(buf, m); + if (stream_->fail()) + throw std::runtime_error("Error while reading data stream."); + boost::asio::write( socket, boost::asio::buffer(buf, m) ); + tmp -= m; + } } Modified: trunk/apps/CppFCPLib/Message.h =================================================================== --- trunk/apps/CppFCPLib/Message.h 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/Message.h 2007-07-16 09:17:50 UTC (rev 14154) @@ -27,18 +27,19 @@ {} public: - typedef boost::shared_ptr MessagePtr; + typedef boost::shared_ptr Ptr; - static Message::MessagePtr factory(std::string header, bool isData=false); + static Message::Ptr factory(std::string header, bool isData=false); void setField(std::string key, std::string value); void setFields(const std::map &fields); const std::string getField(std::string key) const; const std::string& getHeader() const; + virtual void setStream(std::istream* s_, int dataLength); virtual const std::string& toString(); - virtual void toStream(std::ostream&); virtual void toSocket(boost::asio::ip::tcp::socket& socket); + virtual ~Message() {} }; @@ -48,10 +49,12 @@ protected: DataMessage() { isDataType = true; } public: + typedef boost::shared_ptr Ptr; + void setStream(std::istream* s_, int dataLength); const std::string& toString(); - void toStream(std::ostream&); void toSocket(boost::asio::ip::tcp::socket& socket); + ~DataMessage() {} friend class Message; }; Modified: trunk/apps/CppFCPLib/Node.cpp =================================================================== --- trunk/apps/CppFCPLib/Node.cpp 2007-07-16 01:18:16 UTC (rev 14153) +++ trunk/apps/CppFCPLib/Node.cpp 2007-07-16 09:17:50 UTC (rev 14154) @@ -5,6 +5,8 @@ #include #include "Exceptions.h" #include "FCPErrorResponse.h" +#include +#include using namespace FCPLib; @@ -15,26 +17,25 @@ return std::string(newid); } -const Message::MessagePtr +const Message::Ptr Node::getNodeHelloMessage() const { return nodeHelloMessage; } void -Node::checkProtocolError(JobTicket::JobTicketPtr &job) +Node::checkProtocolError(Response &resp) { - if (typeid(job->getResult()).name() == "FCPErrorResponse") { - Message::MessagePtr lastMessage = - ( boost::dynamic_pointer_cast (job->getResult()) ) - ->getMessages().back()->getMessage(); - throw new FCPException(lastMessage); - } + ServerMessage::Ptr sm = createResult( resp ); + + if ( sm->isError() ) + throw FCPException( sm->getMessage() ); } Node::Node(std::string name_, std::string host, int port) : name(name_), - clientReqQueue( new TQueue() ) + clientReqQueue( new TQueue() ), + globalCommandsTimeout(20) // 20 sec { if (!name.size()) name = Node::_getUniqueId(); @@ -43,24 +44,24 @@ nodeThread = new NodeThread(host, port, clientReqQueue); executor.execute( nodeThread ); - Message::MessagePtr m = Message::factory(std::string("ClientHello")); + Message::Ptr m = Message::factory(std::string("ClientHello")); m->setField("Name", name); m->setField("ExpectedVersion", "2.0"); - log().log(DEBUG, "Creating ClientHello\n"); - JobTicket::JobTicketPtr job = JobTicket::factory("__hello", m, false, false, false, 0); - log().log(DEBUG, job->toString()); + JobTicket::Ptr job = JobTicket::factory("__hello", m, false); clientReqQueue->put(job); - log().log(DEBUG, "waiting for the NodeHello"); - job->wait(0); - log().log(DEBUG, "NodeHello arrived"); + log().log(DEBUG, "Node constructor: waiting for response to ClientHello"); + job->wait(globalCommandsTimeout); + Response resp = job->getResponse(); // check if CloceConnectionDuplicateName or ProtocolError has arrived - checkProtocolError(job); // throws + checkProtocolError(resp); // throws - nodeHelloMessage = ( boost::dynamic_pointer_cast (job->getResult()) ) - ->getMessage(); + nodeHelloMessage = boost::dynamic_pointer_cast( + FCPResult::factory( job->getCommandName(), resp ) + )->getMessage(); } Node::~Node() @@ -68,180 +69,190 @@ executor.interrupt(); } -FCPMultiMessageResponse::FCPMultiMessageResponsePtr +FCPMultiMessageResponse::Ptr Node::listPeers(const AdditionalFields& fields) { - Message::MessagePtr m = Message::factory( std::string("ListPeers") ); + Message::Ptr m = Message::factory( std::string("ListPeers") ); if (fields.hasField("WithMetadata")) m->setField("WithMetadata", fields.getField("WithMetadata")); if (fields.hasField("WithVolatile")) m->setField("WithVolatile", fields.getField("WithVolatile")); - JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); - log().log(DEBUG, job->toString()); + JobTicket::Ptr job = JobTicket::factory( "__global", m, false); clientReqQueue->put(job); - log().log(DEBUG, "waiting for the EndListPeers"); - job->wait(0); - log().log(DEBUG, "EndListPeers arrived"); + log().log(DEBUG, "waiting for EndListPeers message"); + job->wait(globalCommandsTimeout); - // NOTE: error should never happen hear... - checkProtocolError(job); // throws + Response resp = job->getResponse(); + // NOTE: error should never happen here... + checkProtocolError(resp) // throws - return boost::dynamic_pointer_cast(job->getResult()); + return boost::dynamic_pointer_cast( FCPResult::factory( job->getCommandName(), resp ) ); } -FCPMultiMessageResponse::FCPMultiMessageResponsePtr +FCPMultiMessageResponse::Ptr Node::listPeerNotes(const std::string& identifier) { - Message::MessagePtr m = Message::factory( std::string("ListPeerNotes") ); + Message::Ptr m = Message::factory( std::string("ListPeerNotes") ); m->setField("NodeIdentifier", identifier); - JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); - log().log(DEBUG, job->toString()); + JobTicket::Ptr job = JobTicket::factory( "__global", m, false); clientReqQueue->put(job); - log().log(DEBUG, "waiting for the EndListPeerNotes"); - job->wait(0); - log().log(DEBUG, "EndListPeers arrived"); + log().log(DEBUG, "waiting for EndListPeerNotes message"); + job->wait(globalCommandsTimeout); + Response resp = job->getResponse(); // ProtocolError or UnknownNodeIdentifier - checkProtocolError(job); // throws + checkProtocolError(resp); // throws - return boost::dynamic_pointer_cast(job->getResult()); + return boost::dynamic_pointer_cast( FCPResult::factory( job->getCommandName(), resp ) ); } -void +FCPOneMessageResponse::Ptr Node::addPeer(const std::string &value, bool isURL = false) { - Message::MessagePtr m = Message::factory( std::string("AddPeer") ); + Message::Ptr m = Message::factory( std::string("AddPeer") ); if (!isURL) m->setField("File", value); else m->setField("URL", value); - JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); - log().log(DEBUG, job->toString()); + JobTicket::Ptr job = JobTicket::factory( "__global", m, false); clientReqQueue->put(job); - log().log(DEBUG, "waiting for AddPeer to be sent"); - job->waitTillReqSent(); - log().log(DEBUG, "AddPeer to was sent"); + log().log(DEBUG, "waiting for Peer message"); + job->wait(globalCommandsTimeout); - // should I check for the errors? how do I know that the operation was successful + Response resp = job->getResponse(); + // ProtocolError or UnknownNodeIdentifier + checkProtocolError(resp); // throws + + return boost::dynamic_pointer_cast( FCPResult::factory( job->getCommandName(), resp ) ); } -void +FCPOneMessageResponse::Ptr Node::addPeer(const std::map &message) { - Message::MessagePtr m = Message::factory( std::string("AddPeer") ); + Message::Ptr m = Message::factory( std::string("AddPeer") ); m->setFields(message); - JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); - log().log(DEBUG, job->toString()); + JobTicket::Ptr job = JobTicket::factory( "__global", m, false); clientReqQueue->put(job); - log().log(DEBUG, "waiting for AddPeer to be sent"); - job->waitTillReqSent(); - log().log(DEBUG, "AddPeer to was sent"); + log().log(DEBUG, "waiting for Peer message"); + job->wait(globalCommandsTimeout); - // should I check for the errors? how do I know that the operation was successful + Response resp = job->getResponse(); + // ProtocolError or UnknownNodeIdentifier + checkProtocolError(resp); // throws + + return boost::dynamic_pointer_cast( FCPResult::factory( job->getCommandName(), resp ) ); } -FCPOneMessageResponse::FCPOneMessageResponsePtr +FCPOneMessageResponse::Ptr Node::modifyPeer(const std::string & nodeIdentifier, const AdditionalFields& fields) { - Message::MessagePtr m = Message::factory( std::string("ModifyPeer") ); + Message::Ptr m = Message::factory( std::string("ModifyPeer") ); m->setField("NodeIdentifier", nodeIdentifier); if (fields.hasField("AllowLocalAddresses")) m->setField("AllowLocalAddresses", fields.getField("AllowLocalAddresses")); if (fields.hasField("IsDisabled")) m->setField("IsDisabled", fields.getField("IsDisabled")); if (fields.hasField("IsListenOnly")) m->setField("IsListenOnly", fields.getField("IsListenOnly")); - JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); - log().log(DEBUG, job->toString()); + JobTicket::Ptr job = JobTicket::factory( "__global", m, false); clientReqQueue->put(job); - log().log(DEBUG, "waiting for the Peer"); - job->wait(0); - log().log(DEBUG, "Peer received"); + log().log(DEBUG, "waiting for Peer message"); + job->wait(globalCommandsTimeout); - return boost::dynamic_pointer_cast(job->getResult()); + Response resp = job->getResponse(); + checkProtocolError(resp); // throws + + return boost::dynamic_pointer_cast( FCPResult::factory( job->getCommandName(), resp ) ); } -FCPOneMessageResponse::FCPOneMessageResponsePtr +FCPOneMessageResponse::Ptr Node::modifyPeerNote(const std::string & nodeIdentifier, const std::string & noteText, int peerNoteType = 1) { - Message::MessagePtr m = Message::factory( std::string("ModifyPeerNote") ); + Message::Ptr m = Message::factory( std::string("ModifyPeerNote") ); m->setField("NodeIdentifier", nodeIdentifier); m->setField("NoteText", noteText); m->setField("PeerNoteType", "1"); // TODO: change to peerNoteType once it is used - JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); - log().log(DEBUG, job->toString()); + JobTicket::Ptr job = JobTicket::factory( "__global", m, false); clientReqQueue->put(job); - log().log(DEBUG, "waiting for the PeerNote"); - job->wait(0); - log().log(DEBUG, "PeerNote received"); + log().log(DEBUG, "waiting for PeerNote message"); + job->wait(globalCommandsTimeout); + Response resp = job->getResponse(); // ProtocolError or UnknownNodeIdentifier - checkProtocolError(job); // throws + checkProtocolError(resp); // throws - return boost::dynamic_pointer_cast(job->getResult()); + return boost::dynamic_pointer_cast( FCPResult::factory( job->getCommandName(), resp ) ); } -FCPOneMessageResponse::FCPOneMessageResponsePtr +FCPOneMessageResponse::Ptr Node::removePeer(const std::string &identifier) { - Message::MessagePtr m = Message::factory( std::string("RemovePeer") ); + Message::Ptr m = Message::factory( std::string("RemovePeer") ); m->setField("NodeIdentifier", identifier); - - JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); - log().log(DEBUG, job->toString()); + JobTicket::Ptr job = JobTicket::factory( "__global", m, false); clientReqQueue->put(job); - log().log(DEBUG, "waiting for the PeerRemoved"); - job->wait(0); - log().log(DEBUG, "PeerRemoved received"); + log().log(DEBUG, "waiting for PeerRemoved message"); + job->wait(globalCommandsTimeout); + Response resp = job->getResponse(); // ProtocolError or UnknownNodeIdentifier - checkProtocolError(job); // throws + checkProtocolError(resp); // throws - return boost::dynamic_pointer_cast(job->getResult()); + + return boost::dynamic_pointer_cast( FCPResult::factory( job->getCommandName(), resp ) ); } -FCPOneMessageResponse::FCPOneMessageResponsePtr +Message::Ptr Node::getNode(const AdditionalFields& fields) { - Message::MessagePtr m = Message::factory( std::string("GetNode") ); + Message::Ptr m = Message::factory( std::string("GetNode") ); if (field