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