2 * Base IDirectMusicObject Implementation
3 * Keep in sync with the master in dlls/dmusic/dmobject.c
5 * Copyright (C) 2003-2004 Rok Mandeljc
6 * Copyright (C) 2014 Michael Stefaniuc
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 #include "wine/debug.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(dmobj
);
31 /* Generic IDirectMusicObject methods */
32 static inline struct dmobject
*impl_from_IDirectMusicObject(IDirectMusicObject
*iface
)
34 return CONTAINING_RECORD(iface
, struct dmobject
, IDirectMusicObject_iface
);
37 HRESULT WINAPI
dmobj_IDirectMusicObject_QueryInterface(IDirectMusicObject
*iface
, REFIID riid
,
40 struct dmobject
*This
= impl_from_IDirectMusicObject(iface
);
41 return IUnknown_QueryInterface(This
->outer_unk
, riid
, ret_iface
);
44 ULONG WINAPI
dmobj_IDirectMusicObject_AddRef(IDirectMusicObject
*iface
)
46 struct dmobject
*This
= impl_from_IDirectMusicObject(iface
);
47 return IUnknown_AddRef(This
->outer_unk
);
50 ULONG WINAPI
dmobj_IDirectMusicObject_Release(IDirectMusicObject
*iface
)
52 struct dmobject
*This
= impl_from_IDirectMusicObject(iface
);
53 return IUnknown_Release(This
->outer_unk
);
56 HRESULT WINAPI
dmobj_IDirectMusicObject_GetDescriptor(IDirectMusicObject
*iface
,
57 DMUS_OBJECTDESC
*desc
)
59 struct dmobject
*This
= impl_from_IDirectMusicObject(iface
);
61 TRACE("(%p/%p)->(%p)\n", iface
, This
, desc
);
66 memcpy(desc
, &This
->desc
, This
->desc
.dwSize
);
71 HRESULT WINAPI
dmobj_IDirectMusicObject_SetDescriptor(IDirectMusicObject
*iface
,
72 DMUS_OBJECTDESC
*desc
)
74 struct dmobject
*This
= impl_from_IDirectMusicObject(iface
);
77 TRACE("(%p, %p)\n", iface
, desc
);
82 /* Immutable property */
83 if (desc
->dwValidData
& DMUS_OBJ_CLASS
)
85 desc
->dwValidData
&= ~DMUS_OBJ_CLASS
;
88 /* Set only valid fields */
89 if (desc
->dwValidData
& DMUS_OBJ_OBJECT
)
90 This
->desc
.guidObject
= desc
->guidObject
;
91 if (desc
->dwValidData
& DMUS_OBJ_NAME
)
92 lstrcpynW(This
->desc
.wszName
, desc
->wszName
, DMUS_MAX_NAME
);
93 if (desc
->dwValidData
& DMUS_OBJ_CATEGORY
)
94 lstrcpynW(This
->desc
.wszCategory
, desc
->wszCategory
, DMUS_MAX_CATEGORY
);
95 if (desc
->dwValidData
& DMUS_OBJ_FILENAME
)
96 lstrcpynW(This
->desc
.wszFileName
, desc
->wszFileName
, DMUS_MAX_FILENAME
);
97 if (desc
->dwValidData
& DMUS_OBJ_VERSION
)
98 This
->desc
.vVersion
= desc
->vVersion
;
99 if (desc
->dwValidData
& DMUS_OBJ_DATE
)
100 This
->desc
.ftDate
= desc
->ftDate
;
101 if (desc
->dwValidData
& DMUS_OBJ_MEMORY
) {
102 This
->desc
.llMemLength
= desc
->llMemLength
;
103 memcpy(This
->desc
.pbMemData
, desc
->pbMemData
, desc
->llMemLength
);
105 if (desc
->dwValidData
& DMUS_OBJ_STREAM
)
106 IStream_Clone(desc
->pStream
, &This
->desc
.pStream
);
108 This
->desc
.dwValidData
|= desc
->dwValidData
;
113 /* Generic IPersistStream methods */
114 static inline struct dmobject
*impl_from_IPersistStream(IPersistStream
*iface
)
116 return CONTAINING_RECORD(iface
, struct dmobject
, IPersistStream_iface
);
119 HRESULT WINAPI
dmobj_IPersistStream_QueryInterface(IPersistStream
*iface
, REFIID riid
,
122 struct dmobject
*This
= impl_from_IPersistStream(iface
);
123 return IUnknown_QueryInterface(This
->outer_unk
, riid
, ret_iface
);
126 ULONG WINAPI
dmobj_IPersistStream_AddRef(IPersistStream
*iface
)
128 struct dmobject
*This
= impl_from_IPersistStream(iface
);
129 return IUnknown_AddRef(This
->outer_unk
);
132 ULONG WINAPI
dmobj_IPersistStream_Release(IPersistStream
*iface
)
134 struct dmobject
*This
= impl_from_IPersistStream(iface
);
135 return IUnknown_Release(This
->outer_unk
);
138 HRESULT WINAPI
dmobj_IPersistStream_GetClassID(IPersistStream
*iface
, CLSID
*class)
140 struct dmobject
*This
= impl_from_IPersistStream(iface
);
142 TRACE("(%p, %p)\n", This
, class);
147 *class = This
->desc
.guidClass
;
152 /* IPersistStream methods not implemented in native */
153 HRESULT WINAPI
unimpl_IPersistStream_GetClassID(IPersistStream
*iface
, CLSID
*class)
155 TRACE("(%p, %p): method not implemented\n", iface
, class);
159 HRESULT WINAPI
unimpl_IPersistStream_IsDirty(IPersistStream
*iface
)
161 TRACE("(%p): method not implemented, always returning S_FALSE\n", iface
);
165 HRESULT WINAPI
unimpl_IPersistStream_Save(IPersistStream
*iface
, IStream
*stream
,
168 TRACE("(%p, %p, %d): method not implemented\n", iface
, stream
, clear_dirty
);
172 HRESULT WINAPI
unimpl_IPersistStream_GetSizeMax(IPersistStream
*iface
, ULARGE_INTEGER
*size
)
174 TRACE("(%p, %p): method not implemented\n", iface
, size
);
179 void dmobject_init(struct dmobject
*dmobj
, const GUID
*class, IUnknown
*outer_unk
)
181 dmobj
->outer_unk
= outer_unk
;
182 dmobj
->desc
.dwSize
= sizeof(dmobj
->desc
);
183 dmobj
->desc
.dwValidData
= DMUS_OBJ_CLASS
;
184 dmobj
->desc
.guidClass
= *class;