00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "physfs/ofile_streambuf.hpp"
00018
00019 #include <sstream>
00020 #include <stdexcept>
00021
00022 OFileStreambuf::OFileStreambuf(const std::string& filename) :
00023 file()
00024 {
00025 file = PHYSFS_openWrite(filename.c_str());
00026 if(file == 0) {
00027 std::stringstream msg;
00028 msg << "Couldn't open file '" << filename << "': "
00029 << PHYSFS_getLastError();
00030 throw std::runtime_error(msg.str());
00031 }
00032
00033 setp(buf, buf+sizeof(buf));
00034 }
00035
00036 OFileStreambuf::~OFileStreambuf()
00037 {
00038 sync();
00039 PHYSFS_close(file);
00040 }
00041
00042 int
00043 OFileStreambuf::overflow(int c)
00044 {
00045 char c2 = (char)c;
00046
00047 if(pbase() == pptr())
00048 return 0;
00049
00050 size_t size = pptr() - pbase();
00051 PHYSFS_sint64 res = PHYSFS_write(file, pbase(), 1, size);
00052 if(res <= 0)
00053 return traits_type::eof();
00054
00055 if(c != traits_type::eof()) {
00056 PHYSFS_sint64 res = PHYSFS_write(file, &c2, 1, 1);
00057 if(res <= 0)
00058 return traits_type::eof();
00059 }
00060
00061 setp(buf, buf + res);
00062 return 0;
00063 }
00064
00065 int
00066 OFileStreambuf::sync()
00067 {
00068 return overflow(traits_type::eof());
00069 }
00070
00071