diff --git a/SlnkDWFCom/SLNKDWF.idl b/SlnkDWFCom/SLNKDWF.idl index 4f60ee3..a39c7f5 100644 --- a/SlnkDWFCom/SLNKDWF.idl +++ b/SlnkDWFCom/SLNKDWF.idl @@ -263,6 +263,24 @@ interface ISLNKSymbol : IDispatch{ interface IOptions : IDispatch{ [id(1), helpstring("method SetOption")] HRESULT SetOption([in] BSTR optionName, VARIANT OptionValue); }; +[ + object, + uuid(01C19AF8-073E-40E2-843F-25A2C6C4E274), + dual, + nonextensible, + helpstring("IZip Interface"), + pointer_default(unique) +] +interface IZip : IDispatch{ + [id(1), helpstring("method Open")] HRESULT Open([in] BSTR ZIPPath); + [id(2), helpstring("method New")] HRESULT New(BSTR ZipPath); + [id(3), helpstring("method UnzipToStream")] HRESULT UnzipToStream([in] VARIANT pVal, [in]BSTR filepath, [in, defaultvalue(L"")] BSTR Password); + [id(4), helpstring("method DecryptToStream")] HRESULT DecryptToStream([in] VARIANT pVal, [in]BSTR filepath); + [id(5), helpstring("method ZipFromString")] HRESULT ZipFromString([in] BSTR filepath, [in] BSTR data, [in, defaultvalue(L"")] BSTR Password); + [id(6), helpstring("method ZipFromStream")] HRESULT ZipFromStream([in] BSTR filepath, [in] VARIANT pVal, [in, defaultvalue(L"")] BSTR Password); + [id(7), helpstring("method EncryptFromString")] HRESULT EncryptFromString([in] BSTR filepath, [in] BSTR data); + [id(8), helpstring("method Close")] HRESULT Close(void); +}; [ uuid(B6FCDE6E-141C-4601-B3AC-4DF4D5F25DF8), version(1.0), @@ -374,4 +392,12 @@ library SLNKDWFLib { [default] interface IOptions; }; + [ + uuid(C5805A7A-67CF-452B-94F1-E7A50023D695), + helpstring("Zip Class") + ] + coclass Zip + { + [default] interface IZip; + }; }; diff --git a/SlnkDWFCom/SLNKDWF.vcproj b/SlnkDWFCom/SLNKDWF.vcproj index 2ab7e35..cdbaf83 100644 --- a/SlnkDWFCom/SLNKDWF.vcproj +++ b/SlnkDWFCom/SLNKDWF.vcproj @@ -355,6 +355,10 @@ RelativePath="WhipFile.cpp" > + + + + + + open(); + } + catch (DWFException& ex) + { + CString err; + err.Format("%ls\n%ls\n%s\n%ls(%d)",ex.type(),ex.message(),ex.function(),ex.file(),ex.line()); + return myAtlReportError (GetObjectCLSID(), "\nCZip::Open('%ls')\n%s", ZipPath, err); + } + + return S_OK; +} + +STDMETHODIMP CZip::New(BSTR ZipPath) +{ + if (m_pZipFile) + return myAtlReportError (GetObjectCLSID(), "\nCZip::New zipfile is already open."); + + try + { + DWFCore::DWFFile oZipFilename( ZipPath ); + + m_pZipFile = new DWFCore::DWFZipFileDescriptor(oZipFilename, DWFZipFileDescriptor::eZip); + m_pZipFile->open(); + + } + catch (DWFException& ex) + { + CString err; + err.Format("%ls\n%ls\n%s\n%ls(%d)",ex.type(),ex.message(),ex.function(),ex.file(),ex.line()); + return myAtlReportError (GetObjectCLSID(), "\nCZip::New('%ls')\n%s", ZipPath, err); + } + return S_OK; +} + +STDMETHODIMP CZip::DecryptToStream(VARIANT pStream, BSTR filepath) +{ + return UnzipToStream(pStream, filepath, CComBSTR ( VERYSECRET )); +} + +// Gebruik vanuit ASP: oZIP.UnzipToStream(Response, "Geheim"); +// want het Response Object implementeerd mooi de IStream interface +STDMETHODIMP CZip::UnzipToStream(VARIANT pStream, BSTR filepath, BSTR Password/*=L""*/) +{ + if (!m_pZipFile) + return myAtlReportError (GetObjectCLSID(), "\nCZip::UnzipToStream zipfile not open."); + + myTRACE("\nEntering CZip::UnzipToStream"); + + CComQIPtr pIStream; + + if (pStream.vt!=VT_ERROR) + { + VARIANT *var2 = &pStream; + if (var2->vt==(VT_VARIANT|VT_BYREF)) // ByRef vanuit VBScript + var2 = (VARIANT *)var2->pvarVal; + + if (var2->vt==VT_DISPATCH) + pIStream = var2->pdispVal; + else if (var2->vt==(VT_DISPATCH|VT_BYREF)) // ByRef vanuit VB + pIStream = *(var2->ppdispVal); + + if (!pIStream) + return E_INVALIDARG; + + try + { + unsigned char* pDataBuffer = DWFCORE_ALLOC_MEMORY( unsigned char, DATA_BUFFER_BYTES ); + if (pDataBuffer == NULL) + { + _DWFCORE_THROW( DWFMemoryException, L"No memory for data buffer" ); + } + + DWFCore::DWFInputStream* pUnzipStream = + m_pZipFile->unzip((LPCSTR)CString(filepath),(LPCSTR)CString(Password)); + + while (pUnzipStream->available() > 0) + { + size_t nBytes; + nBytes = pUnzipStream->read( pDataBuffer, DATA_BUFFER_BYTES ); + ULONG cb; + pIStream->Write((void*)pDataBuffer, (ULONG)nBytes, &cb); + } + + DWFCORE_FREE_OBJECT (pUnzipStream); + DWFCORE_FREE_MEMORY( pDataBuffer ) + } + catch (DWFException& ex) + { + CString err; + err.Format("%ls\n%ls\n%s\n%ls(%d)",ex.type(),ex.message(),ex.function(),ex.file(),ex.line()); + return myAtlReportError (GetObjectCLSID(), "\nCZip::UnzipToStream()\n%s", err); + } + } + + return S_OK; +} + +STDMETHODIMP CZip::EncryptFromString(BSTR filepath, BSTR data) +{ + return ZipFromString( filepath, data, CComBSTR ( VERYSECRET )); +} + +// filepath naam waaronder opgeslagen binnen de ZIP +// data Visual Basic string +// Password Optioneel +STDMETHODIMP CZip::ZipFromStream(BSTR filepath, VARIANT pStream, BSTR Password) +{ + if (!m_pZipFile) + return myAtlReportError (GetObjectCLSID(), "\nCZip::ZipFromStream zipfile not open."); + + myTRACE("\nEntering CZip::ZipFromStream"); + + CComQIPtr pIStream; + + if (pStream.vt!=VT_ERROR) + { + VARIANT *var2 = &pStream; + if (var2->vt==(VT_VARIANT|VT_BYREF)) // ByRef vanuit VBScript + var2 = (VARIANT *)var2->pvarVal; + + if (var2->vt==VT_DISPATCH) + pIStream = var2->pdispVal; + else if (var2->vt==(VT_DISPATCH|VT_BYREF)) // ByRef vanuit VB + pIStream = *(var2->ppdispVal); + + if (!pIStream) + return E_INVALIDARG; + + try + { + // Naam waaronder binnen de zip is opgeslagen + DWFCore::DWFString file((LPCSTR)CString(filepath)); + DWFCore::DWFOutputStream* pZipStream; + + pZipStream = m_pZipFile->zip(file,(LPCSTR)CString(Password)); + + unsigned char* pDataBuffer = DWFCORE_ALLOC_MEMORY( unsigned char, DATA_BUFFER_BYTES ); + if (pDataBuffer == NULL) + { + _DWFCORE_THROW( DWFMemoryException, L"No memory for data buffer" ); + } + + ULONG cbRead; + do + { + pIStream->Read((void*)pDataBuffer, DATA_BUFFER_BYTES, &cbRead); + if (cbRead>0) + pZipStream->write( pDataBuffer, cbRead); + } + while (cbRead == DATA_BUFFER_BYTES); + + pZipStream->flush(); + + DWFCORE_FREE_MEMORY( pDataBuffer ) + DWFCORE_FREE_OBJECT (pZipStream); + } + catch (DWFException& ex) + { + CString err; + err.Format("%ls\n%ls\n%s\n%ls(%d)",ex.type(),ex.message(),ex.function(),ex.file(),ex.line()); + return myAtlReportError (GetObjectCLSID(), "\nCZip::ZipFromString('%ls')\n%s", filepath, err); + } + } + return S_OK; +} + +// filepath naam waaronder opgeslagen binnen de ZIP +// data Visual Basic string +// Password Optioneel +STDMETHODIMP CZip::ZipFromString(BSTR filepath, BSTR data, BSTR Password) +{ + if (!m_pZipFile) + return myAtlReportError (GetObjectCLSID(), "\nCZip::ZipFromString zipfile not open."); + + myTRACE("\nEntering CZip::ZipFromString met data lengte: %d\n", SysStringByteLen(data)); + try + { + // Naam waaronder binnen de zip is opgeslagen + DWFCore::DWFString file((LPCSTR)CString(filepath)); + DWFCore::DWFOutputStream* pZipStream; + + pZipStream = m_pZipFile->zip(file,(LPCSTR)CString(Password)); + size_t nBytes=pZipStream->write( data, SysStringByteLen(data)); + pZipStream->flush(); + DWFCORE_FREE_OBJECT (pZipStream); + } + catch (DWFException& ex) + { + CString err; + err.Format("%ls\n%ls\n%s\n%ls(%d)",ex.type(),ex.message(),ex.function(),ex.file(),ex.line()); + return myAtlReportError (GetObjectCLSID(), "\nCZip::ZipFromString('%ls')\n%s", filepath, err); + } + return S_OK; +} + +STDMETHODIMP CZip::Close(void) +{ + if (!m_pZipFile) + return myAtlReportError (GetObjectCLSID(), "\nCZip::Close zipfile not open."); + + m_pZipFile->close(); + delete m_pZipFile; + m_pZipFile = NULL; + return S_OK; +} diff --git a/SlnkDWFCom/Zip.rgs b/SlnkDWFCom/Zip.rgs new file mode 100644 index 0000000..c63e85b --- /dev/null +++ b/SlnkDWFCom/Zip.rgs @@ -0,0 +1,26 @@ +HKCR +{ + SLNKDWF.Zip.1 = s 'Zip Class' + { + CLSID = s '{C5805A7A-67CF-452B-94F1-E7A50023D695}' + } + SLNKDWF.Zip = s 'Zip Class' + { + CLSID = s '{C5805A7A-67CF-452B-94F1-E7A50023D695}' + CurVer = s 'SLNKDWF.Zip.1' + } + NoRemove CLSID + { + ForceRemove {C5805A7A-67CF-452B-94F1-E7A50023D695} = s 'Zip Class' + { + ProgID = s 'SLNKDWF.Zip.1' + VersionIndependentProgID = s 'SLNKDWF.Zip' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{B6FCDE6E-141C-4601-B3AC-4DF4D5F25DF8}' + } + } +} diff --git a/SlnkDWFCom/resource.h b/SlnkDWFCom/resource.h index 4964ec1..0da5b22 100644 --- a/SlnkDWFCom/resource.h +++ b/SlnkDWFCom/resource.h @@ -25,6 +25,7 @@ #define IDR_SLNKCONTOUR 120 #define IDR_SLNKSYMBOL 126 #define IDR_OPTIONS 127 +#define IDR_ZIP 128 // Next default values for new objects // @@ -33,6 +34,6 @@ #define _APS_NEXT_RESOURCE_VALUE 201 #define _APS_NEXT_COMMAND_VALUE 32768 #define _APS_NEXT_CONTROL_VALUE 201 -#define _APS_NEXT_SYMED_VALUE 128 +#define _APS_NEXT_SYMED_VALUE 129 #endif #endif diff --git a/SlnkDWFImpl/JglUtil.cpp b/SlnkDWFImpl/JglUtil.cpp index 2721e93..f27ef9b 100644 --- a/SlnkDWFImpl/JglUtil.cpp +++ b/SlnkDWFImpl/JglUtil.cpp @@ -23,6 +23,7 @@ HRESULT myAtlReportError(const CLSID & clsid, LPCTSTR lpszFormat, ...) va_end(args); + myTRACE(szBuffer); return AtlReportError(clsid, szBuffer); }