Rewritten ExpatMetalinkProcessor using BufferedFile.

pull/1/head
Tatsuhiro Tsujikawa 2011-08-07 18:08:16 +09:00
parent 32d413c6de
commit 272d81b7a1
3 changed files with 34 additions and 18 deletions

View File

@ -34,8 +34,7 @@
/* copyright --> */
#include "ExpatMetalinkProcessor.h"
#include <iostream>
#include <fstream>
#include <cstdio>
#include "DefaultDiskWriter.h"
#include "MetalinkParserStateMachine.h"
@ -47,6 +46,8 @@
#include "MetalinkParserState.h"
#include "A2STR.h"
#include "error_code.h"
#include "BufferedFile.h"
#include "a2functional.h"
namespace aria2 {
@ -181,18 +182,20 @@ MetalinkProcessor::parseFile
(const std::string& filename,
const std::string& baseUri)
{
BufferedFile* fp = 0;
auto_delete_d<BufferedFile*> deleter(fp);
if(filename == DEV_STDIN) {
return parseFile(std::cin);
fp = new BufferedFile(stdin);
return parseFile(*fp);
} else {
std::ifstream infile(filename.c_str(), std::ios::binary);
return parseFile(infile, baseUri);
fp = new BufferedFile(filename, BufferedFile::READ);
return parseFile(*fp, baseUri);
}
}
SharedHandle<Metalinker>
MetalinkProcessor::parseFile
(std::istream& stream,
const std::string& baseUri)
(BufferedFile& fp, const std::string& baseUri)
{
stm_.reset(new MetalinkParserStateMachine());
stm_->setBaseUri(baseUri);
@ -201,16 +204,15 @@ MetalinkProcessor::parseFile
SharedHandle<SessionData> sessionData(new SessionData(stm_));
XML_Parser parser = createParser(sessionData);
auto_delete<XML_Parser> deleter(parser, XML_ParserFree);
while(stream) {
stream.read(buf, sizeof(buf));
if(XML_Parse(parser, buf, stream.gcount(), 0) == XML_STATUS_ERROR) {
while(1) {
size_t res = fp.read(buf, sizeof(buf));
if(XML_Parse(parser, buf, res, 0) == XML_STATUS_ERROR) {
throw DL_ABORT_EX2(MSG_CANNOT_PARSE_METALINK,
error_code::METALINK_PARSE_ERROR);
}
}
if(stream.bad()) {
throw DL_ABORT_EX2(MSG_CANNOT_PARSE_METALINK,
error_code::METALINK_PARSE_ERROR);
if(res < sizeof(buf)) {
break;
}
}
checkError(parser);
return stm_->getResult();

View File

@ -49,19 +49,20 @@ namespace aria2 {
class Metalinker;
class BinaryStream;
class MetalinkParserStateMachine;
class BufferedFile;
class MetalinkProcessor {
private:
SharedHandle<MetalinkParserStateMachine> stm_;
SharedHandle<Metalinker> parseFile
(BufferedFile& fp,
const std::string& baseUri = A2STR::NIL);
public:
SharedHandle<Metalinker> parseFile
(const std::string& filename,
const std::string& baseUri = A2STR::NIL);
SharedHandle<Metalinker> parseFile
(std::istream& stream,
const std::string& baseUri = A2STR::NIL);
SharedHandle<Metalinker> parseFromBinaryStream
(const SharedHandle<BinaryStream>& binaryStream,
const std::string& baseUri = A2STR::NIL);

View File

@ -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>
class auto_delete_r {
private: