/* */ #include "BufferedFile.h" #include #include #include #include "a2io.h" #include "util.h" namespace aria2 { const std::string BufferedFile::READ = "rb"; const std::string BufferedFile::WRITE = "wb"; const std::string BufferedFile::APPEND = "ab"; BufferedFile::BufferedFile(const std::string& filename, const std::string& mode) { fp_ = a2fopen(utf8ToWChar(filename).c_str(), utf8ToWChar(mode).c_str()); open_ = fp_; } BufferedFile::BufferedFile(FILE* fp) : fp_(fp), open_(true) {} 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_); } size_t BufferedFile::write(const char* str) { return write(str, strlen(str)); } 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; } std::string BufferedFile::getLine() { std::string res; if(eof()) { return res; } char buf[4096]; while(gets(buf, sizeof(buf))) { size_t len = strlen(buf); bool lineBreak = false; if(buf[len-1] == '\n') { --len; lineBreak = true; } res.append(buf, len); if(lineBreak) { break; } } return res; } 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; } int BufferedFile::printf(const char* format, ...) { va_list ap; va_start(ap, format); int r = vfprintf(fp_, format, ap); va_end(ap); return r; } int BufferedFile::flush() { return fflush(fp_); } } // namespace aria2