1 //-------------------------------------------------------------------------
2 //
3 // For conditions of distribution and use, see copyright notice
4 // in Flashpix.h
5 //
6 // Copyright (c) 1999 Digital Imaging Group, Inc.
7 //
8 // Contents: Entry points for MSF DLL
9 //
10 // Classes: None.
11 //
12 // Functions: DllMuliStreamFromStream
13 // DllConvertStreamToMultiStream
14 // DllReleaseMultiStream
15 // DllGetScratchMultiStream
16 // DllIsMultiStream
17 //
18 //--------------------------------------------------------------------------
19 #include "msfhead.cxx"
20 #include "h/handle.hxx"
21
22
23 //+-------------------------------------------------------------------------
24 //
25 // Function: DllMultiStreamFromStrea
26 //
27 // Synopsis: Create a new multistream instance from an existing stream.
28 // This is used to reopen a stored multi-stream.
29 //
30 // Effects: Creates a new CMStream instance
31 //
32 // Arguments: [ppms] -- Pointer to storage for return of multistream
33 // [pplstStream] -- Stream to be used by multi-stream for
34 // reads and writes
35 // [dwFlags] - Startup flags
36 //
37 // Returns: STG_E_INVALIDHEADER if signature on pStream does not
38 // match.
39 // STG_E_UNKNOWN if there was a problem in setup.
40 // S_OK if call completed OK.
41 //
42 // Algorithm: Check the signature on the pStream and on the contents
43 // of the pStream. If either is a mismatch, return
44 // STG_E_INVALIDHEADER.
45 // Create a new CMStream instance and run the setup function.
46 // If the setup function fails, return STG_E_UNKNOWN.
47 // Otherwise, return S_OK.
48 //
49 // Notes:
50 //
51 //--------------------------------------------------------------------------
52
DllMultiStreamFromStream(CMStream ** ppms,ILockBytes ** pplstStream,DWORD dwFlags)53 SCODE DllMultiStreamFromStream(CMStream **ppms,
54 ILockBytes **pplstStream,
55 DWORD dwFlags)
56 {
57 SCODE sc;
58 CMStream *temp;
59
60
61 BOOL fConvert = ((dwFlags & RSF_CONVERT) != 0);
62 BOOL fTruncate = ((dwFlags & RSF_TRUNCATE) != 0);
63 BOOL fCreate = ((dwFlags & RSF_CREATE) != 0);
64
65
66 msfDebugOut((DEB_ITRACE,"In DllMultiStreamFromStream\n"));
67
68 msfMem(temp = new CMStream(pplstStream, SECTORSHIFT));
69
70 STATSTG stat;
71 (*pplstStream)->Stat(&stat, STATFLAG_NONAME);
72 msfAssert(ULIGetHigh(stat.cbSize) == 0);
73 msfDebugOut((DEB_ITRACE,"Size is: %lu\n",ULIGetLow(stat.cbSize)));
74
75 do
76 {
77 if ((ULIGetLow(stat.cbSize) != 0) && (fConvert))
78 {
79 msfChk(temp->InitConvert());
80 break;
81 }
82
83 if (((ULIGetLow(stat.cbSize) == 0) && fCreate) || (fTruncate))
84 {
85 msfChk(temp->InitNew());
86 break;
87 }
88 msfChk(temp->Init());
89 }
90 while (FALSE);
91
92 *ppms = temp;
93
94 msfDebugOut((DEB_ITRACE,"Leaving DllMultiStreamFromStream\n"));
95
96 if (fConvert && ULIGetLow(stat.cbSize))
97 {
98 return STG_S_CONVERTED;
99 }
100
101 return S_OK;
102
103 Err:
104 delete temp;
105 return sc;
106 }
107
108
109 //+-------------------------------------------------------------------------
110 //
111 // Function: DllReleaseMultiStream
112 //
113 // Synopsis: Release a CMStream instance
114 //
115 // Effects: Deletes a multi-stream instance
116 //
117 // Arguments: [pms] -- pointer to object to be deleted
118 //
119 // Returns: S_OK.
120 //
121 // Modifies: Deletes the object pointed to by pMultiStream
122 //
123 // Algorithm: Delete the passed in pointer.
124 //
125 // Notes:
126 //
127 //--------------------------------------------------------------------------
128
DllReleaseMultiStream(CMStream * pms)129 void DllReleaseMultiStream(CMStream *pms)
130 {
131 msfDebugOut((DEB_TRACE,"In DllReleaseMultiStream(%p)\n",pms));
132 delete pms;
133 msfDebugOut((DEB_TRACE,"Out DllReleaseMultiStream()\n"));
134 }
135
136
137
138
139
140 //+-------------------------------------------------------------------------
141 //
142 // Function: DllIsMultiStream
143 //
144 // Synopsis: Check a given Lstream to determine if it is a valid
145 // multistream.
146 //
147 // Arguments: [plst] -- Pointer to lstream to check
148 //
149 // Returns: S_OK if lstream is a valid multistream
150 // STG_E_UNKNOWN otherwise
151 //
152 // Notes:
153 //
154 //--------------------------------------------------------------------------
155
DllIsMultiStream(ILockBytes * plst)156 SCODE DllIsMultiStream(ILockBytes *plst)
157 {
158 SCODE sc;
159 CMSFHeader *phdr;
160
161 msfMem(phdr = new CMSFHeader(SECTORSHIFT));
162
163 ULONG ulTemp;
164
165 ULARGE_INTEGER ulOffset;
166 ULISet32(ulOffset, 0);
167 msfHChk(plst->ReadAt(ulOffset, phdr, sizeof(CMSFHeader), &ulTemp));
168 phdr->ByteSwap(); // swap to machine format if neccessary
169
170 if (ulTemp != sizeof(CMSFHeader))
171 {
172 msfErr(Err, STG_E_UNKNOWN);
173 }
174
175 msfChk(phdr->Validate());
176
177 Err:
178 delete phdr;
179 return sc;
180 }
181
182 #if DEVL == 1
183
184 //The following is a private function so I can set the debug level easily.
SetInfoLevel(ULONG x)185 VOID SetInfoLevel(ULONG x)
186 {
187 msfInfoLevel=x;
188 }
189
190
191 #endif
192