/* */ #include "BufferedFile.h" #include #include #include "a2io.h" #include "util.h" namespace aria2 { const std::string BufferedFile::READ = "rb"; const std::string BufferedFile::WRITE = "wb"; BufferedFile::BufferedFile(const std::string& filename, const std::string& mode) { fp_ = a2fopen(utf8ToWChar(filename).c_str(), utf8ToWChar(mode).c_str()); open_ = fp_; } BufferedFile::~BufferedFile() { close(); } BufferedFile::operator unspecified_bool_type() const { return (!open_ || ferror(fp_)) ? 0 : &BufferedFile::good_state; } size_t BufferedFile::read(void* ptr, size_t count) { return fread(ptr, 1, count, fp_); } size_t BufferedFile::write(const void* ptr, size_t count) { return fwrite(ptr, 1, count, fp_); } char* BufferedFile::gets(char* s, int size) { return fgets(s, size, fp_); } char* BufferedFile::getsn(char* s, int size) { char* ptr = fgets(s, size, fp_); if(ptr) { int len = strlen(ptr); if(ptr[len-1] == '\n') { ptr[len-1] = '\0'; } } return ptr; } int BufferedFile::close() { if(open_) { open_ = false; return fclose(fp_); } else { return 0; } } bool BufferedFile::eof() { return open_ && feof(fp_); } size_t BufferedFile::transfer(std::ostream& out) { size_t count = 0; char buf[4096]; while(1) { size_t r = this->read(buf, sizeof(buf)); out.write(buf, r); count += r; if(r < sizeof(buf)) { break; } } return count; } } // namespace aria2