Skip to content

Commit

Permalink
fix 4603: return data to plugins only if it's already read
Browse files Browse the repository at this point in the history
  • Loading branch information
alabuzhev committed Mar 29, 2016
1 parent 448332b commit 842c3de
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 30 deletions.
6 changes: 5 additions & 1 deletion far/changelog
@@ -1,4 +1,8 @@
drkns 27.03.2016 20:33:46 +0200 - build 4606
drkns 29.03.2016 19:15:04 +0200 - build 4607

1. Уточнение 4603. Возвращаем плагинам перечисленное только если оно уже считано.

drkns 27.03.2016 20:33:46 +0200 - build 4606

1. Рефакторинг.

Expand Down
7 changes: 3 additions & 4 deletions far/common.hpp
Expand Up @@ -108,17 +108,16 @@ template <typename T>
bool CheckStructSize(const T* s) {return s && (s->StructSize >= sizeof(T));}

template<typename T>
inline void ClearStruct(T& s)
inline void ClearStruct(T& s) noexcept
{
static_assert(!std::is_pointer<T>::value, "This template requires a reference to an object");
static_assert(std::is_pod<T>::value, "This template requires a POD type");
memset(&s, 0, sizeof(s));
}

template<typename T>
inline void ClearArray(T& a)
template<typename T, size_t N>
inline void ClearArray(T(&a)[N]) noexcept
{
static_assert(std::is_array<T>::value, "This template requires an array");
static_assert(std::is_pod<T>::value, "This template requires a POD type");
memset(a, 0, sizeof(a));
}
Expand Down
2 changes: 1 addition & 1 deletion far/far.vcxproj
Expand Up @@ -67,7 +67,7 @@ if not exist Include mkdir Include
if not exist bootstrap mkdir bootstrap</Command>
</PreBuildEvent>
<ClCompile>
<AdditionalOptions>/J %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/J /Zc:inline /Zc:rvalueCast /Zc:strictStrings %(AdditionalOptions)</AdditionalOptions>
<PreprocessorDefinitions>_HAS_AUTO_PTR_ETC=0;_CRT_SECURE_NO_WARNINGS;FAR_ALPHA_VERSION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ExceptionHandling>Async</ExceptionHandling>
<PrecompiledHeader>Use</PrecompiledHeader>
Expand Down
59 changes: 42 additions & 17 deletions far/filelist.cpp
Expand Up @@ -158,7 +158,7 @@ struct CustomSort
unsigned int *Positions;
const FileListItem *Items;
size_t ItemsCount;
void(*FileListToPluginItem)(const FileListItem*, int, SortingPanelItem*);
void(*FileListToSortingPanelItem)(const FileListItem*, int, SortingPanelItem*);
int ListSortGroups;
int ListSelectedFirst;
int ListDirectoriesFirst;
Expand Down Expand Up @@ -208,9 +208,14 @@ inline static string GetItemFullName(const FileListItem& Item, const FileList* O
return Owner->GetCurDir() + L"\\"s + (TestParentFolderName(Item.strName) ? L""s : Item.strName);
}

bool FileListItem::IsNumberOfLinksRead() const
{
return m_NumberOfLinks != values::uninitialised(m_NumberOfLinks);
}

DWORD FileListItem::NumberOfLinks(const FileList* Owner) const
{
if (m_NumberOfLinks == values::uninitialised(m_NumberOfLinks))
if (!IsNumberOfLinksRead())
{
if (FileAttr & FILE_ATTRIBUTE_DIRECTORY || !Owner->HardlinksSupported())
{
Expand Down Expand Up @@ -245,27 +250,42 @@ static void GetStreamsCountAndSize(const FileList* Owner, const FileListItem& It
}
}

bool FileListItem::IsNumberOfStreamsRead() const
{
return m_NumberOfStreams != values::uninitialised(m_NumberOfStreams);
}

DWORD FileListItem::NumberOfStreams(const FileList* Owner) const
{
if (m_NumberOfStreams == values::uninitialised(m_NumberOfStreams))
if (!IsNumberOfStreamsRead())
{
GetStreamsCountAndSize(Owner, *this, m_StreamsSize, m_NumberOfStreams, Owner->StreamsSupported());
}
return m_NumberOfStreams;
}

bool FileListItem::IsStreamsSizeRead() const
{
return m_StreamsSize != values::uninitialised(m_StreamsSize);
}

unsigned long long FileListItem::StreamsSize(const FileList* Owner) const
{
if (m_StreamsSize == values::uninitialised(m_StreamsSize))
if (!IsStreamsSizeRead())
{
GetStreamsCountAndSize(Owner, *this, m_StreamsSize, m_NumberOfStreams, Owner->StreamsSupported());
}
return m_StreamsSize;
}

bool FileListItem::IsOwnerRead() const
{
return !(m_Owner.size() == 1 && m_Owner.front() == values::uninitialised(wchar_t()));
}

const string& FileListItem::Owner(const FileList* Owner) const
{
if (m_Owner.size() == 1 && m_Owner.front() == values::uninitialised(wchar_t()))
if (!IsOwnerRead())
{
if (Owner->GetMode() == panel_mode::NORMAL_PANEL)
{
Expand All @@ -279,9 +299,14 @@ const string& FileListItem::Owner(const FileList* Owner) const
return m_Owner;
}

bool FileListItem::IsContentDataRead() const
{
return m_ContentData != nullptr; // bad
}

const content_data_ptr& FileListItem::ContentData(const FileList* Owner) const
{
if (!m_ContentData)
if (!IsContentDataRead())
{
m_ContentData = Owner->GetContentData(GetItemFullName(*this, Owner));
}
Expand Down Expand Up @@ -805,7 +830,7 @@ void FileList::SortFileList(int KeepPosition)
cs.Positions = Positions.data();
cs.Items = m_ListData.data();
cs.ItemsCount = m_ListData.size();
cs.FileListToPluginItem = custom_sort::FileListToSortingPanelItem;
cs.FileListToSortingPanelItem = custom_sort::FileListToSortingPanelItem;
cs.ListSortGroups = ListSortGroups;
cs.ListSelectedFirst = ListSelectedFirst;
cs.ListDirectoriesFirst = ListDirectoriesFirst;
Expand Down Expand Up @@ -5582,7 +5607,7 @@ void FileList::FileListToPluginItem(const FileListItem& fi, PluginPanelItem& pi)
pi.CreationTime=fi.CreationTime;
pi.LastAccessTime=fi.AccessTime;
pi.ChangeTime=fi.ChangeTime;
pi.NumberOfLinks=fi.NumberOfLinks(this);
pi.NumberOfLinks = fi.IsNumberOfLinksRead()? fi.NumberOfLinks(this) : 0;
pi.Flags=fi.UserFlags;

if (fi.Selected)
Expand All @@ -5597,7 +5622,7 @@ void FileList::FileListToPluginItem(const FileListItem& fi, PluginPanelItem& pi)

pi.CRC32=fi.CRC32;
pi.Reserved[0]=pi.Reserved[1]=0;
pi.Owner = EmptyToNull(fi.Owner(this).data());
pi.Owner = EmptyToNull(fi.IsOwnerRead()? fi.Owner(this).data() : L"");
}

size_t FileList::FileListToPluginItem2(const FileListItem& fi,FarGetPluginPanelItem* gpi) const
Expand All @@ -5608,7 +5633,7 @@ size_t FileList::FileListToPluginItem2(const FileListItem& fi,FarGetPluginPanelI
size+=sizeof(wchar_t)*(fi.strShortName.size()+1);
size+=std::accumulate(fi.CustomColumnData, fi.CustomColumnData + fi.CustomColumnNumber, size_t(0), [](size_t size, const wchar_t* i) { return size + (i? (wcslen(i) + 1) * sizeof(wchar_t) : 0); });
size+=fi.DizText?sizeof(wchar_t)*(wcslen(fi.DizText)+1):0;
size += fi.Owner(this).empty()? 0 : sizeof(wchar_t) * (fi.Owner(this).size() + 1);
size += (fi.IsOwnerRead() && !fi.Owner(this).empty())? sizeof(wchar_t) * (fi.Owner(this).size() + 1) : 0;

if (gpi)
{
Expand All @@ -5623,7 +5648,7 @@ size_t FileList::FileListToPluginItem2(const FileListItem& fi,FarGetPluginPanelI
gpi->Item->CreationTime=fi.CreationTime;
gpi->Item->LastAccessTime=fi.AccessTime;
gpi->Item->ChangeTime=fi.ChangeTime;
gpi->Item->NumberOfLinks = fi.NumberOfLinks(this);
gpi->Item->NumberOfLinks = fi.IsNumberOfLinksRead()? fi.NumberOfLinks(this) : 0;
gpi->Item->Flags=fi.UserFlags;
if (fi.Selected)
gpi->Item->Flags|=PPIF_SELECTED;
Expand Down Expand Up @@ -5667,13 +5692,13 @@ size_t FileList::FileListToPluginItem2(const FileListItem& fi,FarGetPluginPanelI
}


if (fi.Owner(this).empty())
if (fi.IsOwnerRead() && !fi.Owner(this).empty())
{
gpi->Item->Owner=nullptr;
gpi->Item->Owner = wcscpy((wchar_t*)data, fi.Owner(this).data());
}
else
{
gpi->Item->Owner = wcscpy((wchar_t*)data, fi.Owner(this).data());
gpi->Item->Owner = nullptr;
}
}
}
Expand Down Expand Up @@ -8782,18 +8807,18 @@ bool FileList::IsModeFullScreen(int Mode)
}


bool FileList::IsDizDisplayed()
bool FileList::IsDizDisplayed() const
{
return IsColumnDisplayed(DIZ_COLUMN);
}

bool FileList::IsColumnDisplayed(std::function<bool(const column&)> Compare)
bool FileList::IsColumnDisplayed(std::function<bool(const column&)> Compare) const
{
return std::any_of(ALL_CONST_RANGE(m_ViewSettings.PanelColumns), Compare) ||
std::any_of(ALL_CONST_RANGE(m_ViewSettings.StatusColumns), Compare);
}

bool FileList::IsColumnDisplayed(int Type)
bool FileList::IsColumnDisplayed(int Type) const
{
return IsColumnDisplayed([&Type](const column& i) {return static_cast<int>(i.type & 0xff) == Type;});
}
Expand Down
15 changes: 12 additions & 3 deletions far/filelist.hpp
Expand Up @@ -90,10 +90,19 @@ class FileListItem: public detail::FileListItemPod
FileListItem();
FileListItem(const PluginPanelItem& pi);

bool IsNumberOfLinksRead() const;
DWORD NumberOfLinks(const FileList* Owner) const;

bool IsNumberOfStreamsRead() const;
DWORD NumberOfStreams(const FileList* Owner) const;

bool IsStreamsSizeRead() const;
unsigned long long StreamsSize(const FileList* Owner) const;

bool IsOwnerRead() const;
const string& Owner(const FileList* Owner) const;

bool IsContentDataRead() const;
const content_data_ptr& ContentData(const FileList* Owner) const;

string strName;
Expand Down Expand Up @@ -207,8 +216,8 @@ class FileList:public Panel
virtual void FlushDiz() override;
virtual void GetDizName(string &strDizName) const override;
virtual void CopyDiz(const string& Name, const string& ShortName, const string& DestName, const string& DestShortName, DizList *DestDiz) override;
virtual bool IsDizDisplayed() override;
virtual bool IsColumnDisplayed(int Type) override;
virtual bool IsDizDisplayed() const override;
virtual bool IsColumnDisplayed(int Type) const override;
virtual int GetColumnsCount() const override { return m_Columns; }
virtual void SetReturnCurrentFile(int Mode) override;
virtual void GetOpenPanelInfo(OpenPanelInfo *Info) const override;
Expand Down Expand Up @@ -318,7 +327,7 @@ class FileList:public Panel
int ProcessOneHostFile(const FileListItem* Item);
void HighlightBorder(int Level, int ListPos) const;
void InitFSWatcher(bool CheckTree);
bool IsColumnDisplayed(std::function<bool(const column&)> Compare);
bool IsColumnDisplayed(std::function<bool(const column&)> Compare) const;

static void DeletePluginItemList(std::vector<PluginPanelItem> &ItemList);
static void FillParentPoint(FileListItem& Item, size_t CurFilePos, const FILETIME* Times = nullptr);
Expand Down
2 changes: 1 addition & 1 deletion far/makefile_vc
Expand Up @@ -267,7 +267,7 @@ DEFINES=\
DISABLED_WARNINGS=/FI disabled_warnings.hpp

# common
CPPFLAG1=/nologo /MP$(MP_LIMIT) /Wall $(DISABLED_WARNINGS) $(DEFUSERFLAGS) $(FARSYSLOG) $(DEFINES) /EHa /Gy /GF /Fd"$(INTDIR)\\" /J /c
CPPFLAG1=/nologo /MP$(MP_LIMIT) /Wall $(DISABLED_WARNINGS) $(DEFUSERFLAGS) $(FARSYSLOG) $(DEFINES) /EHa /Gy /GF /Fd"$(INTDIR)\\" /J /Zc:inline /Zc:rvalueCast /Zc:strictStrings /c
LINKFLAGS=/nologo /subsystem:console /release /nxcompat /largeaddressaware /dynamicbase /map /out:"$(OUTDIR)\Far.exe"
ULINKFLAGS=-q -m- -ap -Gz -O- -o- -Gh -Gh- -GF:LARGEADDRESSAWARE -d*kernel32
RFLAGS=/nologo /l 0x409 /fo"$(RES_FILE)" /d $(USEDEBUG)
Expand Down
4 changes: 2 additions & 2 deletions far/panel.hpp
Expand Up @@ -163,8 +163,8 @@ class Panel: public ScreenObject, public std::enable_shared_from_this<Panel>
virtual void GetDizName(string &strDizName) const {}
virtual void FlushDiz() {}
virtual void CopyDiz(const string& Name,const string& ShortName,const string& DestName, const string& DestShortName,DizList *DestDiz) {}
virtual bool IsDizDisplayed() { return false; }
virtual bool IsColumnDisplayed(int Type) {return false;}
virtual bool IsDizDisplayed() const { return false; }
virtual bool IsColumnDisplayed(int Type) const {return false;}
virtual int GetColumnsCount() const { return 1;}
virtual void SetReturnCurrentFile(int Mode) {}
virtual void QViewDelTempName() {}
Expand Down
2 changes: 1 addition & 1 deletion far/vbuild.m4
@@ -1 +1 @@
m4_define(BUILD,4606)m4_dnl
m4_define(BUILD,4607)m4_dnl

0 comments on commit 842c3de

Please sign in to comment.