diff options
author | Igor Pavlov <ipavlov@users.sourceforge.net> | 2015-06-15 03:00:00 +0300 |
---|---|---|
committer | Kornel LesiĆski <kornel@geekhood.net> | 2016-05-28 02:16:54 +0300 |
commit | 54490d51d5c6b0d794dcbad2d634d4c95fc25b6c (patch) | |
tree | c3c413656432c0ef87b2841c80e42b55ad17d4e8 /CPP/7zip/Archive/Tar | |
parent | 0713a3ab803e57401f18432148b4139e5fe6e5dd (diff) |
15.0515.05
Diffstat (limited to 'CPP/7zip/Archive/Tar')
-rw-r--r-- | CPP/7zip/Archive/Tar/TarHandler.cpp | 26 | ||||
-rw-r--r-- | CPP/7zip/Archive/Tar/TarHandler.h | 2 | ||||
-rw-r--r-- | CPP/7zip/Archive/Tar/TarHandlerOut.cpp | 4 | ||||
-rw-r--r-- | CPP/7zip/Archive/Tar/TarIn.cpp | 40 | ||||
-rw-r--r-- | CPP/7zip/Archive/Tar/TarItem.h | 2 | ||||
-rw-r--r-- | CPP/7zip/Archive/Tar/TarRegister.cpp | 15 | ||||
-rw-r--r-- | CPP/7zip/Archive/Tar/TarUpdate.cpp | 10 |
7 files changed, 59 insertions, 40 deletions
diff --git a/CPP/7zip/Archive/Tar/TarHandler.cpp b/CPP/7zip/Archive/Tar/TarHandler.cpp index 5b587529..d1eec144 100644 --- a/CPP/7zip/Archive/Tar/TarHandler.cpp +++ b/CPP/7zip/Archive/Tar/TarHandler.cpp @@ -143,10 +143,10 @@ HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback) if (!_forceCodePage) { - if (utf8_OK) utf8_OK = CheckUTF8(item.Name); + if (utf8_OK) utf8_OK = CheckUTF8(item.Name, item.NameCouldBeReduced); + if (utf8_OK) utf8_OK = CheckUTF8(item.LinkName, item.LinkNameCouldBeReduced); if (utf8_OK) utf8_OK = CheckUTF8(item.User); if (utf8_OK) utf8_OK = CheckUTF8(item.Group); - if (utf8_OK) utf8_OK = CheckUTF8(item.LinkName); } RINOK(stream->Seek(item.GetPackSizeAligned(), STREAM_SEEK_CUR, &_phySize)); @@ -298,19 +298,12 @@ void CHandler::TarStringToUnicode(const AString &s, NWindows::NCOM::CPropVariant { UString dest; if (_curCodePage == CP_UTF8) - { - if (!ConvertUTF8ToUnicode(s, dest)) - { - prop = "[ERROR-NAME]"; - return; - } - } + ConvertUTF8ToUnicode(s, dest); else - dest = MultiByteToUnicodeString(s, _curCodePage); + MultiByteToUnicodeString2(dest, s, _curCodePage); if (toOs) - prop = NItemName::GetOSName2(dest); - else - prop = dest; + NItemName::ConvertToOSName2(dest); + prop = dest; } STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) @@ -632,10 +625,7 @@ STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) if (item.IsSymLink()) { - CBufInStream *streamSpec = new CBufInStream; - CMyComPtr<IInStream> streamTemp = streamSpec; - streamSpec->Init((const Byte *)(const char *)item.LinkName, item.LinkName.Len(), (IInArchive *)this); - *stream = streamTemp.Detach(); + Create_BufInStream_WithReference((const Byte *)(const char *)item.LinkName, item.LinkName.Len(), (IInArchive *)this, stream); return S_OK; } @@ -651,7 +641,7 @@ void CHandler::Init() _curCodePage = _specifiedCodePage = CP_UTF8; // CP_OEMCP; } -STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps) +STDMETHODIMP CHandler::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps) { Init(); diff --git a/CPP/7zip/Archive/Tar/TarHandler.h b/CPP/7zip/Archive/Tar/TarHandler.h index 23854767..42d57d45 100644 --- a/CPP/7zip/Archive/Tar/TarHandler.h +++ b/CPP/7zip/Archive/Tar/TarHandler.h @@ -67,7 +67,7 @@ public: INTERFACE_IOutArchive(;) STDMETHOD(OpenSeq)(ISequentialInStream *stream); STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream); - STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, UInt32 numProps); + STDMETHOD(SetProperties)(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps); void Init(); CHandler(); diff --git a/CPP/7zip/Archive/Tar/TarHandlerOut.cpp b/CPP/7zip/Archive/Tar/TarHandlerOut.cpp index b909e96c..ae005ac5 100644 --- a/CPP/7zip/Archive/Tar/TarHandlerOut.cpp +++ b/CPP/7zip/Archive/Tar/TarHandlerOut.cpp @@ -36,8 +36,8 @@ HRESULT GetPropString(IArchiveUpdateCallback *callback, UInt32 index, PROPID pro s = NItemName::MakeLegalName(s); if (codePage == CP_UTF8) { - if (!ConvertUnicodeToUTF8(s, res)) - return E_INVALIDARG; + ConvertUnicodeToUTF8(s, res); + // if (!ConvertUnicodeToUTF8(s, res)) // return E_INVALIDARG; } else UnicodeStringToMultiByte2(res, s, codePage); diff --git a/CPP/7zip/Archive/Tar/TarIn.cpp b/CPP/7zip/Archive/Tar/TarIn.cpp index 1584a520..80200c3b 100644 --- a/CPP/7zip/Archive/Tar/TarIn.cpp +++ b/CPP/7zip/Archive/Tar/TarIn.cpp @@ -180,6 +180,9 @@ static HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemE error = k_ErrorType_Corrupted; ReadString(p, NFileHeader::kNameSize, item.Name); p += NFileHeader::kNameSize; + item.NameCouldBeReduced = + (item.Name.Len() == NFileHeader::kNameSize || + item.Name.Len() == NFileHeader::kNameSize - 1); RIF(OctalToNumber32(p, 8, item.Mode)); p += 8; @@ -198,6 +201,9 @@ static HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemE item.LinkFlag = *p++; ReadString(p, NFileHeader::kNameSize, item.LinkName); p += NFileHeader::kNameSize; + item.LinkNameCouldBeReduced = + (item.LinkName.Len() == NFileHeader::kNameSize || + item.LinkName.Len() == NFileHeader::kNameSize - 1); memcpy(item.Magic, p, 8); p += 8; @@ -207,12 +213,17 @@ static HRESULT GetNextItemReal(ISequentialInStream *stream, bool &filled, CItemE item.DeviceMajorDefined = (p[0] != 0); if (item.DeviceMajorDefined) { RIF(OctalToNumber32(p, 8, item.DeviceMajor)); } p += 8; item.DeviceMinorDefined = (p[0] != 0); if (item.DeviceMinorDefined) { RIF(OctalToNumber32(p, 8, item.DeviceMinor)); } p += 8; - AString prefix; - ReadString(p, NFileHeader::kPrefixSize, prefix); + if (p[0] != 0) + { + AString prefix; + ReadString(p, NFileHeader::kPrefixSize, prefix); + if (!prefix.IsEmpty() + && item.IsUstarMagic() + && (item.LinkFlag != 'L' /* || prefix != "00000000000" */ )) + item.Name = prefix + '/' + item.Name; + } + p += NFileHeader::kPrefixSize; - if (!prefix.IsEmpty() && item.IsUstarMagic() && - (item.LinkFlag != 'L' /* || prefix != "00000000000" */ )) - item.Name = prefix + AString('/') + item.Name; if (item.LinkFlag == NFileHeader::NLinkFlag::kHardLink) { @@ -353,12 +364,11 @@ HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item, EErro if (item.PackSize > (1 << 14)) return S_OK; unsigned packSize = (unsigned)item.GetPackSizeAligned(); - char *buf = name->GetBuffer(packSize); + char *buf = name->GetBuf(packSize); size_t processedSize = packSize; HRESULT res = ReadStream(stream, buf, &processedSize); item.HeaderSize += (unsigned)processedSize; - buf[(size_t)item.PackSize] = 0; - name->ReleaseBuffer(); + name->ReleaseBuf_CalcLen((unsigned)item.PackSize); RINOK(res); if (processedSize != packSize) { @@ -392,8 +402,18 @@ HRESULT ReadItem(ISequentialInStream *stream, bool &filled, CItemEx &item, EErro return S_OK; } - if (flagL) item.Name = nameL; - if (flagK) item.LinkName = nameK; + if (flagL) + { + item.Name = nameL; + item.NameCouldBeReduced = false; + } + + if (flagK) + { + item.LinkName = nameK; + item.LinkNameCouldBeReduced = false; + } + error = k_ErrorType_OK; return S_OK; } diff --git a/CPP/7zip/Archive/Tar/TarItem.h b/CPP/7zip/Archive/Tar/TarItem.h index 805a2e7c..5245aaa4 100644 --- a/CPP/7zip/Archive/Tar/TarItem.h +++ b/CPP/7zip/Archive/Tar/TarItem.h @@ -86,6 +86,8 @@ struct CItemEx: public CItem { UInt64 HeaderPos; unsigned HeaderSize; + bool NameCouldBeReduced; + bool LinkNameCouldBeReduced; UInt64 GetDataPosition() const { return HeaderPos + HeaderSize; } UInt64 GetFullSize() const { return HeaderSize + PackSize; } diff --git a/CPP/7zip/Archive/Tar/TarRegister.cpp b/CPP/7zip/Archive/Tar/TarRegister.cpp index 9e0f6f21..f7b256df 100644 --- a/CPP/7zip/Archive/Tar/TarRegister.cpp +++ b/CPP/7zip/Archive/Tar/TarRegister.cpp @@ -9,18 +9,15 @@ namespace NArchive { namespace NTar { -IMP_CreateArcIn -IMP_CreateArcOut +static const Byte k_Signature[] = { 'u', 's', 't', 'a', 'r' }; -static CArcInfo g_ArcInfo = - { "tar", "tar", 0, 0xEE, - 5, { 'u', 's', 't', 'a', 'r' }, +REGISTER_ARC_IO( + "tar", "tar", 0, 0xEE, + k_Signature, NFileHeader::kUstarMagic_Offset, NArcInfoFlags::kStartOpen | NArcInfoFlags::kSymLinks | NArcInfoFlags::kHardLinks, - REF_CreateArc_Pair, IsArc_Tar }; - -REGISTER_ARC(Tar) - + IsArc_Tar) + }} diff --git a/CPP/7zip/Archive/Tar/TarUpdate.cpp b/CPP/7zip/Archive/Tar/TarUpdate.cpp index fdbce395..3adbdee9 100644 --- a/CPP/7zip/Archive/Tar/TarUpdate.cpp +++ b/CPP/7zip/Archive/Tar/TarUpdate.cpp @@ -31,6 +31,9 @@ HRESULT UpdateArchive(IInStream *inStream, ISequentialOutStream *outStream, CMyComPtr<IOutStream> outSeekStream; outStream->QueryInterface(IID_IOutStream, (void **)&outSeekStream); + CMyComPtr<IArchiveUpdateCallbackFile> opCallback; + updateCallback->QueryInterface(IID_IArchiveUpdateCallbackFile, (void **)&opCallback); + UInt64 complexity = 0; unsigned i; @@ -224,6 +227,13 @@ HRESULT UpdateArchive(IInStream *inStream, ISequentialOutStream *outStream, } streamSpec->Init(size); + if (opCallback) + { + RINOK(opCallback->ReportOperation( + NEventIndexType::kInArcIndex, (UInt32)ui.IndexInArchive, + NUpdateNotifyOp::kReplicate)) + } + RINOK(copyCoder->Code(inStreamLimited, outStream, NULL, NULL, progress)); if (copyCoderSpec->TotalSize != size) return E_FAIL; |