115 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			115 lines
		
	
	
		
			4.2 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(__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__
							 |