diff options
Diffstat (limited to 'lib/CopyJob.cc')
-rw-r--r-- | lib/CopyJob.cc | 168 |
1 files changed, 84 insertions, 84 deletions
diff --git a/lib/CopyJob.cc b/lib/CopyJob.cc index fc2a0ca..29c662d 100644 --- a/lib/CopyJob.cc +++ b/lib/CopyJob.cc @@ -1,84 +1,84 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#include "CopyJob.h" -#include "gettext.h" - -CopyJob::CopyJob(Handle * as, Handle * ad, ssize_t asiz, bool ads, bool add, int ashape) : s(as), d(ad), ds(ads), dd(add), siz(asiz), cursiz(0), r(0), w(0), tw(0), shape(ashape) { - struct timezone tz; - - s->SetNonBlock(); - d->SetNonBlock(); - WaitFor(s, W4_READING); - - if (shape > 0) { - gettimeofday(&start, &tz); - } -} - -CopyJob::~CopyJob() { - if (ds) { - delete s; - } - - if (dd) { - delete d; - } -} - -int CopyJob::Do() throw (GeneralException) { - int tr; - struct timeval now; - struct timezone tz; - - if (shape > 0) { - gettimeofday(&now, &tz); - } - - switch (current) { - case 0: - tr = siz >= 0 ? siz - cursiz : COPY_BUFSIZ; - try { - r = s->read(buffer, MIN(COPY_BUFSIZ, tr)); -// cerr << "CopyJob: read " << r << " bytes." << endl; - } - catch (IOAgain e) { - WaitFor(s, W4_READING); - Suspend(TASK_ON_HOLD); - } - if (!r) { - return TASK_DONE; - } - tw = 0; - case 1: - current = 1; - try { - w = d->write(buffer + tw, r - tw); - } - catch (IOAgain e) { - WaitFor(d, W4_WRITING); - Suspend(TASK_ON_HOLD); - } -// cerr << "CopyJob: wrote " << w << " bytes." << endl; - tw += w; - if (r != tw) { -// cerr << "CopyJob: We did expect to write a total of " << r << " bytes and we achieved " << tw << " bytes so far.\n"; - WaitFor(d, W4_WRITING); - Suspend(TASK_ON_HOLD); - } - current = 0; - } - cursiz += r; - - if (!s->IsClosed() && (siz != cursiz)) { - WaitFor(s, W4_READING); - Suspend(TASK_ON_HOLD); - } - - return TASK_DONE; -} - -String CopyJob::GetName() { - return (String(_("CopyJob from ")) + s->GetName() + _(" to ") + d->GetName()); -} - +#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "CopyJob.h"
+#include "gettext.h"
+
+CopyJob::CopyJob(Handle * as, Handle * ad, ssize_t asiz, bool ads, bool add, int ashape) : s(as), d(ad), ds(ads), dd(add), siz(asiz), cursiz(0), r(0), w(0), tw(0), shape(ashape) {
+ struct timezone tz;
+
+ s->SetNonBlock();
+ d->SetNonBlock();
+ WaitFor(s, W4_READING);
+
+ if (shape > 0) {
+ gettimeofday(&start, &tz);
+ }
+}
+
+CopyJob::~CopyJob() {
+ if (ds) {
+ delete s;
+ }
+
+ if (dd) {
+ delete d;
+ }
+}
+
+int CopyJob::Do() throw (GeneralException) {
+ int tr;
+ struct timeval now;
+ struct timezone tz;
+
+ if (shape > 0) {
+ gettimeofday(&now, &tz);
+ }
+
+ switch (current) {
+ case 0:
+ tr = siz >= 0 ? siz - cursiz : COPY_BUFSIZ;
+ try {
+ r = s->read(buffer, MIN(COPY_BUFSIZ, tr));
+// cerr << "CopyJob: read " << r << " bytes." << endl;
+ }
+ catch (IOAgain e) {
+ WaitFor(s, W4_READING);
+ Suspend(TASK_ON_HOLD);
+ }
+ if (!r) {
+ return TASK_DONE;
+ }
+ tw = 0;
+ case 1:
+ current = 1;
+ try {
+ w = d->write(buffer + tw, r - tw);
+ }
+ catch (IOAgain e) {
+ WaitFor(d, W4_WRITING);
+ Suspend(TASK_ON_HOLD);
+ }
+// cerr << "CopyJob: wrote " << w << " bytes." << endl;
+ tw += w;
+ if (r != tw) {
+// cerr << "CopyJob: We did expect to write a total of " << r << " bytes and we achieved " << tw << " bytes so far.\n";
+ WaitFor(d, W4_WRITING);
+ Suspend(TASK_ON_HOLD);
+ }
+ current = 0;
+ }
+ cursiz += r;
+
+ if (!s->IsClosed() && (siz != cursiz)) {
+ WaitFor(s, W4_READING);
+ Suspend(TASK_ON_HOLD);
+ }
+
+ return TASK_DONE;
+}
+
+String CopyJob::GetName() {
+ return (String(_("CopyJob from ")) + s->GetName() + _(" to ") + d->GetName());
+}
+
|