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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? chmhandler.cpp

?? 壓縮解壓工具7-zip源代碼
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
// ChmHandler.cpp

#include "StdAfx.h"

#include "Common/ComTry.h"
#include "Common/Defs.h"
#include "Common/StringConvert.h"
#include "Common/UTFConvert.h"

#include "Windows/PropVariant.h"
#include "Windows/Time.h"

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

#include "../../Compress/CopyCoder.h"
#include "../../Compress/LzxDecoder.h"

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

#include "ChmHandler.h"

using namespace NWindows;
using namespace NTime;

namespace NArchive {
namespace NChm {

// #define _CHM_DETAILS

#ifdef _CHM_DETAILS

enum
{
  kpidSection = kpidUserDefined
};

#endif

STATPROPSTG kProps[] =
{
  { NULL, kpidPath, VT_BSTR},
  { NULL, kpidSize, VT_UI8},
  { NULL, kpidMethod, VT_BSTR},
  { NULL, kpidBlock, VT_UI4}
  
  #ifdef _CHM_DETAILS
  ,
  { L"Section", kpidSection, VT_UI4},
  { NULL, kpidOffset, VT_UI4}
  #endif
};

STATPROPSTG kArcProps[] =
{
  { NULL, kpidNumBlocks, VT_UI8}
};

IMP_IInArchive_Props

IMP_IInArchive_ArcProps_NO
/*
IMP_IInArchive_ArcProps

STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
{
  COM_TRY_BEGIN
  NWindows::NCOM::CPropVariant prop;
  switch(propID)
  {
    case kpidNumBlocks:
    {
      UInt64 numBlocks = 0;
      for (int i = 0; i < m_Database.Sections.Size(); i++)
      {
        const CSectionInfo &s = m_Database.Sections[i];
        for (int j = 0; j < s.Methods.Size(); j++)
        {
          const CMethodInfo &m = s.Methods[j];
          if (m.IsLzx())
            numBlocks += m.LzxInfo.ResetTable.GetNumBlocks();
        }
      }
      prop = numBlocks;
      break;
    }
  }
  prop.Detach(value);
  return S_OK;
  COM_TRY_END
}
*/

STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID,  PROPVARIANT *value)
{
  COM_TRY_BEGIN
  NWindows::NCOM::CPropVariant prop;
  if (m_Database.NewFormat)
  {
    switch(propID)
    {
      case kpidSize:
        prop = (UInt64)m_Database.NewFormatString.Length();
      break;
    }
    prop.Detach(value);
    return S_OK;
  }
  int entryIndex;
  if (m_Database.LowLevel)
    entryIndex = index;
  else
    entryIndex = m_Database.Indices[index];
  const CItem &item = m_Database.Items[entryIndex];
  switch(propID)
  {
    case kpidPath:
    {
      UString us;
      if (ConvertUTF8ToUnicode(item.Name, us))
      {
        if (!m_Database.LowLevel)
        {
          if (us.Length() > 1)
            if (us[0] == L'/')
              us.Delete(0);
        }
        prop = NItemName::GetOSName2(us);
      }
      break;
    }
    case kpidIsDir:  prop = item.IsDir(); break;
    case kpidSize:  prop = item.Size; break;
    case kpidMethod:
    {
      if (!item.IsDir())
        if (item.Section == 0)
          prop = L"Copy";
        else if (item.Section < m_Database.Sections.Size())
          prop = m_Database.Sections[(int)item.Section].GetMethodName();
      break;
    }
    case kpidBlock:
      if (m_Database.LowLevel)
        prop = item.Section;
      else if (item.Section != 0)
        prop = m_Database.GetFolder(index);
      break;
    
    #ifdef _CHM_DETAILS
    
    case kpidSection:  prop = (UInt32)item.Section; break;
    case kpidOffset:  prop = (UInt32)item.Offset; break;

    #endif
  }
  prop.Detach(value);
  return S_OK;
  COM_TRY_END
}

class CProgressImp: public CProgressVirt
{
  CMyComPtr<IArchiveOpenCallback> _callback;
public:
  STDMETHOD(SetTotal)(const UInt64 *numFiles);
  STDMETHOD(SetCompleted)(const UInt64 *numFiles);
  CProgressImp(IArchiveOpenCallback *callback): _callback(callback) {};
};

STDMETHODIMP CProgressImp::SetTotal(const UInt64 *numFiles)
{
  if (_callback)
    return _callback->SetCompleted(numFiles, NULL);
  return S_OK;
}

STDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles)
{
  if (_callback)
    return _callback->SetCompleted(numFiles, NULL);
  return S_OK;
}

STDMETHODIMP CHandler::Open(IInStream *inStream,
    const UInt64 *maxCheckStartPosition,
    IArchiveOpenCallback * /* openArchiveCallback */)
{
  COM_TRY_BEGIN
  m_Stream.Release();
  try
  {
    CInArchive archive;
    // CProgressImp progressImp(openArchiveCallback);
    RINOK(archive.Open(inStream, maxCheckStartPosition, m_Database));
    /*
    if (m_Database.LowLevel)
      return S_FALSE;
    */
    m_Stream = inStream;
  }
  catch(...)
  {
    return S_FALSE;
  }
  return S_OK;
  COM_TRY_END
}

STDMETHODIMP CHandler::Close()
{
  m_Database.Clear();
  m_Stream.Release();
  return S_OK;
}

class CChmFolderOutStream:
  public ISequentialOutStream,
  public CMyUnknownImp
{
public:
  MY_UNKNOWN_IMP

  HRESULT Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK);
  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);

  UInt64 m_FolderSize;
  UInt64 m_PosInFolder;
  UInt64 m_PosInSection;
  const CRecordVector<bool> *m_ExtractStatuses;
  int m_StartIndex;
  int m_CurrentIndex;
  int m_NumFiles;

private:
  const CFilesDatabase *m_Database;
  CMyComPtr<IArchiveExtractCallback> m_ExtractCallback;
  bool m_TestMode;

  bool m_IsOk;
  bool m_FileIsOpen;
  UInt64 m_RemainFileSize;
  CMyComPtr<ISequentialOutStream> m_RealOutStream;

  HRESULT OpenFile();
  HRESULT WriteEmptyFiles();
public:
  void Init(
    const CFilesDatabase *database,
    IArchiveExtractCallback *extractCallback,
    bool testMode);
  HRESULT FlushCorrupted(UInt64 maxSize);
};

void CChmFolderOutStream::Init(
    const CFilesDatabase *database,
    IArchiveExtractCallback *extractCallback,
    bool testMode)
{
  m_Database = database;
  m_ExtractCallback = extractCallback;
  m_TestMode = testMode;

  m_CurrentIndex = 0;
  m_FileIsOpen = false;
}

HRESULT CChmFolderOutStream::OpenFile()
{
  Int32 askMode = (*m_ExtractStatuses)[m_CurrentIndex] ? (m_TestMode ?
      NExtract::NAskMode::kTest :
      NExtract::NAskMode::kExtract) :
      NExtract::NAskMode::kSkip;
  m_RealOutStream.Release();
  RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode));
  if (!m_RealOutStream && !m_TestMode)
    askMode = NArchive::NExtract::NAskMode::kSkip;
  return m_ExtractCallback->PrepareOperation(askMode);
}

HRESULT CChmFolderOutStream::WriteEmptyFiles()
{
  if (m_FileIsOpen)
    return S_OK;
  for (;m_CurrentIndex < m_NumFiles; m_CurrentIndex++)
  {
    UInt64 fileSize = m_Database->GetFileSize(m_StartIndex + m_CurrentIndex);
    if (fileSize != 0)
      return S_OK;
    HRESULT result = OpenFile();
    m_RealOutStream.Release();
    RINOK(result);
    RINOK(m_ExtractCallback->SetOperationResult(NArchive::NExtract::NOperationResult::kOK));
  }
  return S_OK;
}

// This is WritePart function
HRESULT CChmFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK)
{
  UInt32 realProcessed = 0;
  if (processedSize != NULL)
   *processedSize = 0;
  while(size != 0)
  {
    if (m_FileIsOpen)
    {
      UInt32 numBytesToWrite = (UInt32)MyMin(m_RemainFileSize, (UInt64)(size));
      HRESULT res = S_OK;
      if (numBytesToWrite > 0)
      {
        if (!isOK)
          m_IsOk = false;
        if (m_RealOutStream)
        {
          UInt32 processedSizeLocal = 0;
          res = m_RealOutStream->Write((const Byte *)data, numBytesToWrite, &processedSizeLocal);
          numBytesToWrite = processedSizeLocal;
        }
      }
      realProcessed += numBytesToWrite;
      if (processedSize != NULL)
        *processedSize = realProcessed;
      data = (const void *)((const Byte *)data + numBytesToWrite);
      size -= numBytesToWrite;
      m_RemainFileSize -= numBytesToWrite;
      m_PosInSection += numBytesToWrite;
      m_PosInFolder += numBytesToWrite;
      if (res != S_OK)
        return res;
      if (m_RemainFileSize == 0)
      {
        m_RealOutStream.Release();
        RINOK(m_ExtractCallback->SetOperationResult(
          m_IsOk ?
            NArchive::NExtract::NOperationResult::kOK:
            NArchive::NExtract::NOperationResult::kDataError));
        m_FileIsOpen = false;
      }
      if (realProcessed > 0)
        break; // with this break this function works as write part
    }
    else
    {
      if (m_CurrentIndex >= m_NumFiles)
        return E_FAIL;
      int fullIndex = m_StartIndex + m_CurrentIndex;
      m_RemainFileSize = m_Database->GetFileSize(fullIndex);
      UInt64 fileOffset = m_Database->GetFileOffset(fullIndex);
      if (fileOffset < m_PosInSection)
        return E_FAIL;
      if (fileOffset > m_PosInSection)
      {
        UInt32 numBytesToWrite = (UInt32)MyMin(fileOffset - m_PosInSection, UInt64(size));
        realProcessed += numBytesToWrite;
        if (processedSize != NULL)
          *processedSize = realProcessed;
        data = (const void *)((const Byte *)data + numBytesToWrite);
        size -= numBytesToWrite;
        m_PosInSection += numBytesToWrite;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99热这里都是精品| 欧美精品三级在线观看| 国产精品18久久久久久久久| 美女久久久精品| 日韩精品一区第一页| 午夜电影久久久| 日韩精品电影在线| 天堂一区二区在线| 首页亚洲欧美制服丝腿| 天天影视色香欲综合网老头| 午夜精品123| 美日韩一区二区三区| 麻豆精品国产传媒mv男同 | 99在线精品一区二区三区| 成人午夜免费av| av中文字幕在线不卡| 91亚洲精品久久久蜜桃| 在线免费观看一区| 欧美男男青年gay1069videost| 欧美日韩成人在线一区| 日韩你懂的在线播放| 久久综合中文字幕| 国产精品水嫩水嫩| 亚洲黄色小视频| 天天射综合影视| 国产一区二区三区四区在线观看| 国产成人精品aa毛片| 91女神在线视频| 欧美日韩免费电影| 精品奇米国产一区二区三区| 欧美国产日韩精品免费观看| 亚洲欧美日韩国产手机在线 | 色噜噜狠狠色综合欧洲selulu| 在线视频中文字幕一区二区| 91麻豆精品国产自产在线观看一区| 日韩欧美一区在线| 中文字幕精品在线不卡| 一区二区三区中文字幕电影| 蜜桃av一区二区在线观看| 成人午夜短视频| 欧美性高清videossexo| 久久综合丝袜日本网| 一区二区三区自拍| 精品系列免费在线观看| 99久久精品一区二区| 欧美精品久久天天躁| 国产日韩欧美高清在线| 性做久久久久久免费观看| 国产99久久久国产精品免费看 | 91精品国产美女浴室洗澡无遮挡| 精品对白一区国产伦| 一区二区三区日韩欧美精品| 激情另类小说区图片区视频区| av一区二区久久| 欧美一区二区三区免费| 国产精品国产三级国产普通话蜜臀| 亚洲国产视频在线| 国产成人av电影在线播放| 色成年激情久久综合| 2022国产精品视频| 三级影片在线观看欧美日韩一区二区 | 天天综合天天做天天综合| 成人综合婷婷国产精品久久| 欧美日韩aaaaa| 中文字幕在线不卡国产视频| 毛片不卡一区二区| 欧美性色综合网| 欧美国产一区视频在线观看| 日本成人在线不卡视频| 91浏览器在线视频| 国产三级精品三级在线专区| 青青草原综合久久大伊人精品优势| 99视频精品全部免费在线| 亚洲精品一区二区三区精华液| 亚洲国产日韩a在线播放性色| 99在线热播精品免费| 久久久久久久国产精品影院| 丝袜美腿亚洲一区| 欧美性极品少妇| 亚洲日本中文字幕区| 国产成人亚洲精品青草天美| 日韩午夜av电影| 午夜久久久久久久久久一区二区| 99国产精品久久久| 国产精品天美传媒沈樵| 国产一区在线不卡| 精品国产伦一区二区三区观看方式| 亚洲不卡一区二区三区| 色婷婷久久久久swag精品| 中文字幕一区二区三区av| 丰满亚洲少妇av| 国产欧美日韩精品在线| 国内精品久久久久影院一蜜桃| 日韩一区二区三区电影| 日韩影院精彩在线| 欧美一区中文字幕| 视频精品一区二区| 欧美一区二区三区在线| 视频一区视频二区中文| 91精品国产91久久久久久最新毛片| 亚洲一二三专区| 欧美午夜一区二区三区| 亚洲麻豆国产自偷在线| 91免费版在线| 亚洲精品成a人| 色欧美乱欧美15图片| 亚洲一区二区三区四区在线| 色综合天天狠狠| 亚洲综合一二三区| 欧美综合亚洲图片综合区| 亚洲国产裸拍裸体视频在线观看乱了 | 国产欧美一区二区三区在线老狼| 国产一区二区精品在线观看| 久久一夜天堂av一区二区三区| 国产真实乱对白精彩久久| 久久久美女毛片| av综合在线播放| 亚洲自拍偷拍麻豆| 欧美一区二区视频在线观看| 看国产成人h片视频| 久久女同精品一区二区| 国产盗摄一区二区| 亚洲视频香蕉人妖| 欧美老年两性高潮| 热久久国产精品| 久久嫩草精品久久久久| 波波电影院一区二区三区| 综合久久给合久久狠狠狠97色| 欧美三级电影一区| 免费观看30秒视频久久| 国产亚洲va综合人人澡精品 | 日韩免费福利电影在线观看| 国产伦精一区二区三区| 18欧美乱大交hd1984| 欧美日韩一区在线观看| 久久99在线观看| 日韩一区在线播放| 6080国产精品一区二区| 国产精品自在欧美一区| 亚洲精品日产精品乱码不卡| 欧美一区二区在线免费观看| 国产在线精品免费| 亚洲精品免费看| 日韩欧美亚洲国产精品字幕久久久 | 91网站在线播放| 日韩1区2区日韩1区2区| 亚洲国产精品av| 欧美疯狂性受xxxxx喷水图片| 国产成人综合自拍| 亚洲国产日韩一级| 国产日韩欧美综合在线| 欧美日韩免费在线视频| 国产一区二区三区观看| 亚洲在线一区二区三区| 久久色视频免费观看| 欧美在线免费播放| 国产精品一区一区三区| 香蕉久久夜色精品国产使用方法| 国产日韩精品一区二区三区| 欧美日韩久久一区二区| 国产精品69久久久久水密桃 | 欧美午夜理伦三级在线观看| 久久99精品久久久久久国产越南 | 国产一区不卡精品| 亚洲高清免费观看 | 国产成人亚洲综合a∨婷婷| 午夜精品久久久久影视| 国产精品麻豆欧美日韩ww| 日韩精品中文字幕在线不卡尤物 | 一区二区三区在线看| 久久精品一二三| 91精品久久久久久久99蜜桃 | 欧美成人女星排名| 欧美天堂一区二区三区| 99国产精品久久久| 国产成人午夜精品影院观看视频| 日韩精品福利网| 亚洲一区二区三区三| 中文字幕日韩精品一区| 337p日本欧洲亚洲大胆精品 | 国产精品久久久久久久第一福利 | 日韩av在线播放中文字幕| 亚洲女同一区二区| 国产精品久久久久一区二区三区 | 欧美一区二区精品| 欧美日韩在线三区| 色激情天天射综合网| 99精品欧美一区| 成人黄页毛片网站| 丰满岳乱妇一区二区三区| 激情久久五月天| 久久国产精品99精品国产| 天天爽夜夜爽夜夜爽精品视频| 亚洲一区二区三区四区不卡| 亚洲精品乱码久久久久久黑人| 中文字幕在线一区免费| 国产精品妹子av| 国产精品毛片大码女人| 国产精品视频yy9299一区| 国产精品入口麻豆原神|