Browse Source

2009-05-08 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Added tellActiveStatus xml-rpc command which reports download
	status of active downloads.
	* src/XmlRpcMethodFactory.cc
	* src/XmlRpcMethodImpl.cc
	* src/XmlRpcMethodImpl.h
Tatsuhiro Tsujikawa 16 years ago
parent
commit
08856691b3
4 changed files with 93 additions and 1 deletions
  1. 8 0
      ChangeLog
  2. 3 1
      src/XmlRpcMethodFactory.cc
  3. 77 0
      src/XmlRpcMethodImpl.cc
  4. 5 0
      src/XmlRpcMethodImpl.h

+ 8 - 0
ChangeLog

@@ -1,3 +1,11 @@
+2009-05-08  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Added tellActiveStatus xml-rpc command which reports download
+	status of active downloads.
+	* src/XmlRpcMethodFactory.cc
+	* src/XmlRpcMethodImpl.cc
+	* src/XmlRpcMethodImpl.h
+
 2009-05-08  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Added addTorrentFile xml-rpc command which receives uploaded

+ 3 - 1
src/XmlRpcMethodFactory.cc

@@ -46,10 +46,12 @@ XmlRpcMethodFactory::create(const std::string& methodName)
 {
   if(methodName == "aria2.addURI") {
     return SharedHandle<XmlRpcMethod>(new AddURIXmlRpcMethod());
-  } else if(methodName == "aria2.addTorrent") {
+  } else if(methodName == "aria2.addTorrentFile") {
     return SharedHandle<XmlRpcMethod>(new AddTorrentFileXmlRpcMethod());
   } else if(methodName == "aria2.remove") {
     return SharedHandle<XmlRpcMethod>(new RemoveXmlRpcMethod());
+  } else if(methodName == "aria2.tellActiveStatus") {
+    return SharedHandle<XmlRpcMethod>(new TellActiveStatusXmlRpcMethod());
   } else {
     return SharedHandle<XmlRpcMethod>(new FailXmlRpcMethod());
   }

+ 77 - 0
src/XmlRpcMethodImpl.cc

@@ -49,6 +49,16 @@
 #include "RequestGroupMan.h"
 #include "StringFormat.h"
 #include "XmlRpcRequest.h"
+#include "PieceStorage.h"
+#include "PeerStorage.h"
+#include "BtContext.h"
+#include "BtRegistry.h"
+#include "Peer.h"
+#include "DiskAdaptor.h"
+#include "FileEntry.h"
+#include "BtProgressInfoFile.h"
+#include "BtRuntime.h"
+#include "BtAnnounce.h"
 
 namespace aria2 {
 
@@ -143,6 +153,73 @@ BDE RemoveXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
   return resParams;
 }
 
+BDE TellActiveStatusXmlRpcMethod::process
+(const XmlRpcRequest& req, DownloadEngine* e)
+{
+  BDE res = BDE::list();
+  const std::deque<SharedHandle<RequestGroup> >& groups =
+    e->_requestGroupMan->getRequestGroups();
+  for(std::deque<SharedHandle<RequestGroup> >::const_iterator i =
+	groups.begin(); i != groups.end(); ++i) {
+    BDE entryDict = BDE::dict();
+    entryDict["gid"] = BDE(Util::itos((*i)->getGID()));
+    entryDict["totalLength"] = BDE(Util::uitos((*i)->getTotalLength()));
+    entryDict["completedLength"] = BDE(Util::uitos((*i)->getCompletedLength()));
+    TransferStat stat = (*i)->calculateStat();
+    entryDict["downloadSpeed"] = BDE(Util::uitos(stat.getDownloadSpeed()));
+    entryDict["uploadSpeed"] = BDE(Util::uitos(stat.getUploadSpeed()));
+    
+    SharedHandle<PieceStorage> ps = (*i)->getPieceStorage();
+    if(!ps.isNull()) {
+      if(ps->getBitfieldLength() > 0) {
+	entryDict["bitfield"] = BDE(Util::toHex(ps->getBitfield(),
+						ps->getBitfieldLength()));
+      }
+
+      if(!ps->getDiskAdaptor().isNull()) {
+	BDE files = BDE::list();
+	const std::deque<SharedHandle<FileEntry> >& entries =
+	  ps->getDiskAdaptor()->getFileEntries();
+	for(std::deque<SharedHandle<FileEntry> >::const_iterator i =
+	      entries.begin(); i != entries.end(); ++i) {
+	  files << BDE((*i)->getPath());
+	}
+	entryDict["files"] = files;
+      }
+    }
+    
+    SharedHandle<BtContext> btctx =
+      dynamic_pointer_cast<BtContext>((*i)->getDownloadContext());
+    if(!btctx.isNull()) {
+      SharedHandle<BtRegistry> btreg = e->getBtRegistry();
+
+      BDE peers = BDE::list();
+      SharedHandle<PeerStorage> ps =
+	btreg->getPeerStorage(btctx->getInfoHashAsString());
+
+      assert(!ps.isNull());
+
+      std::deque<SharedHandle<Peer> > activePeers;
+      ps->getActivePeers(activePeers);
+      for(std::deque<SharedHandle<Peer> >::const_iterator i =
+	    activePeers.begin(); i != activePeers.end(); ++i) {
+	BDE peerEntry = BDE::dict();
+	peerEntry["peerId"] = BDE(Util::torrentUrlencode((*i)->getPeerId(),
+							 PEER_ID_LENGTH));
+	peerEntry["ip"] = BDE((*i)->ipaddr);
+	peerEntry["port"] = BDE(Util::uitos((*i)->port));
+	peerEntry["bitfield"] = BDE(Util::toHex((*i)->getBitfield(),
+						(*i)->getBitfieldLength()));
+	peers << peerEntry;
+      }
+      entryDict["peers"] = peers;
+    }
+
+    res << entryDict;
+  }
+  return res;
+}
+
 BDE FailXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
 {
   throw DlAbortEx

+ 5 - 0
src/XmlRpcMethodImpl.h

@@ -56,6 +56,11 @@ protected:
   virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);
 };
 
+class TellActiveStatusXmlRpcMethod:public XmlRpcMethod {
+protected:
+  virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);
+};
+
 class FailXmlRpcMethod:public XmlRpcMethod {
 protected:
   virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);