00001
00002
00003
00004
00005
00006 #include <streams.h>
00007
00008 #ifdef PERF
00009 #include <measure.h>
00010 #endif
00011
00012 CPersistStream::CPersistStream(IUnknown *punk, HRESULT *phr)
00013 : mPS_fDirty(FALSE)
00014 {
00015 mPS_dwFileVersion = GetSoftwareVersion();
00016 }
00017
00018 CPersistStream::~CPersistStream() {
00019
00020 }
00021
00022 #if 0
00023 SAMPLE CODE TO COPY - not active at the moment
00024
00025 STDMETHODIMP CPersistStream::NonDelegatingQueryInterface(REFIID riid, void **ppv)
00026 {
00027 if (riid == IID_IPersist) {
00028 return GetInterface((IPersist *) this, ppv);
00029 }
00030 else if (riid == IID_IPersistStream) {
00031 return GetInterface((IPersistStream *) this, ppv);
00032 }
00033 else {
00034 return CUnknown::NonDelegatingQueryInterface(riid, ppv);
00035 }
00036 }
00037 #endif
00038
00039 HRESULT CPersistStream::WriteToStream(IStream *pStream)
00040 {
00041
00042
00043
00044 return NOERROR;
00045 }
00046
00047 HRESULT CPersistStream::ReadFromStream(IStream * pStream)
00048 {
00049
00050
00051
00052 return NOERROR;
00053 }
00054
00055 STDMETHODIMP CPersistStream::Load(LPSTREAM pStm)
00056 {
00057 HRESULT hr;
00058
00059 mPS_dwFileVersion = ReadInt(pStm, hr);
00060 if (FAILED(hr)) {
00061 return hr;
00062 }
00063
00064 return ReadFromStream(pStm);
00065 }
00066
00067 STDMETHODIMP CPersistStream::Save(LPSTREAM pStm, BOOL fClearDirty)
00068 {
00069
00070 HRESULT hr = WriteInt(pStm, GetSoftwareVersion());
00071 if (FAILED(hr)) {
00072 return hr;
00073 }
00074
00075 hr = WriteToStream(pStm);
00076 if (FAILED(hr)) {
00077 return hr;
00078 }
00079
00080 mPS_fDirty = !fClearDirty;
00081
00082 return hr;
00083 }
00084
00085 STDAPI WriteInt(IStream *pIStream, int n)
00086 {
00087 WCHAR Buff[13];
00088 wsprintfW(Buff, L"%011d ",n);
00089 return pIStream->Write(&(Buff[0]), 12*sizeof(WCHAR), NULL);
00090 }
00091
00092 STDAPI_(int) ReadInt(IStream *pIStream, HRESULT &hr)
00093 {
00094
00095 int Sign = 1;
00096 unsigned int n = 0;
00097 WCHAR wch;
00098
00099 hr = pIStream->Read( &wch, sizeof(wch), NULL);
00100 if (FAILED(hr)) {
00101 return 0;
00102 }
00103
00104 if (wch==L'-'){
00105 Sign = -1;
00106 hr = pIStream->Read( &wch, sizeof(wch), NULL);
00107 if (FAILED(hr)) {
00108 return 0;
00109 }
00110 }
00111
00112 for( ; ; ) {
00113 if (wch>=L'0' && wch<=L'9') {
00114 n = 10*n+(int)(wch-L'0');
00115 } else if ( wch == L' '
00116 || wch == L'\t'
00117 || wch == L'\r'
00118 || wch == L'\n'
00119 || wch == L'\0'
00120 ) {
00121 break;
00122 } else {
00123 hr = VFW_E_INVALID_FILE_FORMAT;
00124 return 0;
00125 }
00126
00127 hr = pIStream->Read( &wch, sizeof(wch), NULL);
00128 if (FAILED(hr)) {
00129 return 0;
00130 }
00131 }
00132
00133 if (n==0x80000000 && Sign==-1) {
00134
00135 return (int)n;
00136 }
00137 else return (int)n * Sign;
00138 }
00139
00140 #pragma warning(disable: 4514)