void unpacker::g_open(service_ptr_t<file> & p_out,const service_ptr_t<file> & p,abort_callback & p_abort) { service_enum_t<unpacker> e; service_ptr_t<unpacker> ptr; if (e.first(ptr)) do { p->reopen(p_abort); try { ptr->open(p_out,p,p_abort); return; } catch(exception_io_data const &) {} } while(e.next(ptr)); throw exception_io_data(); }
void input_open_file_helper(service_ptr_t<file> & p_file,const char * p_path,t_input_open_reason p_reason,abort_callback & p_abort) { if (p_file.is_empty()) { switch(p_reason) { default: uBugCheck(); case input_open_info_read: case input_open_decode: filesystem::g_open(p_file,p_path,filesystem::open_mode_read,p_abort); break; case input_open_info_write: filesystem::g_open(p_file,p_path,filesystem::open_mode_write_existing,p_abort); break; } } else { p_file->reopen(p_abort); } }
static void process_path_internal(const char * p_path,const service_ptr_t<file> & p_reader,playlist_loader_callback_v2 & p_callback,playlist_loader_callback::t_entry_type p_type,const t_filestats & p_stats) { //p_path must be canonical p_callback.check(); p_callback.on_progress(p_path); { if (p_reader.is_empty()) { directory_callback_impl directory_results(true); try { filesystem::g_list_directory(p_path,directory_results,p_callback); for(t_size n=0;n<directory_results.get_count();n++) { process_path_internal(directory_results.get_item(n),0,p_callback,playlist_loader_callback::entry_directory_enumerated,directory_results.get_item_stats(n)); } return; } catch(exception_aborted) {throw;} catch(...) { //do nothing, fall thru //fixme - catch only filesystem exceptions? } } bool found = false; { archive_callback_impl archive_results(p_callback); service_enum_t<filesystem> e; service_ptr_t<filesystem> f; while(e.next(f)) { p_callback.check(); service_ptr_t<archive> arch; if (f->service_query_t(arch)) { if (p_reader.is_valid()) p_reader->reopen(p_callback); try { TRACK_CODE("archive::archive_list",arch->archive_list(p_path,p_reader,archive_results,true)); return; } catch(exception_aborted) {throw;} catch(...) {} } } } } { service_ptr_t<link_resolver> ptr; if (link_resolver::g_find(ptr,p_path)) { if (p_reader.is_valid()) p_reader->reopen(p_callback); pfc::string8 temp; try { TRACK_CODE("link_resolver::resolve",ptr->resolve(p_reader,p_path,temp,p_callback)); track_indexer__g_get_tracks_wrap(temp,0,filestats_invalid,playlist_loader_callback::entry_from_playlist,p_callback); return;//success } catch(exception_aborted) {throw;} catch(...) {} } } if (p_callback.is_path_wanted(p_path,p_type)) { track_indexer__g_get_tracks_wrap(p_path,p_reader,p_stats,p_type,p_callback); } }
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; } }