Compress-Deflate7
view release on metacpan or search on metacpan
7zip/CPP/7zip/UI/FileManager/FSFolder.cpp view on Meta::CPAN
}
void CFSFolder::AddRefs(CDirItem &dirItem)
{
int i;
for (i = 0; i < dirItem.Files.Size(); i++)
{
CDirItem &item = dirItem.Files[i];
item.Parent = &dirItem;
_refs.Add(&item);
}
if (!_flatMode)
return;
for (i = 0; i < dirItem.Files.Size(); i++)
{
CDirItem &item = dirItem.Files[i];
if (item.IsDir())
AddRefs(item);
}
}
STDMETHODIMP CFSFolder::LoadItems()
{
// OutputDebugString(TEXT("Start\n"));
Int32 dummy;
WasChanged(&dummy);
Clear();
RINOK(LoadSubItems(_root, _path));
AddRefs(_root);
// OutputDebugString(TEXT("Finish\n"));
_commentsAreLoaded = false;
return S_OK;
}
static const wchar_t *kDescriptionFileName = L"descript.ion";
bool CFSFolder::LoadComments()
{
if (_commentsAreLoaded)
return true;
_comments.Clear();
_commentsAreLoaded = true;
NIO::CInFile file;
if (!file.Open(_path + kDescriptionFileName))
return false;
UInt64 length;
if (!file.GetLength(length))
return false;
if (length >= (1 << 28))
return false;
AString s;
char *p = s.GetBuffer((int)((size_t)length + 1));
UInt32 processedSize;
file.Read(p, (UInt32)length, processedSize);
p[length] = 0;
s.ReleaseBuffer();
if (processedSize != length)
return false;
file.Close();
UString unicodeString;
if (!ConvertUTF8ToUnicode(s, unicodeString))
return false;
return _comments.ReadFromString(unicodeString);
}
static bool IsAscii(const UString &testString)
{
for (int i = 0; i < testString.Length(); i++)
if (testString[i] >= 0x80)
return false;
return true;
}
bool CFSFolder::SaveComments()
{
NIO::COutFile file;
if (!file.Create(_path + kDescriptionFileName, true))
return false;
UString unicodeString;
_comments.SaveToString(unicodeString);
AString utfString;
ConvertUnicodeToUTF8(unicodeString, utfString);
UInt32 processedSize;
if (!IsAscii(unicodeString))
{
Byte bom [] = { 0xEF, 0xBB, 0xBF, 0x0D, 0x0A };
file.Write(bom , sizeof(bom), processedSize);
}
file.Write(utfString, utfString.Length(), processedSize);
_commentsAreLoaded = false;
return true;
}
STDMETHODIMP CFSFolder::GetNumberOfItems(UInt32 *numItems)
{
*numItems = _refs.Size();
return S_OK;
}
/*
STDMETHODIMP CFSFolder::GetNumberOfSubFolders(UInt32 *numSubFolders)
{
UInt32 numSubFoldersLoc = 0;
for (int i = 0; i < _files.Size(); i++)
if (_files[i].IsDir())
numSubFoldersLoc++;
*numSubFolders = numSubFoldersLoc;
return S_OK;
}
*/
#ifndef UNDER_CE
static bool MyGetCompressedFileSizeW(LPCWSTR fileName, UInt64 &size)
{
DWORD highPart;
DWORD lowPart = ::GetCompressedFileSizeW(fileName, &highPart);
if (lowPart == INVALID_FILE_SIZE && ::GetLastError() != NO_ERROR)
{
#ifdef WIN_LONG_PATH
{
UString longPath;
if (GetLongPath(fileName, longPath))
lowPart = ::GetCompressedFileSizeW(longPath, &highPart);
}
#endif
if (lowPart == INVALID_FILE_SIZE && ::GetLastError() != NO_ERROR)
return false;
}
size = (UInt64(highPart) << 32) | lowPart;
return true;
}
#endif
STDMETHODIMP CFSFolder::GetProperty(UInt32 itemIndex, PROPID propID, PROPVARIANT *value)
{
NCOM::CPropVariant prop;
if (itemIndex >= (UInt32)_refs.Size())
return E_INVALIDARG;
CDirItem &fi = *_refs[itemIndex];
switch(propID)
{
case kpidIsDir: prop = fi.IsDir(); break;
case kpidName: prop = fi.Name; break;
case kpidSize: if (!fi.IsDir()) prop = fi.Size; break;
( run in 0.568 second using v1.01-cache-2.11-cpan-39bf76dae61 )