123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- //------------------------------------------------------------------------------
- // 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(__out ULARGE_INTEGER * pcbSize)
- // Allow 24 bytes for version.
- {
- pcbSize->QuadPart = 12*sizeof(WCHAR)+SizeMax();
- return NOERROR;
- }
- // implementation
- CPersistStream(IUnknown *punk, __inout 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(__out 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, __out HRESULT &hr);
- #endif // __PSTREAM__
|