void open(service_ptr_t<file> p_filehint, const char *p_path, t_input_open_reason p_reason, abort_callback &p_abort) { if (p_reason == input_open_info_write) { int len = strlen(p_path); if (len < 4 || _stricmp(p_path + len - 4, ".sap") != 0) throw exception_io_unsupported_format(); filename = strdup(p_path); } if (p_filehint.is_empty()) filesystem::g_open(p_filehint, p_path, filesystem::open_mode_read, p_abort); m_file = p_filehint; module_len = m_file->read(module, sizeof(module), p_abort); if (!ASAP_Load(asap, p_path, module, module_len)) throw exception_io_unsupported_format(); }
void open(service_ptr_t<file> p_filehint, const char *p_path, t_input_open_reason p_reason, abort_callback &p_abort) { if (p_reason == input_open_info_write) { int len = strlen(p_path); if (len >= MAX_PATH || !ASAP_CanSetModuleInfo(p_path)) throw exception_io_unsupported_format(); memcpy(filename, p_path, len + 1); } if (p_filehint.is_empty()) filesystem::g_open(p_filehint, p_path, filesystem::open_mode_read, p_abort); m_file = p_filehint; module_len = m_file->read(module, sizeof(module), p_abort); if (!ASAP_GetModuleInfo(&module_info, p_path, module, module_len)) throw exception_io_unsupported_format(); if (p_reason == input_open_decode) if (!ASAP_Load(&asap, p_path, module, module_len)) throw exception_io_unsupported_format(); }
void tag_processor_id3v2::g_skip_at(const service_ptr_t<file> & p_file,t_filesize p_base, t_filesize & p_size_skipped,abort_callback & p_abort) { unsigned char tmp[10]; p_file->seek ( p_base, p_abort ); if (p_file->read( tmp, sizeof(tmp), p_abort) != sizeof(tmp)) { p_file->seek ( p_base, p_abort ); p_size_skipped = 0; return; } if ( 0 != memcmp ( tmp, "ID3", 3) || ( tmp[5] & 0x0F ) != 0 || ((tmp[6] | tmp[7] | tmp[8] | tmp[9]) & 0x80) != 0 ) { p_file->seek ( p_base, p_abort ); p_size_skipped = 0; return; } int FooterPresent = tmp[5] & 0x10; t_uint32 ret; ret = tmp[6] << 21; ret += tmp[7] << 14; ret += tmp[8] << 7; ret += tmp[9] ; ret += 10; if ( FooterPresent ) ret += 10; try { p_file->seek ( p_base + ret, p_abort ); } catch(exception_io_seek_out_of_range) { p_file->seek( p_base, p_abort ); p_size_skipped = 0; return; } p_size_skipped = ret; }
void read_v2(const service_ptr_t<file> & 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<char> 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 }; if ( forceUTF8 ) { is_utf8 = true; } else { is_utf8 = false; char temp[3]; done = p_file->read(temp, 3, p_abort); if (done != 3) { if (done > 0) p_out = pfc::stringcvt::string_utf8_from_ansi(temp, done); return; } if (!memcmp(utf8_header, temp, 3)) is_utf8 = true; 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<t_size>(size64); mem.set_size(size+1); char * asdf = mem.get_ptr(); p_file->read_object(asdf,size,p_abort); asdf[size]=0; if ( forceUTF8 ) { is_utf8 = true; p_out = asdf; } else if (size>3 && !memcmp(utf8_header,asdf,3)) { is_utf8 = true; p_out.add_string(asdf+3); } else { is_utf8 = false; p_out = pfc::stringcvt::string_utf8_from_ansi(asdf); } return; } }