Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/Archive/RPM')
-rwxr-xr-xCPP/7zip/Archive/RPM/RpmHandler.cpp30
-rwxr-xr-xCPP/7zip/Archive/RPM/RpmHandler.h1
-rwxr-xr-xCPP/7zip/Archive/RPM/RpmIn.cpp10
-rwxr-xr-xCPP/7zip/Archive/RPM/RpmRegister.cpp2
4 files changed, 26 insertions, 17 deletions
diff --git a/CPP/7zip/Archive/RPM/RpmHandler.cpp b/CPP/7zip/Archive/RPM/RpmHandler.cpp
index 7cd881a1..9a9f9af4 100755
--- a/CPP/7zip/Archive/RPM/RpmHandler.cpp
+++ b/CPP/7zip/Archive/RPM/RpmHandler.cpp
@@ -5,20 +5,15 @@
#include "RpmHandler.h"
#include "RpmIn.h"
-#include "Common/Defs.h"
-#include "Common/StringConvert.h"
-#include "Common/NewHandler.h"
#include "Common/ComTry.h"
+#include "Common/MyString.h"
#include "Windows/PropVariant.h"
-#include "Windows/Defs.h"
-#include "../../Common/StreamObjects.h"
#include "../../Common/ProgressUtils.h"
-#include "../../Common/LimitedStreams.h"
+#include "../../Common/StreamUtils.h"
#include "../../Compress/Copy/CopyCoder.h"
-#include "../Common/ItemNameUtils.h"
using namespace NWindows;
@@ -44,10 +39,14 @@ STDMETHODIMP CHandler::Open(IInStream *inStream,
if(OpenArchive(inStream) != S_OK)
return S_FALSE;
RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &m_Pos));
- m_InStream = inStream;
UInt64 endPosition;
RINOK(inStream->Seek(0, STREAM_SEEK_END, &endPosition));
m_Size = endPosition - m_Pos;
+
+ RINOK(inStream->Seek(m_Pos, STREAM_SEEK_SET, NULL));
+ RINOK(ReadStream_FALSE(inStream, _sig, sizeof(_sig) / sizeof(_sig[0])));
+
+ m_InStream = inStream;
return S_OK;
}
catch(...)
@@ -78,6 +77,21 @@ STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIAN
case kpidPackedSize:
prop = m_Size;
break;
+ case kpidExtension:
+ {
+ wchar_t s[32];
+ MyStringCopy(s, L"cpio.");
+ const wchar_t *ext;
+ if (_sig[0] == 0x1F && _sig[1] == 0x8B)
+ ext = L"gz";
+ else if (_sig[0] == 'B' && _sig[1] == 'Z' && _sig[2] == 'h')
+ ext = L"bz2";
+ else
+ ext = L"lzma";
+ MyStringCopy(s + MyStringLen(s), ext);
+ prop = s;
+ break;
+ }
}
prop.Detach(value);
return S_OK;
diff --git a/CPP/7zip/Archive/RPM/RpmHandler.h b/CPP/7zip/Archive/RPM/RpmHandler.h
index c78e8ce3..92efc107 100755
--- a/CPP/7zip/Archive/RPM/RpmHandler.h
+++ b/CPP/7zip/Archive/RPM/RpmHandler.h
@@ -22,6 +22,7 @@ private:
CMyComPtr<IInStream> m_InStream;
UInt64 m_Pos;
UInt64 m_Size;
+ Byte _sig[4];
};
}}
diff --git a/CPP/7zip/Archive/RPM/RpmIn.cpp b/CPP/7zip/Archive/RPM/RpmIn.cpp
index c1600894..db7a6f63 100755
--- a/CPP/7zip/Archive/RPM/RpmIn.cpp
+++ b/CPP/7zip/Archive/RPM/RpmIn.cpp
@@ -32,10 +32,7 @@ static HRESULT RedSigHeaderSig(IInStream *inStream, CSigHeaderSig &h)
{
char dat[kCSigHeaderSigSize];
char *cur = dat;
- UInt32 processedSize;
- RINOK(ReadStream(inStream, dat, kCSigHeaderSigSize, &processedSize));
- if (kCSigHeaderSigSize != processedSize)
- return S_FALSE;
+ RINOK(ReadStream_FALSE(inStream, dat, kCSigHeaderSigSize));
memmove(h.Magic, cur, 4);
cur += 4;
cur += 4;
@@ -51,10 +48,7 @@ HRESULT OpenArchive(IInStream *inStream)
char leadData[kLeadSize];
char *cur = leadData;
CLead lead;
- UInt32 processedSize;
- RINOK(ReadStream(inStream, leadData, kLeadSize, &processedSize));
- if (kLeadSize != processedSize)
- return S_FALSE;
+ RINOK(ReadStream_FALSE(inStream, leadData, kLeadSize));
memmove(lead.Magic, cur, 4);
cur += 4;
lead.Major = *cur++;
diff --git a/CPP/7zip/Archive/RPM/RpmRegister.cpp b/CPP/7zip/Archive/RPM/RpmRegister.cpp
index 76eb2470..61082bac 100755
--- a/CPP/7zip/Archive/RPM/RpmRegister.cpp
+++ b/CPP/7zip/Archive/RPM/RpmRegister.cpp
@@ -8,6 +8,6 @@
static IInArchive *CreateArc() { return new NArchive::NRpm::CHandler; }
static CArcInfo g_ArcInfo =
- { L"Rpm", L"rpm", L".cpio.gz", 0xEB, { 0}, 0, false, CreateArc, 0 };
+ { L"Rpm", L"rpm", 0, 0xEB, { 0}, 0, false, CreateArc, 0 };
REGISTER_ARC(Rpm)