Added LGPL standard comment, and copyright notices where necessary.
[wine] / dlls / quartz / imcntl.c
1 /*
2  * Implementation of IMediaControl for FilterGraph.
3  *
4  * FIXME - stub.
5  *
6  * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
7  *
8  * This library 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.
12  *
13  * This library 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.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23 #include "config.h"
24
25 #include "windef.h"
26 #include "winbase.h"
27 #include "wingdi.h"
28 #include "winuser.h"
29 #include "winerror.h"
30 #include "oleauto.h"
31 #include "strmif.h"
32 #include "control.h"
33 #include "uuids.h"
34
35 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(quartz);
37
38 #include "quartz_private.h"
39 #include "fgraph.h"
40
41
42
43 static HRESULT WINAPI
44 IMediaControl_fnQueryInterface(IMediaControl* iface,REFIID riid,void** ppobj)
45 {
46         CFilterGraph_THIS(iface,mediacontrol);
47
48         TRACE("(%p)->()\n",This);
49
50         return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
51 }
52
53 static ULONG WINAPI
54 IMediaControl_fnAddRef(IMediaControl* iface)
55 {
56         CFilterGraph_THIS(iface,mediacontrol);
57
58         TRACE("(%p)->()\n",This);
59
60         return IUnknown_AddRef(This->unk.punkControl);
61 }
62
63 static ULONG WINAPI
64 IMediaControl_fnRelease(IMediaControl* iface)
65 {
66         CFilterGraph_THIS(iface,mediacontrol);
67
68         TRACE("(%p)->()\n",This);
69
70         return IUnknown_Release(This->unk.punkControl);
71 }
72
73 static HRESULT WINAPI
74 IMediaControl_fnGetTypeInfoCount(IMediaControl* iface,UINT* pcTypeInfo)
75 {
76         CFilterGraph_THIS(iface,mediacontrol);
77
78         FIXME("(%p)->()\n",This);
79
80         return E_NOTIMPL;
81 }
82
83 static HRESULT WINAPI
84 IMediaControl_fnGetTypeInfo(IMediaControl* iface,UINT iTypeInfo, LCID lcid, ITypeInfo** ppobj)
85 {
86         CFilterGraph_THIS(iface,mediacontrol);
87
88         FIXME("(%p)->()\n",This);
89
90         return E_NOTIMPL;
91 }
92
93 static HRESULT WINAPI
94 IMediaControl_fnGetIDsOfNames(IMediaControl* iface,REFIID riid, LPOLESTR* ppwszName, UINT cNames, LCID lcid, DISPID* pDispId)
95 {
96         CFilterGraph_THIS(iface,mediacontrol);
97
98         FIXME("(%p)->()\n",This);
99
100         return E_NOTIMPL;
101 }
102
103 static HRESULT WINAPI
104 IMediaControl_fnInvoke(IMediaControl* iface,DISPID DispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarRes, EXCEPINFO* pExcepInfo, UINT* puArgErr)
105 {
106         CFilterGraph_THIS(iface,mediacontrol);
107
108         FIXME("(%p)->()\n",This);
109
110         return E_NOTIMPL;
111 }
112
113
114 static HRESULT WINAPI
115 IMediaControl_fnRun(IMediaControl* iface)
116 {
117         CFilterGraph_THIS(iface,mediacontrol);
118
119         TRACE("(%p)->()\n",This);
120
121         return IMediaFilter_Run( CFilterGraph_IMediaFilter(This),
122                         (REFERENCE_TIME)0 );
123 }
124
125 static HRESULT WINAPI
126 IMediaControl_fnPause(IMediaControl* iface)
127 {
128         CFilterGraph_THIS(iface,mediacontrol);
129
130         TRACE("(%p)->()\n",This);
131
132         return IMediaFilter_Pause( CFilterGraph_IMediaFilter(This) );
133 }
134
135 static HRESULT WINAPI
136 IMediaControl_fnStop(IMediaControl* iface)
137 {
138         CFilterGraph_THIS(iface,mediacontrol);
139         HRESULT hr;
140         FILTER_STATE    fs;
141
142         TRACE("(%p)->()\n",This);
143
144         hr = IMediaControl_GetState(iface,INFINITE,(OAFilterState*)&fs);
145         if ( SUCCEEDED(hr) && fs == State_Running )
146         {
147                 hr = IMediaControl_Pause(iface);
148                 if ( SUCCEEDED(hr) )
149                         hr = IMediaControl_GetState(iface,INFINITE,(OAFilterState*)&fs);
150         }
151
152         if ( SUCCEEDED(hr) && fs == State_Paused )
153         {
154                 hr = IMediaFilter_Stop(CFilterGraph_IMediaFilter(This));
155                 if ( SUCCEEDED(hr) )
156                         hr = IMediaControl_GetState(iface,INFINITE,(OAFilterState*)&fs);
157         }
158
159         return hr;
160 }
161
162 static HRESULT WINAPI
163 IMediaControl_fnGetState(IMediaControl* iface,LONG lTimeOut,OAFilterState* pFilterState)
164 {
165         CFilterGraph_THIS(iface,mediacontrol);
166
167         TRACE("(%p)->()\n",This);
168
169         return IMediaFilter_GetState( CFilterGraph_IMediaFilter(This), (DWORD)lTimeOut, (FILTER_STATE*)pFilterState );
170 }
171
172 static HRESULT WINAPI
173 IMediaControl_fnRenderFile(IMediaControl* iface,BSTR bstrFileName)
174 {
175         CFilterGraph_THIS(iface,mediacontrol);
176         UINT    uLen;
177         WCHAR*  pwszName;
178         HRESULT hr;
179
180         TRACE("(%p)->()\n",This);
181
182         uLen = SysStringLen(bstrFileName);
183         pwszName = (WCHAR*)QUARTZ_AllocMem( sizeof(WCHAR) * (uLen+1) );
184         if ( pwszName == NULL )
185                 return E_OUTOFMEMORY;
186         memcpy( pwszName, bstrFileName, sizeof(WCHAR)*uLen );
187         pwszName[uLen] = (WCHAR)0;
188
189         hr = IFilterGraph2_RenderFile(
190                 CFilterGraph_IFilterGraph2(This), pwszName, NULL );
191
192         QUARTZ_FreeMem( pwszName );
193
194         return hr;
195 }
196
197 static HRESULT WINAPI
198 IMediaControl_fnAddSourceFilter(IMediaControl* iface,BSTR bstrFileName,IDispatch** ppobj)
199 {
200         CFilterGraph_THIS(iface,mediacontrol);
201
202         FIXME("(%p)->()\n",This);
203
204         return E_NOTIMPL;
205 }
206
207 static HRESULT WINAPI
208 IMediaControl_fnget_FilterCollection(IMediaControl* iface,IDispatch** ppobj)
209 {
210         CFilterGraph_THIS(iface,mediacontrol);
211
212         FIXME("(%p)->()\n",This);
213
214         return E_NOTIMPL;
215 }
216
217 static HRESULT WINAPI
218 IMediaControl_fnget_RegFilterCollection(IMediaControl* iface,IDispatch** ppobj)
219 {
220         CFilterGraph_THIS(iface,mediacontrol);
221
222         FIXME("(%p)->()\n",This);
223
224         return E_NOTIMPL;
225 }
226
227 static HRESULT WINAPI
228 IMediaControl_fnStopWhenReady(IMediaControl* iface)
229 {
230         CFilterGraph_THIS(iface,mediacontrol);
231
232         TRACE("(%p)->()\n",This);
233
234         return IMediaFilter_Stop( CFilterGraph_IMediaFilter(This) );
235 }
236
237
238 static ICOM_VTABLE(IMediaControl) imediacontrol =
239 {
240         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
241         /* IUnknown fields */
242         IMediaControl_fnQueryInterface,
243         IMediaControl_fnAddRef,
244         IMediaControl_fnRelease,
245         /* IDispatch fields */
246         IMediaControl_fnGetTypeInfoCount,
247         IMediaControl_fnGetTypeInfo,
248         IMediaControl_fnGetIDsOfNames,
249         IMediaControl_fnInvoke,
250         /* IMediaControl fields */
251         IMediaControl_fnRun,
252         IMediaControl_fnPause,
253         IMediaControl_fnStop,
254         IMediaControl_fnGetState,
255         IMediaControl_fnRenderFile,
256         IMediaControl_fnAddSourceFilter,
257         IMediaControl_fnget_FilterCollection,
258         IMediaControl_fnget_RegFilterCollection,
259         IMediaControl_fnStopWhenReady,
260 };
261
262
263 HRESULT CFilterGraph_InitIMediaControl( CFilterGraph* pfg )
264 {
265         TRACE("(%p)\n",pfg);
266         ICOM_VTBL(&pfg->mediacontrol) = &imediacontrol;
267
268         return NOERROR;
269 }
270
271 void CFilterGraph_UninitIMediaControl( CFilterGraph* pfg )
272 {
273         TRACE("(%p)\n",pfg);
274 }