#include "StdAfx.h" #include "text_file_loader.h" #include static const unsigned char utf8_header[3] = {0xEF,0xBB,0xBF}; namespace text_file_loader { void write(const service_ptr_t & p_file,abort_callback & p_abort,const char * p_string,bool is_utf8) { p_file->seek(0,p_abort); p_file->set_eof(p_abort); if (is_utf8) { p_file->write_object(utf8_header,sizeof(utf8_header),p_abort); p_file->write_object(p_string,strlen(p_string),p_abort); } else { #ifdef _WIN32 pfc::stringcvt::string_ansi_from_utf8 bah(p_string); p_file->write_object(bah,bah.length(),p_abort); #else throw exception_io_data(); #endif } } void read(const service_ptr_t & p_file, abort_callback & p_abort, pfc::string_base & p_out, bool & is_utf8) { read_v2( p_file, p_abort, p_out, is_utf8, false ); } void read_v2(const service_ptr_t & p_file,abort_callback & p_abort,pfc::string_base & p_out,bool & is_utf8, bool forceUTF8) { p_out.reset(); p_file->reopen( p_abort ); pfc::array_t mem; t_filesize size64; size64 = p_file->get_size(p_abort); if (size64 == filesize_invalid)//typically HTTP { pfc::string8 ansitemp; t_size done; enum { delta = 1024 * 64, max = 1024 * 512 }; is_utf8 = forceUTF8; char temp[3]; done = p_file->read(temp, 3, p_abort); if (done != 3) { if (done > 0) { if ( is_utf8 ) { p_out.set_string( temp, done ); } else { p_out = pfc::stringcvt::string_utf8_from_ansi(temp, done); } } return; } if (!memcmp(utf8_header, temp, 3)) is_utf8 = true; else if (is_utf8) p_out.add_string(temp,3); else ansitemp.add_string(temp, 3); mem.set_size(delta); for(;;) { done = p_file->read(mem.get_ptr(),delta,p_abort); if (done > 0) { if (is_utf8) p_out.add_string(mem.get_ptr(),done); else ansitemp.add_string(mem.get_ptr(),done); } if (done < delta) break; } if (!is_utf8) { p_out = pfc::stringcvt::string_utf8_from_ansi(ansitemp); } return; } else { if (size64>1024*1024*128) throw exception_io_data();//hard limit t_size size = pfc::downcast_guarded(size64); mem.set_size(size+1); char * asdf = mem.get_ptr(); p_file->read_object(asdf,size,p_abort); asdf[size]=0; if (size>=3 && !memcmp(utf8_header,asdf,3)) { is_utf8 = true; p_out.add_string(asdf+3); } else if (forceUTF8) { is_utf8 = true; p_out = asdf; } else { is_utf8 = false; p_out = pfc::stringcvt::string_utf8_from_ansi(asdf); } return; } } void write(const char * p_path,abort_callback & p_abort,const char * p_string,bool is_utf8) { service_ptr_t f; filesystem::g_open_write_new(f,p_path,p_abort); write(f,p_abort,p_string,is_utf8); } void read(const char * p_path, abort_callback & p_abort, pfc::string_base & p_out, bool & is_utf8) { read_v2( p_path, p_abort, p_out, is_utf8, false ); } void read_v2(const char * p_path,abort_callback & p_abort,pfc::string_base & p_out,bool & is_utf8, bool forceUTF8) { service_ptr_t f; filesystem::g_open_read(f,p_path,p_abort); read_v2(f,p_abort,p_out,is_utf8,forceUTF8); } }