Kaynağa Gözat

* DownloadEngine.{h, cc}:
* ConsoleDownloadEngine.{h, cc}: Console output message(size,
speed)
is now generated by ConsoleDownloadEngine not by DownloadEngine.
* main.cc: Download complete/abort message is now generated by
main.

Tatsuhiro Tsujikawa 19 yıl önce
ebeveyn
işleme
0f6d2fd451
6 değiştirilmiş dosya ile 65 ekleme ve 40 silme
  1. 5 1
      ChangeLog
  2. 26 36
      src/DownloadEngine.cc
  3. 8 1
      src/DownloadEngine.h
  4. 1 0
      src/Makefile.am
  5. 17 0
      src/Makefile.in
  6. 8 2
      src/main.cc

+ 5 - 1
ChangeLog

@@ -2,7 +2,11 @@
 
 	* HttpConnection.cc:
 	* common.h: defined the user agent name as macro
-
+	* DownloadEngine.{h, cc}:
+	* ConsoleDownloadEngine.{h, cc}: Console output message(size, speed)
+	is now generated by ConsoleDownloadEngine not by DownloadEngine.
+	* main.cc: Download complete/abort message is now generated by main.
+	
 2006-03-01  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	* AbstractCommand.cc:

+ 26 - 36
src/DownloadEngine.cc

@@ -38,9 +38,7 @@ DownloadEngine::~DownloadEngine() {
 }
 
 void DownloadEngine::run() {
-  struct timeval cp = { 0, 0 };
-  int  speed = 0;
-  long long int psize = 0;
+  initStatistics();
   while(!commands.empty()) {
     int max = commands.size();
     for(int i = 0; i < max; i++) {
@@ -54,48 +52,40 @@ void DownloadEngine::run() {
       waitData();
     }
     noWait = false;
-
-    long long int dlSize = segmentMan->getDownloadedSize();
-    struct timeval now;
-    gettimeofday(&now, NULL);
-    if(cp.tv_sec == 0 && cp.tv_usec == 0) {
-      cp = now;
-      psize = dlSize;
-    } else {
-      long long int elapsed = Util::difftv(now, cp);
-      if(elapsed >= 500000) {
-	int nspeed = (int)((dlSize-psize)/(elapsed/1000000.0));
-	speed = (nspeed+speed)/2;
-	cp = now;
-	psize = dlSize;
-	cout << "\r                                                                            ";
-	cout << "\rProgress " << Util::llitos(dlSize, true) << " Bytes/" <<
-	  Util::llitos(segmentMan->totalSize, true) << " Bytes " <<
-	  (segmentMan->totalSize == 0 ? 0 : (dlSize*100)/segmentMan->totalSize) << "% " <<
-	  speed/1000.0 << "KB/s " <<
-	  "(" << commands.size() << " connections)" << flush;
-      }
-    }
-
+    calculateStatistics();
   }
   diskWriter->closeFile();
   if(segmentMan->finished()) {
     segmentMan->remove();
-    cout << "\nThe download was complete. <" << segmentMan->getFilePath() << ">" << endl;
   } else {
     segmentMan->save();
-    cout << "\nThe download was not complete because of errors. Check the log." << endl;
   }
 }
 
-// void DownloadEngine::shortSleep() {
-//   int wait = rpm == 0 ? 0 : 4096*1000/rpm;
-//   struct timeval tv;
-//   int retval;
-//   tv.tv_sec = 0;
-//   tv.tv_usec = wait*1000;
-//   retval = select(0, NULL, NULL, NULL, &tv);
-// }
+void DownloadEngine::initStatistics() {
+  cp.tv_sec = cp.tv_usec = 0;
+  speed = 0;
+  psize = 0;
+}
+
+void DownloadEngine::calculateStatistics() {
+  long long int dlSize = segmentMan->getDownloadedSize();
+  struct timeval now;
+  gettimeofday(&now, NULL);
+  if(cp.tv_sec == 0 && cp.tv_usec == 0) {
+    cp = now;
+    psize = dlSize;
+  } else {
+    long long int elapsed = Util::difftv(now, cp);
+    if(elapsed >= 500000) {
+      int nspeed = (int)((dlSize-psize)/(elapsed/1000000.0));
+      speed = (nspeed+speed)/2;
+      cp = now;
+      psize = dlSize;
+      sendStatistics(dlSize, segmentMan->totalSize);
+    }
+  }
+}
 
 void DownloadEngine::waitData() {
   fd_set rfds;

+ 8 - 1
src/DownloadEngine.h

@@ -42,6 +42,13 @@ private:
 
   bool addSocket(vector<Socket*>& sockets, Socket* socket);
   bool deleteSocket(vector<Socket*>& sockets, Socket* socket);
+  struct timeval cp;
+  long long int psize;
+  void initStatistics();
+  void calculateStatistics();
+protected:
+  int speed;
+  virtual void sendStatistics(long long int currentSize, long long int totalSize) {};
 public:
   bool noWait;
   queue<Command*> commands;
@@ -51,7 +58,7 @@ public:
   const Option* option;
 
   DownloadEngine();
-  ~DownloadEngine();
+  virtual ~DownloadEngine();
 
   void run();
 

+ 1 - 0
src/Makefile.am

@@ -22,6 +22,7 @@ SRCS =  Socket.cc Socket.h\
 	FtpTunnelResponseCommand.cc FtpTunnelResponseCommand.h\
 	SleepCommand.cc SleepCommand.h\
 	DownloadEngine.cc DownloadEngine.h\
+	ConsoleDownloadEngine.cc ConsoleDownloadEngine.h\
 	Segment.h\
 	SegmentMan.cc SegmentMan.h\
 	SegmentSplitter.cc SegmentSplitter.h\

+ 17 - 0
src/Makefile.in

@@ -71,6 +71,7 @@ am__objects_1 = libaria2c_a-Socket.$(OBJEXT) \
 	libaria2c_a-FtpTunnelResponseCommand.$(OBJEXT) \
 	libaria2c_a-SleepCommand.$(OBJEXT) \
 	libaria2c_a-DownloadEngine.$(OBJEXT) \
+	libaria2c_a-ConsoleDownloadEngine.$(OBJEXT) \
 	libaria2c_a-SegmentMan.$(OBJEXT) \
 	libaria2c_a-SegmentSplitter.$(OBJEXT) \
 	libaria2c_a-SplitFirstSegmentSplitter.$(OBJEXT) \
@@ -212,6 +213,7 @@ SRCS = Socket.cc Socket.h\
 	FtpTunnelResponseCommand.cc FtpTunnelResponseCommand.h\
 	SleepCommand.cc SleepCommand.h\
 	DownloadEngine.cc DownloadEngine.h\
+	ConsoleDownloadEngine.cc ConsoleDownloadEngine.h\
 	Segment.h\
 	SegmentMan.cc SegmentMan.h\
 	SegmentSplitter.cc SegmentSplitter.h\
@@ -320,6 +322,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libaria2c_a-AbstractDiskWriter.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libaria2c_a-Base64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libaria2c_a-ChunkedEncoding.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libaria2c_a-ConsoleDownloadEngine.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libaria2c_a-CookieBox.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libaria2c_a-DefaultDiskWriter.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libaria2c_a-DownloadCommand.Po@am__quote@
@@ -660,6 +663,20 @@ libaria2c_a-DownloadEngine.obj: DownloadEngine.cc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libaria2c_a_CXXFLAGS) $(CXXFLAGS) -c -o libaria2c_a-DownloadEngine.obj `if test -f 'DownloadEngine.cc'; then $(CYGPATH_W) 'DownloadEngine.cc'; else $(CYGPATH_W) '$(srcdir)/DownloadEngine.cc'; fi`
 
+libaria2c_a-ConsoleDownloadEngine.o: ConsoleDownloadEngine.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libaria2c_a_CXXFLAGS) $(CXXFLAGS) -MT libaria2c_a-ConsoleDownloadEngine.o -MD -MP -MF "$(DEPDIR)/libaria2c_a-ConsoleDownloadEngine.Tpo" -c -o libaria2c_a-ConsoleDownloadEngine.o `test -f 'ConsoleDownloadEngine.cc' || echo '$(srcdir)/'`ConsoleDownloadEngine.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libaria2c_a-ConsoleDownloadEngine.Tpo" "$(DEPDIR)/libaria2c_a-ConsoleDownloadEngine.Po"; else rm -f "$(DEPDIR)/libaria2c_a-ConsoleDownloadEngine.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ConsoleDownloadEngine.cc' object='libaria2c_a-ConsoleDownloadEngine.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libaria2c_a_CXXFLAGS) $(CXXFLAGS) -c -o libaria2c_a-ConsoleDownloadEngine.o `test -f 'ConsoleDownloadEngine.cc' || echo '$(srcdir)/'`ConsoleDownloadEngine.cc
+
+libaria2c_a-ConsoleDownloadEngine.obj: ConsoleDownloadEngine.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libaria2c_a_CXXFLAGS) $(CXXFLAGS) -MT libaria2c_a-ConsoleDownloadEngine.obj -MD -MP -MF "$(DEPDIR)/libaria2c_a-ConsoleDownloadEngine.Tpo" -c -o libaria2c_a-ConsoleDownloadEngine.obj `if test -f 'ConsoleDownloadEngine.cc'; then $(CYGPATH_W) 'ConsoleDownloadEngine.cc'; else $(CYGPATH_W) '$(srcdir)/ConsoleDownloadEngine.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libaria2c_a-ConsoleDownloadEngine.Tpo" "$(DEPDIR)/libaria2c_a-ConsoleDownloadEngine.Po"; else rm -f "$(DEPDIR)/libaria2c_a-ConsoleDownloadEngine.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='ConsoleDownloadEngine.cc' object='libaria2c_a-ConsoleDownloadEngine.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libaria2c_a_CXXFLAGS) $(CXXFLAGS) -c -o libaria2c_a-ConsoleDownloadEngine.obj `if test -f 'ConsoleDownloadEngine.cc'; then $(CYGPATH_W) 'ConsoleDownloadEngine.cc'; else $(CYGPATH_W) '$(srcdir)/ConsoleDownloadEngine.cc'; fi`
+
 libaria2c_a-SegmentMan.o: SegmentMan.cc
 @am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libaria2c_a_CXXFLAGS) $(CXXFLAGS) -MT libaria2c_a-SegmentMan.o -MD -MP -MF "$(DEPDIR)/libaria2c_a-SegmentMan.Tpo" -c -o libaria2c_a-SegmentMan.o `test -f 'SegmentMan.cc' || echo '$(srcdir)/'`SegmentMan.cc; \
 @am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libaria2c_a-SegmentMan.Tpo" "$(DEPDIR)/libaria2c_a-SegmentMan.Po"; else rm -f "$(DEPDIR)/libaria2c_a-SegmentMan.Tpo"; exit 1; fi

+ 8 - 2
src/main.cc

@@ -20,7 +20,7 @@
  */
 /* copyright --> */
 #include "HttpInitiateConnectionCommand.h"
-#include "DownloadEngine.h"
+#include "ConsoleDownloadEngine.h"
 #include "SegmentMan.h"
 #include "SplitSlowestSegmentSplitter.h"
 #include "SimpleLogger.h"
@@ -411,7 +411,7 @@ int main(int argc, char* argv[]) {
   SegmentSplitter* splitter = new SplitSlowestSegmentSplitter();
   splitter->setMinSegmentSize(op->getAsLLInt(PREF_MIN_SEGMENT_SIZE));
   splitter->logger = logger;
-  e = new DownloadEngine();
+  e = new ConsoleDownloadEngine();
   e->logger = logger;
   e->option = op;
   e->diskWriter = new DefaultDiskWriter();
@@ -434,6 +434,12 @@ int main(int argc, char* argv[]) {
   sigaction(SIGINT, &sigact, NULL);
 
   e->run();
+
+  if(e->segmentMan->finished()) {
+    cout << "\nThe download was complete. <" << e->segmentMan->getFilePath() << ">" << endl;
+  } else {
+    cout << "\nThe download was not complete because of errors. Check the log." << endl;
+  }
   
   for_each(requests.begin(), requests.end(), clearRequest);
   requests.clear();