318 lines
5.7 KiB
C++
318 lines
5.7 KiB
C++
|
|
/* - - - - - - - - */
|
|
|
|
/*
|
|
** Copyright (C) Microsoft Corporation 1993. All rights reserved.
|
|
*/
|
|
|
|
/* - - - - - - - - */
|
|
|
|
#include <win32.h>
|
|
#include <compobj.h>
|
|
#include <avifmt.h>
|
|
#include "avifile.h"
|
|
#include "avifilei.h"
|
|
#include "debug.h"
|
|
|
|
/* - - - - - - - - */
|
|
|
|
UINT uUseCount;
|
|
BOOL fLocked;
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDAPI DllCanUnloadNow(
|
|
void)
|
|
{
|
|
return ResultFromScode((fLocked || uUseCount) ? S_FALSE : S_OK);
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
HRESULT CAVIFile::Create(
|
|
IUnknown FAR* pUnknownOuter,
|
|
const IID FAR& riid,
|
|
void FAR* FAR* ppv)
|
|
{
|
|
IUnknown FAR* pUnknown;
|
|
CAVIFile FAR* pAVIFile;
|
|
HRESULT hresult;
|
|
|
|
pAVIFile = new FAR CAVIFile(pUnknownOuter, &pUnknown);
|
|
if (!pAVIFile)
|
|
return ResultFromScode(E_OUTOFMEMORY);
|
|
hresult = pUnknown->QueryInterface(riid, ppv);
|
|
if (FAILED(GetScode(hresult)))
|
|
delete pAVIFile;
|
|
return hresult;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIFile::CAVIFile(
|
|
IUnknown FAR* pUnknownOuter,
|
|
IUnknown FAR* FAR* ppUnknown) :
|
|
m_Unknown(this),
|
|
m_AVIFile(this),
|
|
m_Marshal(this)
|
|
{
|
|
hshfile = 0;
|
|
achFile[0] = '\0';
|
|
fInRecord = FALSE;
|
|
lWriteLoc = 0;
|
|
fDirty = 0;
|
|
extra.lp = 0;
|
|
extra.cb = 0;
|
|
_fmemset(&avihdr, 0, sizeof(avihdr));
|
|
avihdr.dwStreams = 0;
|
|
lHeaderSize = 0;
|
|
px = NULL;
|
|
pb = NULL;
|
|
|
|
if (pUnknownOuter) {
|
|
DPF("(F) Being aggregated!\n");
|
|
m_pUnknownOuter = pUnknownOuter;
|
|
} else
|
|
m_pUnknownOuter = &m_Unknown;
|
|
*ppUnknown = &m_Unknown;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIFile::CUnknownImpl::CUnknownImpl(
|
|
CAVIFile FAR* pAVIFile)
|
|
{
|
|
m_pAVIFile = pAVIFile;
|
|
m_refs = 0;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP CAVIFile::CUnknownImpl::QueryInterface(
|
|
const IID FAR& iid,
|
|
void FAR* FAR* ppv)
|
|
{
|
|
if (iid == IID_IUnknown || iid == CLSID_AVISimpleUnMarshal)
|
|
*ppv = &m_pAVIFile->m_Unknown;
|
|
else if (iid == IID_IAVIFile)
|
|
*ppv = &m_pAVIFile->m_AVIFile;
|
|
#if 0
|
|
else if (iid == IID_IMarshal) {
|
|
DPF("(F) QueryInterface (IMarshal)\n");
|
|
*ppv = &m_pAVIFile->m_Marshal;
|
|
}
|
|
#endif
|
|
else
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
AddRef();
|
|
return AVIERR_OK;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP_(ULONG) CAVIFile::CUnknownImpl::AddRef()
|
|
{
|
|
DPF2("File %lx: Usage++=%lx\n", (DWORD) (LPVOID) this, m_refs + 1);
|
|
|
|
if (m_pAVIFile->hshfile)
|
|
shfileAddRef(m_pAVIFile->hshfile);
|
|
uUseCount++;
|
|
return ++m_refs;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIFile::CAVIFileImpl::CAVIFileImpl(
|
|
CAVIFile FAR* pAVIFile)
|
|
{
|
|
m_pAVIFile = pAVIFile;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIFile::CAVIFileImpl::~CAVIFileImpl()
|
|
{
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP CAVIFile::CAVIFileImpl::QueryInterface(
|
|
const IID FAR& iid,
|
|
void FAR* FAR* ppv)
|
|
{
|
|
return m_pAVIFile->m_pUnknownOuter->QueryInterface(iid, ppv);
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP_(ULONG) CAVIFile::CAVIFileImpl::AddRef()
|
|
{
|
|
return m_pAVIFile->m_pUnknownOuter->AddRef();
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP_(ULONG) CAVIFile::CAVIFileImpl::Release()
|
|
{
|
|
return m_pAVIFile->m_pUnknownOuter->Release();
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIStream::CAVIStream(
|
|
IUnknown FAR* pUnknownOuter,
|
|
IUnknown FAR* FAR* ppUnknown) :
|
|
m_Unknown(this),
|
|
m_AVIStream(this),
|
|
m_Marshal(this),
|
|
m_Streaming(this)
|
|
{
|
|
paviBase = NULL;
|
|
hshfile = 0;
|
|
lpFormat = NULL;
|
|
cbFormat = 0;
|
|
lpData = NULL;
|
|
cbData = 0;
|
|
extra.lp = NULL;
|
|
extra.cb = 0;
|
|
psx = NULL;
|
|
lPal = 0;
|
|
pb = NULL;
|
|
fInit = FALSE;
|
|
|
|
if (pUnknownOuter) {
|
|
DPF("(S) Being aggregated!\n");
|
|
m_pUnknownOuter = pUnknownOuter;
|
|
}
|
|
else
|
|
m_pUnknownOuter = &m_Unknown;
|
|
*ppUnknown = &m_Unknown;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIStream::CUnknownImpl::CUnknownImpl(
|
|
CAVIStream FAR* pAVIStream)
|
|
{
|
|
m_pAVIStream = pAVIStream;
|
|
m_refs = 0;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP CAVIStream::CUnknownImpl::QueryInterface(
|
|
const IID FAR& iid,
|
|
void FAR* FAR* ppv)
|
|
{
|
|
if (iid == IID_IUnknown || iid == CLSID_AVISimpleUnMarshal)
|
|
*ppv = &m_pAVIStream->m_Unknown;
|
|
else if (iid == IID_IAVIStream)
|
|
*ppv = &m_pAVIStream->m_AVIStream;
|
|
else if (iid == IID_IAVIStreaming)
|
|
*ppv = &m_pAVIStream->m_Streaming;
|
|
#if 0
|
|
else if (iid == IID_IMarshal) {
|
|
DPF("(S) QueryInterface (IMarshal)\n");
|
|
*ppv = &m_pAVIStream->m_Marshal;
|
|
}
|
|
#endif
|
|
else
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
AddRef();
|
|
return NULL;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP_(ULONG) CAVIStream::CUnknownImpl::AddRef()
|
|
{
|
|
uUseCount++;
|
|
if (m_pAVIStream->hshfile)
|
|
shfileAddRef(m_pAVIStream->hshfile);
|
|
if (m_refs < 20) {
|
|
DPF2("Stream %lx: Usage++=%lx\n", (DWORD) (LPVOID) this, m_refs + 1);
|
|
}
|
|
|
|
return ++m_refs;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIStream::CAVIStreamImpl::CAVIStreamImpl(
|
|
CAVIStream FAR* pAVIStream)
|
|
{
|
|
m_pAVIStream = pAVIStream;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIStream::CAVIStreamImpl::~CAVIStreamImpl()
|
|
{
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP CAVIStream::CAVIStreamImpl::QueryInterface(
|
|
const IID FAR& iid,
|
|
void FAR* FAR* ppv)
|
|
{
|
|
return m_pAVIStream->m_pUnknownOuter->QueryInterface(iid, ppv);
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP_(ULONG) CAVIStream::CAVIStreamImpl::AddRef()
|
|
{
|
|
return m_pAVIStream->m_pUnknownOuter->AddRef();
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP_(ULONG) CAVIStream::CAVIStreamImpl::Release()
|
|
{
|
|
return m_pAVIStream->m_pUnknownOuter->Release();
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIStream::CStreamingImpl::CStreamingImpl(
|
|
CAVIStream FAR* pAVIStream)
|
|
{
|
|
m_pAVIStream = pAVIStream;
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
CAVIStream::CStreamingImpl::~CStreamingImpl()
|
|
{
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP CAVIStream::CStreamingImpl::QueryInterface(
|
|
const IID FAR& iid,
|
|
void FAR* FAR* ppv)
|
|
{
|
|
return m_pAVIStream->m_pUnknownOuter->QueryInterface(iid, ppv);
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP_(ULONG) CAVIStream::CStreamingImpl::AddRef()
|
|
{
|
|
return m_pAVIStream->m_pUnknownOuter->AddRef();
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|
|
STDMETHODIMP_(ULONG) CAVIStream::CStreamingImpl::Release()
|
|
{
|
|
return m_pAVIStream->m_pUnknownOuter->Release();
|
|
}
|
|
|
|
/* - - - - - - - - */
|
|
|