annotate foosdk/sdk/foobar2000/SDK/metadb_handle.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 "filesystem.h" // t_filestats
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "playable_location.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "file_info.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class titleformat_hook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 class titleformat_text_filter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class titleformat_object;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 class metadb_info_container : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 FB2K_MAKE_SERVICE_INTERFACE(metadb_info_container, service_base);
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 file_info const & info() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 virtual t_filestats const & stats() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 virtual bool isInfoPartial() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 t_filestats2 stats2_();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 class metadb_info_container_v2 : public metadb_info_container {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 FB2K_MAKE_SERVICE_INTERFACE(metadb_info_container_v2, metadb_info_container);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 virtual t_filestats2 const & stats2() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 struct metadb_v2_rec_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 metadb_info_container::ptr info, infoBrowse;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 service_ptr reserved;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! A metadb_handle object represents interface to reference-counted file_info cache entry for the specified location.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 //! To obtain a metadb_handle to specific location, use metadb::handle_create(). To obtain a list of metadb_handle objects corresponding to specific path (directory, playlist, multitrack file, etc), use relevant playlist_incoming_item_filter methods (recommended), or call playlist_loader methods directly.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 //! A metadb_handle is also the most efficient way of passing playable object locations around because it provides fast access to both location and infos, and is reference counted so duplicating it is as fast as possible.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! To retrieve a path of a file from a metadb_handle, use metadb_handle::get_path() function. Note that metadb_handle is NOT just file path, some formats support multiple subsongs per physical file, which are signaled using subsong indexes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 class NOVTABLE metadb_handle : public service_base
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 //! Retrieves location represented by this metadb_handle object. Returned reference is valid until calling context releases metadb_handle that returned it (metadb_handle_ptr is deallocated etc).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 virtual const playable_location & get_location() const = 0;//never fails, returned pointer valid till the object is released
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
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 //! Renders information about item referenced by this metadb_handle object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 //! @param p_hook Optional callback object overriding fields and functions; set to NULL if not used.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 //! @param p_out String receiving the output on success.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 //! @param p_script Titleformat script to use. Use titleformat_compiler service to create one.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 //! @param p_filter Optional callback object allowing input to be filtered according to context (i.e. removal of linebreak characters present in tags when rendering playlist lines). Set to NULL when not used.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! @returns true on success, false when dummy file_info instance was used because actual info is was not (yet) known.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 virtual bool format_title(titleformat_hook * p_hook,pfc::string_base & p_out,const service_ptr_t<titleformat_object> & p_script,titleformat_text_filter * p_filter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 FB2K_DEPRECATED virtual void metadb_lock() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 FB2K_DEPRECATED virtual void metadb_unlock() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 //! Returns last seen file stats, filestats_invalid if unknown.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 virtual t_filestats get_filestats() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! Obsolete, use get_info_ref() family of methods instead. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 //! Queries whether cached info about item referenced by this metadb_handle object is already available. Note that this function causes the metadb to be temporarily locked; you can not use it in context that where locking is forbidden.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 //! Note that state of cached info changes only inside main thread, so you can safely assume that it doesn't change while some block of your code inside main thread is being executed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 virtual bool is_info_loaded() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 //! Obsolete, use get_info_ref() instead. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 //! Queries cached info about item referenced by this metadb_handle object. Returns true on success, false when info is not yet known. Note that this function causes the metadb to be temporarily locked; you can not use it in context that where locking is forbidden. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 //! Note that state of cached info changes only inside main thread, so you can safely assume that it doesn't change while some block of your code inside main thread is being executed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 virtual bool get_info(file_info & p_info) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 FB2K_DEPRECATED virtual bool get_info_locked(const file_info * & p_info) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 //! Obsolete, use get_info_ref() family of methods instead. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 //! Queries whether cached info about item referenced by this metadb_handle object is already available.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! This is intended for use in special cases when you need to immediately retrieve info sent by metadb_io hint from another thread; state of returned data can be altered by any thread, as opposed to non-async methods.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 virtual bool is_info_loaded_async() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 //! Obsolete, use get_info_ref() family of methods instead. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //! Queries cached info about item referenced by this metadb_handle object. Returns true on success, false when info is not yet known. Note that this function causes the metadb to be temporarily locked; you can not use it in context that where locking is forbidden.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 //! This is intended for use in special cases when you need to immediately retrieve info sent by metadb_io hint from another thread; state of returned data can be altered by any thread, as opposed to non-async methods.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 virtual bool get_info_async(file_info & p_info) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 FB2K_DEPRECATED virtual bool get_info_async_locked(const file_info * & p_info) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 //! Renders information about item referenced by this metadb_handle object, using external file_info data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 virtual void format_title_from_external_info(const file_info & p_info,titleformat_hook * p_hook,pfc::string_base & p_out,const service_ptr_t<titleformat_object> & p_script,titleformat_text_filter * p_filter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 FB2K_DEPRECATED virtual bool format_title_nonlocking(titleformat_hook * p_hook,pfc::string_base & p_out,const service_ptr_t<titleformat_object> & p_script,titleformat_text_filter * p_filter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 FB2K_DEPRECATED virtual void format_title_from_external_info_nonlocking(const file_info & p_info,titleformat_hook * p_hook,pfc::string_base & p_out,const service_ptr_t<titleformat_object> & p_script,titleformat_text_filter * p_filter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 #if FOOBAR2000_TARGET_VERSION >= 76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 //! Returns browse info for this track. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 //! Browse info comes from an external source - such as internet playlist metadata - not from the media file itself, and is maintained separately. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 //! When title formatting calls are invoked on for a track having browse info present, data for title formatting is sourced from both primary and browse info. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 //! Example: internet radio stream provides no metadata but its playlist XML has title (radio station name), %title% resolves to the radio station name from the playlist.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 virtual bool get_browse_info(file_info & info, t_filetimestamp & ts) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 FB2K_DEPRECATED virtual bool get_browse_info_locked(const file_info * & p_info, t_filetimestamp & ts) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 #if FOOBAR2000_TARGET_VERSION >= 78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 //! \since 1.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 //! Retrieve a reference to the primary info. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 //! You can hold the reference to the info as long as you like, call the method in any context you like with no lock semantics involved. The info held by the returned reference will remain constant even if the metadb content changes. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 //! Returns true and sets outInfo to a reference to this item's primary info on success, returns false on failure (no info known at this time).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 virtual bool get_info_ref(metadb_info_container::ptr & outInfo) const = 0;
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 //! \since 1.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 //! Retrieve a reference to the async info (pending info update). If async info isn't set, a reference to the primary info is returned.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 //! You can hold the reference to the info as long as you like, call the method in any context you like with no lock semantics involved. The info held by the returned reference will remain constant even if the metadb content changes. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 //! Returns true and sets outInfo to a reference to this item's async or primary info on success, returns false on failure (no info known at this time).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 virtual bool get_async_info_ref(metadb_info_container::ptr & outInfo) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 //! \since 1.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 //! Retrieve references to the item's primary and browse infos. If no info is set, NULL pointers are returned. For most local files, browse info is not available and you get a NULL for it.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 //! Since browse info is usually used along with the primary info (as a fallback for missing metas), you can get the two with one call for better performance. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 //! You can hold the reference to the info as long as you like, call the method in any context you like with no lock semantics involved. The info held by the returned reference will remain constant even if the metadb content changes. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 //! See also: get_browse_info(), for browse info rationale.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 virtual void get_browse_info_ref(metadb_info_container::ptr & outInfo, metadb_info_container::ptr & outBrowse) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 //! Simplified method, always returns non-null, dummy info if nothing to return.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 virtual metadb_info_container::ptr get_info_ref() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! Simplified method, always returns non-null, dummy info if nothing to return.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 virtual metadb_info_container::ptr get_async_info_ref() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 //! \since 1.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 //! Retrieve full info using available means - read actual file if not cached. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //! Throws exceptions on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 metadb_info_container::ptr get_full_info_ref( abort_callback & aborter ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 t_filestats2 get_stats2_() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 //! \since 1.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 //! Helper using get_browse_info_ref(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 //! Retrieves primary info + browse info merged together. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 //! Returns true on success, false if neither info is available. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 //! If neither info is avaialble, output data structure is emptied. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 //! See also: get_browse_info() for browse info rationale.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 bool get_browse_info_merged(file_info & infoMerged) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 static bool g_should_reload(const t_filestats & p_old_stats,const t_filestats & p_new_stats,bool p_fresh);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 static bool g_should_reload_ex(const t_filestats& p_old_stats, const t_filestats& p_new_stats, t_filetimestamp p_readtime);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 bool should_reload(const t_filestats & p_new_stats,bool p_fresh) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 //! Helper provided for backwards compatibility; takes formatting script as text string and calls relevant titleformat_compiler methods; returns false when the script could not be compiled.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 //! See format_title() for descriptions of parameters.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 //! Bottleneck warning: you should consider using precompiled titleformat script object and calling regular format_title() instead when processing large numbers of items.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 bool format_title_legacy(titleformat_hook * p_hook,pfc::string_base & out,const char * p_spec,titleformat_text_filter * p_filter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 //! Retrieves path of item described by this metadb_handle instance. Returned string is valid until calling context releases metadb_handle that returned it (metadb_handle_ptr is deallocated etc).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 inline const char * get_path() const {return get_location().get_path();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 //! Retrieves subsong index of item described by this metadb_handle instance (used for multiple playable tracks within single physical file).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 inline t_uint32 get_subsong_index() const {return get_location().get_subsong_index();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 double get_length();//helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 t_filetimestamp get_filetimestamp();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 t_filesize get_filesize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 //! Internal method, do not use
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 inline const char * _get_path() const { return get_path(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 metadb_v2_rec_t query_v2_();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 void formatTitle_v2_(const metadb_v2_rec_t& rec, titleformat_hook* p_hook, pfc::string_base& p_out, const service_ptr_t<titleformat_object>& p_script, titleformat_text_filter* p_filter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 FB2K_MAKE_SERVICE_INTERFACE(metadb_handle,service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 class metadb_handle_v2 : public metadb_handle {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 FB2K_MAKE_SERVICE_INTERFACE(metadb_handle_v2, metadb_handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 typedef metadb_v2_rec_t rec_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 virtual rec_t query_v2() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 virtual t_filestats2 get_stats2() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 virtual void formatTitle_v2(const rec_t& rec, titleformat_hook* p_hook, pfc::string_base& p_out, const service_ptr_t<titleformat_object>& p_script, titleformat_text_filter* p_filter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 typedef pfc::list_base_t<metadb_handle_ptr>* metadb_handle_list_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 typedef pfc::list_base_const_t<metadb_handle_ptr> const * metadb_handle_list_cptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 typedef pfc::list_base_t<metadb_handle_ptr> & metadb_handle_list_ref;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 typedef pfc::list_base_const_t<metadb_handle_ptr> const & metadb_handle_list_cref;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 namespace metadb_handle_list_helper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 void sort_by_format(metadb_handle_list_ref p_list,const char * spec,titleformat_hook * p_hook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 void sort_by_format_get_order(metadb_handle_list_cref p_list,t_size* order,const char * spec,titleformat_hook * p_hook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 void sort_by_format(metadb_handle_list_ref p_list,const service_ptr_t<titleformat_object> & p_script,titleformat_hook * p_hook, int direction = 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 void sort_by_format_get_order(metadb_handle_list_cref p_list,t_size* order,const service_ptr_t<titleformat_object> & p_script,titleformat_hook * p_hook,int p_direction = 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 void sort_by_relative_path(metadb_handle_list_ref p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 void sort_by_relative_path_get_order(metadb_handle_list_cref p_list,t_size* order);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 void remove_duplicates(pfc::list_base_t<metadb_handle_ptr> & p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 void sort_by_pointer_remove_duplicates(pfc::list_base_t<metadb_handle_ptr> & p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 void sort_by_path_quick(pfc::list_base_t<metadb_handle_ptr> & p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 void sort_by_pointer(pfc::list_base_t<metadb_handle_ptr> & p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 t_size bsearch_by_pointer(const pfc::list_base_const_t<metadb_handle_ptr> & p_list,const metadb_handle_ptr & val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 double calc_total_duration(metadb_handle_list_cref p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 pfc::string8 format_total_size(metadb_handle_list_cref p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 //! New method to deal with slower metadb in foobar2000 v2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 double calc_total_duration_v2(metadb_handle_list_cref p_list, unsigned maxThreads, abort_callback & aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 void sort_by_path(pfc::list_base_t<metadb_handle_ptr> & p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 t_filesize calc_total_size(metadb_handle_list_cref list, bool skipUnknown = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 t_filesize calc_total_size_ex(metadb_handle_list_cref list, bool & foundUnknown);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 bool extract_single_path(metadb_handle_list_cref list, const char * &path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 bool extract_folder_path(metadb_handle_list_cref list, pfc::string_base & path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 void sort_by_format_get_order_v2( metadb_handle_list_cref p_list, size_t * order, const service_ptr_t<titleformat_object> & script, titleformat_hook * hook, int direction, abort_callback & aborter );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 void sort_by_format_v2(metadb_handle_list_ref p_list, const service_ptr_t<titleformat_object> & script, titleformat_hook * hook, int direction, abort_callback & aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 struct sorter_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 service_ptr_t < titleformat_object > obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 int direction = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 titleformat_hook* hook = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 //! Late-2023 addition (new fb2k not required) \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 //! Multilayer stablesort using single info query pass, with multiple sort objects that can have different directions.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 //! @param inOutOrder input & output order, please set to a valid permutration (such as identity) on input.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 void sort_by_format_get_order_v3(metadb_handle_list_cref p_list, size_t* inOutOrder, sorter_t const * sorters, size_t nSorters, abort_callback& aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 template<template<typename> class t_alloc = pfc::alloc_fast >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 class metadb_handle_list_t : public service_list_t<metadb_handle,t_alloc> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 typedef metadb_handle_list_t<t_alloc> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 typedef pfc::list_base_const_t<metadb_handle_ptr> t_interface;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 inline void sort_by_format(const char * spec,titleformat_hook * p_hook) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 return metadb_handle_list_helper::sort_by_format(*this, spec, p_hook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 inline void sort_by_format_get_order(t_size* order,const char * spec,titleformat_hook * p_hook) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 metadb_handle_list_helper::sort_by_format_get_order(*this, order, spec, p_hook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 inline void sort_by_format(const service_ptr_t<titleformat_object> & p_script,titleformat_hook * p_hook, int direction = 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 metadb_handle_list_helper::sort_by_format(*this, p_script, p_hook, direction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 inline void sort_by_format_get_order(t_size* order,const service_ptr_t<titleformat_object> & p_script,titleformat_hook * p_hook) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 metadb_handle_list_helper::sort_by_format_get_order(*this, order, p_script, p_hook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 inline void sort_by_relative_path() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 metadb_handle_list_helper::sort_by_relative_path(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 inline void sort_by_relative_path_get_order(t_size* order) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 metadb_handle_list_helper::sort_by_relative_path_get_order(*this,order);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 inline void remove_duplicates() {metadb_handle_list_helper::remove_duplicates(*this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 inline void sort_by_pointer_remove_duplicates() {metadb_handle_list_helper::sort_by_pointer_remove_duplicates(*this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 inline void sort_by_path_quick() {metadb_handle_list_helper::sort_by_path_quick(*this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 inline void sort_by_pointer() {metadb_handle_list_helper::sort_by_pointer(*this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 inline t_size bsearch_by_pointer(const metadb_handle_ptr & val) const {return metadb_handle_list_helper::bsearch_by_pointer(*this,val);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 inline double calc_total_duration() const {return metadb_handle_list_helper::calc_total_duration(*this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 pfc::string8 format_total_size() const { return metadb_handle_list_helper::format_total_size(*this); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 inline void sort_by_path() {metadb_handle_list_helper::sort_by_path(*this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 const t_self & operator=(const t_self & p_source) { this->remove_all(); this->add_items(p_source);return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 const t_self & operator=(const t_interface & p_source) {this->remove_all(); this->add_items(p_source);return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 const t_self & operator=(t_self && p_source) {this->move_from(p_source); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 metadb_handle_list_t(const t_self & p_source) { this->add_items(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 metadb_handle_list_t(const t_interface & p_source) { this->add_items(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 metadb_handle_list_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 metadb_handle_list_t(t_self && p_source) { this->move_from(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 t_self & operator+=(const t_interface & source) { this->add_items(source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 t_self & operator+=(const metadb_handle_ptr & source) { this->add_item(source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 bool extract_single_path(const char * &path) const {return metadb_handle_list_helper::extract_single_path(*this, path);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 typedef metadb_handle_list_t<> metadb_handle_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 namespace metadb_handle_list_helper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 void sorted_by_pointer_extract_difference(metadb_handle_list const & p_list_1,metadb_handle_list const & p_list_2,metadb_handle_list & p_list_1_specific,metadb_handle_list & p_list_2_specific);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 inline pfc::string_base & operator<<(pfc::string_base & p_fmt,const metadb_handle_ptr & p_location) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 if (p_location.is_valid())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 return p_fmt << p_location->get_location();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 return p_fmt << "[invalid location]";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 pfc::string_formatter formatTrackList( metadb_handle_list_cref );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 pfc::string_formatter formatTrackTitle(metadb_handle_ptr item, const char * script = "%title%" );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 pfc::string_formatter formatTrackTitle(metadb_handle_ptr item,service_ptr_t<class titleformat_object> script);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315