00001 PFC_DECLARE_EXCEPTION(exception_tag_not_found,exception_io_data,"Tag not found");
00002
00006 class NOVTABLE tag_write_callback {
00007 public:
00010 virtual bool open_temp_file(service_ptr_t<file> & p_out,abort_callback & p_abort) = 0;
00011 protected:
00012 tag_write_callback() {}
00013 ~tag_write_callback() {}
00014 private:
00015 tag_write_callback(const tag_write_callback &) {throw pfc::exception_not_implemented();}
00016 const tag_write_callback & operator=(const tag_write_callback &) {throw pfc::exception_not_implemented();}
00017 };
00018
00019 class tag_write_callback_dummy : public tag_write_callback {
00020 public:
00021 bool open_temp_file(service_ptr_t<file> & p_out,abort_callback & p_abort) {return false;}
00022 };
00023
00025 class NOVTABLE tag_processor_id3v2 : public service_base
00026 {
00027 public:
00028 virtual void read(const service_ptr_t<file> & p_file,file_info & p_info,abort_callback & p_abort) = 0;
00029 virtual void write(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort) = 0;
00030 virtual void write_ex(tag_write_callback & p_callback,const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort) = 0;
00031
00032 static bool g_get(service_ptr_t<tag_processor_id3v2> & p_out);
00033 static void g_skip(const service_ptr_t<file> & p_file,t_filesize & p_size_skipped,abort_callback & p_abort);
00034 static void g_remove(const service_ptr_t<file> & p_file,t_filesize & p_size_removed,abort_callback & p_abort);
00035 static void g_remove_ex(tag_write_callback & p_callback,const service_ptr_t<file> & p_file,t_filesize & p_size_removed,abort_callback & p_abort);
00036
00037 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(tag_processor_id3v2);
00038 };
00039
00041 class NOVTABLE tag_processor_trailing : public service_base
00042 {
00043 public:
00044 enum {
00045 flag_apev2 = 1,
00046 flag_id3v1 = 2,
00047 };
00048
00049 virtual void read(const service_ptr_t<file> & p_file,file_info & p_info,abort_callback & p_abort) = 0;
00050 virtual void write(const service_ptr_t<file> & p_file,const file_info & p_info,unsigned p_flags,abort_callback & p_abort) = 0;
00051 virtual void remove(const service_ptr_t<file> & p_file,abort_callback & p_abort) = 0;
00052 virtual bool is_id3v1_sufficient(const file_info & p_info) = 0;
00053 virtual void truncate_to_id3v1(file_info & p_info) = 0;
00054 virtual void read_ex(const service_ptr_t<file> & p_file,file_info & p_info,t_filesize & p_tagoffset,abort_callback & p_abort) = 0;
00055
00056 void write_id3v1(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort);
00057 void write_apev2(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort);
00058 void write_apev2_id3v1(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort);
00059
00060
00061 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(tag_processor_trailing);
00062 };
00063
00064 namespace tag_processor {
00066 void write_id3v1(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort);
00068 void write_apev2(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort);
00070 void write_apev2_id3v1(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort);
00072 void write_id3v2(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort);
00074 void write_id3v2_id3v1(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort);
00076 void write_multi(const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort,bool p_write_id3v1,bool p_write_id3v2,bool p_write_apev2);
00078 void write_multi_ex(tag_write_callback & p_callback,const service_ptr_t<file> & p_file,const file_info & p_info,abort_callback & p_abort,bool p_write_id3v1,bool p_write_id3v2,bool p_write_apev2);
00080 void remove_trailing(const service_ptr_t<file> & p_file,abort_callback & p_abort);
00082 bool remove_id3v2(const service_ptr_t<file> & p_file,abort_callback & p_abort);
00084 void remove_id3v2_trailing(const service_ptr_t<file> & p_file,abort_callback & p_abort);
00086 void read_trailing(const service_ptr_t<file> & p_file,file_info & p_info,abort_callback & p_abort);
00088 void read_trailing_ex(const service_ptr_t<file> & p_file,file_info & p_info,t_filesize & p_tagoffset,abort_callback & p_abort);
00090 void read_id3v2(const service_ptr_t<file> & p_file,file_info & p_info,abort_callback & p_abort);
00092 void read_id3v2_trailing(const service_ptr_t<file> & p_file,file_info & p_info,abort_callback & p_abort);
00093
00094 void skip_id3v2(const service_ptr_t<file> & p_file,t_filesize & p_size_skipped,abort_callback & p_abort);
00095
00096 bool is_id3v1_sufficient(const file_info & p_info);
00097 void truncate_to_id3v1(file_info & p_info);
00098
00099 };