00001 /* 00002 Free Download Manager Copyright (c) 2003-2007 FreeDownloadManager.ORG 00003 */ 00004 00005 #include "StdAfx.h" 00006 00007 #include "ArchiveOpenCallback.h" 00008 00009 #include "Common/StringConvert.h" 00010 #include "Windows/PropVariant.h" 00011 00012 #include "../../Common/FileStreams.h" 00013 00014 using namespace NWindows; 00015 00016 STDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes) 00017 { 00018 return Callback->SetTotal(files, bytes); 00019 } 00020 00021 STDMETHODIMP COpenCallbackImp::SetCompleted(const UInt64 *files, const UInt64 *bytes) 00022 { 00023 return Callback->SetTotal(files, bytes); 00024 } 00025 00026 STDMETHODIMP COpenCallbackImp::GetProperty(PROPID propID, PROPVARIANT *value) 00027 { 00028 NCOM::CPropVariant propVariant; 00029 if (_subArchiveMode) 00030 { 00031 switch(propID) 00032 { 00033 case kpidName: 00034 propVariant = _subArchiveName; 00035 break; 00036 } 00037 propVariant.Detach(value); 00038 return S_OK; 00039 } 00040 switch(propID) 00041 { 00042 case kpidName: 00043 propVariant = _fileInfo.Name; 00044 break; 00045 case kpidIsFolder: 00046 propVariant = _fileInfo.IsDirectory(); 00047 break; 00048 case kpidSize: 00049 propVariant = _fileInfo.Size; 00050 break; 00051 case kpidAttributes: 00052 propVariant = (UInt32)_fileInfo.Attributes; 00053 break; 00054 case kpidLastAccessTime: 00055 propVariant = _fileInfo.LastAccessTime; 00056 break; 00057 case kpidCreationTime: 00058 propVariant = _fileInfo.CreationTime; 00059 break; 00060 case kpidLastWriteTime: 00061 propVariant = _fileInfo.LastWriteTime; 00062 break; 00063 } 00064 propVariant.Detach(value); 00065 return S_OK; 00066 } 00067 00068 int COpenCallbackImp::FindName(const UString &name) 00069 { 00070 for (int i = 0; i < FileNames.Size(); i++) 00071 if (name.CompareNoCase(FileNames[i]) == 0) 00072 return i; 00073 return -1; 00074 } 00075 00076 struct CInFileStreamVol: public CInFileStream 00077 { 00078 UString Name; 00079 COpenCallbackImp *OpenCallbackImp; 00080 CMyComPtr<IArchiveOpenCallback> OpenCallbackRef; 00081 ~CInFileStreamVol() 00082 { 00083 int index = OpenCallbackImp->FindName(Name); 00084 if (index >= 0) 00085 OpenCallbackImp->FileNames.Delete(index); 00086 } 00087 }; 00088 00089 STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, 00090 IInStream **inStream) 00091 { 00092 if (_subArchiveMode) 00093 return S_FALSE; 00094 RINOK(Callback->CheckBreak()); 00095 *inStream = NULL; 00096 UString fullPath = _folderPrefix + name; 00097 if (!NFile::NFind::FindFile(fullPath, _fileInfo)) 00098 return S_FALSE; 00099 if (_fileInfo.IsDirectory()) 00100 return S_FALSE; 00101 CInFileStreamVol *inFile = new CInFileStreamVol; 00102 CMyComPtr<IInStream> inStreamTemp = inFile; 00103 if (!inFile->Open(fullPath)) 00104 return ::GetLastError(); 00105 *inStream = inStreamTemp.Detach(); 00106 inFile->Name = name; 00107 inFile->OpenCallbackImp = this; 00108 inFile->OpenCallbackRef = this; 00109 FileNames.Add(name); 00110 return S_OK; 00111 } 00112 00113 #ifndef _NO_CRYPTO 00114 STDMETHODIMP COpenCallbackImp::CryptoGetTextPassword(BSTR *password) 00115 { 00116 return Callback->CryptoGetTextPassword(password); 00117 } 00118 #endif 00119
1.5.6