From nextgens at freenetproject.org Fri Jun 1 17:54:19 2007 From: nextgens at freenetproject.org (Florent =?iso-8859-1?Q?Daigni=E8re?=) Date: Fri, 1 Jun 2007 19:54:19 +0200 Subject: [Cppfcplib] Testing Message-ID: <20070601175419.GD5535@freenetproject.org> Testing, please disregard. From mkolar at freenetproject.org Mon Jun 11 09:52:17 2007 From: mkolar at freenetproject.org (mkolar at freenetproject.org) Date: Mon, 11 Jun 2007 09:52:17 +0000 (UTC) Subject: [Cppfcplib] r13513 - trunk/apps/CppFCPLib Message-ID: <20070611095217.9620347A0B9@emu.freenetproject.org> Author: mkolar Date: 2007-06-11 09:52:17 +0000 (Mon, 11 Jun 2007) New Revision: 13513 Added: trunk/apps/CppFCPLib/FCPListPeersResult.cpp trunk/apps/CppFCPLib/FCPListPeersResult.h trunk/apps/CppFCPLib/FCPResult.cpp trunk/apps/CppFCPLib/FCPResult.h trunk/apps/CppFCPLib/PeerMessage.h trunk/apps/CppFCPLib/ServerMessage.cpp trunk/apps/CppFCPLib/ServerMessage.h Removed: trunk/apps/CppFCPLib/JobTicket.cpp Modified: trunk/apps/CppFCPLib/JobTicket.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 Log: * initial creation of a hierarchy for messages * initial creation of a hierarchy for results Added: trunk/apps/CppFCPLib/FCPListPeersResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPListPeersResult.cpp (rev 0) +++ trunk/apps/CppFCPLib/FCPListPeersResult.cpp 2007-06-11 09:52:17 UTC (rev 13513) @@ -0,0 +1,14 @@ +#include "FCPListPeersResult.h" + + +using namespace FCPLib; + +FCPListPeersResult::FCPResultPtr +FCPListPeersResult::createFromMessages(const std::vector &nodeResponse) +{ + FCPListPeersResultPtr ret( new FCPListPeersResult() ); + + ret->peers = std::vector( nodeResponse ); + + return ret; +} Added: trunk/apps/CppFCPLib/FCPListPeersResult.h =================================================================== --- trunk/apps/CppFCPLib/FCPListPeersResult.h (rev 0) +++ trunk/apps/CppFCPLib/FCPListPeersResult.h 2007-06-11 09:52:17 UTC (rev 13513) @@ -0,0 +1,25 @@ +#ifndef FCPLISTPEERSRESULT_H__ +#define FCPLISTPEERSRESULT_H__ + + +#include +#include +#include "Message.h" +#include "FCPResult.h" + + +namespace FCPLib { + + +class FCPListPeersResult : public FCPResult { + std::vector peers; + + FCPListPeersResult() {} +public: + typedef boost::shared_ptr FCPListPeersResultPtr; + + static FCPResultPtr createFromMessages(const std::vector &nodeResponse); +}; +} + +#endif Added: trunk/apps/CppFCPLib/FCPResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPResult.cpp (rev 0) +++ trunk/apps/CppFCPLib/FCPResult.cpp 2007-06-11 09:52:17 UTC (rev 13513) @@ -0,0 +1,19 @@ +#include "FCPResult.h" +#include + + +#include "FCPListPeersResult.h" + +using namespace FCPLib; + +FCPResult::FCPResultPtr +FCPResult::factory(const std::string cmd, std::vector nodeResponse) +{ + if (cmd == "ListPeers") { + return FCPListPeersResult::createFromMessages( nodeResponse ); + } + + throw new std::runtime_error("Not implemented : " + cmd); +} + +FCPResult::~FCPResult() {} Added: trunk/apps/CppFCPLib/FCPResult.h =================================================================== --- trunk/apps/CppFCPLib/FCPResult.h (rev 0) +++ trunk/apps/CppFCPLib/FCPResult.h 2007-06-11 09:52:17 UTC (rev 13513) @@ -0,0 +1,22 @@ +#ifndef FCPRESULT_H__ +#define FCPRESULT_H__ + +#include "ServerMessage.h" + +#include +#include +#include + +namespace FCPLib { + +class FCPResult { +public: + typedef boost::shared_ptr FCPResultPtr; + + static FCPResultPtr factory(const std::string cmd, std::vector nodeResponse); + virtual ~FCPResult() = 0; +}; + +} + +#endif Deleted: trunk/apps/CppFCPLib/JobTicket.cpp =================================================================== --- trunk/apps/CppFCPLib/JobTicket.cpp 2007-06-10 21:46:45 UTC (rev 13512) +++ trunk/apps/CppFCPLib/JobTicket.cpp 2007-06-11 09:52:17 UTC (rev 13513) @@ -1,125 +0,0 @@ - -#include "JobTicket.h" -#include "DefaultValues.h" -#include "zthread/Thread.h" -#include - -using namespace FCPLib; - -JobTicket::JobTicket(std::string id_, Message::MessagePtr &cmd_) - : id(id_), - cmd(cmd_), - async_(false), - keep(false), - waitTillSent_(false), - timeout_(oneyear), - isReprValid(false) -// hasStream(false) -{ - lock.acquire(); - reqSentLock.acquire(); -} - -JobTicket& -JobTicket::async(bool async) -{ - isReprValid = false; - async_ = async; return *this; -} - -inline JobTicket& -JobTicket::keepJob(bool keep_) -{ - isReprValid = false; - keep = keep_; return *this; -} -inline JobTicket& -JobTicket::waitTillSent(bool wait_) -{ - isReprValid = false; - waitTillSent_ = wait_; return *this; -} -inline JobTicket& -JobTicket::timeout(int timeout) -{ - isReprValid = false; - timeout_ = timeout; return *this; -} - -const std::string& -JobTicket::getId() const -{ - return id; -} - -const std::string& -JobTicket::commandName() const -{ - return cmd->getHeader(); -} - -const std::string& -JobTicket::getMessageText() const -{ - return cmd->toString(); -} - -void -JobTicket::wait(unsigned int timeout) -{ - if (!timeout){ - while (!lock.tryAcquire(100)) - ZThread::Thread::sleep(100); - lock.release(); - return; - } - - unsigned int then = (unsigned int) time(0); - unsigned int elapsed; - while (!reqSentLock.tryAcquire(100)){ - elapsed = (unsigned int) time(0) - then; - if (elapsed < timeout){ - Thread::sleep(1000) - log().log(DEBUG, "wait:"+job->commandName()+":"+job->getId()+": job not dispatched, timeout in " + - boost::lexical_cast(timeout-elapsed)); - continue; - } - } -} - -void -JobTicket::waitTillReqSent() -{ - reqSentLock.acquire(); -} - -void -JobTicket::putResult() -{ - lock.release(); -} - -const std::vector& -JobTicket::getResponse() const -{ - return nodeResponse; -} - -const std::string& -JobTicket::toString() -{ - if (isReprValid) - return repr; - - 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"; - - return repr; -} Modified: trunk/apps/CppFCPLib/JobTicket.h =================================================================== --- trunk/apps/CppFCPLib/JobTicket.h 2007-06-10 21:46:45 UTC (rev 13512) +++ trunk/apps/CppFCPLib/JobTicket.h 2007-06-11 09:52:17 UTC (rev 13513) @@ -1,29 +1,40 @@ #ifndef JOBTICKET_H__ #define JOBTICKET_H__ -#include "Log.h" #include "Message.h" +#include "ServerMessage.h" +#include "FCPResult.h" + +#include #include +#include + #include -#include + #include "zthread/FastMutex.h" namespace FCPLib { class NodeThread; + class JobTicket { std::string id; Message::MessagePtr cmd; - std::vector nodeResponse; - bool async_; + + std::vector nodeResponse; + + bool async; bool keep; - bool waitTillSent_; - int timeout_; + bool waitTillSent; + int timeout; std::string repr; bool isReprValid; + FCPResult::FCPResultPtr result; + bool _hasResult; + // bool hasStream; // ostream stream; @@ -32,29 +43,39 @@ int timeQueued; void putResult(); + + + JobTicket() + { + _hasResult = false; + isReprValid = false; + } public: - typedef boost::shared_ptr JobTicketPtr; + typedef boost::shared_ptr JobTicketPtr; - JobTicket(std::string id_, Message::MessagePtr &cmd_); - inline JobTicket& async(bool async_); - inline JobTicket& keepJob(bool keep_); - inline JobTicket& waitTillSent(bool wait); - inline JobTicket& timeout(int timeout); + static + JobTicketPtr factory(std::string id, Message::MessagePtr cmd, + bool async, bool keep, bool waitTillSent, + int timeout); - const std::string& commandName() const; + const std::string& getCommandName() const; const std::string& getId() const; const std::string& getMessageText() const; void wait(unsigned int timeout_=0); void waitTillReqSent(); - const std::vector& getResponse() const; + const std::vector& getResponse() const; const std::string& toString(); + const FCPResult::FCPResultPtr getResult() const; + bool hasResult() const; friend class NodeThread; }; + + } #endif Modified: trunk/apps/CppFCPLib/Message.cpp =================================================================== --- trunk/apps/CppFCPLib/Message.cpp 2007-06-10 21:46:45 UTC (rev 13512) +++ trunk/apps/CppFCPLib/Message.cpp 2007-06-11 09:52:17 UTC (rev 13513) @@ -1,16 +1,10 @@ #include "Message.h" -using namespace std; using namespace FCPLib; -Message::Message() { - isDataType = false; - isReprValid = false; -} - Message::MessagePtr -Message::factory(std::string &header){ +Message::factory(std::string header){ Message::MessagePtr m( new Message() ); m->header = header; @@ -18,37 +12,6 @@ return m; } -Message::MessagePtr -Message::factory(const char *header){ - std::string hdr(header); - - return factory(hdr); -} - -Message::MessagePtr -Message::factory(Server &s){ - Message::MessagePtr m( new Message() ); - static char line[1000]; - - s.readln(line, 1000); - line[strlen(line)-1] = 0; - m->header = string(line); - - for (;;) { - s.readln(line, 1000); - line[strlen(line)-1] = 0; - - if (!strcmp(line, "End") || !strcmp(line, "EndMessage")) - break; - - char *val = strchr(line, '='); - *val++ = 0; - m->fields[string(line)] = string(val); - } - - return m; -} - void Message::setField(std::string key, std::string value) { // TODO: should i check if a message can contain certain field? @@ -68,15 +31,15 @@ if (isReprValid) return repr; repr = header + "\n"; - for (map::iterator it = fields.begin(); it != fields.end(); ++it) + 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) { repr += "DataLength="; - sprintf(intToString, "%d", fields["Data"].size()); - repr += string(intToString); + sprintf(intToString, "%d", fields["Data"].size()); // FIXME + repr += std::string(intToString); repr += "\n"; repr += "Data\n"; repr += fields["Data"]; @@ -92,3 +55,4 @@ { return header; } + Modified: trunk/apps/CppFCPLib/Message.h =================================================================== --- trunk/apps/CppFCPLib/Message.h 2007-06-10 21:46:45 UTC (rev 13512) +++ trunk/apps/CppFCPLib/Message.h 2007-06-11 09:52:17 UTC (rev 13513) @@ -6,7 +6,6 @@ #include #include #include -#include "Server.h" namespace FCPLib { @@ -16,16 +15,19 @@ std::map fields; + bool isReprValid; bool isDataType; - bool isReprValid; - Message(); + Message() : + isReprValid(false), + isDataType(false) + {} + public: typedef boost::shared_ptr MessagePtr; - static MessagePtr factory(std::string &header); - static MessagePtr factory(const char *header); - static MessagePtr factory(Server &s); + static Message::MessagePtr factory(std::string header); + void setField(std::string key, std::string value); inline std::string getField(const std::string &key); const std::string& getHeader() const; @@ -33,6 +35,7 @@ const std::string& toString(); }; + } #endif Modified: trunk/apps/CppFCPLib/Node.cpp =================================================================== --- trunk/apps/CppFCPLib/Node.cpp 2007-06-10 21:46:45 UTC (rev 13512) +++ trunk/apps/CppFCPLib/Node.cpp 2007-06-11 09:52:17 UTC (rev 13513) @@ -1,6 +1,5 @@ #include "Node.h" -#include "Message.h" #include "Log.h" using namespace FCPLib; @@ -23,22 +22,36 @@ nodeThread = new NodeThread(host, port, clientReqQueue); executor.execute( nodeThread ); - Message::MessagePtr m = Message::factory("ClientHello"); + Message::MessagePtr m = Message::factory(std::string("ClientHello")); m->setField("Name", name); m->setField("ExpectedVersion", "2.0"); log().log(DEBUG, "Creating ClientHello\n"); - JobTicket::JobTicketPtr job( new JobTicket("__hello", m) ); + JobTicket::JobTicketPtr job = JobTicket::factory("__hello", m, false, false, false, 0); log().log(DEBUG, job->toString()); clientReqQueue->put(job); log().log(DEBUG, "waiting for the NodeHello"); job->wait(0); log().log(DEBUG, "NodeHello arrived"); -// cout << "Izlaz:\n" << job->getResponse()[0]->toString(); } Node::~Node() { executor.interrupt(); } + +FCPListPeersResult +Node::listPeers(bool withMetaData = false, + bool withVolatile = false){ + Message::MessagePtr m = Message::factory( std::string("ListPeers") ); + m->setField("WithMetadata", withMetaData ? "true" : "false"); + m->setField("WithVolatila", withVolatile ? "true" : "false"); + + JobTicket::JobTicketPtr job = JobTicket::factory( "__hello", m, false, false, false, 0 ); + log().log(DEBUG, job->toString()); + clientReqQueue->put(job); + + //TODO: finish +} + Modified: trunk/apps/CppFCPLib/Node.h =================================================================== --- trunk/apps/CppFCPLib/Node.h 2007-06-10 21:46:45 UTC (rev 13512) +++ trunk/apps/CppFCPLib/Node.h 2007-06-11 09:52:17 UTC (rev 13513) @@ -3,10 +3,13 @@ #include #include + #include "zthread/Thread.h" #include "zthread/ThreadedExecutor.h" + #include "TQueue.h" #include "NodeThread.h" +#include "FCPListPeersResult.h" namespace FCPLib { class Node { @@ -20,6 +23,8 @@ public: Node(std::string name, std::string host, int port); ~Node(); + + FCPListPeersResult listPeers(bool, bool); }; } Modified: trunk/apps/CppFCPLib/NodeThread.cpp =================================================================== --- trunk/apps/CppFCPLib/NodeThread.cpp 2007-06-10 21:46:45 UTC (rev 13512) +++ trunk/apps/CppFCPLib/NodeThread.cpp 2007-06-11 09:52:17 UTC (rev 13513) @@ -17,7 +17,7 @@ } void NodeThread::run(){ - Message::MessagePtr m; + ServerMessage::ServerMessagePtr m; JobTicket::JobTicketPtr job; log().log(DETAIL, "FCPNode: manager thread starting"); try { @@ -26,7 +26,7 @@ log().log(NOISY, "_mgrThread: Testing for incoming message"); if (s.dataAvailable()){ log().log(DEBUG, "_mgrThread: Retrieving incoming message"); - m = Message::factory(s); + m = ServerMessage::factory(s); log().log(DEBUG, "_mgrThread: Got incoming message, dispatching"); // dispatch the message doMessage(m); @@ -49,7 +49,7 @@ NodeThread::sendClientReq(JobTicket::JobTicketPtr &job) { log().log(NOISY, "sendClientReq : top"); - if (job->commandName() != "WatchGlobal") { + if (job->getCommandName() != "WatchGlobal") { log().log(NOISY, "sendClientReq : about to add the job to the map"); (*jobs)[job->getId()] = job; log().log(NOISY, "sendClientReq : added the job to the map"); @@ -60,55 +60,22 @@ job->reqSentLock.release(); } -// -//void NodeThread::_hello(){ -// string message; -// message = Message::toString("ClientHello", 2, "Name", this->name.c_str(), "ExpectedVersion", "2.0"); -// messageQSend->put(message); -// logfile->log(DETAIL, message); -// -// message = this->_rxMsg(); -// Message* nodeHello = new Message(message); -// const char * tmp; -// if ((tmp = nodeHello->getField("FCPVersion")) != NULL){ -// this->nodeFCPVersion = string(tmp); -// } -// if ((tmp = nodeHello->getField("Version")) != NULL){ -// this->nodeVersion = string(tmp); -// } -// if ((tmp = nodeHello->getField("Testnet")) != NULL){ -// this->nodeIsTestnet = (string(tmp) == "true") ? true : false; -// } -// if ((tmp = nodeHello->getField("CompressionCodes")) != NULL){ -// this->compressionCodes = atoi(tmp); -// } -// -// delete nodeHello; -//} - - -// -//string NodeThread::_rxMsg(){ -// string message = messageQReceive->get(); -// logfile->log(DETAIL, message); -// return message; -//} -// -//void NodeThread::_on_rxMsg(std::string& message){ -// Message m(message); -// -// logfile->log(DEBUG, m.toString()); -//} - void -NodeThread::doMessage(Message::MessagePtr &message) +NodeThread::doMessage(ServerMessage::ServerMessagePtr &message) { JobTicket::JobTicketPtr job; - if (message->getHeader() == "NodeHello"){ - job = jobs->find("__hello")->second; - job->nodeResponse.push_back(message); - job->putResult(); + std::map::iterator it; + + it = jobs->find(message->getIdOfJob()); + if (it == jobs->end()) { + log().log(DEBUG, "doMessage : received NodeHello, cannot find __hello in started jobs"); return; } + + job = it->second; + job->nodeResponse.push_back(message); + if (message->isLastMessage(job->getCommandName())) { + job->putResult(); + } } Modified: trunk/apps/CppFCPLib/NodeThread.h =================================================================== --- trunk/apps/CppFCPLib/NodeThread.h 2007-06-10 21:46:45 UTC (rev 13512) +++ trunk/apps/CppFCPLib/NodeThread.h 2007-06-11 09:52:17 UTC (rev 13513) @@ -8,29 +8,25 @@ #include #include #include "JobTicket.h" +#include "ServerMessage.h" namespace FCPLib { class Node; -typedef TQueue JobTicketQueue; +typedef TQueue< JobTicket::JobTicketPtr > JobTicketQueue; class NodeThread : public ZThread::Runnable { -// ZThread::CountedPtr logfile; ZThread::CountedPtr< JobTicketQueue > clientReqQueue; FCPLib::Server s; - ZThread::CountedPtr< std::map > jobs; -// void _hello(); -// static std::string _getUniqueId(); -// std::string _rxMsg(); -// void _on_rxMsg(std::string &message); + ZThread::CountedPtr< std::map > jobs; friend class Node; NodeThread(std::string &host, int port, ZThread::CountedPtr< JobTicketQueue > &clientReqQueue_) throw(); void sendClientReq(JobTicket::JobTicketPtr &job); - void doMessage(Message::MessagePtr &message); + void doMessage(ServerMessage::ServerMessagePtr &message); public: void run(); }; Added: trunk/apps/CppFCPLib/PeerMessage.h =================================================================== --- trunk/apps/CppFCPLib/PeerMessage.h (rev 0) +++ trunk/apps/CppFCPLib/PeerMessage.h 2007-06-11 09:52:17 UTC (rev 13513) @@ -0,0 +1,34 @@ +#ifndef PEERMESSAGE_H__ +#define PEERMESSAGE_H__ + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class PeerMessage : public ServerMessage { + PeerMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLastMessage(const std::string &cmd) const + { + if (cmd == "ListPeers") + return false; + else if (cmd == "ModifyPeer") + return true; + + throw new std::runtime_error("Unknown command"); + } + + friend class ServerMessage; +}; + +} + +#endif // PEERMESSAGE_H__ Added: trunk/apps/CppFCPLib/ServerMessage.cpp =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.cpp (rev 0) +++ trunk/apps/CppFCPLib/ServerMessage.cpp 2007-06-11 09:52:17 UTC (rev 13513) @@ -0,0 +1,43 @@ + +#include "ServerMessage.h" +#include "PeerMessage.h" + +using namespace FCPLib; + + +ServerMessage::ServerMessagePtr +ServerMessage::factory(Server &s){ + ServerMessage::ServerMessagePtr m; + static char line[1000]; + + s.readln(line, 1000); + line[strlen(line)-1] = 0; + std::string header = std::string(line); + + if (header == "Peer") { + m = ServerMessagePtr( new PeerMessage() ); + } + m->message = Message::factory(header); + + m->read(s); + + return m; +} + +void ServerMessage::read(Server &s) +{ + static char line[1000]; + for (;;) { + s.readln(line, 1000); + line[strlen(line)-1] = 0; + + if (!strcmp(line, "End") || !strcmp(line, "EndMessage")) + break; + + char *val = strchr(line, '='); + *val++ = 0; + message->setField(std::string(line), std::string(val)); + } +} + + Added: trunk/apps/CppFCPLib/ServerMessage.h =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.h (rev 0) +++ trunk/apps/CppFCPLib/ServerMessage.h 2007-06-11 09:52:17 UTC (rev 13513) @@ -0,0 +1,24 @@ +#ifndef SERVERMESSAGE_H__ +#define SERVERMESSAGE_H__ + +#include "Message.h" +#include "Server.h" + +namespace FCPLib { + +class ServerMessage { + Message::MessagePtr message; + + void read(Server &s); +public: + typedef boost::shared_ptr ServerMessagePtr; + static ServerMessagePtr factory(Server &s); + + virtual std::string getIdOfJob() const = 0; + virtual bool isLastMessage(const std::string &cmd) const = 0; + virtual ~ServerMessage() {} +}; + +} + +#endif // SERVERMESSAGE_H__ From mkolar at freenetproject.org Mon Jun 11 09:53:28 2007 From: mkolar at freenetproject.org (mkolar at freenetproject.org) Date: Mon, 11 Jun 2007 09:53:28 +0000 (UTC) Subject: [Cppfcplib] r13514 - trunk/apps/CppFCPLib Message-ID: <20070611095328.A4A2247A0DC@emu.freenetproject.org> Author: mkolar Date: 2007-06-11 09:53:28 +0000 (Mon, 11 Jun 2007) New Revision: 13514 Added: trunk/apps/CppFCPLib/JobTicket.cpp Log: * forgotten file commit Added: trunk/apps/CppFCPLib/JobTicket.cpp =================================================================== --- trunk/apps/CppFCPLib/JobTicket.cpp (rev 0) +++ trunk/apps/CppFCPLib/JobTicket.cpp 2007-06-11 09:53:28 UTC (rev 13514) @@ -0,0 +1,143 @@ +#include "JobTicket.h" +#include "DefaultValues.h" +#include "Log.h" + +#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() ); + + ret->id = id; + ret->cmd = cmd; + + ret->async = async; + ret->keep = keep; + ret->waitTillSent = waitTillSent; + ret->timeout = timeout; + + + ret->lock.acquire(); + ret->reqSentLock.acquire(); + + return ret; + } + +const std::string& +JobTicket::getId() const { + return id; +} + +const std::string& +JobTicket::getCommandName() const +{ + return cmd->getHeader(); +} + +const std::string& +JobTicket::getMessageText() const +{ + return cmd->toString(); +} + +void +JobTicket::wait(unsigned int timeout) +{ + if (!timeout){ + while (!lock.tryAcquire(100)) + ZThread::Thread::sleep(100); + lock.release(); + return; + } + + unsigned int then = (unsigned int) time(0); + unsigned int elapsed; + while (!reqSentLock.tryAcquire(100)){ + elapsed = (unsigned int) time(0) - then; + if (elapsed < timeout){ + ZThread::Thread::sleep(1000); + log().log(DEBUG, "wait:"+this->getCommandName()+":"+this->getId()+": job not dispatched, timeout in " + + boost::lexical_cast(timeout-elapsed)); + continue; + } + log().log(DEBUG, "wait:"+this->getCommandName()+":"+this->getId()+": timeout on send command"); + + // TODO: should I maybe create a result here, and then when retrieving + // result throw an exception?? + throw new std::runtime_error("command timeout"); + } + log().log(DEBUG, "wait:"+this->getCommandName()+":"+this->getId()+": job now dispatched"); + while (!lock.tryAcquire(100)){ + elapsed = (unsigned int) time(0) - then; + if (elapsed < timeout) { + ZThread::Thread::sleep(2000); + log().log(DEBUG, "wait:"+this->getCommandName()+":"+this->getId()+": waiting for node response, timeout in " + + boost::lexical_cast(timeout-elapsed)); + continue; + } + 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"); + } + log().log(DEBUG, "wait:"+this->getCommandName()+":"+this->getId()+": job complete"); + lock.release(); +} + +void +JobTicket::waitTillReqSent() +{ + reqSentLock.acquire(); +} + +const std::vector& +JobTicket::getResponse() const +{ + return nodeResponse; +} + +const std::string& +JobTicket::toString() +{ + if (isReprValid) + return repr; + + 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"; + + // TODO: + // add representation of hasResult and Result + + 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); + lock.release(); +} From mkolar at freenetproject.org Tue Jun 12 08:03:45 2007 From: mkolar at freenetproject.org (mkolar at freenetproject.org) Date: Tue, 12 Jun 2007 08:03:45 +0000 (UTC) Subject: [Cppfcplib] r13528 - trunk/apps/CppFCPLib Message-ID: <20070612080345.930E547A111@emu.freenetproject.org> Author: mkolar Date: 2007-06-12 08:03:45 +0000 (Tue, 12 Jun 2007) New Revision: 13528 Added: trunk/apps/CppFCPLib/EndMessage.h trunk/apps/CppFCPLib/FCPClientHelloResult.h trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp trunk/apps/CppFCPLib/FCPListPeerNotesResult.h trunk/apps/CppFCPLib/NodeHelloMessage.h trunk/apps/CppFCPLib/PeerNoteMessage.h trunk/apps/CppFCPLib/todo.txt Modified: trunk/apps/CppFCPLib/FCPListPeersResult.cpp trunk/apps/CppFCPLib/FCPListPeersResult.h trunk/apps/CppFCPLib/FCPResult.cpp trunk/apps/CppFCPLib/FCPResult.h trunk/apps/CppFCPLib/Node.cpp trunk/apps/CppFCPLib/Node.h trunk/apps/CppFCPLib/NodeThread.cpp trunk/apps/CppFCPLib/ServerMessage.cpp trunk/apps/CppFCPLib/ServerMessage.h trunk/apps/CppFCPLib/main.cpp Log: * added handling for ListPeers and ListPeerNotes * some minor changes on ClientHello and NodeHello messages Added: trunk/apps/CppFCPLib/EndMessage.h =================================================================== --- trunk/apps/CppFCPLib/EndMessage.h (rev 0) +++ trunk/apps/CppFCPLib/EndMessage.h 2007-06-12 08:03:45 UTC (rev 13528) @@ -0,0 +1,6 @@ +#ifndef ENDMESSAGE_H__ +#define ENDMESSAGE_H__ + + + +#endif // ENDMESSAGE_H__ Added: trunk/apps/CppFCPLib/FCPClientHelloResult.h =================================================================== --- trunk/apps/CppFCPLib/FCPClientHelloResult.h (rev 0) +++ trunk/apps/CppFCPLib/FCPClientHelloResult.h 2007-06-12 08:03:45 UTC (rev 13528) @@ -0,0 +1,24 @@ +#ifndef FCPCLIENTHELLORESULT_H__ +#define FCPCLIENTHELLORESULT_H__ + +#include +#include +#include "Message.h" +#include "FCPResult.h" + +namespace FCPLib { + +class FCPClientHelloResult : public FCPResult { + Message::MessagePtr message; + + FCPClientHelloResult(Message::MessagePtr message_) : message(message_) {} +public: + typedef boost::shared_ptr FCPClientHelloResultPtr; + + const Message::MessagePtr getMessage() const { return message; } + + friend class FCPResult; +}; +} + +#endif // FCPCLIENTHELLORESULT_H__ Added: trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp (rev 0) +++ trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp 2007-06-12 08:03:45 UTC (rev 13528) @@ -0,0 +1,16 @@ +#include "FCPListPeerNotesResult.h" + + +using namespace FCPLib; + +const std::vector +FCPListPeerNotesResult::getPeerNotes() const +{ + return peerNotes; +} + +FCPListPeerNotesResult::FCPListPeerNotesResult(const std::vector &nodeResponse ) +{ + // FIX: do not store last message (EndListPeerNotes) + this->peerNotes = std::vector( nodeResponse ); +} Added: trunk/apps/CppFCPLib/FCPListPeerNotesResult.h =================================================================== --- trunk/apps/CppFCPLib/FCPListPeerNotesResult.h (rev 0) +++ trunk/apps/CppFCPLib/FCPListPeerNotesResult.h 2007-06-12 08:03:45 UTC (rev 13528) @@ -0,0 +1,26 @@ +#ifndef FCPLISTPEERNOTESRESULT_H__ +#define FCPLISTPEERNOTESRESULT_H__ + +#include +#include +#include "Message.h" +#include "FCPResult.h" + + +namespace FCPLib { + + +class FCPListPeerNotesResult : public FCPResult { + std::vector peerNotes; + + FCPListPeerNotesResult(const std::vector &nodeResponse ); +public: + typedef boost::shared_ptr FCPListPeerNotesResultPtr; + + const std::vector getPeerNotes() const; + + friend class FCPResult; +}; +} + +#endif // FCPLISTPEERNOTESRESULT_H__ Modified: trunk/apps/CppFCPLib/FCPListPeersResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPListPeersResult.cpp 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/FCPListPeersResult.cpp 2007-06-12 08:03:45 UTC (rev 13528) @@ -3,12 +3,15 @@ using namespace FCPLib; -FCPListPeersResult::FCPResultPtr -FCPListPeersResult::createFromMessages(const std::vector &nodeResponse) + +const std::vector +FCPListPeersResult::getPeers() const { - FCPListPeersResultPtr ret( new FCPListPeersResult() ); + return peers; +} - ret->peers = std::vector( nodeResponse ); - - return ret; +FCPListPeersResult::FCPListPeersResult(const std::vector &nodeResponse) +{ + // FIX: do not store last message (EndListPeers) + this->peers = std::vector( nodeResponse ); } Modified: trunk/apps/CppFCPLib/FCPListPeersResult.h =================================================================== --- trunk/apps/CppFCPLib/FCPListPeersResult.h 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/FCPListPeersResult.h 2007-06-12 08:03:45 UTC (rev 13528) @@ -14,11 +14,12 @@ class FCPListPeersResult : public FCPResult { std::vector peers; - FCPListPeersResult() {} + FCPListPeersResult( const std::vector &nodeResponse ); public: typedef boost::shared_ptr FCPListPeersResultPtr; - static FCPResultPtr createFromMessages(const std::vector &nodeResponse); + const std::vector getPeers() const; + friend class FCPResult; }; } Modified: trunk/apps/CppFCPLib/FCPResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPResult.cpp 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/FCPResult.cpp 2007-06-12 08:03:45 UTC (rev 13528) @@ -3,14 +3,22 @@ #include "FCPListPeersResult.h" +#include "FCPClientHelloResult.h" +#include "FCPListPeerNotesResult.h" using namespace FCPLib; FCPResult::FCPResultPtr -FCPResult::factory(const std::string cmd, std::vector nodeResponse) +FCPResult::factory(const std::string cmd, std::vector &nodeResponse) { + if (cmd == "ClientHello") { + return FCPClientHelloResult::FCPClientHelloResultPtr( new FCPClientHelloResult( (*nodeResponse.begin())->getMessage() ) ); + } else if (cmd == "ListPeers") { - return FCPListPeersResult::createFromMessages( nodeResponse ); + return FCPListPeersResult::FCPListPeersResultPtr( new FCPListPeersResult(nodeResponse) ); + } else + if (cmd == "ListPeerNotes") { + return FCPListPeerNotesResult::FCPListPeerNotesResultPtr( new FCPListPeerNotesResult(nodeResponse) ); } throw new std::runtime_error("Not implemented : " + cmd); Modified: trunk/apps/CppFCPLib/FCPResult.h =================================================================== --- trunk/apps/CppFCPLib/FCPResult.h 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/FCPResult.h 2007-06-12 08:03:45 UTC (rev 13528) @@ -13,7 +13,7 @@ public: typedef boost::shared_ptr FCPResultPtr; - static FCPResultPtr factory(const std::string cmd, std::vector nodeResponse); + static FCPResultPtr factory(const std::string cmd, std::vector &nodeResponse); virtual ~FCPResult() = 0; }; Modified: trunk/apps/CppFCPLib/Node.cpp =================================================================== --- trunk/apps/CppFCPLib/Node.cpp 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/Node.cpp 2007-06-12 08:03:45 UTC (rev 13528) @@ -41,17 +41,38 @@ executor.interrupt(); } -FCPListPeersResult +FCPListPeersResult::FCPListPeersResultPtr Node::listPeers(bool withMetaData = false, - bool withVolatile = false){ + bool withVolatile = false) +{ Message::MessagePtr m = Message::factory( std::string("ListPeers") ); m->setField("WithMetadata", withMetaData ? "true" : "false"); m->setField("WithVolatila", withVolatile ? "true" : "false"); - JobTicket::JobTicketPtr job = JobTicket::factory( "__hello", m, false, false, false, 0 ); + JobTicket::JobTicketPtr job = JobTicket::factory( "__global", m, false, false, false, 0 ); log().log(DEBUG, job->toString()); clientReqQueue->put(job); - //TODO: finish + log().log(DEBUG, "waiting for the EndListPeers"); + job->wait(0); + log().log(DEBUG, "EndListPeers arrived"); + + return boost::dynamic_pointer_cast(job->getResult()); } +FCPListPeerNotesResult::FCPListPeerNotesResultPtr +Node::listPeerNotes(std::string& identifier) +{ + Message::MessagePtr 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()); + clientReqQueue->put(job); + + log().log(DEBUG, "waiting for the EndListPeerNotes"); + job->wait(0); + log().log(DEBUG, "EndListPeers arrived"); + + return boost::dynamic_pointer_cast(job->getResult()); +} Modified: trunk/apps/CppFCPLib/Node.h =================================================================== --- trunk/apps/CppFCPLib/Node.h 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/Node.h 2007-06-12 08:03:45 UTC (rev 13528) @@ -10,6 +10,7 @@ #include "TQueue.h" #include "NodeThread.h" #include "FCPListPeersResult.h" +#include "FCPListPeerNotesResult.h" namespace FCPLib { class Node { @@ -24,7 +25,8 @@ Node(std::string name, std::string host, int port); ~Node(); - FCPListPeersResult listPeers(bool, bool); + FCPListPeersResult::FCPListPeersResultPtr listPeers(bool, bool); + FCPListPeerNotesResult::FCPListPeerNotesResultPtr listPeerNotes(std::string&); }; } Added: trunk/apps/CppFCPLib/NodeHelloMessage.h =================================================================== --- trunk/apps/CppFCPLib/NodeHelloMessage.h (rev 0) +++ trunk/apps/CppFCPLib/NodeHelloMessage.h 2007-06-12 08:03:45 UTC (rev 13528) @@ -0,0 +1,26 @@ +#ifndef NODEHELLOMESSAGE_H__ +#define NODEHELLOMESSAGE_H__ + +namespace FCPLib { + +class ServerMessage; + +class NodeHelloMessage : public ServerMessage { + NodeHelloMessage() {} +public: + std::string getIdOfJob() const + { + return "__hello"; + } + + bool isLastMessage(const std::string &cmd) const + { + return true; + } + + friend class ServerMessage; +}; + +} + +#endif // NODEHELLOMESSAGE_H__ Modified: trunk/apps/CppFCPLib/NodeThread.cpp =================================================================== --- trunk/apps/CppFCPLib/NodeThread.cpp 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/NodeThread.cpp 2007-06-12 08:03:45 UTC (rev 13528) @@ -68,7 +68,7 @@ it = jobs->find(message->getIdOfJob()); if (it == jobs->end()) { - log().log(DEBUG, "doMessage : received NodeHello, cannot find __hello in started jobs"); + log().log(DETAIL, "doMessage : received " + message->toString() + ", cannot find " + message->getIdOfJob() + " in started jobs"); return; } Added: trunk/apps/CppFCPLib/PeerNoteMessage.h =================================================================== --- trunk/apps/CppFCPLib/PeerNoteMessage.h (rev 0) +++ trunk/apps/CppFCPLib/PeerNoteMessage.h 2007-06-12 08:03:45 UTC (rev 13528) @@ -0,0 +1,33 @@ +#ifndef PEERNOTEMESSAGE_H__ +#define PEERNOTEMESSAGE_H__ + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class PeerNoteMessage : public ServerMessage { + PeerNoteMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLastMessage(const std::string &cmd) const + { + if (cmd == "ListPeerNotes") + return false; + else if (cmd == "ModifyPeerNote") + return true; + + throw new std::runtime_error("Unknown command"); + } + + friend class ServerMessage; +}; + +} +#endif // PEERNOTEMESSAGE_H__ Modified: trunk/apps/CppFCPLib/ServerMessage.cpp =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.cpp 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/ServerMessage.cpp 2007-06-12 08:03:45 UTC (rev 13528) @@ -1,6 +1,9 @@ #include "ServerMessage.h" +#include "PeerNoteMessage.h" #include "PeerMessage.h" +#include "NodeHelloMessage.h" +#include "Log.h" using namespace FCPLib; @@ -14,8 +17,22 @@ line[strlen(line)-1] = 0; std::string header = std::string(line); + log().log(DETAIL, "NODE: " + header); + + if (header == "NodeHello"){ + m = ServerMessagePtr( new NodeHelloMessage() ); + } else if (header == "Peer") { m = ServerMessagePtr( new PeerMessage() ); + } else + if (header == "EndListPeers") { + m = ServerMessagePtr( new EndMessage() ); + } else + if (header == "PeerNote") { + m = ServerMessagePtr( new PeerNoteMessage() ); + } else + if (header == "EndListPeerNotes") { + m = ServerMessagePtr( new EndMessage() ); } m->message = Message::factory(header); @@ -31,6 +48,8 @@ s.readln(line, 1000); line[strlen(line)-1] = 0; + log().log(DETAIL, "NODE: " + std::string(line)); + if (!strcmp(line, "End") || !strcmp(line, "EndMessage")) break; @@ -40,4 +59,7 @@ } } - +const std::string& +ServerMessage::toString() const { + return message->toString(); +} Modified: trunk/apps/CppFCPLib/ServerMessage.h =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.h 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/ServerMessage.h 2007-06-12 08:03:45 UTC (rev 13528) @@ -7,9 +7,11 @@ namespace FCPLib { class ServerMessage { + void read(Server &s); + +protected: Message::MessagePtr message; - void read(Server &s); public: typedef boost::shared_ptr ServerMessagePtr; static ServerMessagePtr factory(Server &s); @@ -17,6 +19,9 @@ virtual std::string getIdOfJob() const = 0; virtual bool isLastMessage(const std::string &cmd) const = 0; virtual ~ServerMessage() {} + + const std::string& toString() const; + const Message::MessagePtr getMessage() const { return message; } }; } Modified: trunk/apps/CppFCPLib/main.cpp =================================================================== --- trunk/apps/CppFCPLib/main.cpp 2007-06-12 02:14:54 UTC (rev 13527) +++ trunk/apps/CppFCPLib/main.cpp 2007-06-12 08:03:45 UTC (rev 13528) @@ -2,7 +2,8 @@ #include #include "Server.h" #include "Node.h" - +#include "FCPListPeersResult.h" + using namespace std; using namespace FCPLib; @@ -17,6 +18,8 @@ // cout << line; // } - Node("123", "", -1); + Node n("123", "", -1); +// FCPListPeersResult::FCPListPeersResultPtr r = n.listPeers(); + return 0; } Added: trunk/apps/CppFCPLib/todo.txt =================================================================== --- trunk/apps/CppFCPLib/todo.txt (rev 0) +++ trunk/apps/CppFCPLib/todo.txt 2007-06-12 08:03:45 UTC (rev 13528) @@ -0,0 +1,10 @@ +Todo +==== + +* work on logging messages... + + +Questions +========= + +* what to do with CloseConnectionDuplicateClientName \ No newline at end of file From toad at amphibian.dyndns.org Thu Jun 14 18:05:24 2007 From: toad at amphibian.dyndns.org (Matthew Toseland) Date: Thu, 14 Jun 2007 19:05:24 +0100 Subject: [Cppfcplib] r13528 - trunk/apps/CppFCPLib In-Reply-To: <20070612080345.930E547A111@emu.freenetproject.org> References: <20070612080345.930E547A111@emu.freenetproject.org> Message-ID: <200706141905.29304.toad@amphibian.dyndns.org> Are you assuming that we will never have two ListPeerNotes for the same node at the same time, and enforcing this through coalescing in the library? Should we include an Identifier field? On Tuesday 12 June 2007 09:03, mkolar at freenetproject.org wrote: > Author: mkolar > Date: 2007-06-12 08:03:45 +0000 (Tue, 12 Jun 2007) > New Revision: 13528 > > Added: > trunk/apps/CppFCPLib/EndMessage.h > trunk/apps/CppFCPLib/FCPClientHelloResult.h > trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp > trunk/apps/CppFCPLib/FCPListPeerNotesResult.h > trunk/apps/CppFCPLib/NodeHelloMessage.h > trunk/apps/CppFCPLib/PeerNoteMessage.h > trunk/apps/CppFCPLib/todo.txt > Modified: > trunk/apps/CppFCPLib/FCPListPeersResult.cpp > trunk/apps/CppFCPLib/FCPListPeersResult.h > trunk/apps/CppFCPLib/FCPResult.cpp > trunk/apps/CppFCPLib/FCPResult.h > trunk/apps/CppFCPLib/Node.cpp > trunk/apps/CppFCPLib/Node.h > trunk/apps/CppFCPLib/NodeThread.cpp > trunk/apps/CppFCPLib/ServerMessage.cpp > trunk/apps/CppFCPLib/ServerMessage.h > trunk/apps/CppFCPLib/main.cpp > Log: > * added handling for ListPeers and ListPeerNotes > * some minor changes on ClientHello and NodeHello messages > > > > Added: trunk/apps/CppFCPLib/EndMessage.h > =================================================================== > --- trunk/apps/CppFCPLib/EndMessage.h (rev 0) > +++ trunk/apps/CppFCPLib/EndMessage.h 2007-06-12 08:03:45 UTC (rev 13528) > @@ -0,0 +1,6 @@ > +#ifndef ENDMESSAGE_H__ > +#define ENDMESSAGE_H__ > + > + > + > +#endif // ENDMESSAGE_H__ > > Added: trunk/apps/CppFCPLib/FCPClientHelloResult.h > =================================================================== > --- trunk/apps/CppFCPLib/FCPClientHelloResult.h > (rev 0) +++ trunk/apps/CppFCPLib/FCPClientHelloResult.h 2007-06-12 08:03:45 > UTC (rev 13528) @@ -0,0 +1,24 @@ > +#ifndef FCPCLIENTHELLORESULT_H__ > +#define FCPCLIENTHELLORESULT_H__ > + > +#include > +#include > +#include "Message.h" > +#include "FCPResult.h" > + > +namespace FCPLib { > + > +class FCPClientHelloResult : public FCPResult { > + Message::MessagePtr message; > + > + FCPClientHelloResult(Message::MessagePtr message_) : message(message_) > {} +public: > + typedef boost::shared_ptr FCPClientHelloResultPtr; > + > + const Message::MessagePtr getMessage() const { return message; } > + > + friend class FCPResult; > +}; > +} > + > +#endif // FCPCLIENTHELLORESULT_H__ > > Added: trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp > =================================================================== > --- trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp > (rev 0) +++ trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp 2007-06-12 > 08:03:45 UTC (rev 13528) @@ -0,0 +1,16 @@ > +#include "FCPListPeerNotesResult.h" > + > + > +using namespace FCPLib; > + > +const std::vector > +FCPListPeerNotesResult::getPeerNotes() const > +{ > + return peerNotes; > +} > + > +FCPListPeerNotesResult::FCPListPeerNotesResult(const > std::vector &nodeResponse ) +{ > + // FIX: do not store last message (EndListPeerNotes) > + this->peerNotes = std::vector( > nodeResponse ); +} > > Added: trunk/apps/CppFCPLib/FCPListPeerNotesResult.h > =================================================================== > --- trunk/apps/CppFCPLib/FCPListPeerNotesResult.h > (rev 0) +++ trunk/apps/CppFCPLib/FCPListPeerNotesResult.h 2007-06-12 > 08:03:45 UTC (rev 13528) @@ -0,0 +1,26 @@ > +#ifndef FCPLISTPEERNOTESRESULT_H__ > +#define FCPLISTPEERNOTESRESULT_H__ > + > +#include > +#include > +#include "Message.h" > +#include "FCPResult.h" > + > + > +namespace FCPLib { > + > + > +class FCPListPeerNotesResult : public FCPResult { > + std::vector peerNotes; > + > + FCPListPeerNotesResult(const > std::vector &nodeResponse ); +public: > + typedef boost::shared_ptr > FCPListPeerNotesResultPtr; + > + const std::vector getPeerNotes() const; > + > + friend class FCPResult; > +}; > +} > + > +#endif // FCPLISTPEERNOTESRESULT_H__ > > Modified: trunk/apps/CppFCPLib/FCPListPeersResult.cpp > =================================================================== > --- trunk/apps/CppFCPLib/FCPListPeersResult.cpp 2007-06-12 02:14:54 UTC > (rev 13527) +++ trunk/apps/CppFCPLib/FCPListPeersResult.cpp 2007-06-12 > 08:03:45 UTC (rev 13528) @@ -3,12 +3,15 @@ > > using namespace FCPLib; > > -FCPListPeersResult::FCPResultPtr > -FCPListPeersResult::createFromMessages(const > std::vector &nodeResponse) + > +const std::vector > +FCPListPeersResult::getPeers() const > { > - FCPListPeersResultPtr ret( new FCPListPeersResult() ); > + return peers; > +} > > - ret->peers = std::vector( nodeResponse > ); - > - return ret; > +FCPListPeersResult::FCPListPeersResult(const > std::vector &nodeResponse) +{ > + // FIX: do not store last message (EndListPeers) > + this->peers = std::vector( nodeResponse > ); } > > Modified: trunk/apps/CppFCPLib/FCPListPeersResult.h > =================================================================== > --- trunk/apps/CppFCPLib/FCPListPeersResult.h 2007-06-12 02:14:54 UTC (rev > 13527) +++ trunk/apps/CppFCPLib/FCPListPeersResult.h 2007-06-12 08:03:45 > UTC (rev 13528) @@ -14,11 +14,12 @@ > class FCPListPeersResult : public FCPResult { > std::vector peers; > > - FCPListPeersResult() {} > + FCPListPeersResult( const std::vector > &nodeResponse ); public: > typedef boost::shared_ptr FCPListPeersResultPtr; > > - static FCPResultPtr createFromMessages(const > std::vector &nodeResponse); + const > std::vector getPeers() const; + friend > class FCPResult; > }; > } > > > Modified: trunk/apps/CppFCPLib/FCPResult.cpp > =================================================================== > --- trunk/apps/CppFCPLib/FCPResult.cpp 2007-06-12 02:14:54 UTC (rev 13527) > +++ trunk/apps/CppFCPLib/FCPResult.cpp 2007-06-12 08:03:45 UTC (rev 13528) > @@ -3,14 +3,22 @@ > > > #include "FCPListPeersResult.h" > +#include "FCPClientHelloResult.h" > +#include "FCPListPeerNotesResult.h" > > using namespace FCPLib; > > FCPResult::FCPResultPtr > -FCPResult::factory(const std::string cmd, > std::vector nodeResponse) > +FCPResult::factory(const std::string cmd, > std::vector &nodeResponse) { > + if (cmd == "ClientHello") { > + return FCPClientHelloResult::FCPClientHelloResultPtr( new > FCPClientHelloResult( (*nodeResponse.begin())->getMessage() ) ); + } else > if (cmd == "ListPeers") { > - return FCPListPeersResult::createFromMessages( nodeResponse ); > + return FCPListPeersResult::FCPListPeersResultPtr( new > FCPListPeersResult(nodeResponse) ); + } else > + if (cmd == "ListPeerNotes") { > + return FCPListPeerNotesResult::FCPListPeerNotesResultPtr( new > FCPListPeerNotesResult(nodeResponse) ); } > > throw new std::runtime_error("Not implemented : " + cmd); > > Modified: trunk/apps/CppFCPLib/FCPResult.h > =================================================================== > --- trunk/apps/CppFCPLib/FCPResult.h 2007-06-12 02:14:54 UTC (rev 13527) > +++ trunk/apps/CppFCPLib/FCPResult.h 2007-06-12 08:03:45 UTC (rev 13528) > @@ -13,7 +13,7 @@ > public: > typedef boost::shared_ptr FCPResultPtr; > > - static FCPResultPtr factory(const std::string cmd, > std::vector nodeResponse); + static > FCPResultPtr factory(const std::string cmd, > std::vector &nodeResponse); virtual > ~FCPResult() = 0; > }; > > > Modified: trunk/apps/CppFCPLib/Node.cpp > =================================================================== > --- trunk/apps/CppFCPLib/Node.cpp 2007-06-12 02:14:54 UTC (rev 13527) > +++ trunk/apps/CppFCPLib/Node.cpp 2007-06-12 08:03:45 UTC (rev 13528) > @@ -41,17 +41,38 @@ > executor.interrupt(); > } > > -FCPListPeersResult > +FCPListPeersResult::FCPListPeersResultPtr > Node::listPeers(bool withMetaData = false, > - bool withVolatile = false){ > + bool withVolatile = false) > +{ > Message::MessagePtr m = Message::factory( std::string("ListPeers") ); > m->setField("WithMetadata", withMetaData ? "true" : "false"); > m->setField("WithVolatila", withVolatile ? "true" : "false"); > > - JobTicket::JobTicketPtr job = JobTicket::factory( "__hello", m, false, > false, false, 0 ); + JobTicket::JobTicketPtr job = JobTicket::factory( > "__global", m, false, false, false, 0 ); log().log(DEBUG, job->toString()); > clientReqQueue->put(job); > > - //TODO: finish > + log().log(DEBUG, "waiting for the EndListPeers"); > + job->wait(0); > + log().log(DEBUG, "EndListPeers arrived"); > + > + return boost::dynamic_pointer_cast FCPResult>(job->getResult()); } > > +FCPListPeerNotesResult::FCPListPeerNotesResultPtr > +Node::listPeerNotes(std::string& identifier) > +{ > + Message::MessagePtr 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()); > + clientReqQueue->put(job); > + > + log().log(DEBUG, "waiting for the EndListPeerNotes"); > + job->wait(0); > + log().log(DEBUG, "EndListPeers arrived"); > + > + return boost::dynamic_pointer_cast FCPResult>(job->getResult()); +} > > Modified: trunk/apps/CppFCPLib/Node.h > =================================================================== > --- trunk/apps/CppFCPLib/Node.h 2007-06-12 02:14:54 UTC (rev 13527) > +++ trunk/apps/CppFCPLib/Node.h 2007-06-12 08:03:45 UTC (rev 13528) > @@ -10,6 +10,7 @@ > #include "TQueue.h" > #include "NodeThread.h" > #include "FCPListPeersResult.h" > +#include "FCPListPeerNotesResult.h" > > namespace FCPLib { > class Node { > @@ -24,7 +25,8 @@ > Node(std::string name, std::string host, int port); > ~Node(); > > - FCPListPeersResult listPeers(bool, bool); > + FCPListPeersResult::FCPListPeersResultPtr listPeers(bool, bool); > + FCPListPeerNotesResult::FCPListPeerNotesResultPtr > listPeerNotes(std::string&); }; > } > > > Added: trunk/apps/CppFCPLib/NodeHelloMessage.h > =================================================================== > --- trunk/apps/CppFCPLib/NodeHelloMessage.h (rev 0) > +++ trunk/apps/CppFCPLib/NodeHelloMessage.h 2007-06-12 08:03:45 UTC (rev > 13528) @@ -0,0 +1,26 @@ > +#ifndef NODEHELLOMESSAGE_H__ > +#define NODEHELLOMESSAGE_H__ > + > +namespace FCPLib { > + > +class ServerMessage; > + > +class NodeHelloMessage : public ServerMessage { > + NodeHelloMessage() {} > +public: > + std::string getIdOfJob() const > + { > + return "__hello"; > + } > + > + bool isLastMessage(const std::string &cmd) const > + { > + return true; > + } > + > + friend class ServerMessage; > +}; > + > +} > + > +#endif // NODEHELLOMESSAGE_H__ > > Modified: trunk/apps/CppFCPLib/NodeThread.cpp > =================================================================== > --- trunk/apps/CppFCPLib/NodeThread.cpp 2007-06-12 02:14:54 UTC (rev 13527) > +++ trunk/apps/CppFCPLib/NodeThread.cpp 2007-06-12 08:03:45 UTC (rev 13528) > @@ -68,7 +68,7 @@ > > it = jobs->find(message->getIdOfJob()); > if (it == jobs->end()) { > - log().log(DEBUG, "doMessage : received NodeHello, cannot find __hello > in started jobs"); + log().log(DETAIL, "doMessage : received " + > message->toString() + ", cannot find " + message->getIdOfJob() + " in > started jobs"); return; > } > > > Added: trunk/apps/CppFCPLib/PeerNoteMessage.h > =================================================================== > --- trunk/apps/CppFCPLib/PeerNoteMessage.h (rev 0) > +++ trunk/apps/CppFCPLib/PeerNoteMessage.h 2007-06-12 08:03:45 UTC (rev > 13528) @@ -0,0 +1,33 @@ > +#ifndef PEERNOTEMESSAGE_H__ > +#define PEERNOTEMESSAGE_H__ > + > +#include > +#include > + > +namespace FCPLib { > + > +class ServerMessage; > + > +class PeerNoteMessage : public ServerMessage { > + PeerNoteMessage() {} > +public: > + std::string getIdOfJob() const > + { > + return "__global"; > + } > + > + bool isLastMessage(const std::string &cmd) const > + { > + if (cmd == "ListPeerNotes") > + return false; > + else if (cmd == "ModifyPeerNote") > + return true; > + > + throw new std::runtime_error("Unknown command"); > + } > + > + friend class ServerMessage; > +}; > + > +} > +#endif // PEERNOTEMESSAGE_H__ > > Modified: trunk/apps/CppFCPLib/ServerMessage.cpp > =================================================================== > --- trunk/apps/CppFCPLib/ServerMessage.cpp 2007-06-12 02:14:54 UTC (rev > 13527) +++ trunk/apps/CppFCPLib/ServerMessage.cpp 2007-06-12 08:03:45 UTC > (rev 13528) @@ -1,6 +1,9 @@ > > #include "ServerMessage.h" > +#include "PeerNoteMessage.h" > #include "PeerMessage.h" > +#include "NodeHelloMessage.h" > +#include "Log.h" > > using namespace FCPLib; > > @@ -14,8 +17,22 @@ > line[strlen(line)-1] = 0; > std::string header = std::string(line); > > + log().log(DETAIL, "NODE: " + header); > + > + if (header == "NodeHello"){ > + m = ServerMessagePtr( new NodeHelloMessage() ); > + } else > if (header == "Peer") { > m = ServerMessagePtr( new PeerMessage() ); > + } else > + if (header == "EndListPeers") { > + m = ServerMessagePtr( new EndMessage() ); > + } else > + if (header == "PeerNote") { > + m = ServerMessagePtr( new PeerNoteMessage() ); > + } else > + if (header == "EndListPeerNotes") { > + m = ServerMessagePtr( new EndMessage() ); > } > m->message = Message::factory(header); > > @@ -31,6 +48,8 @@ > s.readln(line, 1000); > line[strlen(line)-1] = 0; > > + log().log(DETAIL, "NODE: " + std::string(line)); > + > if (!strcmp(line, "End") || !strcmp(line, "EndMessage")) > break; > > @@ -40,4 +59,7 @@ > } > } > > - > +const std::string& > +ServerMessage::toString() const { > + return message->toString(); > +} > > Modified: trunk/apps/CppFCPLib/ServerMessage.h > =================================================================== > --- trunk/apps/CppFCPLib/ServerMessage.h 2007-06-12 02:14:54 UTC (rev > 13527) +++ trunk/apps/CppFCPLib/ServerMessage.h 2007-06-12 08:03:45 UTC > (rev 13528) @@ -7,9 +7,11 @@ > namespace FCPLib { > > class ServerMessage { > + void read(Server &s); > + > +protected: > Message::MessagePtr message; > > - void read(Server &s); > public: > typedef boost::shared_ptr ServerMessagePtr; > static ServerMessagePtr factory(Server &s); > @@ -17,6 +19,9 @@ > virtual std::string getIdOfJob() const = 0; > virtual bool isLastMessage(const std::string &cmd) const = 0; > virtual ~ServerMessage() {} > + > + const std::string& toString() const; > + const Message::MessagePtr getMessage() const { return message; } > }; > > } > > Modified: trunk/apps/CppFCPLib/main.cpp > =================================================================== > --- trunk/apps/CppFCPLib/main.cpp 2007-06-12 02:14:54 UTC (rev 13527) > +++ trunk/apps/CppFCPLib/main.cpp 2007-06-12 08:03:45 UTC (rev 13528) > @@ -2,7 +2,8 @@ > #include > #include "Server.h" > #include "Node.h" > - > +#include "FCPListPeersResult.h" > + > using namespace std; > using namespace FCPLib; > > @@ -17,6 +18,8 @@ > // cout << line; > // } > > - Node("123", "", -1); > + Node n("123", "", -1); > +// FCPListPeersResult::FCPListPeersResultPtr r = n.listPeers(); > + > return 0; > } > > Added: trunk/apps/CppFCPLib/todo.txt > =================================================================== > --- trunk/apps/CppFCPLib/todo.txt (rev 0) > +++ trunk/apps/CppFCPLib/todo.txt 2007-06-12 08:03:45 UTC (rev 13528) > @@ -0,0 +1,10 @@ > +Todo > +==== > + > +* work on logging messages... > + > + > +Questions > +========= > + > +* what to do with CloseConnectionDuplicateClientName > \ No newline at end of file > > _______________________________________________ > Cppfcplib mailing list > Cppfcplib at freenetproject.org > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cppfcplib -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 189 bytes Desc: not available Url : http://emu.freenetproject.org/pipermail/cppfcplib/attachments/20070614/f8f00d33/attachment.pgp From mkolar at freenetproject.org Mon Jun 18 07:10:01 2007 From: mkolar at freenetproject.org (mkolar at freenetproject.org) Date: Mon, 18 Jun 2007 07:10:01 +0000 (UTC) Subject: [Cppfcplib] r13645 - trunk/apps/CppFCPLib Message-ID: <20070618071001.531EF47919E@emu.freenetproject.org> Author: mkolar Date: 2007-06-18 07:10:00 +0000 (Mon, 18 Jun 2007) New Revision: 13645 Added: trunk/apps/CppFCPLib/FCPMultiMessageResponse.h trunk/apps/CppFCPLib/FCPOneMessageResponse.h trunk/apps/CppFCPLib/NodeDataMessage.h trunk/apps/CppFCPLib/PeerRemovedMessage.h Removed: trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp trunk/apps/CppFCPLib/FCPListPeerNotesResult.h trunk/apps/CppFCPLib/FCPListPeersResult.cpp trunk/apps/CppFCPLib/FCPListPeersResult.h Modified: trunk/apps/CppFCPLib/EndMessage.h trunk/apps/CppFCPLib/FCPResult.cpp 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 trunk/apps/CppFCPLib/main.cpp Log: * FCPOneMessageResponse and FCPMultiMessageResponse used to replace other types of responses * few messages were added Modified: trunk/apps/CppFCPLib/EndMessage.h =================================================================== --- trunk/apps/CppFCPLib/EndMessage.h 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/EndMessage.h 2007-06-18 07:10:00 UTC (rev 13645) @@ -1,6 +1,29 @@ #ifndef ENDMESSAGE_H__ #define ENDMESSAGE_H__ +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class EndMessage : public ServerMessage { + EndMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLastMessage(const std::string &cmd) const + { + return true; + } + + friend class ServerMessage; +}; + +} - #endif // ENDMESSAGE_H__ Deleted: trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/FCPListPeerNotesResult.cpp 2007-06-18 07:10:00 UTC (rev 13645) @@ -1,16 +0,0 @@ -#include "FCPListPeerNotesResult.h" - - -using namespace FCPLib; - -const std::vector -FCPListPeerNotesResult::getPeerNotes() const -{ - return peerNotes; -} - -FCPListPeerNotesResult::FCPListPeerNotesResult(const std::vector &nodeResponse ) -{ - // FIX: do not store last message (EndListPeerNotes) - this->peerNotes = std::vector( nodeResponse ); -} Deleted: trunk/apps/CppFCPLib/FCPListPeerNotesResult.h =================================================================== --- trunk/apps/CppFCPLib/FCPListPeerNotesResult.h 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/FCPListPeerNotesResult.h 2007-06-18 07:10:00 UTC (rev 13645) @@ -1,26 +0,0 @@ -#ifndef FCPLISTPEERNOTESRESULT_H__ -#define FCPLISTPEERNOTESRESULT_H__ - -#include -#include -#include "Message.h" -#include "FCPResult.h" - - -namespace FCPLib { - - -class FCPListPeerNotesResult : public FCPResult { - std::vector peerNotes; - - FCPListPeerNotesResult(const std::vector &nodeResponse ); -public: - typedef boost::shared_ptr FCPListPeerNotesResultPtr; - - const std::vector getPeerNotes() const; - - friend class FCPResult; -}; -} - -#endif // FCPLISTPEERNOTESRESULT_H__ Deleted: trunk/apps/CppFCPLib/FCPListPeersResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPListPeersResult.cpp 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/FCPListPeersResult.cpp 2007-06-18 07:10:00 UTC (rev 13645) @@ -1,17 +0,0 @@ -#include "FCPListPeersResult.h" - - -using namespace FCPLib; - - -const std::vector -FCPListPeersResult::getPeers() const -{ - return peers; -} - -FCPListPeersResult::FCPListPeersResult(const std::vector &nodeResponse) -{ - // FIX: do not store last message (EndListPeers) - this->peers = std::vector( nodeResponse ); -} Deleted: trunk/apps/CppFCPLib/FCPListPeersResult.h =================================================================== --- trunk/apps/CppFCPLib/FCPListPeersResult.h 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/FCPListPeersResult.h 2007-06-18 07:10:00 UTC (rev 13645) @@ -1,26 +0,0 @@ -#ifndef FCPLISTPEERSRESULT_H__ -#define FCPLISTPEERSRESULT_H__ - - -#include -#include -#include "Message.h" -#include "FCPResult.h" - - -namespace FCPLib { - - -class FCPListPeersResult : public FCPResult { - std::vector peers; - - FCPListPeersResult( const std::vector &nodeResponse ); -public: - typedef boost::shared_ptr FCPListPeersResultPtr; - - const std::vector getPeers() const; - friend class FCPResult; -}; -} - -#endif Added: trunk/apps/CppFCPLib/FCPMultiMessageResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPMultiMessageResponse.h (rev 0) +++ trunk/apps/CppFCPLib/FCPMultiMessageResponse.h 2007-06-18 07:10:00 UTC (rev 13645) @@ -0,0 +1,31 @@ +#ifndef FCPMULTIMESSAGERESPONSE_H__ +#define FCPMULTIMESSAGERESPONSE_H__ + + +#include +#include +#include "Message.h" +#include "FCPResult.h" + + +namespace FCPLib { + + +class FCPMultiMessageResponse : public FCPResult { + std::vector messages; + + FCPMultiMessageResponse( const std::vector &nodeResponse ) { + messages = nodeResponse; + messages.pop_back(); + } +public: + typedef boost::shared_ptr FCPMultiMessageResponsePtr; + + const std::vector getMessages() const { + return messages; + } + friend class FCPResult; +}; +} + +#endif // FCPMULTIMESSAGERESPONSE_H__ Added: trunk/apps/CppFCPLib/FCPOneMessageResponse.h =================================================================== --- trunk/apps/CppFCPLib/FCPOneMessageResponse.h (rev 0) +++ trunk/apps/CppFCPLib/FCPOneMessageResponse.h 2007-06-18 07:10:00 UTC (rev 13645) @@ -0,0 +1,24 @@ +#ifndef FCPONEMESSAGERESPONSE_H__ +#define FCPONEMESSAGERESPONSE_H__ + +#include +#include +#include "Message.h" +#include "FCPResult.h" + +namespace FCPLib { + +class FCPOneMessageResponse : public FCPResult { + Message::MessagePtr message; + + FCPOneMessageResponse(Message::MessagePtr message_) : message(message_) {} +public: + typedef boost::shared_ptr FCPOneMessageResponsePtr; + + const Message::MessagePtr getMessage() const { return message; } + + friend class FCPResult; +}; +} + +#endif // FCPONEMESSAGERESPONSE_H__ Modified: trunk/apps/CppFCPLib/FCPResult.cpp =================================================================== --- trunk/apps/CppFCPLib/FCPResult.cpp 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/FCPResult.cpp 2007-06-18 07:10:00 UTC (rev 13645) @@ -2,9 +2,8 @@ #include -#include "FCPListPeersResult.h" -#include "FCPClientHelloResult.h" -#include "FCPListPeerNotesResult.h" +#include "FCPMultiMessageResponse.h" +#include "FCPOneMessageResponse.h" using namespace FCPLib; @@ -12,13 +11,13 @@ FCPResult::factory(const std::string cmd, std::vector &nodeResponse) { if (cmd == "ClientHello") { - return FCPClientHelloResult::FCPClientHelloResultPtr( new FCPClientHelloResult( (*nodeResponse.begin())->getMessage() ) ); + return FCPOneMessageResponse::FCPOneMessageResponsePtr( new FCPOneMessageResponse( (*nodeResponse.begin())->getMessage() ) ); } else if (cmd == "ListPeers") { - return FCPListPeersResult::FCPListPeersResultPtr( new FCPListPeersResult(nodeResponse) ); + return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse) ); } else if (cmd == "ListPeerNotes") { - return FCPListPeerNotesResult::FCPListPeerNotesResultPtr( new FCPListPeerNotesResult(nodeResponse) ); + return FCPMultiMessageResponse::FCPMultiMessageResponsePtr( new FCPMultiMessageResponse(nodeResponse) ); } throw new std::runtime_error("Not implemented : " + cmd); Modified: trunk/apps/CppFCPLib/Message.cpp =================================================================== --- trunk/apps/CppFCPLib/Message.cpp 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/Message.cpp 2007-06-18 07:10:00 UTC (rev 13645) @@ -19,6 +19,13 @@ fields[key] = value; } +void +Message::setFields(const std::map &fields) { + for (std::map::const_iterator it = fields.begin(); it != fields.end(); ++it) { + this->setField(it->first, it->second); + } +} + std::string Message::getField(const std::string &key) { return fields[key]; Modified: trunk/apps/CppFCPLib/Message.h =================================================================== --- trunk/apps/CppFCPLib/Message.h 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/Message.h 2007-06-18 07:10:00 UTC (rev 13645) @@ -29,6 +29,7 @@ static Message::MessagePtr factory(std::string header); 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& getHeader() const; Modified: trunk/apps/CppFCPLib/Node.cpp =================================================================== --- trunk/apps/CppFCPLib/Node.cpp 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/Node.cpp 2007-06-18 07:10:00 UTC (rev 13645) @@ -34,6 +34,8 @@ log().log(DEBUG, "waiting for the NodeHello"); job->wait(0); log().log(DEBUG, "NodeHello arrived"); + + // TODO: put information received from NODE somewhere } Node::~Node() @@ -41,7 +43,7 @@ executor.interrupt(); } -FCPListPeersResult::FCPListPeersResultPtr +FCPMultiMessageResponse::FCPMultiMessageResponsePtr Node::listPeers(bool withMetaData = false, bool withVolatile = false) { @@ -57,11 +59,11 @@ job->wait(0); log().log(DEBUG, "EndListPeers arrived"); - return boost::dynamic_pointer_cast(job->getResult()); + return boost::dynamic_pointer_cast(job->getResult()); } -FCPListPeerNotesResult::FCPListPeerNotesResultPtr -Node::listPeerNotes(std::string& identifier) +FCPMultiMessageResponse::FCPMultiMessageResponsePtr +Node::listPeerNotes(const std::string& identifier) { Message::MessagePtr m = Message::factory( std::string("ListPeerNotes") ); m->setField("NodeIdentifier", identifier); @@ -74,5 +76,130 @@ job->wait(0); log().log(DEBUG, "EndListPeers arrived"); - return boost::dynamic_pointer_cast(job->getResult()); + return boost::dynamic_pointer_cast(job->getResult()); } + +void +Node::addPeer(const std::string &value, bool isURL = false) { + Message::MessagePtr 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()); + clientReqQueue->put(job); + + log().log(DEBUG, "waiting for AddPeer to be sent"); + job->waitTillReqSent(); + log().log(DEBUG, "AddPeer to was sent"); +} + + +void +Node::addPeer(const std::map &message) +{ + Message::MessagePtr 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()); + clientReqQueue->put(job); + + log().log(DEBUG, "waiting for AddPeer to be sent"); + job->waitTillReqSent(); + log().log(DEBUG, "AddPeer to was sent"); +} + +FCPOneMessageResponse::FCPOneMessageResponsePtr +Node::modifyPeer(const std::string & nodeIdentifier, + bool allowLocalAddresses = false, + bool isDisabled = false, + bool isListenOnly = false) +{ + 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"); + + + 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 Peer"); + job->wait(0); + log().log(DEBUG, "Peer received"); + + return boost::dynamic_pointer_cast(job->getResult()); +} + +FCPOneMessageResponse::FCPOneMessageResponsePtr +Node::modifyPeerNote(const std::string & nodeIdentifier, + const std::string & noteText, + int peerNoteType = 1) +{ + Message::MessagePtr m = Message::factory( std::string("ModifyPeerNote") ); + + m->setField("NodeIdentifier", nodeIdentifier); + m->setField("NoteText", noteText); + m->setField("PeerNoteType", "1"); + + 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 PeerNote"); + job->wait(0); + log().log(DEBUG, "PeerNote received"); + + return boost::dynamic_pointer_cast(job->getResult()); +} + +FCPOneMessageResponse::FCPOneMessageResponsePtr +Node::removePeer(const std::string &identifier) +{ + Message::MessagePtr 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()); + clientReqQueue->put(job); + + log().log(DEBUG, "waiting for the PeerRemoved"); + job->wait(0); + log().log(DEBUG, "PeerRemoved received"); + + return boost::dynamic_pointer_cast(job->getResult()); +} + +FCPOneMessageResponse::FCPOneMessageResponsePtr +Node::getNode(bool withPrivate = false, + bool withVolatile = false) +{ + Message::MessagePtr m = Message::factory( std::string("GetNode") ); + + if (withPrivate) + m->setField("WithPrivate", "True"); + if (withVolatile) + m->setField("WithVolatile", "True"); + + 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 NodeData"); + job->wait(0); + log().log(DEBUG, "NodeData received"); + + return boost::dynamic_pointer_cast(job->getResult()); +} Modified: trunk/apps/CppFCPLib/Node.h =================================================================== --- trunk/apps/CppFCPLib/Node.h 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/Node.h 2007-06-18 07:10:00 UTC (rev 13645) @@ -3,14 +3,15 @@ #include #include +#include #include "zthread/Thread.h" #include "zthread/ThreadedExecutor.h" #include "TQueue.h" #include "NodeThread.h" -#include "FCPListPeersResult.h" -#include "FCPListPeerNotesResult.h" +#include "FCPMultiMessageResponse.h" +#include "FCPOneMessageResponse.h" namespace FCPLib { class Node { @@ -25,8 +26,14 @@ Node(std::string name, std::string host, int port); ~Node(); - FCPListPeersResult::FCPListPeersResultPtr listPeers(bool, bool); - FCPListPeerNotesResult::FCPListPeerNotesResultPtr listPeerNotes(std::string&); + FCPMultiMessageResponse::FCPMultiMessageResponsePtr listPeers(bool, bool); + 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 modifyPeerNote(const std::string &, const std::string &, int); + FCPOneMessageResponse::FCPOneMessageResponsePtr removePeer(const std::string &); + FCPOneMessageResponse::FCPOneMessageResponsePtr getNode(bool, bool); }; } Added: trunk/apps/CppFCPLib/NodeDataMessage.h =================================================================== --- trunk/apps/CppFCPLib/NodeDataMessage.h (rev 0) +++ trunk/apps/CppFCPLib/NodeDataMessage.h 2007-06-18 07:10:00 UTC (rev 13645) @@ -0,0 +1,29 @@ +#ifndef NODEDATAMESSAGE_H__ +#define NODEDATAMESSAGE_H__ + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class NodeDataMessage : public ServerMessage { + NodeDataMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLastMessage(const std::string &cmd) const + { + return true; + } + + friend class ServerMessage; +}; + +} + +#endif // NODEDATAMESSAGE_H__ Added: trunk/apps/CppFCPLib/PeerRemovedMessage.h =================================================================== --- trunk/apps/CppFCPLib/PeerRemovedMessage.h (rev 0) +++ trunk/apps/CppFCPLib/PeerRemovedMessage.h 2007-06-18 07:10:00 UTC (rev 13645) @@ -0,0 +1,29 @@ +#ifndef PEERREMOVEDMESSAGE_H__ +#define PEERREMOVEDMESSAGE_H__ + +#include +#include + +namespace FCPLib { + +class ServerMessage; + +class PeerRemovedMessage : public ServerMessage { + PeerRemovedMessage() {} +public: + std::string getIdOfJob() const + { + return "__global"; + } + + bool isLastMessage(const std::string &cmd) const + { + return true; + } + + friend class ServerMessage; +}; + +} + +#endif // PEERREMOVEDMESSAGE_H__ Modified: trunk/apps/CppFCPLib/ServerMessage.cpp =================================================================== --- trunk/apps/CppFCPLib/ServerMessage.cpp 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/ServerMessage.cpp 2007-06-18 07:10:00 UTC (rev 13645) @@ -1,8 +1,11 @@ #include "ServerMessage.h" #include "PeerNoteMessage.h" +#include "EndMessage.h" #include "PeerMessage.h" #include "NodeHelloMessage.h" +#include "PeerRemovedMessage.h" +#include "NodeDataMessage.h" #include "Log.h" using namespace FCPLib; @@ -33,7 +36,14 @@ } else if (header == "EndListPeerNotes") { m = ServerMessagePtr( new EndMessage() ); + } else + if (header == "PeerRemoved") { + m = ServerMessagePtr( new PeerRemovedMessage() ); + } else + if (header == "NodeData") { + m = ServerMessagePtr( new NodeDataMessage() ); } + m->message = Message::factory(header); m->read(s); Modified: trunk/apps/CppFCPLib/main.cpp =================================================================== --- trunk/apps/CppFCPLib/main.cpp 2007-06-18 03:07:11 UTC (rev 13644) +++ trunk/apps/CppFCPLib/main.cpp 2007-06-18 07:10:00 UTC (rev 13645) @@ -2,7 +2,7 @@ #include #include "Server.h" #include "Node.h" -#include "FCPListPeersResult.h" +#include "FCPMultiMessageResponse.h" using namespace std; using namespace FCPLib;