other-licenses/7zstub/src/7zip/UI/Common/ArchiveOpenCallback.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/other-licenses/7zstub/src/7zip/UI/Common/ArchiveOpenCallback.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,117 @@
     1.4 +// ArchiveOpenCallback.cpp
     1.5 +
     1.6 +#include "StdAfx.h"
     1.7 +
     1.8 +#include "ArchiveOpenCallback.h"
     1.9 +
    1.10 +#include "Common/StringConvert.h"
    1.11 +#include "Windows/PropVariant.h"
    1.12 +
    1.13 +#include "../../Common/FileStreams.h"
    1.14 +
    1.15 +using namespace NWindows;
    1.16 +
    1.17 +STDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes)
    1.18 +{
    1.19 +  return Callback->SetTotal(files, bytes);
    1.20 +}
    1.21 +
    1.22 +STDMETHODIMP COpenCallbackImp::SetCompleted(const UInt64 *files, const UInt64 *bytes)
    1.23 +{
    1.24 +  return Callback->SetTotal(files, bytes);
    1.25 +}
    1.26 +  
    1.27 +STDMETHODIMP COpenCallbackImp::GetProperty(PROPID propID, PROPVARIANT *value)
    1.28 +{
    1.29 +  NCOM::CPropVariant propVariant;
    1.30 +  if (_subArchiveMode)
    1.31 +  {
    1.32 +    switch(propID)
    1.33 +    {
    1.34 +      case kpidName:
    1.35 +        propVariant = _subArchiveName;
    1.36 +        break;
    1.37 +    }
    1.38 +    propVariant.Detach(value);
    1.39 +    return S_OK;
    1.40 +  }
    1.41 +  switch(propID)
    1.42 +  {
    1.43 +    case kpidName:
    1.44 +      propVariant = _fileInfo.Name;
    1.45 +      break;
    1.46 +    case kpidIsFolder:
    1.47 +      propVariant = _fileInfo.IsDirectory();
    1.48 +      break;
    1.49 +    case kpidSize:
    1.50 +      propVariant = _fileInfo.Size;
    1.51 +      break;
    1.52 +    case kpidAttributes:
    1.53 +      propVariant = (UInt32)_fileInfo.Attributes;
    1.54 +      break;
    1.55 +    case kpidLastAccessTime:
    1.56 +      propVariant = _fileInfo.LastAccessTime;
    1.57 +      break;
    1.58 +    case kpidCreationTime:
    1.59 +      propVariant = _fileInfo.CreationTime;
    1.60 +      break;
    1.61 +    case kpidLastWriteTime:
    1.62 +      propVariant = _fileInfo.LastWriteTime;
    1.63 +      break;
    1.64 +    }
    1.65 +  propVariant.Detach(value);
    1.66 +  return S_OK;
    1.67 +}
    1.68 +
    1.69 +int COpenCallbackImp::FindName(const UString &name)
    1.70 +{
    1.71 +  for (int i = 0; i < FileNames.Size(); i++)
    1.72 +    if (name.CompareNoCase(FileNames[i]) == 0)
    1.73 +      return i;
    1.74 +  return -1;
    1.75 +}
    1.76 +
    1.77 +struct CInFileStreamVol: public CInFileStream
    1.78 +{
    1.79 +  UString Name;
    1.80 +  COpenCallbackImp *OpenCallbackImp;
    1.81 +  CMyComPtr<IArchiveOpenCallback> OpenCallbackRef;
    1.82 +  ~CInFileStreamVol()
    1.83 +  {
    1.84 +    int index = OpenCallbackImp->FindName(Name);
    1.85 +    if (index >= 0)
    1.86 +      OpenCallbackImp->FileNames.Delete(index);
    1.87 +  }
    1.88 +};
    1.89 +
    1.90 +STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, 
    1.91 +    IInStream **inStream)
    1.92 +{
    1.93 +  if (_subArchiveMode)
    1.94 +    return S_FALSE;
    1.95 +  RINOK(Callback->CheckBreak());
    1.96 +  *inStream = NULL;
    1.97 +  UString fullPath = _folderPrefix + name;
    1.98 +  if (!NFile::NFind::FindFile(fullPath, _fileInfo))
    1.99 +    return S_FALSE;
   1.100 +  if (_fileInfo.IsDirectory())
   1.101 +    return S_FALSE;
   1.102 +  CInFileStreamVol *inFile = new CInFileStreamVol;
   1.103 +  CMyComPtr<IInStream> inStreamTemp = inFile;
   1.104 +  if (!inFile->Open(fullPath))
   1.105 +    return ::GetLastError();
   1.106 +  *inStream = inStreamTemp.Detach();
   1.107 +  inFile->Name = name;
   1.108 +  inFile->OpenCallbackImp = this;
   1.109 +  inFile->OpenCallbackRef = this;
   1.110 +  FileNames.Add(name);
   1.111 +  return S_OK;
   1.112 +}
   1.113 +
   1.114 +#ifndef _NO_CRYPTO
   1.115 +STDMETHODIMP COpenCallbackImp::CryptoGetTextPassword(BSTR *password)
   1.116 +{
   1.117 +  return Callback->CryptoGetTextPassword(password);
   1.118 +}
   1.119 +#endif
   1.120 +  

mercurial