Skip to content

Commit

Permalink
Add 'GetArchiveFormat'
Browse files Browse the repository at this point in the history
  • Loading branch information
fasterthanlime committed Feb 13, 2018
1 parent eb31dfe commit 558038e
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 17 deletions.
18 changes: 13 additions & 5 deletions Lib7Zip/7ZipArchive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ class CCustomArchiveExtractCallback:
class C7ZipArchiveImpl : public virtual C7ZipArchive
{
public:
C7ZipArchiveImpl(C7ZipLibrary * pLibrary, IInArchive * pInArchive);
C7ZipArchiveImpl(C7ZipLibrary * pLibrary, IInArchive * pInArchive, const wstring &formatName);
virtual ~C7ZipArchiveImpl();

public:
Expand All @@ -168,6 +168,7 @@ class C7ZipArchiveImpl : public virtual C7ZipArchive

virtual wstring GetArchivePassword() const;
virtual void SetArchivePassword(const wstring & password);
virtual wstring GetArchiveFormat() const;
virtual bool IsPasswordSet() const;

virtual bool GetUInt64Property(lib7zip::PropertyIndexEnum propertyIndex,
Expand All @@ -183,11 +184,13 @@ class C7ZipArchiveImpl : public virtual C7ZipArchive
CMyComPtr<IInArchive> m_pInArchive;
C7ZipObjectPtrArray m_ArchiveItems;
wstring m_Password;
wstring m_Format;
};

C7ZipArchiveImpl::C7ZipArchiveImpl(C7ZipLibrary * pLibrary, IInArchive * pInArchive) :
C7ZipArchiveImpl::C7ZipArchiveImpl(C7ZipLibrary * pLibrary, IInArchive * pInArchive, const wstring &formatName) :
m_pLibrary(pLibrary),
m_pInArchive(pInArchive)
m_pInArchive(pInArchive),
m_Format(formatName)
{
}

Expand Down Expand Up @@ -285,6 +288,11 @@ wstring C7ZipArchiveImpl::GetArchivePassword() const
return m_Password;
}

wstring C7ZipArchiveImpl::GetArchiveFormat() const
{
return m_Format;
}

void C7ZipArchiveImpl::SetArchivePassword(const wstring & password)
{
m_Password = password;
Expand All @@ -295,9 +303,9 @@ bool C7ZipArchiveImpl::IsPasswordSet() const
return !(m_Password == L"");
}

bool Create7ZipArchive(C7ZipLibrary * pLibrary, IInArchive * pInArchive, C7ZipArchive ** ppArchive)
bool Create7ZipArchive(C7ZipLibrary * pLibrary, IInArchive * pInArchive, C7ZipArchive ** ppArchive, const wstring &formatName)
{
C7ZipArchiveImpl * pArchive = new C7ZipArchiveImpl(pLibrary, pInArchive);
C7ZipArchiveImpl * pArchive = new C7ZipArchiveImpl(pLibrary, pInArchive, formatName);

if (pArchive->Initialize())
{
Expand Down
25 changes: 15 additions & 10 deletions Lib7Zip/7ZipOpenArchive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ using namespace NWindows;

const UInt64 kMaxCheckStartPosition = 1 << 22;

extern bool Create7ZipArchive(C7ZipLibrary * pLibrary, IInArchive * pInArchive, C7ZipArchive ** pArchive);
extern bool Create7ZipArchive(C7ZipLibrary * pLibrary, IInArchive * pInArchive, C7ZipArchive ** pArchive, const wstring &formatName);

static bool ReadStream(CMyComPtr<IInStream> & inStream, Int64 offset, UINT32 seekOrigin, CByteBuffer & signature)
{
Expand Down Expand Up @@ -80,14 +80,16 @@ static bool ReadStream(CMyComPtr<IInStream> & inStream, Int64 offset, UINT32 see

static int CreateInArchive(pU7ZipFunctions pFunctions,
const C7ZipObjectPtrArray & formatInfos,
CMyComPtr<IInStream> & inStream,
CMyComPtr<IInStream> & inStream,
wstring ext,
CMyComPtr<IInArchive> & archive,
bool fCheckFileTypeBySignature)
bool fCheckFileTypeBySignature,
wstring &formatName)
{
for (C7ZipObjectPtrArray::const_iterator it = formatInfos.begin();
it != formatInfos.end();it++) {
const C7ZipFormatInfo * pInfo = dynamic_cast<const C7ZipFormatInfo *>(*it);
formatName = pInfo->m_Name;

if (!fCheckFileTypeBySignature) {
for(WStringArray::const_iterator extIt = pInfo->Exts.begin(); extIt != pInfo->Exts.end(); extIt++) {
Expand All @@ -106,6 +108,7 @@ static int CreateInArchive(pU7ZipFunctions pFunctions,

#if MY_VER_MAJOR >= 15
for(unsigned i = 0; i < pInfo->Signatures.Size(); i++) {
wprintf(L"Checking signature %d\n", i);
CByteBuffer signature(pInfo->Signatures[i].Size());

if (!ReadStream(inStream, pInfo->SignatureOffset, FILE_BEGIN, signature))
Expand Down Expand Up @@ -196,7 +199,7 @@ static HRESULT InternalOpenArchive(C7ZipLibrary * pLibrary,
C7ZipArchiveOpenCallback * pOpenCallBack,
C7ZipArchive ** ppArchive,
HRESULT * pResult,
bool fCheckFileTypeBySignature)
bool fCheckFileTypeBySignature)
{
CMyComPtr<IInArchive> archive = NULL;
CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo = NULL;
Expand All @@ -208,14 +211,16 @@ static HRESULT InternalOpenArchive(C7ZipLibrary * pLibrary,
CMyComPtr<IInStream> inStream(pArchiveStream);

CMyComPtr<IArchiveOpenCallback> openCallBack(pOpenCallBack);
wstring formatName;

do {
FAIL_RET(CreateInArchive(pHandler->GetFunctions(),
pHandler->GetFormatInfoArray(),
inStream,
extension,
archive,
fCheckFileTypeBySignature), pResult);
pHandler->GetFormatInfoArray(),
inStream,
extension,
archive,
fCheckFileTypeBySignature,
formatName), pResult);

if (archive == NULL)
return false;
Expand Down Expand Up @@ -274,5 +279,5 @@ static HRESULT InternalOpenArchive(C7ZipLibrary * pLibrary,
if (archive == NULL)
return S_FALSE;

return Create7ZipArchive(pLibrary, archive, ppArchive) ? S_OK : S_FALSE;
return Create7ZipArchive(pLibrary, archive, ppArchive, formatName) ? S_OK : S_FALSE;
}
1 change: 1 addition & 0 deletions Lib7Zip/lib7zip.h
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ class C7ZipArchive : public virtual C7ZipObject
virtual bool ExtractSeveral(unsigned int *indexList, int numIndices, C7ZipExtractCallback *extractCallback) = 0;
virtual wstring GetArchivePassword() const = 0;
virtual void SetArchivePassword(const wstring & password) = 0;
virtual wstring GetArchiveFormat() const = 0;
virtual bool IsPasswordSet() const = 0;

virtual void Close() = 0;
Expand Down
5 changes: 3 additions & 2 deletions Test7Zip/Test7Zip.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -253,10 +253,11 @@ int main(int argc, char * argv[])
TestOutStream oStream("TestResult.txt");
if (lib.OpenArchive(&stream, &pArchive)) {
unsigned int numItems = 0;

pArchive->GetItemCount(&numItems);
wprintf(L"%d items\n", numItems);

wprintf(L"%d\n", numItems);
auto format = pArchive->GetArchiveFormat();
wprintf(L"'%ls' format\n", format.c_str());

for(unsigned int i = 0;i < numItems;i++) {
C7ZipArchiveItem * pArchiveItem = NULL;
Expand Down

0 comments on commit 558038e

Please sign in to comment.