New files

pull/1/head
Tatsuhiro Tsujikawa 2007-05-20 13:57:56 +00:00
parent eaf2d53a91
commit 079d2844ec
29 changed files with 2466 additions and 0 deletions

View File

@ -0,0 +1,51 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_ABSTRACT_SEGMENT_MAN_FACTORY_H_
#define _D_ABSTRACT_SEGMENT_MAN_FACTORY_H_
#include "SegmentManFactory.h"
class AbstractSegmentManFactory : public SegmentManFactory {
protected:
const Option* _option;
public:
AbstractSegmentManFactory(const Option* option):_option(option) {}
virtual ~AbstractSegmentManFactory() {}
};
typedef SharedHandle<AbstractSegmentManFactory> AbstractSegmentManFactoryHandle;
#endif // _D_ABSTRACT_SEGMENT_MAN_FACTORY_H_

59
src/CUIDCounter.h Normal file
View File

@ -0,0 +1,59 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_CUID_COUNTER_H_
#define _D_CUID_COUNTER_H_
#include "common.h"
typedef int32_t CUID;
class CUIDCounter {
private:
int32_t count;
public:
CUIDCounter():count(0) {}
~CUIDCounter() {}
CUID newID()
{
return ++count;
}
};
typedef SharedHandle<CUIDCounter> CUIDCounterHandle;
typedef SingletonHolder<CUIDCounterHandle> CUIDCounterSingletonHolder;
#endif // _D_CUID_COUNTER_H_

View File

@ -0,0 +1,90 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "CheckIntegrityCommand.h"
#include "FileAllocationEntry.h"
#include "InitiateConnectionCommandFactory.h"
#include "DlAbortEx.h"
#include "message.h"
void CheckIntegrityCommand::initValidator()
{
_validator = new IteratableChunkChecksumValidator();
_validator->setChunkChecksum(_requestGroup->getChunkChecksum());
_validator->setDiskWriter(_requestGroup->getSegmentMan()->diskWriter);
_validator->setBitfield(_requestGroup->getSegmentMan()->getBitfield());
if(!_validator->canValidate()) {
// insufficient checksums.
throw new DlAbortEx("Insufficient checksums.");
}
_validator->init();
}
bool CheckIntegrityCommand::execute()
{
setStatusRealtime();
_e->noWait = true;
try {
_validator->validateChunk();
if(_validator->finished()) {
if(_requestGroup->downloadFinished()) {
logger->notice(MSG_DOWNLOAD_ALREADY_COMPLETED, cuid, _requestGroup->getFilePath().c_str());
return true;
}
if(_requestGroup->needsFileAllocation()) {
_e->_fileAllocationMan->pushFileAllocationEntry(new FileAllocationEntry(cuid, _req, _requestGroup));
} else {
int32_t numCommandsToGenerate = 15;
Commands commands = _requestGroup->getNextCommand(_e, numCommandsToGenerate);
Command* command = InitiateConnectionCommandFactory::createInitiateConnectionCommand(cuid, _req, _requestGroup, _e);
commands.push_front(command);
_e->addCommand(commands);
}
return true;
} else {
_e->commands.push_back(this);
return false;
}
} catch(Exception* e) {
_requestGroup->getSegmentMan()->errors++;
logger->error("CUID#%d - Exception caught while validating file integrity.", e, cuid);
delete e;
logger->error(MSG_DOWNLOAD_NOT_COMPLETE, cuid, _requestGroup->getFilePath().c_str());
// TODO this is wrong. There may exist invalid chunk data before catching
// exception. Fix this.
_requestGroup->markPieceDone(_validator->getCurrentOffset());
return true;
}
}

View File

@ -0,0 +1,71 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_CHECK_INTEGRITY_COMMAND_H_
#define _D_CHECK_INTEGRITY_COMMAND_H_
#include "Command.h"
#include "Request.h"
#include "RequestGroup.h"
#include "DownloadEngine.h"
#include "IteratableChunkChecksumValidator.h"
class CheckIntegrityCommand : public Command {
private:
RequestHandle _req;
RequestGroup* _requestGroup;
DownloadEngine* _e;
IteratableChunkChecksumValidatorHandle _validator;
public:
CheckIntegrityCommand(int cuid, const RequestHandle& req, RequestGroup* requestGroup, DownloadEngine* e):
Command(cuid),
_req(req),
_requestGroup(requestGroup),
_e(e),
_validator(0)
{
++_requestGroup->numConnection;
}
virtual ~CheckIntegrityCommand()
{
--_requestGroup->numConnection;
}
void initValidator();
virtual bool execute();
};
#endif // _D_CHECK_INTEGRITY_COMMAND_H_

96
src/ChunkChecksum.h Normal file
View File

@ -0,0 +1,96 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_CHUNK_CHECKSUM_H_
#define _D_CHUNK_CHECKSUM_H_
#include "common.h"
#include "messageDigest.h"
class ChunkChecksum {
private:
MessageDigestContext::DigestAlgo _algo;
Strings _checksums;
int32_t _checksumLength;
public:
ChunkChecksum(const MessageDigestContext::DigestAlgo& algo,
const Strings& checksums,
int32_t checksumLength):
_algo(algo),
_checksums(checksums),
_checksumLength(checksumLength) {}
bool validateChunk(const string& actualChecksum,
int32_t checksumIndex) const
{
if(checksumIndex < (int32_t)_checksums.size()) {
return actualChecksum == getChecksum(checksumIndex);
} else {
return false;
}
}
int64_t getEstimatedDataLength() const
{
return ((int64_t)_checksumLength)*_checksums.size();
}
int32_t countChecksum() const
{
return _checksums.size();
}
string getChecksum(int32_t index) const
{
if(index < (int32_t)_checksums.size()) {
return _checksums[index];
} else {
return "";
}
}
int32_t getChecksumLength() const
{
return _checksumLength;
}
MessageDigestContext::DigestAlgo getAlgo() const
{
return _algo;
}
};
typedef SharedHandle<ChunkChecksum> ChunkChecksumHandle;
#endif // _D_CHUNK_CHECKSUM_H_

View File

@ -0,0 +1,48 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "DefaultSegmentManFactory.h"
#include "prefs.h"
#include "DefaultDiskWriter.h"
SegmentManHandle DefaultSegmentManFactory::createNewInstance()
{
SegmentManHandle segmentMan = new SegmentMan();
segmentMan->diskWriter = new DefaultDiskWriter();
segmentMan->dir = _option->get(PREF_DIR);
// TODO disable this in multi-simultaneous download mode.
segmentMan->ufilename = _option->get(PREF_OUT);
segmentMan->option = _option;
return segmentMan;
}

View File

@ -0,0 +1,51 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_DEFAULT_SEGMENT_MAN_FACTORY_H_
#define _D_DEFAULT_SEGMENT_MAN_FACTORY_H_
#include "AbstractSegmentManFactory.h"
class DefaultSegmentManFactory : public AbstractSegmentManFactory {
public:
DefaultSegmentManFactory(const Option* option):AbstractSegmentManFactory(option) {}
virtual ~DefaultSegmentManFactory() {}
virtual SegmentManHandle createNewInstance();
};
typedef SharedHandle<DefaultSegmentManFactory> DefaultSegmentManFactoryHandle;
#endif // _D_DEFAULT_SEGMENT_MAN_FACTORY_H_

View File

@ -0,0 +1,73 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "FileAllocationCommand.h"
#include "InitiateConnectionCommandFactory.h"
#include "message.h"
bool FileAllocationCommand::execute()
{
setStatusRealtime();
_e->noWait = true;
try {
_fileAllocationEntry->allocateChunk();
if(_fileAllocationEntry->allocationFinished()) {
int64_t totalLength = _requestGroup->getSegmentMan()->totalSize;
logger->debug("%d seconds to allocate %lld byte(s)",
_timer.difference(), totalLength);
_e->_fileAllocationMan->markCurrentFileAllocationEntryDone();
int32_t numCommandsToGenerate = 15;
Commands commands = _requestGroup->getNextCommand(_e, numCommandsToGenerate);
Command* command = InitiateConnectionCommandFactory::createInitiateConnectionCommand(cuid, _req, _requestGroup, _e);
commands.push_front(command);
_e->addCommand(commands);
return true;
} else {
_e->commands.push_back(this);
return false;
}
} catch(Exception* e) {
_requestGroup->getSegmentMan()->errors++;
logger->error("CUID#%d - Exception caught while allocating file space.", e, cuid);
delete e;
logger->notice(MSG_DOWNLOAD_NOT_COMPLETE, cuid, _requestGroup->getFilePath().c_str());
return true;
}
}

View File

@ -0,0 +1,63 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_FILE_ALLOCATION_COMMAND_H_
#define _D_FILE_ALLOCATION_COMMAND_H_
#include "Command.h"
#include "Request.h"
#include "RequestGroup.h"
#include "DownloadEngine.h"
#include "TimeA2.h"
#include "FileAllocationEntry.h"
class FileAllocationCommand : public Command {
private:
RequestHandle _req;
RequestGroup* _requestGroup;
DownloadEngine* _e;
FileAllocationEntryHandle _fileAllocationEntry;
Time _timer;
public:
FileAllocationCommand(int cuid, const RequestHandle& req, RequestGroup* requestGroup, DownloadEngine* e, const FileAllocationEntryHandle& fileAllocationEntry):
Command(cuid),
_req(req),
_requestGroup(requestGroup),
_e(e),
_fileAllocationEntry(fileAllocationEntry) {}
virtual bool execute();
};
#endif // _D_FILE_ALLOCATION_COMMAND_H_

View File

@ -0,0 +1,62 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "FileAllocationDispatcherCommand.h"
#include "FileAllocationCommand.h"
bool FileAllocationDispatcherCommand::execute()
{
if(_e->_requestGroupMan->downloadFinished()) {
return true;
}
if(!_e->_fileAllocationMan->isFileAllocationBeingExecuted() &&
_e->_fileAllocationMan->nextFileAllocationEntryExists()) {
FileAllocationEntryHandle entry = _e->_fileAllocationMan->popNextFileAllocationEntry();
logger->info("Dispatching FileAllocationCommand for CUID#%d.",
entry->getCUID());
FileAllocationCommand* command =
new FileAllocationCommand(entry->getCUID(),
entry->getCurrentRequest(),
entry->getRequestGroup(),
_e,
_e->_fileAllocationMan->getCurrentFileAllocationEntry());
_e->commands.push_back(command);
_e->noWait = true;
}
_e->commands.push_back(this);
return false;
}

View File

@ -0,0 +1,54 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_FILE_ALLOCATION_DISPATCHER_COMMAND_H_
#define _D_FILE_ALLOCATION_DISPATCHER_COMMAND_H_
#include "Command.h"
#include "DownloadEngine.h"
class FileAllocationDispatcherCommand : public Command {
private:
DownloadEngine* _e;
public:
FileAllocationDispatcherCommand(int cuid, DownloadEngine* e):
Command(cuid), _e(e)
{
setStatusRealtime();
}
virtual bool execute();
};
#endif // _D_FILE_ALLOCATION_DISPATCHER_COMMAND_H_

View File

@ -0,0 +1,54 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "FileAllocationEntry.h"
#define BUFSIZE 16*1024
void FileAllocationEntry::allocateChunk()
{
int32_t bufSize = BUFSIZE;
char buf[BUFSIZE];
memset(buf, 0, bufSize);
_requestGroup->getSegmentMan()->diskWriter->writeData(buf, bufSize, _offset);
_offset += bufSize;
int64_t totalLength = _requestGroup->getSegmentMan()->totalSize;
if(totalLength < _offset) {
_requestGroup->getSegmentMan()->diskWriter->truncate(totalLength);
_offset = totalLength;
}
}

102
src/FileAllocationEntry.h Normal file
View File

@ -0,0 +1,102 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_FILE_ALLOCATION_ENTRY_H_
#define _D_FILE_ALLOCATION_ENTRY_H_
#include "common.h"
#include "Request.h"
#include "RequestGroup.h"
class FileAllocationEntry {
private:
int _cuid;
RequestHandle _currentRequest;
RequestGroup* _requestGroup;
int64_t _offset;
public:
FileAllocationEntry(int cuid,
const RequestHandle& currentRequest,
RequestGroup* requestGroup,
int64_t offset = 0):
_cuid(cuid),
_currentRequest(currentRequest),
_requestGroup(requestGroup),
_offset(offset)
{
++_requestGroup->numConnection;
}
~FileAllocationEntry()
{
--_requestGroup->numConnection;
}
int getCUID() const
{
return _cuid;
}
RequestHandle getCurrentRequest() const
{
return _currentRequest;
}
RequestGroup* getRequestGroup() const
{
return _requestGroup;
}
void setOffset(int64_t offset)
{
_offset = offset;
}
int64_t getOffset() const
{
return _offset;
}
void allocateChunk();
bool allocationFinished() const
{
return _requestGroup->getSegmentMan()->totalSize <= _offset;
}
};
typedef SharedHandle<FileAllocationEntry> FileAllocationEntryHandle;
typedef deque<FileAllocationEntryHandle> FileAllocationEntries;
#endif // _D_FILE_ALLOCATION_ENTRY_H_

89
src/FileAllocationMan.h Normal file
View File

@ -0,0 +1,89 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_FILE_ALLOCATION_MAN_H_
#define _D_FILE_ALLOCATION_MAN_H_
#include "common.h"
#include "Request.h"
#include "RequestGroup.h"
#include "FileAllocationEntry.h"
class FileAllocationMan {
private:
FileAllocationEntries _fileAllocationEntries;
FileAllocationEntryHandle _currentFileAllocationEntry;
public:
FileAllocationMan():_currentFileAllocationEntry(0) {}
bool isFileAllocationBeingExecuted() const
{
return _currentFileAllocationEntry.get() != 0;
}
FileAllocationEntryHandle getCurrentFileAllocationEntry()
{
return _currentFileAllocationEntry;
}
void markCurrentFileAllocationEntryDone()
{
_currentFileAllocationEntry = 0;
}
bool nextFileAllocationEntryExists() const
{
return !_fileAllocationEntries.empty();
}
FileAllocationEntryHandle popNextFileAllocationEntry()
{
if(!nextFileAllocationEntryExists()) {
return 0;
}
FileAllocationEntryHandle entry = _fileAllocationEntries.front();
_fileAllocationEntries.pop_front();
_currentFileAllocationEntry = entry;
return entry;
}
void pushFileAllocationEntry(const FileAllocationEntryHandle& entry)
{
_fileAllocationEntries.push_back(entry);
}
};
typedef SharedHandle<FileAllocationMan> FileAllocationManHandle;
#endif // _D_FILE_ALLOCATION_MAN_H_

View File

@ -0,0 +1,45 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "FillRequestGroupCommand.h"
bool FillRequestGroupCommand::execute()
{
_e->_requestGroupMan->fillRequestGroupFromReserver(_e);
if(_e->_requestGroupMan->downloadFinished()) {
return true;
}
_e->commands.push_back(this);
return false;
}

View File

@ -0,0 +1,66 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_FILL_REQUEST_GROUP_COMMAND_H_
#define _D_FILL_REQUEST_GROUP_COMMAND_H_
#include "Command.h"
#include "TimeA2.h"
#include "RequestGroup.h"
#include "DownloadEngine.h"
class FillRequestGroupCommand : public Command {
private:
RequestGroups _reservedRequestGroups;
DownloadEngine* _e;
int32_t _interval;
Time _checkPoint;
public:
FillRequestGroupCommand(int cuid, DownloadEngine* e, int32_t interval):
Command(cuid),
_e(e),
_interval(interval)
{
setStatusRealtime();
}
virtual bool execute();
void setInterval(int32_t interval)
{
_interval = interval;
}
};
#endif // _D_FILL_REQUEST_GROUP_COMMAND_H_

View File

@ -0,0 +1,81 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "IteratableChunkChecksumValidator.h"
#include "Util.h"
#include "message.h"
void IteratableChunkChecksumValidator::validateChunk()
{
if(!finished()) {
string actualChecksum = calculateActualChecksum();
if(!_chunkChecksum->validateChunk(actualChecksum, _currentIndex)) {
int64_t offset = ((int64_t)_currentIndex)*_chunkChecksum->getChecksumLength();
// wrong checksum
logger->info(EX_INVALID_CHUNK_CHECKSUM,
_currentIndex,
offset,
_chunkChecksum->getChecksum(_currentIndex).c_str(),
actualChecksum.c_str());
int32_t startIndex;
int32_t endIndex;
Util::indexRange(startIndex, endIndex, offset,
_chunkChecksum->getChecksumLength(),
_bitfield->getBlockLength());
_bitfield->unsetBitRange(startIndex, endIndex);
}
_currentIndex++;
}
}
string IteratableChunkChecksumValidator::calculateActualChecksum()
{
int64_t offset = ((int64_t)_currentIndex)*_chunkChecksum->getChecksumLength();
int32_t length = _diskWriter->size() < offset+_chunkChecksum->getChecksumLength() ? _diskWriter->size()-offset : _chunkChecksum->getChecksumLength();
return _diskWriter->messageDigest(offset, length, _chunkChecksum->getAlgo());
}
bool IteratableChunkChecksumValidator::canValidate() const
{
// We assume file is already opened using DiskWriter::open or openExistingFile.
return _chunkChecksum->getEstimatedDataLength() >= _diskWriter->size();
}
void IteratableChunkChecksumValidator::init()
{
_bitfield->setAllBit();
_currentIndex = 0;
}

View File

@ -0,0 +1,91 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_ITERATABLE_CHUNK_CHECKSUM_VALIDATOR_H_
#define _D_ITERATABLE_CHUNK_CHECKSUM_VALIDATOR_H_
#include "common.h"
#include "BitfieldMan.h"
#include "ChunkChecksum.h"
#include "DiskWriter.h"
#include "LogFactory.h"
class IteratableChunkChecksumValidator
{
private:
DiskWriterHandle _diskWriter;
BitfieldMan* _bitfield;
int32_t _currentIndex;
ChunkChecksumHandle _chunkChecksum;
const Logger* logger;
string calculateActualChecksum();
public:
IteratableChunkChecksumValidator():_diskWriter(0), _bitfield(0), _currentIndex(0), _chunkChecksum(0), logger(LogFactory::getInstance()) {}
bool canValidate() const;
void init();
void validateChunk();
bool finished() const
{
return _currentIndex >= _chunkChecksum->countChecksum();
}
void setDiskWriter(const DiskWriterHandle& diskWriter)
{
_diskWriter = diskWriter;
}
void setBitfield(BitfieldMan* bitfield)
{
_bitfield = bitfield;
}
void setChunkChecksum(const ChunkChecksumHandle& chunkChecksum)
{
_chunkChecksum = chunkChecksum;
}
int64_t getCurrentOffset() const
{
return ((int64_t)_currentIndex)*_chunkChecksum->getChecksumLength();
}
};
typedef SharedHandle<IteratableChunkChecksumValidator> IteratableChunkChecksumValidatorHandle;
#endif // _D_ITERATABLE_CHUNK_CHECKSUM_VALIDATOR_H_

119
src/MultiUrlRequestInfo.cc Normal file
View File

@ -0,0 +1,119 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "MultiUrlRequestInfo.h"
#include "prefs.h"
#include "DownloadEngineFactory.h"
#include "RecoverableException.h"
#include "message.h"
#include "DNSCache.h"
#include "TorrentRequestInfo.h"
#include "MetalinkRequestInfo.h"
extern volatile sig_atomic_t haltRequested;
RequestInfoHandle MultiUrlRequestInfo::createNextRequestInfo(const string& filename) const
{
#ifdef ENABLE_BITTORRENT
if(op->getAsBool(PREF_FOLLOW_TORRENT) &&
Util::endsWith(fileInfo.filename, ".torrent")) {
return new TorrentRequestInfo(filename, op);
} else
#endif // ENABLE_BITTORRENT
#ifdef ENABLE_METALINK
if(op->getAsBool(PREF_FOLLOW_METALINK) &&
Util::endsWith(fileInfo.filename, ".metalink")) {
return new MetalinkRequestInfo(filename, op);
} else
#endif // ENABLE_METALINK
{
return 0;
}
}
static void handler(int signal) {
haltRequested = true;
}
RequestInfos MultiUrlRequestInfo::execute() {
{
DNSCacheHandle dnsCache = new SimpleDNSCache();
DNSCacheSingletonHolder::instance(dnsCache);
}
RequestInfos nextReqInfos;
try {
SharedHandle<ConsoleDownloadEngine> e(DownloadEngineFactory::newConsoleEngine(op, _requestGroups));
e->fillCommand();
// The number of simultaneous download is specified by PREF_MAX_SIMULTANEOUS_DOWNLOADS.
// The remaining urls are queued into FillRequestGroupCommand.
// It observes the number of simultaneous downloads and if it is under
// the limit, it adds RequestGroup object from its queue to DownloadEngine.
// This is done every 1 second. At the same time, it removes finished/error
// RequestGroup from DownloadEngine.
Util::setGlobalSignalHandler(SIGINT, handler, 0);
Util::setGlobalSignalHandler(SIGTERM, handler, 0);
e->run();
for(RequestGroups::iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
if((*itr)->downloadFinished()) {
RequestInfoHandle reqInfo = createNextRequestInfo((*itr)->getFilePath());
if(!reqInfo.isNull()) {
nextReqInfos.push_back(reqInfo);
}
}
}
RequestGroupMan rgman(_requestGroups);
// TODO print summary of the download result
rgman.showDownloadResults(cout);
cout << flush;
// TODO Do we have to print a message when some of the downloads are failed?
if(!rgman.downloadFinished()) {
printDownloadAbortMessage();
}
} catch(RecoverableException *ex) {
logger->error("Exception caught", ex);
delete ex;
fail = true;
}
Util::setGlobalSignalHandler(SIGINT, SIG_DFL, 0);
Util::setGlobalSignalHandler(SIGTERM, SIG_DFL, 0);
return nextReqInfos;
}

61
src/MultiUrlRequestInfo.h Normal file
View File

@ -0,0 +1,61 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_MULTI_URL_REQUEST_INFO_H_
#define _D_MULTI_URL_REQUEST_INFO_H_
#include "RequestInfo.h"
class MultiUrlRequestInfo : public RequestInfo {
private:
RequestGroups _requestGroups;
RequestInfoHandle createNextRequestInfo(const string& filename) const;
public:
MultiUrlRequestInfo(const RequestGroups& requestGroups, Option* op):
RequestInfo(op),
_requestGroups(requestGroups) {}
MultiUrlRequestInfo(const Strings& uris, Option* op):RequestInfo(op)
{
_requestGroups.push_back(new RequestGroup(uris, op));
}
virtual ~MultiUrlRequestInfo() {}
virtual RequestInfos execute();
};
typedef SharedHandle<MultiUrlRequestInfo> MultiUrlRequestInfoHandle;
#endif // _D_MULTI_URL_REQUEST_INFO_H_

258
src/RequestGroup.cc Normal file
View File

@ -0,0 +1,258 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "RequestGroup.h"
#include "DownloadEngine.h"
#include "prefs.h"
#include "DefaultDiskWriter.h"
#include "RequestFactory.h"
#include "InitiateConnectionCommandFactory.h"
#include "CUIDCounter.h"
#include "DlAbortEx.h"
#include "File.h"
#include "message.h"
#include "DlAbortEx.h"
#include "Util.h"
#include "CheckIntegrityCommand.h"
#include "FatalException.h"
SegmentManHandle RequestGroup::initSegmentMan()
{
_segmentMan = _segmentManFactory->createNewInstance();
/*
_segmentMan = new SegmentMan();
_segmentMan->diskWriter = new DefaultDiskWriter();// DefaultDiskWriter::createNewDiskWriter(_option);
_segmentMan->dir = _option->get(PREF_DIR);
// TODO disable this in multi-simultaneous download mode.
_segmentMan->ufilename = _option->get(PREF_OUT);
_segmentMan->option = _option;
*/
return _segmentMan;
}
Commands RequestGroup::getNextCommand(DownloadEngine* e, int32_t maxNum, const string& method)
{
Commands commands;
for(;!_uris.empty() && commands.size() < (size_t)maxNum; _uris.pop_front()) {
string uri = _uris.front();
_spentUris.push_back(uri);
RequestHandle req = RequestFactorySingletonHolder::instance()->createRequest();
req->setReferer(_option->get(PREF_REFERER));
req->setMethod(method);
if(req->setUrl(uri)) {
commands.push_back(InitiateConnectionCommandFactory::createInitiateConnectionCommand(CUIDCounterSingletonHolder::instance()->newID(), req, this, e));
} else {
logger->info(_("Unrecognized URL or unsupported protocol: %s\n"),
req->getUrl().c_str());
}
}
return commands;
}
void RequestGroup::initBitfield()
{
_segmentMan->initBitfield(_option->getAsInt(PREF_SEGMENT_SIZE),
_segmentMan->totalSize);
}
void RequestGroup::openExistingFile()
{
_segmentMan->diskWriter->openExistingFile(_segmentMan->getFilePath());
}
void RequestGroup::markAllPiecesDone()
{
_segmentMan->markAllPiecesDone();
}
void RequestGroup::markExistingPiecesDone()
{
_segmentMan->markPieceDone(File(_segmentMan->getFilePath()).size());
}
void RequestGroup::markPieceDone(int64_t length)
{
_segmentMan->markPieceDone(length);
}
void RequestGroup::shouldCancelDownloadForSafety()
{
if(_segmentMan->shouldCancelDownloadForSafety()) {
logger->notice(MSG_FILE_ALREADY_EXISTS,
_segmentMan->getFilePath().c_str(),
_segmentMan->getSegmentFilePath().c_str());
throw new FatalException(EX_FILE_ALREADY_EXISTS,
_segmentMan->getFilePath().c_str(),
_segmentMan->getSegmentFilePath().c_str());
}
}
void RequestGroup::initAndOpenFile()
{
_segmentMan->diskWriter->initAndOpenFile(_segmentMan->getFilePath());
}
bool RequestGroup::needsFileAllocation() const
{
return _option->get(PREF_FILE_ALLOCATION) == V_PREALLOC
&& File(_segmentMan->getFilePath()).size() < _segmentMan->totalSize;
}
bool RequestGroup::fileExists() const
{
return _segmentMan->fileExists();
}
bool RequestGroup::segmentFileExists() const
{
return _segmentMan->segmentFileExists();
}
string RequestGroup::getFilePath() const
{
if(_segmentMan.isNull()) {
return "";
} else {
return _segmentMan->getFilePath();
}
}
void RequestGroup::loadAndOpenFile()
{
bool segFileExists = segmentFileExists();
if(segFileExists) {
load();
openExistingFile();
} else if(fileExists() && _option->get(PREF_CONTINUE) == V_TRUE) {
File existingFile(getFilePath());
if(getTotalLength() < existingFile.size()) {
throw new DlAbortEx("Invalid file length. Cannot continue download %s: local %s, remote %s",
getFilePath().c_str(),
Util::llitos(existingFile.size()).c_str(),
Util::llitos(getTotalLength()).c_str());
}
initBitfield();
openExistingFile();
} else {
shouldCancelDownloadForSafety();
initBitfield();
if(fileExists() && _option->get(PREF_CHECK_INTEGRITY) == V_TRUE) {
openExistingFile();
} else {
initAndOpenFile();
}
}
}
bool RequestGroup::downloadFinishedByFileLength()
{
if(_segmentMan->segmentFileExists()) {
return false;
}
File existingFile(getFilePath());
if(existingFile.exists() &&
getTotalLength() == existingFile.size()) {
_segmentMan->downloadStarted = true;
initBitfield();
_segmentMan->markAllPiecesDone();
return true;
} else {
return false;
}
}
void RequestGroup::prepareForNextAction(int cuid, const RequestHandle& req, DownloadEngine* e)
{
File existingFile(getFilePath());
if(existingFile.size() > 0 && _option->get(PREF_CHECK_INTEGRITY) == V_TRUE) {
CheckIntegrityCommand* command = new CheckIntegrityCommand(cuid, req, this, e);
command->initValidator();
e->commands.push_back(command);
} else if(needsFileAllocation()) {
e->_fileAllocationMan->pushFileAllocationEntry(new FileAllocationEntry(cuid, req, this));
} else {
int32_t numCommandsToGenerate = 15;
Commands commands = getNextCommand(e, numCommandsToGenerate);
Command* command = InitiateConnectionCommandFactory::createInitiateConnectionCommand(cuid, req, this, e);
commands.push_front(command);
e->addCommand(commands);
}
}
void RequestGroup::validateFilename(const string& expectedFilename,
const string& actualFilename) const
{
if(expectedFilename.empty()) {
return;
}
if(expectedFilename != actualFilename) {
throw new DlAbortEx(EX_FILENAME_MISMATCH,
expectedFilename.c_str(),
actualFilename.c_str());
}
}
void RequestGroup::validateTotalLength(int64_t expectedTotalLength,
int64_t actualTotalLength) const
{
if(expectedTotalLength <= 0) {
return;
}
if(expectedTotalLength != actualTotalLength) {
throw new DlAbortEx(EX_SIZE_MISMATCH,
expectedTotalLength,
actualTotalLength);
}
}
void RequestGroup::validateFilename(const string& actualFilename) const
{
validateFilename(_segmentMan->filename, actualFilename);
}
void RequestGroup::validateTotalLength(int64_t actualTotalLength) const
{
validateTotalLength(_segmentMan->totalSize, actualTotalLength);
}
void RequestGroup::validateFilenameByHint(const string& actualFilename) const
{
validateFilename(_hintFilename, actualFilename);
}
void RequestGroup::validateTotalLengthByHint(int64_t actualTotalLength) const
{
validateTotalLength(_hintTotalLength, actualTotalLength);
}

245
src/RequestGroup.h Normal file
View File

@ -0,0 +1,245 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_REQUEST_GROUP_H_
#define _D_REQUEST_GROUP_H_
#include "common.h"
#include "SegmentMan.h"
#include "LogFactory.h"
#include "Command.h"
#include "ChunkChecksum.h"
#include "Checksum.h"
#include "SegmentManFactory.h"
#include "DefaultSegmentManFactory.h"
class DownloadEngine;
class RequestGroup {
private:
int64_t _hintTotalLength;
string _hintFilename;
Strings _uris;
Strings _spentUris;
SegmentManHandle _segmentMan;
SegmentManFactoryHandle _segmentManFactory;
const Option* _option;
const Logger* logger;
ChunkChecksumHandle _chunkChecksum;
Checksum _checksum;
void validateFilename(const string& expectedFilename,
const string& actualFilename) const;
void validateTotalLength(int64_t expectedTotalLength,
int64_t actualTotalLength) const;
public:
int32_t numConnection;
bool isTorrent;
RequestGroup(const Strings& uris, const Option* option):
_uris(uris), _segmentMan(0), _segmentManFactory(new DefaultSegmentManFactory(option)), _option(option), logger(LogFactory::getInstance()), _chunkChecksum(0), numConnection(0), isTorrent(false) {}
RequestGroup(const string& uri, const Option* option):
_segmentMan(0), _segmentManFactory(new DefaultSegmentManFactory(option)), _option(option), logger(LogFactory::getInstance()), _chunkChecksum(0), numConnection(0), isTorrent(false)
{
_uris.push_back(uri);
}
/**
* Reinitializes SegmentMan based on current property values and
* returns new one.
*/
SegmentManHandle initSegmentMan();
SegmentManHandle getSegmentMan() const
{
return _segmentMan;
}
Commands getNextCommand(DownloadEngine* e, int32_t maxNum, const string& method = "GET");
void addURI(const string& uri)
{
_uris.push_back(uri);
}
void setChunkChecksum(const ChunkChecksumHandle& chunkChecksum)
{
_chunkChecksum = chunkChecksum;
}
ChunkChecksumHandle getChunkChecksum() const
{
return _chunkChecksum;
}
void initBitfield();
void openExistingFile();
void markAllPiecesDone();
void markExistingPiecesDone();
void markPieceDone(int64_t length);
void shouldCancelDownloadForSafety();
void initAndOpenFile();
bool needsFileAllocation() const;
bool downloadFinished() const
{
if(_segmentMan.isNull()) {
return false;
} else {
return _segmentMan->finished();
}
}
void load()
{
_segmentMan->load();
}
void save()
{
_segmentMan->save();
}
void remove()
{
_segmentMan->remove();
}
void closeFile()
{
_segmentMan->diskWriter->closeFile();
}
bool fileExists() const;
bool segmentFileExists() const;
string getFilePath() const;
int64_t getTotalLength() const
{
return _segmentMan->totalSize;
}
int64_t getDownloadLength() const
{
return _segmentMan->getDownloadLength();
}
void loadAndOpenFile();
void prepareForNextAction(int cuid, const RequestHandle& req, DownloadEngine* e);
bool downloadFinishedByFileLength();
void setChecksum(const Checksum& checksum)
{
_checksum = checksum;
}
const string& getHintFilename() const
{
return _hintFilename;
}
void setHintFilename(const string& filename)
{
_hintFilename = filename;
}
int64_t getHintTotalLength() const
{
return _hintTotalLength;
}
void setHintTotalLength(int64_t totalLength)
{
_hintTotalLength = totalLength;
}
const Strings& getRemainingUris() const
{
return _uris;
}
const Strings& getSpentUris() const
{
return _spentUris;
}
Strings getUris() const
{
Strings temp(_spentUris.begin(), _spentUris.end());
temp.insert(temp.end(), _uris.begin(), _uris.end());
return temp;
}
/**
* Compares expected filename with specified actualFilename.
* The expected filename refers to SegmentMan::filename.
*/
void validateFilename(const string& actualFilename) const;
void validateTotalLength(int64_t actualTotalLength) const;
/**
* Compares expected filename with specified actualFilename.
* The expected filename refers to RequestGroup::hintFilename.
*/
void validateFilenameByHint(const string& actualFilename) const;
void validateTotalLengthByHint(int64_t actualTotalLength) const;
void setSegmentManFactory(const SegmentManFactoryHandle& segmentManFactory)
{
_segmentManFactory = segmentManFactory;
}
};
typedef SharedHandle<RequestGroup> RequestGroupHandle;
typedef deque<RequestGroupHandle> RequestGroups;
#endif // _D_REQUEST_GROUP_H_

120
src/RequestGroupMan.cc Normal file
View File

@ -0,0 +1,120 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "RequestGroupMan.h"
#include "DownloadEngine.h"
#include <iomanip>
void RequestGroupMan::removeStoppedGroup()
{
int32_t count = 0;
RequestGroups temp;
for(RequestGroups::iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
if((*itr)->numConnection > 0) {
temp.push_back(*itr);
} else {
(*itr)->closeFile();
if((*itr)->downloadFinished()) {
_logger->notice("Download complete: %s", (*itr)->getFilePath().c_str());
(*itr)->remove();
} else {
(*itr)->save();
}
++count;
}
}
_requestGroups = temp;
if(count > 0) {
_logger->debug("%d RequestGroup(s) deleted.", count);
}
}
void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
{
removeStoppedGroup();
int32_t count = 0;
for(int32_t num = _maxSimultaneousDownloads-_requestGroups.size();
num > 0 && _reservedGroups.size() > 0; --num) {
RequestGroupHandle groupToAdd = _reservedGroups.front();
_reservedGroups.pop_front();
_requestGroups.push_back(groupToAdd);
groupToAdd->initSegmentMan();
Commands commands = groupToAdd->getNextCommand(e, 1);
count += commands.size();
e->addCommand(commands);
}
if(count > 0) {
_logger->debug("%d RequestGroup(s) added.", count);
}
}
void RequestGroupMan::showDownloadResults(ostream& o) const
{
// Download Results:
// idx|stat|path/length
// ===+====+=======================================================================
o << "\n"
<<_("Download Results:") << "\n"
<< "idx|stat|path/URI" << "\n"
<< "===+====+======================================================================" << "\n";
int32_t count = 0;
for(RequestGroups::const_iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
o << setw(3) << ++count << "|";
if((*itr)->downloadFinished()) {
o << "OK ";
} else {
o << "ERR ";
}
o << "|";
if((*itr)->downloadFinished()) {
o << (*itr)->getFilePath();
} else {
Strings uris = (*itr)->getUris();
if(uris.empty()) {
o << "n/a";
} else {
o << uris.front();
if(uris.size() > 1) {
o << " (" << uris.size()-1 << "more)";
}
}
}
o << "\n";
}
}

164
src/RequestGroupMan.h Normal file
View File

@ -0,0 +1,164 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_REQUEST_GROUP_MAN_H_
#define _D_REQUEST_GROUP_MAN_H_
#include "common.h"
#include "RequestGroup.h"
#include "LogFactory.h"
class DownloadEngine;
class RequestGroupMan {
private:
RequestGroups _requestGroups;
RequestGroups _reservedGroups;
const Logger* _logger;
int32_t _maxSimultaneousDownloads;
public:
RequestGroupMan(const RequestGroups& requestGroups = RequestGroups(), int32_t maxSimultaneousDownloads = 1):
_requestGroups(requestGroups),
_logger(LogFactory::getInstance()),
_maxSimultaneousDownloads(maxSimultaneousDownloads) {}
bool downloadFinished()
{
for(RequestGroups::iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
if((*itr)->numConnection > 0 || !(*itr)->getSegmentMan()->finished()) {
return false;
}
}
return true;
}
void save()
{
for(RequestGroups::iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
if(!(*itr)->getSegmentMan()->finished()) {
(*itr)->getSegmentMan()->save();
}
}
}
void closeFile()
{
for(RequestGroups::iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
(*itr)->getSegmentMan()->diskWriter->closeFile();
}
}
int64_t getDownloadLength() const
{
int64_t downloadLength = 0;
for(RequestGroups::const_iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
downloadLength += (*itr)->getSegmentMan()->getDownloadLength();
}
return downloadLength;
}
int64_t getTotalLength() const
{
int64_t totalLength = 0;
for(RequestGroups::const_iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
totalLength += (*itr)->getSegmentMan()->totalSize;
}
return totalLength;
}
Commands getInitialCommands(DownloadEngine* e) const
{
Commands commands;
for(RequestGroups::const_iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
(*itr)->initSegmentMan();
commands.push_back((*itr)->getNextCommand(e, 1).front());
}
return commands;
}
void removeStoppedGroup();
void fillRequestGroupFromReserver(DownloadEngine* e);
void addRequestGroup(const RequestGroupHandle& group)
{
_requestGroups.push_back(group);
}
void addReservedGroup(const RequestGroups& groups)
{
_reservedGroups.insert(_reservedGroups.end(), groups.begin(), groups.end());
}
void addReservedGroup(const RequestGroupHandle& group)
{
_reservedGroups.push_back(group);
}
int32_t countRequestGroup() const
{
return _requestGroups.size();
}
RequestGroupHandle getRequestGroup(int32_t index) const
{
if(index < (int32_t)_requestGroups.size()) {
return _requestGroups[index];
} else {
return 0;
}
}
void showDownloadResults(ostream& o) const;
int32_t getErrors() const
{
int32_t errors = 0;
for(RequestGroups::const_iterator itr = _requestGroups.begin();
itr != _requestGroups.end(); ++itr) {
errors += (*itr)->getSegmentMan()->errors;
}
return errors;
}
};
typedef SharedHandle<RequestGroupMan> RequestGroupManHandle;
#endif // _D_REQUEST_GROUP_MAN_H_

50
src/SegmentManFactory.h Normal file
View File

@ -0,0 +1,50 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_SEGMENT_MAN_FACTORY_H_
#define _D_SEGMENT_MAN_FACTORY_H_
#include "common.h"
#include "SegmentMan.h"
class SegmentManFactory {
public:
virtual ~SegmentManFactory() {}
virtual SegmentManHandle createNewInstance() = 0;
};
typedef SharedHandle<SegmentManFactory> SegmentManFactoryHandle;
#endif // _D_SEGMENT_MAN_FACTORY_H_

View File

@ -0,0 +1,45 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "TrackerSegmentManFactory.h"
#include "ByteArrayDiskWriter.h"
SegmentManHandle TrackerSegmentManFactory::createNewInstance()
{
SegmentManHandle segmentMan = new SegmentMan();
segmentMan->diskWriter = new ByteArrayDiskWriter();
segmentMan->option = _option;
segmentMan->ufilename = "[tracker.announce]";
return segmentMan;
}

View File

@ -0,0 +1,51 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_TRACKER_SEGMENT_MAN_FACTORY_H_
#define _D_TRACKER_SEGMENT_MAN_FACTORY_H_
#include "AbstractSegmentManFactory.h"
class TrackerSegmentManFactory : public AbstractSegmentManFactory {
public:
TrackerSegmentManFactory(const Option* option):AbstractSegmentManFactory(option) {}
virtual ~TrackerSegmentManFactory() {}
virtual SegmentManHandle createNewInstance();
};
typedef SharedHandle<TrackerSegmentManFactory> TrackerSegmentManFactoryHandle;
#endif // _D_TRACKER_SEGMENT_MAN_FACTORY_H_

54
src/UriFileListParser.cc Normal file
View File

@ -0,0 +1,54 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include "UriFileListParser.h"
#include "Util.h"
bool UriFileListParser::hasNext() const
{
return _ifs;
}
Strings UriFileListParser::next()
{
string line;
while(getline(_ifs, line)) {
if(Util::trim(line) != "") {
Strings uris;
Util::slice(uris, line, '\t', true);
return uris;
}
}
return Strings();
}

53
src/UriFileListParser.h Normal file
View File

@ -0,0 +1,53 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_URI_FILE_LIST_PARSER_H_
#define _D_URI_FILE_LIST_PARSER_H_
#include "common.h"
#include <fstream>
class UriFileListParser {
private:
string _filename;
ifstream _ifs;
public:
UriFileListParser(const string& filename):_filename(filename), _ifs(filename.c_str()) {}
bool hasNext() const;
Strings next();
};
#endif // _D_URI_FILE_LIST_PARSER_H_