⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tarhandlerout.cpp

📁 由7-zip提供的压缩、解压缩程序
💻 CPP
字号:
// Tar/HandlerOut.cpp#include "StdAfx.h"#include "Common/StringConvert.h"#include "Common/ComTry.h"#include "Windows/PropVariant.h"#include "Windows/Time.h"#include "../Common/ItemNameUtils.h"#include "TarHandler.h"#include "TarUpdate.h"using namespace NWindows;using namespace NCOM;using namespace NTime;namespace NArchive {namespace NTar {STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type){  *type = NFileTimeType::kUnix;  return S_OK;}STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems,    IArchiveUpdateCallback *updateCallback){  COM_TRY_BEGIN  CObjectVector<CUpdateItemInfo> updateItems;  for(UInt32 i = 0; i < numItems; i++)  {    CUpdateItemInfo updateItem;    Int32 newData;    Int32 newProperties;    UInt32 indexInArchive;    if (!updateCallback)      return E_FAIL;    RINOK(updateCallback->GetUpdateItemInfo(i,        &newData, &newProperties, &indexInArchive));    updateItem.NewProperties = IntToBool(newProperties);    updateItem.NewData = IntToBool(newData);    updateItem.IndexInArchive = indexInArchive;    updateItem.IndexInClient = i;    if (IntToBool(newProperties))    {      FILETIME utcTime;      UString name;      bool isDirectoryStatusDefined;      UInt32 attributes;      {        NCOM::CPropVariant propVariant;        RINOK(updateCallback->GetProperty(i, kpidAttributes, &propVariant));        if (propVariant.vt == VT_EMPTY)          attributes = 0;        else if (propVariant.vt != VT_UI4)          return E_INVALIDARG;        else          attributes = propVariant.ulVal;      }      {        NCOM::CPropVariant propVariant;        RINOK(updateCallback->GetProperty(i, kpidLastWriteTime, &propVariant));        if (propVariant.vt != VT_FILETIME)          return E_INVALIDARG;        utcTime = propVariant.filetime;      }      {        NCOM::CPropVariant propVariant;        RINOK(updateCallback->GetProperty(i, kpidPath, &propVariant));        if (propVariant.vt == VT_EMPTY)          name.Empty();        else if (propVariant.vt != VT_BSTR)          return E_INVALIDARG;        else          name = propVariant.bstrVal;      }      {        NCOM::CPropVariant propVariant;        RINOK(updateCallback->GetProperty(i, kpidIsFolder, &propVariant));        if (propVariant.vt == VT_EMPTY)          isDirectoryStatusDefined = false;        else if (propVariant.vt != VT_BOOL)          return E_INVALIDARG;        else        {          updateItem.IsDirectory = (propVariant.boolVal != VARIANT_FALSE);          isDirectoryStatusDefined = true;        }      }      updateItem.Name = UnicodeStringToMultiByte(          NItemName::MakeLegalName(name), CP_OEMCP);      if (!isDirectoryStatusDefined)        updateItem.IsDirectory = ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0);      if (updateItem.IsDirectory)        updateItem.Name += '/';      if(!FileTimeToUnixTime(utcTime, updateItem.Time))      {        updateItem.Time = 0;        // return E_INVALIDARG;      }    }    if (IntToBool(newData))    {      UInt64 size;      {        NCOM::CPropVariant propVariant;        RINOK(updateCallback->GetProperty(i, kpidSize, &propVariant));        if (propVariant.vt != VT_UI8)          return E_INVALIDARG;        size = propVariant.uhVal.QuadPart;      }      updateItem.Size = size;    }    updateItems.Add(updateItem);  }  return UpdateArchive(_inStream, outStream, _items, updateItems, updateCallback);  COM_TRY_END}}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -