2 * Implements CLSID_FileWriter.
4 * Copyright (C) Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
38 #include "wine/debug.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(quartz);
41 #include "quartz_private.h"
45 static const WCHAR QUARTZ_FileWriter_Name[] =
46 { 'F','i','l','e',' ','W','r','i','t','e','r',0 };
47 static const WCHAR QUARTZ_FileWriterPin_Name[] =
51 /* FIXME - add this flag to strmif.h */
52 #define AM_FILE_OVERWRITE 0x1
54 /***************************************************************************
56 * CFileWriterImpl methods
60 static HRESULT CFileWriterImpl_OnActive( CBaseFilterImpl* pImpl )
62 CFileWriterImpl_THIS(pImpl,basefilter);
64 FIXME( "(%p)\n", This );
69 static HRESULT CFileWriterImpl_OnInactive( CBaseFilterImpl* pImpl )
71 CFileWriterImpl_THIS(pImpl,basefilter);
73 FIXME( "(%p)\n", This );
78 static const CBaseFilterHandlers filterhandlers =
80 CFileWriterImpl_OnActive, /* pOnActive */
81 CFileWriterImpl_OnInactive, /* pOnInactive */
86 /***************************************************************************
88 * CFileWriterPinImpl methods
92 static HRESULT CFileWriterPinImpl_OnPreConnect( CPinBaseImpl* pImpl, IPin* pPin )
94 CFileWriterPinImpl_THIS(pImpl,pin);
96 TRACE("(%p,%p)\n",This,pPin);
101 static HRESULT CFileWriterPinImpl_OnPostConnect( CPinBaseImpl* pImpl, IPin* pPin )
103 CFileWriterPinImpl_THIS(pImpl,pin);
105 TRACE("(%p,%p)\n",This,pPin);
110 static HRESULT CFileWriterPinImpl_OnDisconnect( CPinBaseImpl* pImpl )
112 CFileWriterPinImpl_THIS(pImpl,pin);
114 TRACE("(%p)\n",This);
116 if ( This->meminput.pAllocator != NULL )
118 IMemAllocator_Decommit(This->meminput.pAllocator);
119 IMemAllocator_Release(This->meminput.pAllocator);
120 This->meminput.pAllocator = NULL;
126 static HRESULT CFileWriterPinImpl_CheckMediaType( CPinBaseImpl* pImpl, const AM_MEDIA_TYPE* pmt )
128 CFileWriterPinImpl_THIS(pImpl,pin);
130 TRACE("(%p,%p)\n",This,pmt);
132 if ( !IsEqualGUID( &pmt->majortype, &MEDIATYPE_Stream ) )
138 static HRESULT CFileWriterPinImpl_Receive( CPinBaseImpl* pImpl, IMediaSample* pSample )
140 CFileWriterPinImpl_THIS(pImpl,pin);
145 REFERENCE_TIME rtStart;
146 REFERENCE_TIME rtEnd;
147 LARGE_INTEGER dlibMove;
149 TRACE( "(%p,%p)\n",This,pSample );
151 if ( This->pRender->m_fInFlush )
153 if ( pSample == NULL )
156 hr = IMediaSample_GetPointer(pSample,&pData);
159 lLength = (LONG)IMediaSample_GetActualDataLength(pSample);
165 ERR( "invalid length: %ld\n", lLength );
169 hr = IMediaSample_GetTime( pSample, &rtStart, &rtEnd );
173 dlibMove.QuadPart = rtStart;
174 hr = IStream_Seek(CFileWriterPinImpl_IStream(This),dlibMove,STREAM_SEEK_SET,NULL);
178 hr = IStream_Write(CFileWriterPinImpl_IStream(This),pData,lLength,&cbWritten);
183 static HRESULT CFileWriterPinImpl_ReceiveCanBlock( CPinBaseImpl* pImpl )
185 CFileWriterPinImpl_THIS(pImpl,pin);
187 TRACE( "(%p)\n", This );
192 static HRESULT CFileWriterPinImpl_EndOfStream( CPinBaseImpl* pImpl )
194 CFileWriterPinImpl_THIS(pImpl,pin);
196 FIXME( "(%p)\n", This );
198 This->pRender->m_fInFlush = FALSE;
200 /* FIXME - don't notify twice until stopped or seeked. */
201 return CBaseFilterImpl_MediaEventNotify(
202 &This->pRender->basefilter, EC_COMPLETE,
203 (LONG_PTR)S_OK, (LONG_PTR)(IBaseFilter*)(This->pRender) );
206 static HRESULT CFileWriterPinImpl_BeginFlush( CPinBaseImpl* pImpl )
208 CFileWriterPinImpl_THIS(pImpl,pin);
210 FIXME( "(%p)\n", This );
212 This->pRender->m_fInFlush = TRUE;
217 static HRESULT CFileWriterPinImpl_EndFlush( CPinBaseImpl* pImpl )
219 CFileWriterPinImpl_THIS(pImpl,pin);
221 FIXME( "(%p)\n", This );
223 This->pRender->m_fInFlush = FALSE;
228 static HRESULT CFileWriterPinImpl_NewSegment( CPinBaseImpl* pImpl, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double rate )
230 CFileWriterPinImpl_THIS(pImpl,pin);
232 FIXME( "(%p)\n", This );
234 This->pRender->m_fInFlush = FALSE;
242 static const CBasePinHandlers pinhandlers =
244 CFileWriterPinImpl_OnPreConnect, /* pOnPreConnect */
245 CFileWriterPinImpl_OnPostConnect, /* pOnPostConnect */
246 CFileWriterPinImpl_OnDisconnect, /* pOnDisconnect */
247 CFileWriterPinImpl_CheckMediaType, /* pCheckMediaType */
248 NULL, /* pQualityNotify */
249 CFileWriterPinImpl_Receive, /* pReceive */
250 CFileWriterPinImpl_ReceiveCanBlock, /* pReceiveCanBlock */
251 CFileWriterPinImpl_EndOfStream, /* pEndOfStream */
252 CFileWriterPinImpl_BeginFlush, /* pBeginFlush */
253 CFileWriterPinImpl_EndFlush, /* pEndFlush */
254 CFileWriterPinImpl_NewSegment, /* pNewSegment */
258 /***************************************************************************
260 * new/delete CFileWriterImpl
264 /* can I use offsetof safely? - FIXME? */
265 static QUARTZ_IFEntry FilterIFEntries[] =
267 { &IID_IPersist, offsetof(CFileWriterImpl,basefilter)-offsetof(CFileWriterImpl,unk) },
268 { &IID_IMediaFilter, offsetof(CFileWriterImpl,basefilter)-offsetof(CFileWriterImpl,unk) },
269 { &IID_IBaseFilter, offsetof(CFileWriterImpl,basefilter)-offsetof(CFileWriterImpl,unk) },
270 { &IID_IFileSinkFilter, offsetof(CFileWriterImpl,filesink)-offsetof(CFileWriterImpl,unk) },
271 { &IID_IFileSinkFilter2, offsetof(CFileWriterImpl,filesink)-offsetof(CFileWriterImpl,unk) },
274 static HRESULT CFileWriterImpl_OnQueryInterface(
275 IUnknown* punk, const IID* piid, void** ppobj )
277 CFileWriterImpl_THIS(punk,unk);
279 if ( This->pSeekPass == NULL )
280 return E_NOINTERFACE;
282 if ( IsEqualGUID( &IID_IMediaPosition, piid ) ||
283 IsEqualGUID( &IID_IMediaSeeking, piid ) )
285 TRACE( "IMediaSeeking(or IMediaPosition) is queried\n" );
286 return IUnknown_QueryInterface( (IUnknown*)(&This->pSeekPass->unk), piid, ppobj );
289 return E_NOINTERFACE;
292 static void QUARTZ_DestroyFileWriter(IUnknown* punk)
294 CFileWriterImpl_THIS(punk,unk);
296 TRACE( "(%p)\n", This );
297 CFileWriterImpl_OnInactive(&This->basefilter);
299 if ( This->pPin != NULL )
301 IUnknown_Release(This->pPin->unk.punkControl);
304 if ( This->pSeekPass != NULL )
306 IUnknown_Release((IUnknown*)&This->pSeekPass->unk);
307 This->pSeekPass = NULL;
310 if ( This->m_hFile != INVALID_HANDLE_VALUE )
312 CloseHandle( This->m_hFile );
313 This->m_hFile = INVALID_HANDLE_VALUE;
315 if ( This->m_pszFileName != NULL )
317 QUARTZ_FreeMem( This->m_pszFileName );
318 This->m_pszFileName = NULL;
320 QUARTZ_MediaType_Free( &This->m_mt );
322 CFileWriterImpl_UninitIFileSinkFilter2(This);
323 CBaseFilterImpl_UninitIBaseFilter(&This->basefilter);
325 DeleteCriticalSection( &This->m_csReceive );
328 HRESULT QUARTZ_CreateFileWriter(IUnknown* punkOuter,void** ppobj)
330 CFileWriterImpl* This = NULL;
333 TRACE("(%p,%p)\n",punkOuter,ppobj);
335 This = (CFileWriterImpl*)
336 QUARTZ_AllocObj( sizeof(CFileWriterImpl) );
338 return E_OUTOFMEMORY;
339 This->pSeekPass = NULL;
341 This->m_fInFlush = FALSE;
343 This->m_hFile = INVALID_HANDLE_VALUE;
344 This->m_pszFileName = NULL;
345 This->m_cbFileName = 0;
347 ZeroMemory( &This->m_mt, sizeof(AM_MEDIA_TYPE) );
349 QUARTZ_IUnkInit( &This->unk, punkOuter );
350 This->qiext.pNext = NULL;
351 This->qiext.pOnQueryInterface = &CFileWriterImpl_OnQueryInterface;
352 QUARTZ_IUnkAddDelegation( &This->unk, &This->qiext );
354 hr = CBaseFilterImpl_InitIBaseFilter(
356 This->unk.punkControl,
358 QUARTZ_FileWriter_Name,
362 hr = CFileWriterImpl_InitIFileSinkFilter2(This);
365 CBaseFilterImpl_UninitIBaseFilter(&This->basefilter);
371 QUARTZ_FreeObj(This);
375 This->unk.pEntries = FilterIFEntries;
376 This->unk.dwEntries = sizeof(FilterIFEntries)/sizeof(FilterIFEntries[0]);
377 This->unk.pOnFinalRelease = QUARTZ_DestroyFileWriter;
379 InitializeCriticalSection( &This->m_csReceive );
381 hr = QUARTZ_CreateFileWriterPin(
383 &This->basefilter.csFilter,
387 hr = QUARTZ_CompList_AddComp(
388 This->basefilter.pInPins,
389 (IUnknown*)&This->pPin->pin,
392 hr = QUARTZ_CreateSeekingPassThruInternal(
393 (IUnknown*)&(This->unk), &This->pSeekPass,
394 TRUE, (IPin*)&(This->pPin->pin) );
398 IUnknown_Release( This->unk.punkControl );
402 *ppobj = (void*)&(This->unk);
407 /***************************************************************************
409 * new/delete CFileWriterPinImpl
413 /* can I use offsetof safely? - FIXME? */
414 static QUARTZ_IFEntry PinIFEntries[] =
416 { &IID_IPin, offsetof(CFileWriterPinImpl,pin)-offsetof(CFileWriterPinImpl,unk) },
417 { &IID_IMemInputPin, offsetof(CFileWriterPinImpl,meminput)-offsetof(CFileWriterPinImpl,unk) },
418 { &IID_IStream, offsetof(CFileWriterPinImpl,stream)-offsetof(CFileWriterPinImpl,unk) },
421 static void QUARTZ_DestroyFileWriterPin(IUnknown* punk)
423 CFileWriterPinImpl_THIS(punk,unk);
425 TRACE( "(%p)\n", This );
427 CPinBaseImpl_UninitIPin( &This->pin );
428 CMemInputPinBaseImpl_UninitIMemInputPin( &This->meminput );
429 CFileWriterPinImpl_UninitIStream(This);
432 HRESULT QUARTZ_CreateFileWriterPin(
433 CFileWriterImpl* pFilter,
434 CRITICAL_SECTION* pcsPin,
435 CRITICAL_SECTION* pcsPinReceive,
436 CFileWriterPinImpl** ppPin)
438 CFileWriterPinImpl* This = NULL;
441 TRACE("(%p,%p,%p,%p)\n",pFilter,pcsPin,pcsPinReceive,ppPin);
443 This = (CFileWriterPinImpl*)
444 QUARTZ_AllocObj( sizeof(CFileWriterPinImpl) );
446 return E_OUTOFMEMORY;
448 QUARTZ_IUnkInit( &This->unk, NULL );
449 This->pRender = pFilter;
451 hr = CPinBaseImpl_InitIPin(
453 This->unk.punkControl,
454 pcsPin, pcsPinReceive,
455 &pFilter->basefilter,
456 QUARTZ_FileWriterPin_Name,
462 hr = CMemInputPinBaseImpl_InitIMemInputPin(
464 This->unk.punkControl,
468 hr = CFileWriterPinImpl_InitIStream(This);
471 CMemInputPinBaseImpl_UninitIMemInputPin(&This->meminput);
477 CPinBaseImpl_UninitIPin( &This->pin );
483 QUARTZ_FreeObj(This);
487 This->unk.pEntries = PinIFEntries;
488 This->unk.dwEntries = sizeof(PinIFEntries)/sizeof(PinIFEntries[0]);
489 This->unk.pOnFinalRelease = QUARTZ_DestroyFileWriterPin;
493 TRACE("returned successfully.\n");
498 /***************************************************************************
500 * CFileWriterPinImpl::IStream
504 static HRESULT WINAPI
505 IStream_fnQueryInterface(IStream* iface,REFIID riid,void** ppobj)
507 CFileWriterPinImpl_THIS(iface,stream);
509 TRACE("(%p)->()\n",This);
511 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
515 IStream_fnAddRef(IStream* iface)
517 CFileWriterPinImpl_THIS(iface,stream);
519 TRACE("(%p)->()\n",This);
521 return IUnknown_AddRef(This->unk.punkControl);
525 IStream_fnRelease(IStream* iface)
527 CFileWriterPinImpl_THIS(iface,stream);
529 TRACE("(%p)->()\n",This);
531 return IUnknown_Release(This->unk.punkControl);
534 static HRESULT WINAPI
535 IStream_fnRead(IStream* iface,void* pv,ULONG cb,ULONG* pcbRead)
537 CFileWriterPinImpl_THIS(iface,stream);
539 FIXME("(%p)->()\n",This);
544 static HRESULT WINAPI
545 IStream_fnWrite(IStream* iface,const void* pv,ULONG cb,ULONG* pcbWritten)
547 CFileWriterPinImpl_THIS(iface,stream);
550 FIXME("(%p)->(%p,%lu,%p)\n",This,pv,cb,pcbWritten);
552 EnterCriticalSection( &This->pRender->m_csReceive );
553 if ( This->pRender->m_hFile == INVALID_HANDLE_VALUE )
559 if ( ! WriteFile( This->pRender->m_hFile, pv, cb, pcbWritten, NULL ) )
567 LeaveCriticalSection( &This->pRender->m_csReceive );
571 static HRESULT WINAPI
572 IStream_fnSeek(IStream* iface,LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER* plibNewPosition)
574 CFileWriterPinImpl_THIS(iface,stream);
579 FIXME("(%p)->() stub!\n",This);
581 EnterCriticalSection( &This->pRender->m_csReceive );
582 if ( This->pRender->m_hFile == INVALID_HANDLE_VALUE )
588 dwDistLow = dlibMove.s.LowPart;
589 lDistHigh = dlibMove.s.HighPart;
592 dwDistLow = SetFilePointer( This->pRender->m_hFile, (LONG)dwDistLow, &lDistHigh, dwOrigin );
593 if ( dwDistLow == 0xffffffff && GetLastError() != 0 )
599 if ( plibNewPosition != NULL )
601 plibNewPosition->s.LowPart = dwDistLow;
602 plibNewPosition->s.HighPart = lDistHigh;
607 LeaveCriticalSection( &This->pRender->m_csReceive );
611 static HRESULT WINAPI
612 IStream_fnSetSize(IStream* iface,ULARGE_INTEGER libNewSize)
614 CFileWriterPinImpl_THIS(iface,stream);
616 FIXME("(%p)->() stub!\n",This);
618 if ( This->pRender->m_hFile == INVALID_HANDLE_VALUE )
625 static HRESULT WINAPI
626 IStream_fnCopyTo(IStream* iface,IStream* pstrm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten)
628 CFileWriterPinImpl_THIS(iface,stream);
630 FIXME("(%p)->()\n",This);
635 static HRESULT WINAPI
636 IStream_fnCommit(IStream* iface,DWORD grfCommitFlags)
638 CFileWriterPinImpl_THIS(iface,stream);
640 FIXME("(%p)->() stub!\n",This);
645 static HRESULT WINAPI
646 IStream_fnRevert(IStream* iface)
648 CFileWriterPinImpl_THIS(iface,stream);
650 FIXME("(%p)->() stub!\n",This);
655 static HRESULT WINAPI
656 IStream_fnLockRegion(IStream* iface,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType)
658 CFileWriterPinImpl_THIS(iface,stream);
660 FIXME("(%p)->() stub!\n",This);
665 static HRESULT WINAPI
666 IStream_fnUnlockRegion(IStream* iface,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType)
668 CFileWriterPinImpl_THIS(iface,stream);
670 FIXME("(%p)->() stub!\n",This);
675 static HRESULT WINAPI
676 IStream_fnStat(IStream* iface,STATSTG* pstatstg,DWORD grfStatFlag)
678 CFileWriterPinImpl_THIS(iface,stream);
680 FIXME("(%p)->() stub!\n",This);
685 static HRESULT WINAPI
686 IStream_fnClone(IStream* iface,IStream** ppstrm)
688 CFileWriterPinImpl_THIS(iface,stream);
690 FIXME("(%p)->() stub!\n",This);
695 static ICOM_VTABLE(IStream) istream =
697 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
698 /* IUnknown fields */
699 IStream_fnQueryInterface,
710 IStream_fnLockRegion,
711 IStream_fnUnlockRegion,
716 HRESULT CFileWriterPinImpl_InitIStream( CFileWriterPinImpl* This )
718 TRACE("(%p)\n",This);
719 ICOM_VTBL(&This->stream) = &istream;
724 HRESULT CFileWriterPinImpl_UninitIStream( CFileWriterPinImpl* This )
726 TRACE("(%p)\n",This);
732 /***************************************************************************
734 * CFileWriterImpl::IFileSinkFilter2
738 static HRESULT WINAPI
739 IFileSinkFilter2_fnQueryInterface(IFileSinkFilter2* iface,REFIID riid,void** ppobj)
741 CFileWriterImpl_THIS(iface,filesink);
743 TRACE("(%p)->()\n",This);
745 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
749 IFileSinkFilter2_fnAddRef(IFileSinkFilter2* iface)
751 CFileWriterImpl_THIS(iface,filesink);
753 TRACE("(%p)->()\n",This);
755 return IUnknown_AddRef(This->unk.punkControl);
759 IFileSinkFilter2_fnRelease(IFileSinkFilter2* iface)
761 CFileWriterImpl_THIS(iface,filesink);
763 TRACE("(%p)->()\n",This);
765 return IUnknown_Release(This->unk.punkControl);
768 static HRESULT WINAPI
769 IFileSinkFilter2_fnSetFileName(IFileSinkFilter2* iface,LPCOLESTR pszFileName,const AM_MEDIA_TYPE* pmt)
771 CFileWriterImpl_THIS(iface,filesink);
774 TRACE("(%p)->(%s,%p)\n",This,debugstr_w(pszFileName),pmt);
776 if ( pszFileName == NULL )
779 if ( This->m_pszFileName != NULL )
782 This->m_cbFileName = sizeof(WCHAR)*(lstrlenW(pszFileName)+1);
783 This->m_pszFileName = (WCHAR*)QUARTZ_AllocMem( This->m_cbFileName );
784 if ( This->m_pszFileName == NULL )
785 return E_OUTOFMEMORY;
786 memcpy( This->m_pszFileName, pszFileName, This->m_cbFileName );
790 hr = QUARTZ_MediaType_Copy( &This->m_mt, pmt );
796 ZeroMemory( &This->m_mt, sizeof(AM_MEDIA_TYPE) );
797 memcpy( &This->m_mt.majortype, &MEDIATYPE_Stream, sizeof(GUID) );
798 memcpy( &This->m_mt.subtype, &MEDIASUBTYPE_NULL, sizeof(GUID) );
799 This->m_mt.lSampleSize = 1;
800 memcpy( &This->m_mt.formattype, &FORMAT_None, sizeof(GUID) );
803 This->m_hFile = CreateFileW(
808 ( This->m_dwMode == AM_FILE_OVERWRITE ) ? CREATE_ALWAYS : OPEN_ALWAYS,
809 FILE_ATTRIBUTE_NORMAL,
811 if ( This->m_hFile == INVALID_HANDLE_VALUE )
817 This->pPin->pin.pmtAcceptTypes = &This->m_mt;
818 This->pPin->pin.cAcceptTypes = 1;
825 static HRESULT WINAPI
826 IFileSinkFilter2_fnGetCurFile(IFileSinkFilter2* iface,LPOLESTR* ppszFileName,AM_MEDIA_TYPE* pmt)
828 CFileWriterImpl_THIS(iface,filesink);
829 HRESULT hr = E_NOTIMPL;
831 TRACE("(%p)->(%p,%p)\n",This,ppszFileName,pmt);
833 if ( ppszFileName == NULL || pmt == NULL )
836 if ( This->m_pszFileName == NULL )
839 hr = QUARTZ_MediaType_Copy( pmt, &This->m_mt );
843 *ppszFileName = (WCHAR*)CoTaskMemAlloc( This->m_cbFileName );
844 if ( *ppszFileName == NULL )
846 QUARTZ_MediaType_Free(pmt);
847 ZeroMemory( pmt, sizeof(AM_MEDIA_TYPE) );
848 return E_OUTOFMEMORY;
851 memcpy( *ppszFileName, This->m_pszFileName, This->m_cbFileName );
856 static HRESULT WINAPI
857 IFileSinkFilter2_fnSetMode(IFileSinkFilter2* iface,DWORD dwFlags)
859 CFileWriterImpl_THIS(iface,filesink);
861 TRACE("(%p)->(%08lx)\n",This,dwFlags);
863 if ( dwFlags != 0 && dwFlags != AM_FILE_OVERWRITE )
865 This->m_dwMode = dwFlags;
870 static HRESULT WINAPI
871 IFileSinkFilter2_fnGetMode(IFileSinkFilter2* iface,DWORD* pdwFlags)
873 CFileWriterImpl_THIS(iface,filesink);
875 TRACE("(%p)->(%p)\n",This,pdwFlags);
877 if ( pdwFlags == NULL )
880 *pdwFlags = This->m_dwMode;
885 static ICOM_VTABLE(IFileSinkFilter2) ifilesink2 =
887 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
888 /* IUnknown fields */
889 IFileSinkFilter2_fnQueryInterface,
890 IFileSinkFilter2_fnAddRef,
891 IFileSinkFilter2_fnRelease,
892 /* IFileSinkFilter2 fields */
893 IFileSinkFilter2_fnSetFileName,
894 IFileSinkFilter2_fnGetCurFile,
895 IFileSinkFilter2_fnSetMode,
896 IFileSinkFilter2_fnGetMode,
899 HRESULT CFileWriterImpl_InitIFileSinkFilter2( CFileWriterImpl* This )
901 TRACE("(%p)\n",This);
902 ICOM_VTBL(&This->filesink) = &ifilesink2;
907 HRESULT CFileWriterImpl_UninitIFileSinkFilter2( CFileWriterImpl* This )
909 TRACE("(%p)\n",This);