annotate foosdk/sdk/foobar2000/SDK/ole_interaction.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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef _WIN32
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 #include "mem_block_container.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "playlist.h"
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 class NOVTABLE playlist_dataobject_desc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 virtual t_size get_entry_count() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 virtual void get_entry_name(t_size which, pfc::string_base & out) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 virtual void get_entry_content(t_size which, metadb_handle_list_ref out) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 virtual void set_entry_count(t_size count) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 virtual void set_entry_name(t_size which, const char * name) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 virtual void set_entry_content(t_size which, metadb_handle_list_cref content) = 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 void copy(playlist_dataobject_desc const & source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 const t_size count = source.get_entry_count(); set_entry_count(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 metadb_handle_list content; pfc::string8 name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 for(t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 source.get_entry_name(walk,name); source.get_entry_content(walk,content);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 set_entry_name(walk,name); set_entry_content(walk,content);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 ~playlist_dataobject_desc() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 const playlist_dataobject_desc & operator=(const playlist_dataobject_desc &) {return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 class NOVTABLE playlist_dataobject_desc_v2 : public playlist_dataobject_desc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 virtual void get_side_data(t_size which, mem_block_container & out) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 virtual void set_side_data(t_size which, const void * data, t_size size) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 void copy(playlist_dataobject_desc_v2 const & source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 const t_size count = source.get_entry_count(); set_entry_count(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 metadb_handle_list content; pfc::string8 name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 mem_block_container_impl_t<pfc::alloc_fast_aggressive> sideData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 for(t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 source.get_entry_name(walk,name); source.get_entry_content(walk,content); source.get_side_data(walk, sideData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 set_entry_name(walk,name); set_entry_content(walk,content); set_side_data(walk, sideData.get_ptr(), sideData.get_size());
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 void set_from_playlist_manager(bit_array const & mask) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 auto api = playlist_manager_v4::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 const t_size pltotal = api->get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 const t_size total = mask.calc_count(true,0,pltotal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 set_entry_count(total);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 t_size done = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 pfc::string8 name; metadb_handle_list content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 for(t_size walk = 0; walk < pltotal; ++walk) if (mask[walk]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 pfc::dynamic_assert( done < total );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 api->playlist_get_name(walk,name); api->playlist_get_all_items(walk,content);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 set_entry_name(done,name); set_entry_content(done,content);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 stream_writer_buffer_simple sideData; api->playlist_get_sideinfo(walk, &sideData, fb2k::noAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 set_side_data(done,sideData.m_buffer.get_ptr(), sideData.m_buffer.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 ++done;
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 pfc::dynamic_assert( done == total );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 const playlist_dataobject_desc_v2 & operator=(const playlist_dataobject_desc_v2& source) {copy(source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 ~playlist_dataobject_desc_v2() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 class playlist_dataobject_desc_impl : public playlist_dataobject_desc_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 playlist_dataobject_desc_impl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 playlist_dataobject_desc_impl(const playlist_dataobject_desc_v2 & source) {copy(source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 t_size get_entry_count() const {return m_entries.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 void get_entry_name(t_size which, pfc::string_base & out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (which < m_entries.get_size()) out = m_entries[which].m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 else throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 void get_entry_content(t_size which, metadb_handle_list_ref out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 if (which < m_entries.get_size()) out = m_entries[which].m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 else throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 void set_entry_count(t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 m_entries.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 void set_entry_name(t_size which, const char * name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 if (which < m_entries.get_size()) m_entries[which].m_name = name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 else throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 void set_entry_content(t_size which, metadb_handle_list_cref content) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 if (which < m_entries.get_size()) m_entries[which].m_content = content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 else throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 void get_side_data(t_size which, mem_block_container & out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 if (which < m_entries.get_size()) out.set(m_entries[which].m_sideData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 else throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 void set_side_data(t_size which, const void * data, t_size size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 if (which < m_entries.get_size()) m_entries[which].m_sideData.set_data_fromptr(reinterpret_cast<const t_uint8*>(data), size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 else throw pfc::exception_invalid_params();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 struct entry { metadb_handle_list m_content; pfc::string8 m_name; pfc::array_t<t_uint8> m_sideData; };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 pfc::array_t<entry> m_entries;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 //! \since 0.9.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 //! Provides various methods for interaction between foobar2000 and OLE IDataObjects, Windows Clipboard, drag&drop and such. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 //! To instantiate, use ole_interaction::get().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 class NOVTABLE ole_interaction : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 FB2K_MAKE_SERVICE_COREAPI(ole_interaction)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 KClipboardFormatSimpleLocations,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 KClipboardFormatFPL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 KClipboardFormatMultiFPL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 KClipboardFormatTotal
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 //! Retrieves clipboard format ID for one of foobar2000's internal data formats.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 //! @param which One of KClipboardFormat* constants.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 virtual t_uint32 get_clipboard_format(t_uint32 which) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 //! Creates an IDataObject from a group of tracks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 virtual pfc::com_ptr_t<IDataObject> create_dataobject(metadb_handle_list_cref source) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 //! Creates an IDataObject from one or more playlists, including playlist name info for re-creating those playlists later.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 virtual pfc::com_ptr_t<IDataObject> create_dataobject(const playlist_dataobject_desc & source) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 //! Attempts to parse an IDataObject as playlists.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 virtual HRESULT parse_dataobject_playlists(pfc::com_ptr_t<IDataObject> obj, playlist_dataobject_desc & out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //! For internal use only. Will succeed only if the metadb_handle list can be generated immediately, without performing potentially timeconsuming tasks such as parsing media files (for an example when the specified IDataObject contains data in one of our internal formats).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 virtual HRESULT parse_dataobject_immediate(pfc::com_ptr_t<IDataObject> obj, metadb_handle_list_ref out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 //! Attempts to parse an IDataObject into a dropped_files_data object (list of metadb_handles if immediately available, list of file paths otherwise).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 virtual HRESULT parse_dataobject(pfc::com_ptr_t<IDataObject> obj, dropped_files_data & out) = 0;
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 //! Checks whether the specified IDataObject appears to be parsable by our parse_dataobject methods.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 virtual HRESULT check_dataobject(pfc::com_ptr_t<IDataObject> obj, DWORD & dropEffect, bool & isNative) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 //! Checks whether the specified IDataObject appears to be parsable as playlists (parse_dataobject_playlists method).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 virtual HRESULT check_dataobject_playlists(pfc::com_ptr_t<IDataObject> obj) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 //! \since 0.9.5.4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 class NOVTABLE ole_interaction_v2 : public ole_interaction {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(ole_interaction_v2, ole_interaction)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 //! Creates an IDataObject from one or more playlists, including playlist name info for re-creating those playlists later.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 virtual pfc::com_ptr_t<IDataObject> create_dataobject(const playlist_dataobject_desc_v2 & source) = 0;
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 //! Attempts to parse an IDataObject as playlists.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 virtual HRESULT parse_dataobject_playlists(pfc::com_ptr_t<IDataObject> obj, playlist_dataobject_desc_v2 & out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 #endif // _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158