diff options
author | Igor Pavlov <ipavlov@users.sourceforge.net> | 2007-08-27 04:00:00 +0400 |
---|---|---|
committer | Kornel LesiĆski <kornel@geekhood.net> | 2016-05-28 02:15:54 +0300 |
commit | 051769bbc577aeede90558b6ab5c9be187940ca0 (patch) | |
tree | e6330cb80f2d4a526d8aa27812528e053b0cda90 /CPP/7zip/FileManager/PhysDriveFolder.cpp | |
parent | 33ccab7e728a996800e166d849fe1e92a17e1afe (diff) |
4.53 beta
Diffstat (limited to 'CPP/7zip/FileManager/PhysDriveFolder.cpp')
-rwxr-xr-x | CPP/7zip/FileManager/PhysDriveFolder.cpp | 305 |
1 files changed, 0 insertions, 305 deletions
diff --git a/CPP/7zip/FileManager/PhysDriveFolder.cpp b/CPP/7zip/FileManager/PhysDriveFolder.cpp deleted file mode 100755 index fc5045eb..00000000 --- a/CPP/7zip/FileManager/PhysDriveFolder.cpp +++ /dev/null @@ -1,305 +0,0 @@ -// PhysDriveFolder.cpp - -#include "StdAfx.h" - -extern "C" -{ - #include "../../../C/Alloc.h" -} - -#include "PhysDriveFolder.h" -#include "Windows/PropVariant.h" -#include "Windows/FileDevice.h" -#include "Windows/FileSystem.h" - -#include "../PropID.h" - -using namespace NWindows; - -static const UInt32 kBufferSize = (4 << 20); - -static STATPROPSTG kProperties[] = -{ - { NULL, kpidName, VT_BSTR}, - { NULL, kpidSize, VT_UI8} -}; - -HRESULT CPhysDriveFolder::Init(const UString &path) -{ - _prefix = L"\\\\.\\"; - _path = path; - NFile::NDevice::CInFile inFile; - if (!inFile.Open(GetFullPath())) - return GetLastError(); - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::LoadItems() -{ - _driveType = NFile::NSystem::MyGetDriveType(_path + L"\\"); - _name = _path.Left(1); - _name += L'.'; - if (_driveType == DRIVE_CDROM) - _name += L"iso"; - else - _name += L"img"; - Int32 dummy; - WasChanged(&dummy); - return GetLength(_length); -} - -STDMETHODIMP CPhysDriveFolder::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = 1; - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value) -{ - NCOM::CPropVariant propVariant; - if (itemIndex >= 1) - return E_INVALIDARG; - switch(propID) - { - case kpidIsFolder: - propVariant = false; - break; - case kpidName: - propVariant = _name; - break; - case kpidSize: - propVariant = _length; - break; - } - propVariant.Detach(value); - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::BindToFolder(UInt32 /* index */, IFolderFolder ** /* resultFolder */) - { return E_NOTIMPL; } - -STDMETHODIMP CPhysDriveFolder::BindToFolder(const wchar_t * /* name */, IFolderFolder ** /* resultFolder */) - { return E_NOTIMPL; } - -STDMETHODIMP CPhysDriveFolder::BindToParentFolder(IFolderFolder **resultFolder) -{ - *resultFolder = 0; - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::GetName(BSTR * /* name */) - { return E_NOTIMPL; } - -STDMETHODIMP CPhysDriveFolder::GetNumberOfProperties(UInt32 *numProperties) -{ - *numProperties = sizeof(kProperties) / sizeof(kProperties[0]); - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::GetPropertyInfo(UInt32 index, - BSTR *name, PROPID *propID, VARTYPE *varType) -{ - if (index >= sizeof(kProperties) / sizeof(kProperties[0])) - return E_INVALIDARG; - const STATPROPSTG &prop = kProperties[index]; - *propID = prop.propid; - *varType = prop.vt; - *name = 0; - return S_OK; -} - - -STDMETHODIMP CPhysDriveFolder::GetTypeID(BSTR *name) -{ - CMyComBSTR temp = L"PhysDrive"; - *name = temp.Detach(); - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::GetPath(BSTR *path) -{ - UString tempPath = GetFullPath() + L"\\"; - CMyComBSTR temp = tempPath; - *path = temp.Detach(); - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::WasChanged(Int32 *wasChanged) -{ - bool wasChangedMain = false; - *wasChanged = BoolToInt(wasChangedMain); - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::Clone(IFolderFolder **resultFolder) -{ - CPhysDriveFolder *folderSpec = new CPhysDriveFolder; - CMyComPtr<IFolderFolder> folderNew = folderSpec; - folderSpec->Init(_path); - *resultFolder = folderNew.Detach(); - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::GetItemFullSize(UInt32 index, PROPVARIANT *value, IProgress * /* progress */) -{ - NCOM::CPropVariant propVariant; - if (index >= 1) - return E_INVALIDARG; - UInt64 size = 0; - HRESULT result = GetLength(size); - propVariant = size; - propVariant.Detach(value); - return result; -} - -STDMETHODIMP CPhysDriveFolder::CreateFolder(const wchar_t * /* name */, IProgress * /* progress */) - { return E_NOTIMPL; } - -STDMETHODIMP CPhysDriveFolder::CreateFile(const wchar_t * /* name */, IProgress * /* progress */) - { return E_NOTIMPL; } - -STDMETHODIMP CPhysDriveFolder::Rename(UInt32 /* index */, const wchar_t * /* newName */, IProgress * /* progress */) - { return E_NOTIMPL; } - -STDMETHODIMP CPhysDriveFolder::Delete(const UInt32 * /* indices */, UInt32 /* numItems */, IProgress * /* progress */) - { return E_NOTIMPL; } - -STDMETHODIMP CPhysDriveFolder::SetProperty(UInt32 index, PROPID /* propID */, - const PROPVARIANT * /* value */, IProgress * /* progress */) -{ - if (index >= 1) - return E_INVALIDARG; - return E_NOTIMPL; -} - -HRESULT CPhysDriveFolder::GetLength(UInt64 &length) const -{ - NFile::NDevice::CInFile inFile; - if (!inFile.Open(GetFullPath())) - return GetLastError(); - if (!inFile.GetLengthSmart(length)) - return GetLastError(); - return S_OK; -} - -struct CPhysTempBuffer -{ - void *buffer; - CPhysTempBuffer(): buffer(0) {} - ~CPhysTempBuffer() { MyFree(buffer); } -}; - -HRESULT CopyFileSpec(LPCWSTR fromPath, LPCWSTR toPath, bool writeToDisk, UInt64 fileSize, UInt32 bufferSize, IProgress *progress) -{ - NFile::NIO::CInFile inFile; - if (!inFile.Open(fromPath)) - return GetLastError(); - if (fileSize == (UInt64)(Int64)-1) - { - if (!inFile.GetLength(fileSize)) - ::GetLastError(); - } - NFile::NIO::COutFile outFile; - if (writeToDisk) - { - if (!outFile.Open(toPath, FILE_SHARE_WRITE, OPEN_EXISTING, 0)) - return GetLastError(); - } - else - if (!outFile.Create(toPath, true)) - return GetLastError(); - CPhysTempBuffer tempBuffer; - tempBuffer.buffer = MyAlloc(bufferSize); - if (tempBuffer.buffer == 0) - return E_OUTOFMEMORY; - - for (UInt64 pos = 0; pos < fileSize;) - { - RINOK(progress->SetCompleted(&pos)); - UInt64 rem = fileSize - pos; - UInt32 curSize = (UInt32)MyMin(rem, (UInt64)bufferSize); - UInt32 processedSize; - if (!inFile.Read(tempBuffer.buffer, curSize, processedSize)) - return GetLastError(); - if (processedSize == 0) - break; - curSize = processedSize; - if (writeToDisk) - { - const UInt32 kMask = 0x1FF; - curSize = (curSize + kMask) & ~kMask; - if (curSize > bufferSize) - return E_FAIL; - } - - if (!outFile.Write(tempBuffer.buffer, curSize, processedSize)) - return GetLastError(); - if (curSize != processedSize) - return E_FAIL; - pos += curSize; - } - return S_OK; -} - -STDMETHODIMP CPhysDriveFolder::CopyTo(const UInt32 * /* indices */, UInt32 numItems, - const wchar_t *path, IFolderOperationsExtractCallback *callback) -{ - if (numItems == 0) - return S_OK; - UString destPath = path; - if (destPath.IsEmpty()) - return E_INVALIDARG; - bool directName = (destPath[destPath.Length() - 1] != L'\\'); - if (directName) - { - if (numItems > 1) - return E_INVALIDARG; - } - else - destPath += _name; - - UInt64 fileSize; - if (GetLength(fileSize) == S_OK) - { - RINOK(callback->SetTotal(fileSize)); - } - - Int32 writeAskResult; - CMyComBSTR destPathResult; - RINOK(callback->AskWrite(GetFullPath(), BoolToInt(false), NULL, &fileSize, - destPath, &destPathResult, &writeAskResult)); - if (!IntToBool(writeAskResult)) - return S_OK; - - RINOK(callback->SetCurrentFilePath(GetFullPathWithName())); - - UInt32 bufferSize = (_driveType == DRIVE_REMOVABLE) ? (18 << 10) * 4 : kBufferSize; - return CopyFileSpec(GetFullPath(), destPathResult, false, fileSize, bufferSize, callback); -} - -///////////////////////////////////////////////// -// Move Operations - -STDMETHODIMP CPhysDriveFolder::MoveTo( - const UInt32 * /* indices */, - UInt32 /* numItems */, - const wchar_t * /* path */, - IFolderOperationsExtractCallback * /* callback */) -{ - return E_NOTIMPL; -} - -STDMETHODIMP CPhysDriveFolder::CopyFrom( - const wchar_t * fromFolderPath, - const wchar_t ** itemsPaths, UInt32 numItems, IProgress *callback) -{ - if (numItems == 0) - return S_OK; - if (numItems != 1) - return E_INVALIDARG; - if (_driveType != DRIVE_REMOVABLE /* && _driveType != DRIVE_CDROM */) - return E_NOTIMPL; - UInt32 bufferSize = (_driveType == DRIVE_REMOVABLE) ? (18 << 10) * 4 : kBufferSize; - // MessageBoxW(0, fromFolderPath, itemsPaths[0], 0); - return CopyFileSpec((UString)fromFolderPath + itemsPaths[0], GetFullPath(), true, (UInt64)(Int64)-1, bufferSize, callback); -} |