From 16f738ecee689c6feb2acb7e4ef4d9bb4144ae7d Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 8 Jun 2008 11:04:43 +0200 Subject: Initial commit --- zip/ZipArchive/ZipExtraField.cpp | 88 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 zip/ZipArchive/ZipExtraField.cpp (limited to 'zip/ZipArchive/ZipExtraField.cpp') diff --git a/zip/ZipArchive/ZipExtraField.cpp b/zip/ZipArchive/ZipExtraField.cpp new file mode 100644 index 0000000..4488e37 --- /dev/null +++ b/zip/ZipArchive/ZipExtraField.cpp @@ -0,0 +1,88 @@ +//////////////////////////////////////////////////////////////////////////////// +// This source file is part of the ZipArchive library source distribution and +// is Copyrighted 2000 - 2007 by Artpol Software - Tadeusz Dracz +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// For the licensing details refer to the License.txt file. +// +// Web Site: http://www.artpol-software.com +//////////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "ZipExtraField.h" + +bool CZipExtraField::Read(CZipStorage *pStorage, WORD uSize) +{ + if (uSize == 0) + return true; + Clear(); + CZipAutoBuffer buffer; + buffer.Allocate(uSize); + pStorage->Read(buffer, uSize, true); + char* position = (char*) buffer; + do + { + CZipExtraData* pExtra = new CZipExtraData(); + if (!pExtra->Read(position, uSize)) + { + delete pExtra; + return false; + } + int totalSize = pExtra->GetTotalSize(); + if (totalSize > uSize || totalSize < 0) + return false; + position += totalSize; + uSize = (WORD)(uSize - totalSize); + Add(pExtra); + } + while (uSize > 0); + return true; +} + + +void CZipExtraField::Write(char* buffer)const +{ + int offset = 0; + for (int i = 0; i < GetCount(); i++) + offset += GetAt(i)->Write(buffer + offset); +} + +int CZipExtraField::GetTotalSize()const +{ + int total = 0; + for (int i = 0; i < GetCount(); i++) + total += GetAt(i)->GetTotalSize(); + return total; +} + +void CZipExtraField::RemoveInternalHeaders() +{ + for (int i = GetCount() - 1; i >= 0; i--) + { + WORD headerID = GetAt(i)->GetHeaderID(); + if ( + headerID == ZIP_EXTRA_ZARCH_NAME) + RemoveAt(i); + } +} + +CZipExtraData* CZipExtraField::Lookup(WORD headerID, int& index) const +{ + // we can do a non-efficient search here + // usually the number of extra fields is low, if any + for (int i = 0; i < GetCount(); i++) + { + CZipExtraData* pExtra = GetAt(i); + if (pExtra->m_uHeaderID == headerID) + { + index = i; + return pExtra; + } + } + return NULL; +} + -- cgit v1.2.3