亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? nsishandler.cpp

?? 壓縮解壓工具7-zip源代碼
?? CPP
字號:
// NSisHandler.cpp

#include "StdAfx.h"

#include "../../../../C/CpuArch.h"

#include "Common/ComTry.h"
#include "Common/IntToString.h"
#include "Common/NewHandler.h"

#include "Windows/PropVariant.h"

#include "../../Common/StreamUtils.h"

#include "../Common/ItemNameUtils.h"

#include "NsisHandler.h"

#define Get32(p) GetUi32(p)

using namespace NWindows;

namespace NArchive {
namespace NNsis {

static const wchar_t *kBcjMethod = L"BCJ";
static const wchar_t *kUnknownMethod = L"Unknown";

static const wchar_t *kMethods[] =
{
  L"Copy",
  L"Deflate",
  L"BZip2",
  L"LZMA"
};

static const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]);

STATPROPSTG kProps[] =
{
  { NULL, kpidPath, VT_BSTR},
  { NULL, kpidSize, VT_UI8},
  { NULL, kpidPackSize, VT_UI8},
  { NULL, kpidMTime, VT_FILETIME},
  { NULL, kpidMethod, VT_BSTR},
  { NULL, kpidSolid, VT_BOOL}
};

STATPROPSTG kArcProps[] =
{
  { NULL, kpidMethod, VT_BSTR},
  { NULL, kpidSolid, VT_BOOL}
};

IMP_IInArchive_Props
IMP_IInArchive_ArcProps

STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
{
  COM_TRY_BEGIN
  NWindows::NCOM::CPropVariant prop;
  switch(propID)
  {
    case kpidMethod:
    {
      UInt32 dict = 1;
      bool filter = false;
      for (int i = 0; i < _archive.Items.Size(); i++)
      {
        const CItem &item = _archive.Items[i];
        filter |= item.UseFilter;
        if (item.DictionarySize > dict)
          dict = item.DictionarySize;
      }
      prop = GetMethod(filter, dict);
      break;
    }
    case kpidSolid: prop = _archive.IsSolid; break;
  }
  prop.Detach(value);
  return S_OK;
  COM_TRY_END
}


STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 * maxCheckStartPosition, IArchiveOpenCallback * /* openArchiveCallback */)
{
  COM_TRY_BEGIN
  Close();
  {
    if(_archive.Open(
        EXTERNAL_CODECS_VARS
        stream, maxCheckStartPosition) != S_OK)
      return S_FALSE;
    _inStream = stream;
  }
  return S_OK;
  COM_TRY_END
}

STDMETHODIMP CHandler::Close()
{
  _archive.Clear();
  _archive.Release();
  _inStream.Release();
  return S_OK;
}

STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
{
  *numItems = _archive.Items.Size()
  #ifdef NSIS_SCRIPT
    + 1
  #endif
  ;
  return S_OK;
}

static UString ConvertUInt32ToString(UInt32 value)
{
  wchar_t buffer[32];
  ConvertUInt64ToString(value, buffer);
  return buffer;
}

static UString GetStringForSizeValue(UInt32 value)
{
  for (int i = 31; i >= 0; i--)
    if ((UInt32(1) << i) == value)
      return ConvertUInt32ToString(i);
  UString result;
  if (value % (1 << 20) == 0)
  {
    result += ConvertUInt32ToString(value >> 20);
    result += L"m";
  }
  else if (value % (1 << 10) == 0)
  {
    result += ConvertUInt32ToString(value >> 10);
    result += L"k";
  }
  else
  {
    result += ConvertUInt32ToString(value);
    result += L"b";
  }
  return result;
}

UString CHandler::GetMethod(bool useItemFilter, UInt32 dictionary) const
{
  NMethodType::EEnum methodIndex = _archive.Method;
  UString method;
  if (_archive.IsSolid && _archive.UseFilter || !_archive.IsSolid && useItemFilter)
  {
    method += kBcjMethod;
    method += L" ";
  }
  method += (methodIndex < kNumMethods) ? kMethods[methodIndex] : kUnknownMethod;
  if (methodIndex == NMethodType::kLZMA)
  {
    method += L":";
    method += GetStringForSizeValue(_archive.IsSolid ? _archive.DictionarySize: dictionary);
  }
  return method;
}

bool CHandler::GetUncompressedSize(int index, UInt32 &size)
{
  size = 0;
  const CItem &item = _archive.Items[index];
  if (item.SizeIsDefined)
     size = item.Size;
  else if (_archive.IsSolid && item.EstimatedSizeIsDefined)
     size  = item.EstimatedSize;
  else
    return false;
  return true;
}

bool CHandler::GetCompressedSize(int index, UInt32 &size)
{
  size = 0;
  const CItem &item = _archive.Items[index];
  if (item.CompressedSizeIsDefined)
    size = item.CompressedSize;
  else
  {
    if (_archive.IsSolid)
    {
      if (index == 0)
        size = _archive.FirstHeader.GetDataSize();
      else
        return false;
    }
    else
    {
      if (!item.IsCompressed)
        size = item.Size;
      else
        return false;
    }
  }
  return true;
}


STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
{
  COM_TRY_BEGIN
  NWindows::NCOM::CPropVariant prop;
  #ifdef NSIS_SCRIPT
  if (index >= (UInt32)_archive.Items.Size())
  {
    switch(propID)
    {
      case kpidPath:  prop = L"[NSIS].nsi"; break;
      case kpidSize:
      case kpidPackSize:  prop = (UInt64)_archive.Script.Length(); break;
      case kpidSolid:  prop = false; break;
    }
  }
  else
  #endif
  {
    const CItem &item = _archive.Items[index];
    switch(propID)
    {
      case kpidPath:
      {
        UString s = NItemName::WinNameToOSName(item.GetReducedName(_archive.IsUnicode));
        if (!s.IsEmpty())
          prop = (const wchar_t *)s;
        break;
      }
      case kpidSize:
      {
        UInt32 size;
        if (GetUncompressedSize(index, size))
          prop = (UInt64)size;
        break;
      }
      case kpidPackSize:
      {
        UInt32 size;
        if (GetCompressedSize(index, size))
          prop = (UInt64)size;
        break;
      }
      case kpidMTime:
      {
        if (item.MTime.dwHighDateTime > 0x01000000 &&
            item.MTime.dwHighDateTime < 0xFF000000)
          prop = item.MTime;
        break;
      }
      case kpidMethod:  prop = GetMethod(item.UseFilter, item.DictionarySize); break;
      case kpidSolid:  prop = _archive.IsSolid; break;
    }
  }
  prop.Detach(value);
  return S_OK;
  COM_TRY_END
}

STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems,
    Int32 _aTestMode, IArchiveExtractCallback *extractCallback)
{
  COM_TRY_BEGIN
  bool testMode = (_aTestMode != 0);
  bool allFilesMode = (numItems == UInt32(-1));
  if (allFilesMode)
    GetNumberOfItems(&numItems);
  if(numItems == 0)
    return S_OK;
  UInt64 totalSize = 0;

  UInt32 i;
  for(i = 0; i < numItems; i++)
  {
    UInt32 index = (allFilesMode ? i : indices[i]);
    #ifdef NSIS_SCRIPT
    if (index >= (UInt32)_archive.Items.Size())
      totalSize += _archive.Script.Length();
    else
    #endif
    {
      UInt32 size;
      if (_archive.IsSolid)
      {
        GetUncompressedSize(index, size);
        UInt64 pos = _archive.GetPosOfSolidItem(index);
        if (pos > totalSize)
          totalSize = pos + size;
      }
      else
      {
        GetCompressedSize(index, size);
        totalSize += size;
      }
    }
  }
  extractCallback->SetTotal(totalSize);

  UInt64 currentTotalSize = 0;
  UInt32 currentItemSize = 0;

  UInt64 streamPos = 0;
  if (_archive.IsSolid)
  {
    RINOK(_inStream->Seek(_archive.StreamOffset, STREAM_SEEK_SET, NULL));
    bool useFilter;
    RINOK(_archive.Decoder.Init(
        EXTERNAL_CODECS_VARS
        _inStream, _archive.Method, _archive.FilterFlag, useFilter));
  }

  CByteBuffer byteBuf;
  const UInt32 kBufferLength = 1 << 16;
  byteBuf.SetCapacity(kBufferLength);
  Byte *buffer = byteBuf;

  bool dataError = false;
  for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
  {
    currentItemSize = 0;
    RINOK(extractCallback->SetCompleted(&currentTotalSize));
    CMyComPtr<ISequentialOutStream> realOutStream;
    Int32 askMode;
    askMode = testMode ? NArchive::NExtract::NAskMode::kTest : NArchive::NExtract::NAskMode::kExtract;
    UInt32 index = allFilesMode ? i : indices[i];

    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));

    #ifdef NSIS_SCRIPT
    if (index >= (UInt32)_archive.Items.Size())
    {
      currentItemSize = _archive.Script.Length();
      if(!testMode && (!realOutStream))
        continue;
      RINOK(extractCallback->PrepareOperation(askMode));
      if (!testMode)
        RINOK(WriteStream(realOutStream, (const char *)_archive.Script, (UInt32)_archive.Script.Length()));
    }
    else
    #endif
    {
      const CItem &item = _archive.Items[index];
      
      if (_archive.IsSolid)
        GetUncompressedSize(index, currentItemSize);
      else
        GetCompressedSize(index, currentItemSize);
      
      if(!testMode && (!realOutStream))
        continue;
      
      RINOK(extractCallback->PrepareOperation(askMode));
      
      if (!dataError)
      {
        bool needDecompress = false;
        bool sizeIsKnown = false;
        UInt32 fullSize = 0;

        if (_archive.IsSolid)
        {
          UInt64 pos = _archive.GetPosOfSolidItem(index);
          while(streamPos < pos)
          {
            size_t processedSize = (UInt32)MyMin(pos - streamPos, (UInt64)kBufferLength);
            HRESULT res = _archive.Decoder.Read(buffer, &processedSize);
            if (res != S_OK)
            {
              if (res != S_FALSE)
                return res;
              dataError = true;
              break;
            }
            if (processedSize == 0)
            {
              dataError = true;
              break;
            }
            streamPos += processedSize;
          }
          if (streamPos == pos)
          {
            Byte buffer2[4];
            size_t processedSize = 4;
            RINOK(_archive.Decoder.Read(buffer2, &processedSize));
            if (processedSize != 4)
              return E_FAIL;
            streamPos += processedSize;
            fullSize = Get32(buffer2);
            sizeIsKnown = true;
            needDecompress = true;
          }
        }
        else
        {
          RINOK(_inStream->Seek(_archive.GetPosOfNonSolidItem(index) + 4, STREAM_SEEK_SET, NULL));
          if (item.IsCompressed)
          {
            needDecompress = true;
            bool useFilter;
            RINOK(_archive.Decoder.Init(
                EXTERNAL_CODECS_VARS
                _inStream, _archive.Method, _archive.FilterFlag, useFilter));
            // fullSize = Get32(buffer); // It's bug !!!
            // Test it: what is exact fullSize?
            fullSize =  0xFFFFFFFF;
          }
          else
            fullSize = item.Size;
        }
        if (!dataError)
        {
          if (needDecompress)
          {
            UInt64 offset = 0;
            while(!sizeIsKnown || fullSize > 0)
            {
              UInt32 curSize = kBufferLength;
              if (sizeIsKnown && curSize > fullSize)
                curSize = fullSize;
              size_t processedSize = curSize;
              HRESULT res = _archive.Decoder.Read(buffer, &processedSize);
              if (res != S_OK)
              {
                if (res != S_FALSE)
                  return res;
                dataError = true;
                break;
              }
              if (processedSize == 0)
              {
                if (sizeIsKnown)
                  dataError = true;
                break;
              }
              
              fullSize -= (UInt32)processedSize;
              streamPos += processedSize;
              offset += processedSize;
              
              UInt64 completed;
              if (_archive.IsSolid)
                completed = currentTotalSize + offset;
              else
                completed = streamPos;
              RINOK(extractCallback->SetCompleted(&completed));
              if (!testMode)
                RINOK(WriteStream(realOutStream, buffer, processedSize));
            }
          }
          else
          {
            while(fullSize > 0)
            {
              UInt32 curSize = MyMin(fullSize, kBufferLength);
              UInt32 processedSize;
              RINOK(_inStream->Read(buffer, curSize, &processedSize));
              if (processedSize == 0)
              {
                dataError = true;
                break;
              }
              fullSize -= processedSize;
              streamPos += processedSize;
              if (!testMode)
                RINOK(WriteStream(realOutStream, buffer, processedSize));
            }
          }
        }
      }
    }
    realOutStream.Release();
    RINOK(extractCallback->SetOperationResult(dataError ?
        NArchive::NExtract::NOperationResult::kDataError :
        NArchive::NExtract::NOperationResult::kOK));
  }
  return S_OK;
  COM_TRY_END
}

IMPL_ISetCompressCodecsInfo

}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区二区蜜臀亚洲| 精品人伦一区二区色婷婷| 国产美女视频91| 久久精品72免费观看| 蜜乳av一区二区| 美洲天堂一区二卡三卡四卡视频| 日韩精品午夜视频| 日本三级韩国三级欧美三级| 久久成人免费日本黄色| 极品少妇xxxx偷拍精品少妇| 国产一区福利在线| fc2成人免费人成在线观看播放| 91国偷自产一区二区开放时间 | 欧美在线视频日韩| 欧美三级韩国三级日本一级| 欧美军同video69gay| 日韩精品一区二区在线观看| 精品国产一二三区| 欧美韩国日本一区| 一区二区三区波多野结衣在线观看| 亚洲午夜精品网| 免费精品99久久国产综合精品| 国产精品自拍av| 99久久久国产精品免费蜜臀| 欧美日韩成人综合在线一区二区| 精品日韩欧美一区二区| 国产精品视频在线看| 亚洲va国产天堂va久久en| 国产在线视频一区二区三区| 色综合色狠狠天天综合色| 这里只有精品电影| 国产精品视频一二| 日韩成人午夜精品| 成人网在线免费视频| 欧美理论片在线| 国产精品久久看| 日本va欧美va瓶| 色综合天天综合色综合av| 欧美一区二区三级| 综合激情成人伊人| 国产呦萝稀缺另类资源| 欧美中文一区二区三区| 亚洲精品一区二区三区精华液| 一区二区欧美在线观看| 国产精品一二三四五| 欧美精选一区二区| 中文字幕亚洲一区二区va在线| 日韩二区三区四区| 91国产丝袜在线播放| 欧美激情一区二区三区在线| 日本午夜精品视频在线观看| 色丁香久综合在线久综合在线观看| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲午夜激情网站| 97久久精品人人做人人爽| 久久久久九九视频| 久久精品国产久精国产| 欧美精品免费视频| 亚洲一二三级电影| 色综合久久综合网97色综合| 中文字幕第一区第二区| 国产乱码精品一区二区三区av| 欧美精品粉嫩高潮一区二区| 亚洲综合色噜噜狠狠| youjizz久久| 国产日韩一级二级三级| 国产麻豆视频精品| 国产午夜三级一区二区三| 极品美女销魂一区二区三区免费| 欧美一区二区三区爱爱| 蜜臀av一区二区在线免费观看| 精品视频999| 丝瓜av网站精品一区二区| 精品污污网站免费看| 亚洲一区二区精品久久av| 欧美剧情电影在线观看完整版免费励志电影| 中文字幕av一区二区三区高| 国产成人h网站| 国产清纯美女被跳蛋高潮一区二区久久w| 久久精品国产亚洲a| 26uuu亚洲婷婷狠狠天堂| 国产乱码精品一品二品| 欧美国产激情一区二区三区蜜月| 国产.精品.日韩.另类.中文.在线.播放| 日韩一级二级三级| 国产精品一区三区| 亚洲人成网站在线| 精品视频一区三区九区| 久久精品理论片| 国产女人aaa级久久久级| 97久久精品人人爽人人爽蜜臀| 久久草av在线| 精品噜噜噜噜久久久久久久久试看| 欧美大片日本大片免费观看| 亚洲国产裸拍裸体视频在线观看乱了| 在线欧美小视频| www.亚洲精品| 亚洲国产另类av| 欧美一区二区私人影院日本| 国产午夜精品一区二区三区视频 | 亚洲自拍都市欧美小说| 国产精品女上位| 中文字幕+乱码+中文字幕一区| 欧美videossexotv100| 欧美酷刑日本凌虐凌虐| 欧美精品亚洲二区| 欧美专区日韩专区| 在线精品视频一区二区三四| 91麻豆精品一区二区三区| 99麻豆久久久国产精品免费优播| 国产成人精品1024| 国产不卡视频一区二区三区| 国产精品一区在线观看乱码| 狠狠狠色丁香婷婷综合激情| 久久成人免费网站| 韩国av一区二区三区四区| 狠狠色丁香久久婷婷综合_中| 韩国女主播成人在线观看| 激情综合一区二区三区| 国产夫妻精品视频| 成人av先锋影音| 91社区在线播放| 91国偷自产一区二区开放时间| 欧美午夜影院一区| 欧美精品一卡两卡| 日韩美女视频在线| 久久久久久电影| 亚洲日穴在线视频| 亚洲综合成人在线| 热久久免费视频| 久久99精品一区二区三区三区| 国产一区二区三区日韩| 成人在线视频一区| 在线欧美日韩国产| 精品成人佐山爱一区二区| 中文幕一区二区三区久久蜜桃| 国产精品国产自产拍在线| 亚洲综合丁香婷婷六月香| 日本不卡一二三| 成人开心网精品视频| 欧美日韩一区不卡| 久久久蜜桃精品| 亚洲激情中文1区| 九色porny丨国产精品| 成人爽a毛片一区二区免费| 色哟哟国产精品免费观看| 在线成人免费观看| 国产亚洲精久久久久久| 亚洲曰韩产成在线| 国产精品一级二级三级| 色爱区综合激月婷婷| 精品国产乱码久久久久久闺蜜| 国产精品成人网| 琪琪久久久久日韩精品| 91欧美激情一区二区三区成人| 3d动漫精品啪啪| 国产精品美日韩| 男女男精品网站| 色狠狠色狠狠综合| 国产日本一区二区| 亚洲成人动漫av| 成人av资源网站| 欧美xxxxx牲另类人与| 一区二区三区91| 高清日韩电视剧大全免费| 91精品婷婷国产综合久久性色| 国产精品成人免费精品自在线观看| 日本成人在线电影网| 日本韩国精品一区二区在线观看| 久久一区二区三区四区| 午夜精品福利一区二区三区蜜桃| 粉嫩av亚洲一区二区图片| 日韩欧美一区在线观看| 亚洲综合色婷婷| 99久久久久久99| 国产欧美精品区一区二区三区 | 亚洲精品国产无天堂网2021| 国产真实乱子伦精品视频| 欧美性高清videossexo| 中文字幕五月欧美| 成人免费视频视频| 亚洲精品一区二区三区影院| 舔着乳尖日韩一区| 欧美日韩精品系列| 伊人婷婷欧美激情| 色综合色狠狠综合色| 18欧美亚洲精品| 99视频一区二区| 中文字幕一区二区三区精华液| 国产不卡在线一区| 久久久99久久精品欧美| 极品少妇一区二区| 欧美精品一区视频| 国产剧情av麻豆香蕉精品| 精品不卡在线视频| 国内精品伊人久久久久av一坑| 26uuu国产在线精品一区二区| 麻豆一区二区三| 久久网这里都是精品| 狠狠网亚洲精品|