summaryrefslogtreecommitdiffstats
path: root/installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/ClientCodec/ClientCodec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/ClientCodec/ClientCodec.cpp')
-rw-r--r--installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/ClientCodec/ClientCodec.cpp370
1 files changed, 370 insertions, 0 deletions
diff --git a/installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/ClientCodec/ClientCodec.cpp b/installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/ClientCodec/ClientCodec.cpp
new file mode 100644
index 000000000..664889bf7
--- /dev/null
+++ b/installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/ClientCodec/ClientCodec.cpp
@@ -0,0 +1,370 @@
+// Client7z.cpp
+
+#include "StdAfx.h"
+
+#ifdef _WIN32
+#include <initguid.h>
+#else
+#include "Common/MyInitGuid.h"
+#endif
+
+#include "Windows/DLL.h"
+#include "../../ICoder.h"
+#include "Windows/PropVariant.h"
+#include "Common/MyCom.h"
+
+using namespace NWindows;
+
+class CFileIn : public ISequentialInStream, public CMyUnknownImp
+{
+ FILE *file_;
+ size_t pos_;
+ public:
+ MY_UNKNOWN_IMP
+
+ CFileIn() : file_(0) , pos_(0) { }
+ ~CFileIn() { this->close(); }
+
+ HRESULT open(const char *name)
+ {
+ file_ = fopen(name,"rb");
+ if (file_) return S_OK;
+ return E_FAIL;
+ }
+ void close()
+ {
+ if (file_) fclose(file_);
+ file_ = 0;
+ pos_ = 0;
+ }
+ HRESULT Read(void *data, UInt32 size, UInt32 *processedSize)
+ {
+ if (file_)
+ {
+ size_t ret = fread (data, 1, size, file_);
+ *processedSize = ret;
+ pos_ += ret;
+ // TBD : if ret == 0, test for feof/ferror
+ return S_OK;
+ }
+ return E_FAIL;
+ }
+ size_t pos() { return pos_; }
+};
+
+class CFileOut : public ISequentialOutStream, public CMyUnknownImp
+{
+ FILE *file_;
+ size_t pos_;
+ public:
+ MY_UNKNOWN_IMP
+
+ CFileOut() : file_(0) { }
+ ~CFileOut() { this->close(); }
+
+ HRESULT open(const char *name)
+ {
+ file_ = fopen(name,"wb");
+ if (file_) return S_OK;
+ return E_FAIL;
+ }
+ void close()
+ {
+ if (file_) fclose(file_);
+ file_ = 0;
+ }
+ HRESULT Write(const void *data, UInt32 size, UInt32 *processedSize)
+ {
+ if (file_)
+ {
+ size_t ret = fwrite(data, 1, size, file_);
+ *processedSize = ret;
+ pos_ += ret;
+ // TBD : if ret == 0, test for feof/ferror
+ return S_OK;
+ }
+ return E_FAIL;
+ }
+ size_t pos() { return pos_; }
+};
+
+//////////////////////////////////////////////////////////////////////////
+// Main function
+
+static const char *kHelpString =
+"Usage: ClientCodec codec.so [c | d | i] [file_in file_out]\n"
+"Examples:\n"
+" ClientCodec LZMA.so i : info about the codec\n"
+" ClientCodec LZMA.so e file_in file_out : encodes file_in to file_out\n"
+" ClientCodec LZMA.so d file_in file_out : decodes file_in to file_out\n"
+;
+
+typedef UINT32 (WINAPI * CreateObjectFunc)(
+ const GUID *clsID,
+ const GUID *interfaceID,
+ void **outObject);
+
+typedef UINT32 (WINAPI * GetNumberOfMethodsFunc)(UINT32 *numMethods);
+
+typedef UINT32 (WINAPI * GetMethodPropertyFunc)(UINT32 index, PROPID propID, PROPVARIANT *value);
+
+int main(int argc, char* argv[])
+{
+ if ((argc != 3) && (argc != 5))
+ {
+ printf(kHelpString);
+ return 1;
+ }
+
+ if ((argc == 3) && (strcmp(argv[2],"i") != 0))
+ {
+ printf(kHelpString);
+ return 1;
+ }
+
+ NWindows::NDLL::CLibrary library;
+ if (!library.Load(argv[1]))
+ {
+ printf("Can not load library %s\n",argv[1]);
+ return 1;
+ }
+ CreateObjectFunc createObjectFunc = (CreateObjectFunc)library.GetProcAddress("CreateObject");
+ if (createObjectFunc == 0)
+ {
+ printf("Can not get CreateObject\n");
+ return 1;
+ }
+
+ GetNumberOfMethodsFunc getNumberOfMethodsFunc = (GetNumberOfMethodsFunc)library.GetProcAddress("GetNumberOfMethods");
+ if (getNumberOfMethodsFunc == 0)
+ {
+ printf("Can not get GetNumberOfMethodsFunc\n");
+ return 1;
+ }
+
+ UINT32 numMethods = 0;
+ HRESULT res = getNumberOfMethodsFunc(&numMethods);
+ if (res != S_OK)
+ {
+ printf("Error in GetNumberOfMethods\n");
+ return 1;
+ }
+
+ GetMethodPropertyFunc getMethodPropertyFunc = (GetMethodPropertyFunc)library.GetProcAddress("GetMethodProperty");
+ if (getMethodPropertyFunc == 0)
+ {
+ printf("Can not get GetMethodProperty\n");
+ return 1;
+ }
+
+ if (argv[2][0] == 'i')
+ {
+ printf("%s has %d method(s)\n",argv[1],(int)numMethods);
+
+ for(UINT32 m = 0; m < numMethods ; m++)
+ {
+ printf("\tMethod %d :\n",(int)m);
+ NCOM::CPropVariant propVariant;
+ res = getMethodPropertyFunc(m,NMethodPropID::kName,&propVariant);
+ if (res == S_OK)
+ {
+ if (propVariant.vt == VT_BSTR)
+ {
+ printf("\t\tName : %ls\n",propVariant.bstrVal); // Unicode Name
+ } else {
+ printf("\t\tName : Error\n");
+ }
+ } else {
+ printf("\t\tName : Unknown\n");
+ }
+ res = getMethodPropertyFunc(m,NMethodPropID::kDecoder,&propVariant);
+ if ((res == S_OK) && (propVariant.vt == VT_BSTR)) printf("\t\tDecoder : YES\n");
+ else printf("\t\tDecoder : NO\n");
+
+ res = getMethodPropertyFunc(m,NMethodPropID::kEncoder,&propVariant);
+ if ((res == S_OK) && (propVariant.vt == VT_BSTR)) printf("\t\tEncoder : YES\n");
+ else printf("\t\tEncoder : NO\n");
+ }
+ }
+
+ int numMethod = 0; // TBD
+
+ if (argv[2][0] == 'e')
+ {
+ NCOM::CPropVariant propVariant;
+ res = getMethodPropertyFunc(numMethod,NMethodPropID::kEncoder,&propVariant);
+ if ((res == S_OK) && (propVariant.vt == VT_BSTR))
+ {
+ CMyComPtr<ICompressCoder> outCoder;
+ if (createObjectFunc((const GUID *)propVariant.bstrVal, &IID_ICompressCoder, (void **)&outCoder) != S_OK)
+ {
+ printf("Can not get class object\n");
+ return 1;
+ }
+ printf("Encoding : ...\n");
+
+ CMyComPtr<CFileIn> inStream = new CFileIn;
+ res = inStream->open(argv[3]);
+ if (res != S_OK)
+ {
+ printf("cannot open %s\n",argv[3]);
+ return 1;
+ }
+
+ CMyComPtr<CFileOut> outStream = new CFileOut;
+ res = outStream->open(argv[4]);
+ if (res != S_OK)
+ {
+ printf("cannot open %s\n",argv[4]);
+ return 1;
+ }
+{
+ CMyComPtr<ICompressSetCoderProperties> setCoderProperties;
+ outCoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties);
+ if (setCoderProperties != NULL)
+ {
+ printf("IID_ICompressSetCoderProperties : Found\n");
+ PROPID propID = NCoderPropID::kEndMarker;
+ NWindows::NCOM::CPropVariant value = true;
+ res = setCoderProperties->SetCoderProperties(&propID, &value, 1);
+ if (res = S_OK) printf("kEndMarker : ON\n");
+ else printf("kEndMarker : KO KO\n");
+ }
+ else
+ {
+ printf("IID_ICompressSetCoderProperties : NOT Found\n");
+ }
+}
+
+{
+ CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties;
+
+ outCoder.QueryInterface(IID_ICompressWriteCoderProperties, &writeCoderProperties);
+
+ if (writeCoderProperties != NULL)
+ {
+ UINT32 len = 5; // TBD
+ UInt32 processedSize;
+ outStream->Write(&len, sizeof(len), &processedSize);
+
+ printf("IID_ICompressWriteCoderProperties : Found\n");
+ size_t pos1 = outStream->pos();
+ writeCoderProperties->WriteCoderProperties(outStream);
+ size_t pos2 = outStream->pos();
+ printf("SizeOfProp : %d\n",(int)(pos2-pos1));
+/*
+ CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp;
+ CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
+ outStreamSpec->Init();
+ writeCoderProperties->WriteCoderProperties(outStream);
+
+ size_t size = outStreamSpec->GetSize();
+
+ // encodingInfo.Properties.SetCapacity(size);
+ if (encodingInfo.AltCoders.Size() == 0)
+ encodingInfo.AltCoders.Add(CAltCoderInfo());
+ CAltCoderInfo &altCoderInfo = encodingInfo.AltCoders.Front();
+ altCoderInfo.Properties.SetCapacity(size);
+
+ memmove(altCoderInfo.Properties, outStreamSpec->GetBuffer(), size);
+*/
+ }
+ else
+ {
+ printf("IID_ICompressWriteCoderProperties : NOT Found\n");
+ UINT32 len = 0;
+ UInt32 processedSize;
+ outStream->Write(&len, sizeof(len), &processedSize);
+ }
+}
+
+ res = outCoder->Code(inStream,outStream,0,0,0);
+ inStream->close();
+ outStream->close();
+
+ if (res == S_OK)
+ {
+ printf("Encoding : Done\n");
+ } else {
+ printf("Encoding : Error\n");
+ return 1;
+ }
+ }
+ else
+ {
+ printf("Encoder not available\n");
+ return 1;
+ }
+ }
+
+ if (argv[2][0] == 'd')
+ {
+ NCOM::CPropVariant propVariant;
+ res = getMethodPropertyFunc(numMethod,NMethodPropID::kDecoder,&propVariant);
+ if ((res == S_OK) && (propVariant.vt == VT_BSTR))
+ {
+ CMyComPtr<ICompressCoder> outCoder;
+ if (createObjectFunc((const GUID *)propVariant.bstrVal, &IID_ICompressCoder, (void **)&outCoder) != S_OK)
+ {
+ printf("Can not get class object\n");
+ return 1;
+ }
+ printf("Decoding : ...\n");
+
+ CMyComPtr<CFileIn> inStream = new CFileIn;
+ res = inStream->open(argv[3]);
+ if (res != S_OK)
+ {
+ printf("cannot open %s\n",argv[3]);
+ return 1;
+ }
+
+ CMyComPtr<CFileOut> outStream = new CFileOut;
+ res = outStream->open(argv[4]);
+ if (res != S_OK)
+ {
+ printf("cannot open %s\n",argv[4]);
+ return 1;
+ }
+{
+ UINT32 len = 0;
+ UInt32 processedSize;
+ inStream->Read(&len, sizeof(len), &processedSize);
+
+ if (len > 0)
+ {
+ Byte props[256]; // TBD
+ inStream->Read(props, len, &processedSize);
+
+ CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties;
+ outCoder->QueryInterface(IID_ICompressSetDecoderProperties2, (void **)&setDecoderProperties);
+ if (setDecoderProperties)
+ {
+ setDecoderProperties->SetDecoderProperties2(props, len);
+ printf("IID_ICompressSetDecoderProperties2 : Found (%d)\n",(int)len);
+ }
+ }
+}
+
+ // FIXME UInt64 outSize = 10511; // res = outCoder->Code(inStream,outStream,0,&outSize,0);
+ res = outCoder->Code(inStream,outStream,0,0,0);
+ inStream->close();
+ outStream->close();
+
+ if (res == S_OK)
+ {
+ printf("Decoding : Done\n");
+ } else {
+ printf("Decoding : Error\n");
+ return 1;
+ }
+ }
+ else
+ {
+ printf("Decoder not available\n");
+ return 1;
+ }
+ }
+
+ return 0;
+}