annotate foosdk/sdk/foobar2000/SDK/archive.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "filesystem.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace foobar2000_io {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class archive;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! Callback passed to archive listing methods. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! For backwards compatibility, this inherits with abort_callback as well. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //! When implementiong, you must override abort_callback methods redirecting them to your abort_callback. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! It is recommended to use lambda-based archive_list helper instead of implementing this interface.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 class NOVTABLE archive_callback : public abort_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 virtual bool on_entry(archive * owner,const char * url,const t_filestats & p_stats,const service_ptr_t<file> & p_reader) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 //! Interface for archive reader services. When implementing, derive from archive_impl rather than from deriving from archive directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 class NOVTABLE archive : public filesystem {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 FB2K_MAKE_SERVICE_INTERFACE(archive,filesystem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 typedef std::function<void(const char* url, const t_filestats& stats, file::ptr reader) > list_func_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Lists archive contents. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! May be called with any path, not only path accepted by is_our_archive. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! It is strongly recommended to use the lambda_based archive_list() helper instead of calling this directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 //! @param p_reader Optional reader to use, if the caller already has one. Implementation will open the file if no reader is supplied.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 //! @param p_want_readers Flag to tell if the callback wants a reader object for each file in the archive, or just wants to list contents.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 virtual void archive_list(const char * p_path,const service_ptr_t<file> & p_reader,archive_callback & p_callback,bool p_want_readers) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! Helper implemented on top of the other archive_list, uses lambda instead of callback, avoids having to implement archive_callback.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 void archive_list(const char * path, file::ptr, list_func_t, bool wantReaders, abort_callback&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 //! Optional method to weed out unsupported formats prior to calling archive_list. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 //! Use this to suppress calls to archive_list() to avoid spurious exceptions being thrown. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! Implemented via archive_v2.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 bool is_our_archive( const char * path );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 //! \since 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 //! New 1.5 series API, though allowed to implement/call in earlier versions. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 //! Suppresses spurious C++ exceptions on all files not recognized as archives by this instance.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 class NOVTABLE archive_v2 : public archive {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 FB2K_MAKE_SERVICE_INTERFACE(archive_v2, archive)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 //! Optional method to weed out unsupported formats prior to calling archive_list. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 //! Use this to suppress calls to archive_list() to avoid spurious exceptions being thrown.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 virtual bool is_our_archive( const char * path ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! \since 1.6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 //! New 1.6 series API, though allowed to implement/call in earlier versions.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 class NOVTABLE archive_v3 : public archive_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 FB2K_MAKE_SERVICE_INTERFACE(archive_v3, archive_v2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 //! Determine supported archive file types. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 //! Returns a list of extensions, colon delimited, e.g.: "zip,rar,7z"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 virtual void list_extensions(pfc::string_base & out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 //! \since 2.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 class NOVTABLE archive_v4 : public archive_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 FB2K_MAKE_SERVICE_INTERFACE(archive_v4, archive_v3)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 virtual fb2k::arrayRef archive_list_v4( fsItemFilePtr item, file::ptr readerOptional, abort_callback & a) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 //! Root class for archive implementations. Derive from this instead of from archive directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 class NOVTABLE archive_impl : public service_multi_inherit<archive_v4, filesystem_v3> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 //do not override these
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 bool get_canonical_path(const char * path,pfc::string_base & out) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 bool is_our_path(const char * path) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 bool get_display_path(const char * path,pfc::string_base & out) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 void remove(const char * path,abort_callback & p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 void move(const char * src,const char * dst,abort_callback & p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 void move_overwrite(const char* src, const char* dst, abort_callback& abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 bool is_remote(const char * src) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 bool relative_path_create(const char * file_path,const char * playlist_path,pfc::string_base & out) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 bool relative_path_parse(const char * relative_path,const char * playlist_path,pfc::string_base & out) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 void open(service_ptr_t<file> & p_out,const char * path, t_open_mode mode,abort_callback & p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 void create_directory(const char * path,abort_callback &) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 void make_directory(const char* path, abort_callback& abort, bool* didCreate = nullptr) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 void list_directory(const char* p_path, directory_callback& p_out, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 void list_directory_ex(const char* p_path, directory_callback& p_out, unsigned listMode, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 void list_directory_v3(const char* path, directory_callback_v3& callback, unsigned listMode, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 t_filestats2 get_stats2(const char* p_path, uint32_t s2flags, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 virtual void get_stats(const char* p_path, t_filestats& p_stats, bool& p_is_writeable, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 void list_extensions(pfc::string_base & out) override { out = get_archive_type(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 bool supports_content_types() override { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 char pathSeparator() override { return '/'; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 void extract_filename_ext(const char * path, pfc::string_base & outFN) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 bool get_display_name_short(const char* in, pfc::string_base& out) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 fb2k::arrayRef archive_list_v4( fsItemFilePtr item, file::ptr readerOptional, abort_callback & a ) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 //override these
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 virtual const char * get_archive_type()=0;//eg. "zip", must be lowercase
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 virtual t_filestats2 get_stats2_in_archive(const char * p_archive,const char * p_file,unsigned s2flags,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 virtual void open_archive(service_ptr_t<file> & p_out,const char * archive,const char * file, abort_callback & p_abort) = 0;//opens for reading
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 //override these
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 // virtual void archive_list(const char * path,const service_ptr_t<file> & p_reader,archive_callback & p_out,bool p_want_readers) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 // virtual bool is_our_archive( const char * path ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 static bool g_is_unpack_path(const char * path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 static bool g_parse_unpack_path(const char * path,pfc::string_base & archive,pfc::string_base & file);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 static bool g_parse_unpack_path_ex(const char * path,pfc::string_base & archive,pfc::string_base & file, pfc::string_base & type);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 static void g_make_unpack_path(pfc::string_base & path,const char * archive,const char * file,const char * type);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 void make_unpack_path(pfc::string_base & path,const char * archive,const char * file);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 class archive_factory_t : public service_factory_single_t<T> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }