diff options
Diffstat (limited to 'CPP/7zip/Archive/RPM')
-rwxr-xr-x | CPP/7zip/Archive/RPM/RpmHandler.cpp | 30 | ||||
-rwxr-xr-x | CPP/7zip/Archive/RPM/RpmHandler.h | 1 | ||||
-rwxr-xr-x | CPP/7zip/Archive/RPM/RpmIn.cpp | 10 | ||||
-rwxr-xr-x | CPP/7zip/Archive/RPM/RpmRegister.cpp | 2 |
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) |