115 lines
4 KiB
C++
115 lines
4 KiB
C++
//------------------------------------------------------------------------------
|
|
// File: PStream.h
|
|
//
|
|
// Desc: DirectShow base classes - defines a class for persistent properties
|
|
// of filters.
|
|
//
|
|
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef __PSTREAM__
|
|
#define __PSTREAM__
|
|
|
|
// Base class for persistent properties of filters
|
|
// (i.e. filter properties in saved graphs)
|
|
|
|
// The simplest way to use this is:
|
|
// 1. Arrange for your filter to inherit this class
|
|
// 2. Implement in your class WriteToStream and ReadFromStream
|
|
// These will override the "do nothing" functions here.
|
|
// 3. Change your NonDelegatingQueryInterface to handle IPersistStream
|
|
// 4. Implement SizeMax to return the number of bytes of data you save.
|
|
// If you save UNICODE data, don't forget a char is 2 bytes.
|
|
// 5. Whenever your data changes, call SetDirty()
|
|
//
|
|
// At some point you may decide to alter, or extend the format of your data.
|
|
// At that point you will wish that you had a version number in all the old
|
|
// saved graphs, so that you can tell, when you read them, whether they
|
|
// represent the old or new form. To assist you in this, this class
|
|
// writes and reads a version number.
|
|
// When it writes, it calls GetSoftwareVersion() to enquire what version
|
|
// of the software we have at the moment. (In effect this is a version number
|
|
// of the data layout in the file). It writes this as the first thing in the data.
|
|
// If you want to change the version, implement (override) GetSoftwareVersion().
|
|
// It reads this from the file into mPS_dwFileVersion before calling ReadFromStream,
|
|
// so in ReadFromStream you can check mPS_dwFileVersion to see if you are reading
|
|
// an old version file.
|
|
// Normally you should accept files whose version is no newer than the software
|
|
// version that's reading them.
|
|
|
|
|
|
// CPersistStream
|
|
//
|
|
// Implements IPersistStream.
|
|
// See 'OLE Programmers Reference (Vol 1):Structured Storage Overview' for
|
|
// more implementation information.
|
|
class CPersistStream : public IPersistStream {
|
|
private:
|
|
|
|
// Internal state:
|
|
|
|
protected:
|
|
DWORD mPS_dwFileVersion; // version number of file (being read)
|
|
BOOL mPS_fDirty;
|
|
|
|
public:
|
|
|
|
// IPersistStream methods
|
|
|
|
STDMETHODIMP IsDirty()
|
|
{return (mPS_fDirty ? S_OK : S_FALSE);} // note FALSE means clean
|
|
STDMETHODIMP Load(LPSTREAM pStm);
|
|
STDMETHODIMP Save(LPSTREAM pStm, BOOL fClearDirty);
|
|
STDMETHODIMP GetSizeMax(ULARGE_INTEGER * pcbSize)
|
|
// Allow 24 bytes for version.
|
|
{ pcbSize->QuadPart = 12*sizeof(WCHAR)+SizeMax(); return NOERROR; }
|
|
|
|
// implementation
|
|
|
|
CPersistStream(IUnknown *punk, HRESULT *phr);
|
|
~CPersistStream();
|
|
|
|
HRESULT SetDirty(BOOL fDirty)
|
|
{ mPS_fDirty = fDirty; return NOERROR;}
|
|
|
|
|
|
// override to reveal IPersist & IPersistStream
|
|
// STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
|
|
|
|
// --- IPersist ---
|
|
|
|
// You must override this to provide your own class id
|
|
STDMETHODIMP GetClassID(CLSID *pClsid) PURE;
|
|
|
|
// overrideable if you want
|
|
// file version number. Override it if you ever change format
|
|
virtual DWORD GetSoftwareVersion(void) { return 0; }
|
|
|
|
|
|
//=========================================================================
|
|
// OVERRIDE THESE to read and write your data
|
|
// OVERRIDE THESE to read and write your data
|
|
// OVERRIDE THESE to read and write your data
|
|
|
|
virtual int SizeMax() {return 0;}
|
|
virtual HRESULT WriteToStream(IStream *pStream);
|
|
virtual HRESULT ReadFromStream(IStream *pStream);
|
|
//=========================================================================
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
|
|
// --- Useful helpers ---
|
|
|
|
|
|
// Writes an int to an IStream as UNICODE.
|
|
STDAPI WriteInt(IStream *pIStream, int n);
|
|
|
|
// inverse of WriteInt
|
|
STDAPI_(int) ReadInt(IStream *pIStream, HRESULT &hr);
|
|
|
|
#endif // __PSTREAM__
|