mirror of https://github.com/aria2/aria2
Rewritten ExpatMetalinkProcessor using BufferedFile.
parent
32d413c6de
commit
272d81b7a1
|
@ -34,8 +34,7 @@
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#include "ExpatMetalinkProcessor.h"
|
#include "ExpatMetalinkProcessor.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <cstdio>
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
#include "DefaultDiskWriter.h"
|
#include "DefaultDiskWriter.h"
|
||||||
#include "MetalinkParserStateMachine.h"
|
#include "MetalinkParserStateMachine.h"
|
||||||
|
@ -47,6 +46,8 @@
|
||||||
#include "MetalinkParserState.h"
|
#include "MetalinkParserState.h"
|
||||||
#include "A2STR.h"
|
#include "A2STR.h"
|
||||||
#include "error_code.h"
|
#include "error_code.h"
|
||||||
|
#include "BufferedFile.h"
|
||||||
|
#include "a2functional.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -181,18 +182,20 @@ MetalinkProcessor::parseFile
|
||||||
(const std::string& filename,
|
(const std::string& filename,
|
||||||
const std::string& baseUri)
|
const std::string& baseUri)
|
||||||
{
|
{
|
||||||
|
BufferedFile* fp = 0;
|
||||||
|
auto_delete_d<BufferedFile*> deleter(fp);
|
||||||
if(filename == DEV_STDIN) {
|
if(filename == DEV_STDIN) {
|
||||||
return parseFile(std::cin);
|
fp = new BufferedFile(stdin);
|
||||||
|
return parseFile(*fp);
|
||||||
} else {
|
} else {
|
||||||
std::ifstream infile(filename.c_str(), std::ios::binary);
|
fp = new BufferedFile(filename, BufferedFile::READ);
|
||||||
return parseFile(infile, baseUri);
|
return parseFile(*fp, baseUri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedHandle<Metalinker>
|
SharedHandle<Metalinker>
|
||||||
MetalinkProcessor::parseFile
|
MetalinkProcessor::parseFile
|
||||||
(std::istream& stream,
|
(BufferedFile& fp, const std::string& baseUri)
|
||||||
const std::string& baseUri)
|
|
||||||
{
|
{
|
||||||
stm_.reset(new MetalinkParserStateMachine());
|
stm_.reset(new MetalinkParserStateMachine());
|
||||||
stm_->setBaseUri(baseUri);
|
stm_->setBaseUri(baseUri);
|
||||||
|
@ -201,16 +204,15 @@ MetalinkProcessor::parseFile
|
||||||
SharedHandle<SessionData> sessionData(new SessionData(stm_));
|
SharedHandle<SessionData> sessionData(new SessionData(stm_));
|
||||||
XML_Parser parser = createParser(sessionData);
|
XML_Parser parser = createParser(sessionData);
|
||||||
auto_delete<XML_Parser> deleter(parser, XML_ParserFree);
|
auto_delete<XML_Parser> deleter(parser, XML_ParserFree);
|
||||||
while(stream) {
|
while(1) {
|
||||||
stream.read(buf, sizeof(buf));
|
size_t res = fp.read(buf, sizeof(buf));
|
||||||
if(XML_Parse(parser, buf, stream.gcount(), 0) == XML_STATUS_ERROR) {
|
if(XML_Parse(parser, buf, res, 0) == XML_STATUS_ERROR) {
|
||||||
throw DL_ABORT_EX2(MSG_CANNOT_PARSE_METALINK,
|
throw DL_ABORT_EX2(MSG_CANNOT_PARSE_METALINK,
|
||||||
error_code::METALINK_PARSE_ERROR);
|
error_code::METALINK_PARSE_ERROR);
|
||||||
}
|
}
|
||||||
}
|
if(res < sizeof(buf)) {
|
||||||
if(stream.bad()) {
|
break;
|
||||||
throw DL_ABORT_EX2(MSG_CANNOT_PARSE_METALINK,
|
}
|
||||||
error_code::METALINK_PARSE_ERROR);
|
|
||||||
}
|
}
|
||||||
checkError(parser);
|
checkError(parser);
|
||||||
return stm_->getResult();
|
return stm_->getResult();
|
||||||
|
|
|
@ -49,19 +49,20 @@ namespace aria2 {
|
||||||
class Metalinker;
|
class Metalinker;
|
||||||
class BinaryStream;
|
class BinaryStream;
|
||||||
class MetalinkParserStateMachine;
|
class MetalinkParserStateMachine;
|
||||||
|
class BufferedFile;
|
||||||
|
|
||||||
class MetalinkProcessor {
|
class MetalinkProcessor {
|
||||||
private:
|
private:
|
||||||
SharedHandle<MetalinkParserStateMachine> stm_;
|
SharedHandle<MetalinkParserStateMachine> stm_;
|
||||||
|
|
||||||
|
SharedHandle<Metalinker> parseFile
|
||||||
|
(BufferedFile& fp,
|
||||||
|
const std::string& baseUri = A2STR::NIL);
|
||||||
public:
|
public:
|
||||||
SharedHandle<Metalinker> parseFile
|
SharedHandle<Metalinker> parseFile
|
||||||
(const std::string& filename,
|
(const std::string& filename,
|
||||||
const std::string& baseUri = A2STR::NIL);
|
const std::string& baseUri = A2STR::NIL);
|
||||||
|
|
||||||
SharedHandle<Metalinker> parseFile
|
|
||||||
(std::istream& stream,
|
|
||||||
const std::string& baseUri = A2STR::NIL);
|
|
||||||
|
|
||||||
SharedHandle<Metalinker> parseFromBinaryStream
|
SharedHandle<Metalinker> parseFromBinaryStream
|
||||||
(const SharedHandle<BinaryStream>& binaryStream,
|
(const SharedHandle<BinaryStream>& binaryStream,
|
||||||
const std::string& baseUri = A2STR::NIL);
|
const std::string& baseUri = A2STR::NIL);
|
||||||
|
|
|
@ -206,6 +206,19 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class auto_delete_d {
|
||||||
|
private:
|
||||||
|
T obj_;
|
||||||
|
public:
|
||||||
|
auto_delete_d(T obj):obj_(obj) {}
|
||||||
|
|
||||||
|
~auto_delete_d()
|
||||||
|
{
|
||||||
|
delete obj_;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<typename T, typename R>
|
template<typename T, typename R>
|
||||||
class auto_delete_r {
|
class auto_delete_r {
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in New Issue