void tag_processor_id3v2::g_remove_ex(tag_write_callback & p_callback,const service_ptr_t<file> & p_file,t_uint64 & p_size_removed,abort_callback & p_abort) { p_file->ensure_seekable(); t_filesize len; len = p_file->get_size(p_abort); if (len == filesize_invalid) throw exception_io_no_length(); p_file->seek(0,p_abort); t_uint64 offset; g_multiskip(p_file,offset,p_abort); if (offset>0 && offset<len) { len-=offset; service_ptr_t<file> temp; if (p_callback.open_temp_file(temp,p_abort)) { file::g_transfer_object(p_file,temp,len,p_abort); } else { if (len > 16*1024*1024) filesystem::g_open_temp(temp,p_abort); else filesystem::g_open_tempmem(temp,p_abort); file::g_transfer_object(p_file,temp,len,p_abort); p_file->seek(0,p_abort); p_file->set_eof(p_abort); temp->seek(0,p_abort); file::g_transfer_object(temp,p_file,len,p_abort); } } p_size_removed = offset; }
void open(service_ptr_t<file> file, const char *path, t_input_open_reason reason, abort_callback &abort) { m_pfile = file; input_open_file_helper(m_pfile, path, reason, abort); m_pfile->ensure_seekable(); m_demuxer = std::make_shared<CAFFile>(m_pfile, abort); m_decoder = IDecoder::create_decoder(m_demuxer, abort); }