diff --git a/far/FarDlgBuilder.hpp b/far/FarDlgBuilder.hpp index 755e1f4346..b4bf5e149f 100644 --- a/far/FarDlgBuilder.hpp +++ b/far/FarDlgBuilder.hpp @@ -108,9 +108,8 @@ struct ListControlBinding: public DialogItemBinding Поддерживает automation (изменение флагов одного элемента в зависимости от состояния другого). Реализуется при помощи метода LinkFlags(). */ -class DialogBuilder: noncopyable, public DialogBuilderBase +class DialogBuilder: noncopyable, public base> { - using base = DialogBuilderBase; public: DialogBuilder(lng TitleMessageId, const wchar_t *HelpTopic = nullptr, Dialog::dialog_handler handler = nullptr); DialogBuilder(); @@ -154,30 +153,30 @@ class DialogBuilder: noncopyable, public DialogBuilderBase void AddRadioButtons(IntOption& Value, int OptionCount, const lng MessageIDs[], bool FocusOnSelected=false); - using base::AddText; + using base_type::AddText; decltype(auto) AddText(lng LabelId) { - return base::AddText(static_cast(LabelId)); + return base_type::AddText(static_cast(LabelId)); } decltype(auto) AddTextBefore(DialogItemEx* RelativeTo, lng LabelId) { - return base::AddTextBefore(RelativeTo, static_cast(LabelId)); + return base_type::AddTextBefore(RelativeTo, static_cast(LabelId)); } - using base::AddTextAfter; + using base_type::AddTextAfter; decltype(auto) AddTextAfter(DialogItemEx* RelativeTo, lng LabelId, int skip = 1) { - return base::AddTextAfter(RelativeTo, static_cast(LabelId), skip); + return base_type::AddTextAfter(RelativeTo, static_cast(LabelId), skip); } using base::AddSeparator; decltype(auto) AddSeparator(lng LabelId) { - return base::AddSeparator(static_cast(LabelId)); + return base_type::AddSeparator(static_cast(LabelId)); } // Связывает состояние элементов Parent и Target. Когда Parent->Selected равно diff --git a/far/changelog b/far/changelog index d2daf58e14..a7c208df1a 100644 --- a/far/changelog +++ b/far/changelog @@ -1,3 +1,11 @@ +drkns 08.03.2017 17:34:21 +0000 - build 4909 + +1. VS2017 support. + +2. VS2017 & clang warnings. + +3. Рефакторинг. + zg 07.03.2017 03:02:10 +0200 - build 4908 1. убрана глобальная переменная WaitInMainLoop. diff --git a/far/cmdline.cpp b/far/cmdline.cpp index 539f2162f0..39817b8c44 100644 --- a/far/cmdline.cpp +++ b/far/cmdline.cpp @@ -82,7 +82,7 @@ CommandLine::CommandLine(window_ptr Owner): CmdStr( Owner, this, - [this](const Manager::Key& Key){ return Global->CtrlObject->Cp()->ProcessKey(Key); }, + [](const Manager::Key& Key){ return Global->CtrlObject->Cp()->ProcessKey(Key); }, nullptr, Global->CtrlObject->CmdHistory.get(), nullptr, @@ -478,7 +478,7 @@ int CommandLine::ProcessKey(const Manager::Key& Key) // Сбрасываем выделение на некоторых клавишах if (!Global->Opt->CmdLine.EditBlock) { - static int UnmarkKeys[]= + static const unsigned int UnmarkKeys[]= { KEY_LEFT, KEY_NUMPAD4, KEY_CTRLS, KEY_RCTRLS, diff --git a/far/common.hpp b/far/common.hpp index 5da02f15f1..e485e41468 100644 --- a/far/common.hpp +++ b/far/common.hpp @@ -199,13 +199,30 @@ constexpr size_t aligned_size(size_t Size, size_t Alignment = MEMORY_ALLOCATION_ return (Size + (Alignment - 1)) & ~(Alignment - 1); } -template -struct aligned_sizeof +namespace detail { - enum + template + struct aligned_sizeof_t { - value = aligned_size(sizeof(T), Alignment) + enum + { + value = aligned_size(sizeof(T), Alignment) + }; }; +} + +template +constexpr auto aligned_sizeof() +{ + return detail::aligned_sizeof_t::value; +} + +template +class base: public T +{ +protected: + using T::T; + using base_type = base; }; #endif // COMMON_HPP_1BD5AB87_3379_4AFE_9F63_DB850DCF72B4 diff --git a/far/common/zip_view.hpp b/far/common/zip_view.hpp index 5d7af136d2..af510372b1 100644 --- a/far/common/zip_view.hpp +++ b/far/common/zip_view.hpp @@ -94,6 +94,7 @@ class zip_iterator: auto operator==(const zip_iterator& rhs) const { return m_Tuple == rhs.m_Tuple; } auto operator<(const zip_iterator& rhs) const { return m_Tuple < rhs.m_Tuple; } auto operator*() const { return detail::traits::dereference(m_Tuple); } + auto operator-(const zip_iterator& rhs) const { return std::get<0>(m_Tuple) - std::get<0>(rhs.m_Tuple); } private: typename zip_iterator::pointer m_Tuple; diff --git a/far/components.cpp b/far/components.cpp index 80fafc4a5e..817d3a0c91 100644 --- a/far/components.cpp +++ b/far/components.cpp @@ -50,14 +50,6 @@ namespace components GetComponentsList().add(this); } - components_list::components_list(): - list(), - ptr(), - enum_ptr(), - m_size() - { - } - void components_list::add(component* item) { if (!list) @@ -78,13 +70,12 @@ namespace components if (!index) enum_ptr = list; - if (enum_ptr) - { - value = enum_ptr->m_getInfo; - enum_ptr = enum_ptr->m_next; - return true; - } - return false; + if (!enum_ptr) + return false; + + value = enum_ptr->m_getInfo; + enum_ptr = enum_ptr->m_next; + return true; } std::map& GetComponentsInfo() diff --git a/far/components.hpp b/far/components.hpp index 82ea13557d..ee7dbf79fb 100644 --- a/far/components.hpp +++ b/far/components.hpp @@ -65,12 +65,12 @@ namespace components bool get(size_t index, value_type& value) const; - components_list(); + components_list() = default; - component* list; - component* ptr; - mutable component* enum_ptr; - size_t m_size; + component* list{}; + component* ptr{}; + mutable component* enum_ptr{}; + size_t m_size{}; }; std::map& GetComponentsInfo(); diff --git a/far/configdb.cpp b/far/configdb.cpp index f622a15b6c..b46dd002be 100644 --- a/far/configdb.cpp +++ b/far/configdb.cpp @@ -2149,7 +2149,7 @@ void config_provider::CheckDatabase(SQLiteDb *pDb) } } -void config_provider::TryImportDatabase(representable *p, const char *son, bool plugin) +void config_provider::TryImportDatabase(representable* p, const char* NodeName, bool IsPlugin) { if (!m_TemplateSource && !Global->Opt->TemplateProfilePath.empty()) { @@ -2160,13 +2160,13 @@ void config_provider::TryImportDatabase(representable *p, const char *son, bool { auto root = m_TemplateSource->GetRoot(); - if (!son) + if (!NodeName) { p->Import(*m_TemplateSource); } - else if (!plugin) + else if (!IsPlugin) { - m_TemplateSource->SetRoot(root.FirstChildElement(son)); + m_TemplateSource->SetRoot(root.FirstChildElement(NodeName)); p->Import(*m_TemplateSource); } else @@ -2174,7 +2174,7 @@ void config_provider::TryImportDatabase(representable *p, const char *son, bool for (const auto& i: xml_enum(root.FirstChildElement("pluginsconfig"), "plugin")) { const auto guid = i->Attribute("guid"); - if (guid && 0 == strcmp(guid, son)) + if (guid && 0 == strcmp(guid, NodeName)) { m_TemplateSource->SetRoot(&const_cast(*i)); p->Import(*m_TemplateSource); @@ -2187,31 +2187,33 @@ void config_provider::TryImportDatabase(representable *p, const char *son, bool } template -std::unique_ptr config_provider::CreateDatabase(const char *son) +void config_provider::CheckAndImportDatabase(T* Database, const char* ImportNodeName, bool IsPlugin) { - auto cfg = std::make_unique(); - CheckDatabase(cfg.get()); - if (m_Mode != mode::m_import && cfg->IsNew()) + CheckDatabase(Database); + if (m_Mode != mode::m_import && Database->IsNew()) { - TryImportDatabase(cfg.get(), son); + TryImportDatabase(Database, ImportNodeName, IsPlugin); } - return cfg; } template -HierarchicalConfigUniquePtr config_provider::CreateHierarchicalConfig(dbcheck DbId, const string& dbn, const char *xmln, bool Local, bool plugin) +std::unique_ptr config_provider::CreateDatabase() { - auto cfg = std::make_unique(dbn, Local); + auto Database = std::make_unique(); + CheckAndImportDatabase(Database.get(), nullptr, false); + return Database; +} + +template +HierarchicalConfigUniquePtr config_provider::CreateHierarchicalConfig(dbcheck DbId, const string& DbName, const char* ImportNodeName, bool IsLocal, bool IsPlugin) +{ + auto Database = std::make_unique(DbName, IsLocal); if (!m_CheckedDb.Check(DbId)) { - CheckDatabase(cfg.get()); - if (m_Mode != mode::m_import && cfg->IsNew()) - { - TryImportDatabase(cfg.get(), xmln, plugin); - } + CheckAndImportDatabase(Database.get(), ImportNodeName, IsPlugin); m_CheckedDb.Set(DbId); } - return HierarchicalConfigUniquePtr(cfg.release()); + return HierarchicalConfigUniquePtr(Database.release()); } enum dbcheck: int diff --git a/far/configdb.hpp b/far/configdb.hpp index 597bfba2f9..c35919141d 100644 --- a/far/configdb.hpp +++ b/far/configdb.hpp @@ -385,11 +385,12 @@ class config_provider: noncopyable HierarchicalConfigUniquePtr CreatePanelModeConfig(); private: - template HierarchicalConfigUniquePtr CreateHierarchicalConfig(dbcheck DbId, const string& dbn, const char *xmln, bool Local = false, bool plugin = false); - template std::unique_ptr CreateDatabase(const char *son = nullptr); + template void CheckAndImportDatabase(T* Database, const char* ImportNodeName, bool IsPlugin); + template std::unique_ptr CreateDatabase(); + template HierarchicalConfigUniquePtr CreateHierarchicalConfig(dbcheck DbId, const string& DbName, const char* ImportNodeName, bool IsLocal = false, bool IsPlugin = false); bool Import(const string& File); bool Export(const string& File); - void TryImportDatabase(representable *p, const char *son = nullptr, bool plugin=false); + void TryImportDatabase(representable* p, const char* NodeName = nullptr, bool IsPlugin = false); void CheckDatabase(class SQLiteDb *pDb); int m_LoadResult; diff --git a/far/copy.cpp b/far/copy.cpp index f22c2d2048..e783c229f6 100644 --- a/far/copy.cpp +++ b/far/copy.cpp @@ -1200,12 +1200,9 @@ ShellCopy::ShellCopy(panel_ptr SrcPanel, // исходная панель ( // Позаботимся о дизах. if (!(Flags&FCOPY_COPYTONUL) && !strDestDizPath.empty()) { - const auto Attr = os::GetFileAttributes(DestDiz.GetDizName()); - int DestReadOnly=(Attr!=INVALID_FILE_ATTRIBUTES && (Attr & FILE_ATTRIBUTE_READONLY)); - - if (LastIteration) // Скидываем только во время последней Op. - if (Move && !DestReadOnly) - SrcPanel->FlushDiz(); + // Скидываем только во время последней Op. + if (LastIteration && Move && !os::fs::file_status(DestDiz.GetDizName()).check(FILE_ATTRIBUTE_READONLY)) + SrcPanel->FlushDiz(); DestDiz.Flush(strDestDizPath); } @@ -1222,10 +1219,7 @@ ShellCopy::ShellCopy(panel_ptr SrcPanel, // исходная панель ( { // равно нужно апдейтить дизы! if (!(Flags&FCOPY_COPYTONUL) && !strDestDizPath.empty()) { - const auto Attr = os::GetFileAttributes(DestDiz.GetDizName()); - int DestReadOnly=(Attr!=INVALID_FILE_ATTRIBUTES && (Attr & FILE_ATTRIBUTE_READONLY)); - - if (Move && !DestReadOnly) + if (Move && !os::fs::file_status(DestDiz.GetDizName()).check(FILE_ATTRIBUTE_READONLY)) SrcPanel->FlushDiz(); DestDiz.Flush(strDestDizPath); diff --git a/far/dialog.cpp b/far/dialog.cpp index a76b8a1273..d77cb443c2 100644 --- a/far/dialog.cpp +++ b/far/dialog.cpp @@ -194,7 +194,7 @@ size_t ItemStringAndSize(const DialogItemEx *Data,string& ItemString) static size_t ConvertItemEx2(const DialogItemEx *ItemEx, FarGetDialogItem *Item) { - size_t size = aligned_sizeof::value, offsetList = size, offsetListItems = size; + size_t size = aligned_sizeof(), offsetList = size, offsetListItems = size; vmenu_ptr ListBox; size_t ListBoxSize = 0; if (ItemEx->Type==DI_LISTBOX || ItemEx->Type==DI_COMBOBOX) @@ -202,7 +202,7 @@ static size_t ConvertItemEx2(const DialogItemEx *ItemEx, FarGetDialogItem *Item) ListBox=ItemEx->ListPtr; if (ListBox) { - size += aligned_sizeof::value; + size += aligned_sizeof(); offsetListItems=size; ListBoxSize=ListBox->size(); size+=ListBoxSize*sizeof(FarListItem); diff --git a/far/disabled_warnings.hpp b/far/disabled_warnings.hpp index 86cf32cfe4..ceac90e39b 100644 --- a/far/disabled_warnings.hpp +++ b/far/disabled_warnings.hpp @@ -39,7 +39,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #pragma warning(disable: 4091) // https://msdn.microsoft.com/en-us/library/eehkcz60.aspx 'typedef ': ignored on left of 'type' when no variable is declared #pragma warning(disable: 4265) // https://msdn.microsoft.com/en-us/library/wzxffy8c.aspx 'class' : class has virtual functions, but destructor is not virtual #pragma warning(disable: 4668) // https://msdn.microsoft.com/en-us/library/4dt9kyhy.aspx 'symbol' is not defined as a preprocessor macro, replacing with '0' for 'directives' +#pragma warning(disable: 4774) // no page 'function' : format string expected in argument 'number' is not a string literal #pragma warning(disable: 4917) // https://msdn.microsoft.com/en-us/library/3w98z1xh.aspx 'declarator' : a GUID can only be associated with a class, interface or namespace +#pragma warning(disable: 4987) // no page nonstandard extension used: 'throw (...)' #pragma warning(disable: 4996) // https://msdn.microsoft.com/en-us/library/ttcz0bys.aspx The compiler encountered a deprecated declaration #else // these in the rest of the code as well diff --git a/far/editor.cpp b/far/editor.cpp index 22613c692f..1c02efe03f 100644 --- a/far/editor.cpp +++ b/far/editor.cpp @@ -816,7 +816,7 @@ bool Editor::ProcessKeyInternal(const Manager::Key& Key, bool& Refresh) if (!EdOpt.PersistentBlocks) { - static int UnmarkKeys[]= + static const unsigned int UnmarkKeys[]= { KEY_LEFT, KEY_NUMPAD4, KEY_RIGHT, KEY_NUMPAD6, @@ -6801,7 +6801,7 @@ Editor::numbered_iterator Editor::InsertString(const wchar_t* Str, int nLength, const auto NewLine = numbered_iterator(Lines.emplace(Where, GetOwner()), Where.Number()); m_LinesCount++; - const auto& UpdateIterator = [&NewLine, &Where](numbered_iterator& What) + const auto& UpdateIterator = [&Where](numbered_iterator& What) { if (What.Number() >= Where.Number()) { diff --git a/far/encoding.cpp b/far/encoding.cpp index 4675b49919..309f7c94e7 100644 --- a/far/encoding.cpp +++ b/far/encoding.cpp @@ -41,7 +41,7 @@ class installed_codepages { public: installed_codepages(); - const cp_map& get() const { return m_InstalledCp; } + const auto& get() const { return m_InstalledCp; } private: void insert(UINT Codepage, UINT MaxCharSize, const string& Name) diff --git a/far/execute.cpp b/far/execute.cpp index afa1a35259..f5f4235600 100644 --- a/far/execute.cpp +++ b/far/execute.cpp @@ -854,7 +854,7 @@ void Execute(execute_info& Info, bool FolderRun, bool Silent, const std::functio seInfo.lpParameters = strNewCmdPar.data(); } - const auto& GetVerb = [&Verb](const string& Str) + const auto& GetVerb = [](const string& Str) { DWORD DummyError; string DummyString; diff --git a/far/far.vcxproj b/far/far.vcxproj index 16ecb5fdf7..7f9477aa4b 100644 --- a/far/far.vcxproj +++ b/far/far.vcxproj @@ -30,6 +30,7 @@ v140 + v141 diff --git a/far/farexcpt.hpp b/far/farexcpt.hpp index 03644a95cc..2b0a59ba60 100644 --- a/far/farexcpt.hpp +++ b/far/farexcpt.hpp @@ -55,6 +55,11 @@ auto seh_invoke(function&& Callable, filter&& Filter, handler&& Handler) // GCC doesn't support these currently return Callable(); #else +#if COMPILER == C_CLANG + // Workaround for clang "filter expression type should be an integral value" error + std::function FilterWrapper = Filter; +#define Filter FilterWrapper +#endif __try { return Callable(); @@ -66,6 +71,9 @@ auto seh_invoke(function&& Callable, filter&& Filter, handler&& Handler) ResetStackOverflowIfNeeded(); return Handler(); } +#if COMPILER == C_CLANG +#undef Filter +#endif #endif } diff --git a/far/farwinapi.cpp b/far/farwinapi.cpp index 3263cbd59f..095e8c92a5 100644 --- a/far/farwinapi.cpp +++ b/far/farwinapi.cpp @@ -162,7 +162,8 @@ static void DirectoryInfoToFindData(const FILE_ID_BOTH_DIR_INFORMATION& Director const auto& RemoveTrailingZeros = [](string& Where) { - Where.resize(Where.find_last_not_of(L'\0') + 1); + const auto Pos = Where.find_last_not_of(L'\0'); + Pos != string::npos? Where.resize(Pos + 1) : Where.clear(); }; // MSDN verse 2.4.17: @@ -186,10 +187,10 @@ static void DirectoryInfoToFindData(const FILE_ID_BOTH_DIR_INFORMATION& Director FindData.strAlternateFileName.clear(); } -static auto FindFirstFileInternal(const string& Name, FAR_FIND_DATA& FindData) +static find_file_handle FindFirstFileInternal(const string& Name, FAR_FIND_DATA& FindData) { if (Name.empty() || IsSlash(Name.back())) - return find_file_handle{}; + return nullptr; auto Handle = std::make_unique(); @@ -205,7 +206,7 @@ static auto FindFirstFileInternal(const string& Name, FAR_FIND_DATA& FindData) { SetLastError(ERROR_PATH_NOT_FOUND); } - return find_file_handle{}; + return nullptr; } // for network paths buffer size must be <= 64k @@ -244,7 +245,7 @@ static auto FindFirstFileInternal(const string& Name, FAR_FIND_DATA& FindData) } if (!QueryResult) - return find_file_handle{}; + return nullptr; const auto DirectoryInfo = reinterpret_cast(Handle->BufferBase.get()); DirectoryInfoToFindData(*DirectoryInfo, FindData, Handle->Extended); @@ -830,42 +831,43 @@ NTSTATUS GetLastNtStatus() bool DeleteFile(const string& FileName) { NTPath strNtName(FileName); - bool Result = ::DeleteFile(strNtName.data()) != FALSE; - if(!Result && ElevationRequired(ELEVATION_MODIFY_REQUEST)) - { - Result = Global->Elevation->fDeleteFile(strNtName); - } - if (!Result && !os::fs::exists(strNtName)) + if (::DeleteFile(strNtName.data())) + return true; + + if (!os::fs::exists(strNtName)) { // Someone deleted it already, // but job is done, no need to report error. - Result = true; + return true; } - return Result; + if(ElevationRequired(ELEVATION_MODIFY_REQUEST)) + return Global->Elevation->fDeleteFile(strNtName); + + return false; } bool RemoveDirectory(const string& DirName) { NTPath strNtName(DirName); - bool Result = ::RemoveDirectory(strNtName.data()) != FALSE; - if(!Result && ElevationRequired(ELEVATION_MODIFY_REQUEST)) - { - Result = Global->Elevation->fRemoveDirectory(strNtName); - } + if (::RemoveDirectory(strNtName.data())) + return true; - if (!Result && !os::fs::exists(strNtName)) + if (!os::fs::exists(strNtName)) { // Someone deleted it already, // but job is done, no need to report error. - Result = true; + return true; } - return Result; + if(ElevationRequired(ELEVATION_MODIFY_REQUEST)) + return Global->Elevation->fRemoveDirectory(strNtName); + + return false; } -os::handle CreateFile(const string& Object, DWORD DesiredAccess, DWORD ShareMode, LPSECURITY_ATTRIBUTES SecurityAttributes, DWORD CreationDistribution, DWORD FlagsAndAttributes, HANDLE TemplateFile, bool ForceElevation) +handle CreateFile(const string& Object, DWORD DesiredAccess, DWORD ShareMode, LPSECURITY_ATTRIBUTES SecurityAttributes, DWORD CreationDistribution, DWORD FlagsAndAttributes, HANDLE TemplateFile, bool ForceElevation) { NTPath strObject(Object); FlagsAndAttributes |= FILE_FLAG_BACKUP_SEMANTICS; @@ -874,24 +876,28 @@ os::handle CreateFile(const string& Object, DWORD DesiredAccess, DWORD ShareMode FlagsAndAttributes |= FILE_FLAG_POSIX_SEMANTICS; } - os::handle Handle(::CreateFile(strObject.data(), DesiredAccess, ShareMode, SecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile)); - if(!Handle) + if (auto Handle = handle(::CreateFile(strObject.data(), DesiredAccess, ShareMode, SecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile))) + return Handle; + + const auto LastError = GetLastError(); + + if (STATUS_STOPPED_ON_SYMLINK == GetLastNtStatus() && ERROR_STOPPED_ON_SYMLINK != LastError) { - DWORD Error=::GetLastError(); - if(Error==ERROR_FILE_NOT_FOUND||Error==ERROR_PATH_NOT_FOUND) - { - FlagsAndAttributes&=~FILE_FLAG_POSIX_SEMANTICS; - Handle.reset(::CreateFile(strObject.data(), DesiredAccess, ShareMode, SecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile)); - } - if (STATUS_STOPPED_ON_SYMLINK == GetLastNtStatus() && ERROR_STOPPED_ON_SYMLINK != GetLastError()) - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return nullptr; } - if((!Handle && ElevationRequired(DesiredAccess&(GENERIC_ALL|GENERIC_WRITE|WRITE_OWNER|WRITE_DAC|DELETE|FILE_WRITE_DATA|FILE_ADD_FILE|FILE_APPEND_DATA|FILE_ADD_SUBDIRECTORY|FILE_CREATE_PIPE_INSTANCE|FILE_WRITE_EA|FILE_DELETE_CHILD|FILE_WRITE_ATTRIBUTES)?ELEVATION_MODIFY_REQUEST:ELEVATION_READ_REQUEST)) || ForceElevation) + if (LastError == ERROR_FILE_NOT_FOUND || LastError == ERROR_PATH_NOT_FOUND) { - Handle.reset(Global->Elevation->fCreateFile(strObject, DesiredAccess, ShareMode, SecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile)); + FlagsAndAttributes &= ~FILE_FLAG_POSIX_SEMANTICS; + if (auto Handle = handle(::CreateFile(strObject.data(), DesiredAccess, ShareMode, SecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile))) + return Handle; } - return Handle; + + if (ElevationRequired(DesiredAccess & (GENERIC_ALL | GENERIC_WRITE | WRITE_OWNER | WRITE_DAC | DELETE | FILE_WRITE_DATA | FILE_ADD_FILE | FILE_APPEND_DATA | FILE_ADD_SUBDIRECTORY | FILE_CREATE_PIPE_INSTANCE | FILE_WRITE_EA | FILE_DELETE_CHILD | FILE_WRITE_ATTRIBUTES)? ELEVATION_MODIFY_REQUEST : ELEVATION_READ_REQUEST) || ForceElevation) + return handle(Global->Elevation->fCreateFile(strObject, DesiredAccess, ShareMode, SecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile)); + + return nullptr; } bool CopyFileEx( @@ -908,19 +914,26 @@ bool CopyFileEx( { strTo += PointToName(strFrom); } - bool Result = ::CopyFileEx(strFrom.data(), strTo.data(), lpProgressRoutine, lpData, pbCancel, dwCopyFlags) != FALSE; - if(!Result) - { - if (STATUS_STOPPED_ON_SYMLINK == GetLastNtStatus() && ERROR_STOPPED_ON_SYMLINK != GetLastError()) - ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - else if (STATUS_FILE_IS_A_DIRECTORY == GetLastNtStatus()) - ::SetLastError(ERROR_FILE_EXISTS); + if (::CopyFileEx(strFrom.data(), strTo.data(), lpProgressRoutine, lpData, pbCancel, dwCopyFlags)) + return true; - else if (ElevationRequired(ELEVATION_MODIFY_REQUEST)) //BUGBUG, really unknown - Result = Global->Elevation->fCopyFileEx(strFrom, strTo, lpProgressRoutine, lpData, pbCancel, dwCopyFlags); + if (STATUS_STOPPED_ON_SYMLINK == GetLastNtStatus() && ERROR_STOPPED_ON_SYMLINK != GetLastError()) + { + ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return false; } - return Result; + + if (STATUS_FILE_IS_A_DIRECTORY == GetLastNtStatus()) + { + ::SetLastError(ERROR_FILE_EXISTS); + return false; + } + + if (ElevationRequired(ELEVATION_MODIFY_REQUEST)) //BUGBUG, really unknown + return Global->Elevation->fCopyFileEx(strFrom, strTo, lpProgressRoutine, lpData, pbCancel, dwCopyFlags); + + return false; } bool MoveFile( @@ -933,17 +946,20 @@ bool MoveFile( { strTo += PointToName(strFrom); } - bool Result = ::MoveFile(strFrom.data(), strTo.data()) != FALSE; + + if (::MoveFile(strFrom.data(), strTo.data())) + return true; - if(!Result) + if (STATUS_STOPPED_ON_SYMLINK == GetLastNtStatus() && ERROR_STOPPED_ON_SYMLINK != GetLastError()) { - if (STATUS_STOPPED_ON_SYMLINK == GetLastNtStatus() && ERROR_STOPPED_ON_SYMLINK != GetLastError()) - ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - - else if (ElevationRequired(ELEVATION_MODIFY_REQUEST)) //BUGBUG, really unknown - Result = Global->Elevation->fMoveFileEx(strFrom, strTo, 0); + ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return false; } - return Result; + + if (ElevationRequired(ELEVATION_MODIFY_REQUEST)) //BUGBUG, really unknown + return Global->Elevation->fMoveFileEx(strFrom, strTo, 0); + + return false; } bool MoveFileEx( @@ -957,25 +973,29 @@ bool MoveFileEx( { strTo += PointToName(strFrom); } - bool Result = ::MoveFileEx(strFrom.data(), strTo.data(), dwFlags) != FALSE; - if(!Result) + + if (::MoveFileEx(strFrom.data(), strTo.data(), dwFlags)) + return true; + + if (STATUS_STOPPED_ON_SYMLINK == GetLastNtStatus() && ERROR_STOPPED_ON_SYMLINK != GetLastError()) { - if (STATUS_STOPPED_ON_SYMLINK == GetLastNtStatus() && ERROR_STOPPED_ON_SYMLINK != GetLastError()) - ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return false; + } - else if (ElevationRequired(ELEVATION_MODIFY_REQUEST)) //BUGBUG, really unknown + if (ElevationRequired(ELEVATION_MODIFY_REQUEST)) //BUGBUG, really unknown + { + // exclude fake elevation request for: move file over existing directory with same name + const fs::file_status SrcStatus(strFrom), DstStatus(strTo); + if (fs::is_directory(DstStatus) && fs::is_file(SrcStatus)) { - // exclude fake elevation request for: move file over existing directory with same name - DWORD f = GetFileAttributes(strFrom); - DWORD t = GetFileAttributes(strTo); - - if (f!=INVALID_FILE_ATTRIBUTES && t!=INVALID_FILE_ATTRIBUTES && 0==(f & FILE_ATTRIBUTE_DIRECTORY) && 0!=(t & FILE_ATTRIBUTE_DIRECTORY)) - ::SetLastError(ERROR_FILE_EXISTS); // existing directory name == moved file name - else - Result = Global->Elevation->fMoveFileEx(strFrom, strTo, dwFlags); + ::SetLastError(ERROR_FILE_EXISTS); // existing directory name == moved file name + return false; } + return Global->Elevation->fMoveFileEx(strFrom, strTo, dwFlags); } - return Result; + + return false; } string& strCurrentDirectory() @@ -1143,27 +1163,27 @@ bool GetVolumeInformation( string *pFileSystemName ) { - wchar_t_ptr VolumeNameBuffer, FileSystemNameBuffer; + wchar_t VolumeNameBuffer[MAX_PATH + 1], FileSystemNameBuffer[MAX_PATH + 1]; if (pVolumeName) { - VolumeNameBuffer.reset(MAX_PATH + 1); VolumeNameBuffer[0] = L'\0'; } if (pFileSystemName) { - FileSystemNameBuffer.reset(MAX_PATH + 1); FileSystemNameBuffer[0] = L'\0'; } - bool bResult = ::GetVolumeInformation(RootPathName.data(), VolumeNameBuffer.get(), static_cast(VolumeNameBuffer.size()), lpVolumeSerialNumber, - lpMaximumComponentLength, lpFileSystemFlags, FileSystemNameBuffer.get(), static_cast(FileSystemNameBuffer.size())) != FALSE; + + if (!::GetVolumeInformation(RootPathName.data(), VolumeNameBuffer, static_cast(std::size(VolumeNameBuffer)), lpVolumeSerialNumber, + lpMaximumComponentLength, lpFileSystemFlags, FileSystemNameBuffer, static_cast(std::size(FileSystemNameBuffer)))) + return false; if (pVolumeName) - *pVolumeName = VolumeNameBuffer.get(); + *pVolumeName = VolumeNameBuffer; if (pFileSystemName) - *pFileSystemName = FileSystemNameBuffer.get(); + *pFileSystemName = FileSystemNameBuffer; - return bResult; + return true; } bool GetFindDataEx(const string& FileName, FAR_FIND_DATA& FindData,bool ScanSymLink) @@ -1253,18 +1273,19 @@ bool GetDiskSize(const string& Path,unsigned long long* TotalSize, unsigned long Result = Global->Elevation->fGetDiskFreeSpaceEx(strPath.data(), &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes); } - if (Result) - { - if (TotalSize) - *TotalSize = TotalNumberOfBytes.QuadPart; + if (!Result) + return false; - if (TotalFree) - *TotalFree = TotalNumberOfFreeBytes.QuadPart; + if (TotalSize) + *TotalSize = TotalNumberOfBytes.QuadPart; - if (UserFree) - *UserFree = FreeBytesAvailableToCaller.QuadPart; - } - return Result; + if (TotalFree) + *TotalFree = TotalNumberOfFreeBytes.QuadPart; + + if (UserFree) + *UserFree = FreeBytesAvailableToCaller.QuadPart; + + return true; } find_handle FindFirstFileName(const string& FileName, DWORD dwFlags, string& LinkName) @@ -1306,12 +1327,13 @@ bool CreateDirectoryEx(const string& TemplateDirectory, const string& NewDirecto const auto& Create = [&](const string& Template) { - auto Result = Template.empty()? ::CreateDirectory(NtNewDirectory.data(), SecurityAttributes) != FALSE : ::CreateDirectoryEx(Template.data(), NtNewDirectory.data(), SecurityAttributes) != FALSE; - if (!Result && ElevationRequired(ELEVATION_MODIFY_REQUEST)) - { - Result = Global->Elevation->fCreateDirectoryEx(Template, NtNewDirectory, SecurityAttributes); - } - return Result; + if (Template.empty() ? ::CreateDirectory(NtNewDirectory.data(), SecurityAttributes) : ::CreateDirectoryEx(Template.data(), NtNewDirectory.data(), SecurityAttributes)) + return true; + + if (ElevationRequired(ELEVATION_MODIFY_REQUEST)) + return Global->Elevation->fCreateDirectoryEx(Template, NtNewDirectory, SecurityAttributes); + + return false; }; return Create(NTPath(TemplateDirectory)) || @@ -1333,12 +1355,14 @@ DWORD GetFileAttributes(const string& FileName) bool SetFileAttributes(const string& FileName, DWORD dwFileAttributes) { NTPath NtName(FileName); - bool Result = ::SetFileAttributes(NtName.data(), dwFileAttributes) != FALSE; - if(!Result && ElevationRequired(ELEVATION_MODIFY_REQUEST)) - { - Result = Global->Elevation->fSetFileAttributes(NtName, dwFileAttributes); - } - return Result; + + if (::SetFileAttributes(NtName.data(), dwFileAttributes)) + return true; + + if(ElevationRequired(ELEVATION_MODIFY_REQUEST)) + return Global->Elevation->fSetFileAttributes(NtName, dwFileAttributes); + + return false; } bool CreateSymbolicLinkInternal(const string& Object, const string& Target, DWORD dwFlags) @@ -1351,12 +1375,14 @@ bool CreateSymbolicLinkInternal(const string& Object, const string& Target, DWOR bool CreateSymbolicLink(const string& SymlinkFileName, const string& TargetFileName,DWORD dwFlags) { NTPath NtSymlinkFileName(SymlinkFileName); - bool Result = CreateSymbolicLinkInternal(NtSymlinkFileName, TargetFileName, dwFlags); - if(!Result && ElevationRequired(ELEVATION_MODIFY_REQUEST)) - { - Result=Global->Elevation->fCreateSymbolicLink(NtSymlinkFileName, TargetFileName, dwFlags); - } - return Result; + + if (CreateSymbolicLinkInternal(NtSymlinkFileName, TargetFileName, dwFlags)) + return true; + + if(ElevationRequired(ELEVATION_MODIFY_REQUEST)) + return Global->Elevation->fCreateSymbolicLink(NtSymlinkFileName, TargetFileName, dwFlags); + + return false; } bool SetFileEncryptionInternal(const wchar_t* Name, bool Encrypt) @@ -1367,33 +1393,37 @@ bool SetFileEncryptionInternal(const wchar_t* Name, bool Encrypt) bool SetFileEncryption(const string& Name, bool Encrypt) { NTPath NtName(Name); - bool Result = SetFileEncryptionInternal(NtName.data(), Encrypt); - if(!Result && ElevationRequired(ELEVATION_MODIFY_REQUEST, false)) // Encryption implemented in adv32, NtStatus not affected - { - Result=Global->Elevation->fSetFileEncryption(NtName, Encrypt); - } - return Result; + + if (SetFileEncryptionInternal(NtName.data(), Encrypt)) + return true; + + if(ElevationRequired(ELEVATION_MODIFY_REQUEST, false)) // Encryption implemented in adv32, NtStatus not affected + return Global->Elevation->fSetFileEncryption(NtName, Encrypt); + + return false; } bool CreateHardLinkInternal(const string& Object, const string& Target,LPSECURITY_ATTRIBUTES SecurityAttributes) { - bool Result = ::CreateHardLink(Object.data(), Target.data(), SecurityAttributes) != FALSE; - if(!Result && ElevationRequired(ELEVATION_MODIFY_REQUEST)) - { - Result = Global->Elevation->fCreateHardLink(Object, Target, SecurityAttributes); - } - return Result; + if (::CreateHardLink(Object.data(), Target.data(), SecurityAttributes)) + return true; + + if(ElevationRequired(ELEVATION_MODIFY_REQUEST)) + return Global->Elevation->fCreateHardLink(Object, Target, SecurityAttributes); + + return false; } bool CreateHardLink(const string& FileName, const string& ExistingFileName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { - bool Result = CreateHardLinkInternal(NTPath(FileName),NTPath(ExistingFileName), lpSecurityAttributes) != FALSE; + if (CreateHardLinkInternal(NTPath(FileName), NTPath(ExistingFileName), lpSecurityAttributes)) + return true; + //bug in win2k: \\?\ fails - if (!Result && !IsWindowsXPOrGreater()) - { - Result = CreateHardLinkInternal(FileName, ExistingFileName, lpSecurityAttributes); - } - return Result; + if (!IsWindowsXPOrGreater()) + return CreateHardLinkInternal(FileName, ExistingFileName, lpSecurityAttributes); + + return false; } static bool FileStreamInformationToFindStreamData(const FILE_STREAM_INFORMATION& StreamInfo, WIN32_FIND_STREAM_DATA& StreamData) @@ -1672,7 +1702,7 @@ void EnableLowFragmentationHeap() break; } - for (auto i: Heaps) + for (const auto i: Heaps) { ULONG HeapFragValue = 2; Imports().HeapSetInformation(i, HeapCompatibilityInformation, &HeapFragValue, sizeof(HeapFragValue)); @@ -1727,12 +1757,14 @@ bool DetachVirtualDiskInternal(const string& Object, VIRTUAL_STORAGE_TYPE& Virtu bool DetachVirtualDisk(const string& Object, VIRTUAL_STORAGE_TYPE& VirtualStorageType) { NTPath NtObject(Object); - bool Result = DetachVirtualDiskInternal(NtObject, VirtualStorageType); - if(!Result && ElevationRequired(ELEVATION_MODIFY_REQUEST)) - { - Result = Global->Elevation->fDetachVirtualDisk(NtObject, VirtualStorageType); - } - return Result; + + if (DetachVirtualDiskInternal(NtObject, VirtualStorageType)) + return true; + + if(ElevationRequired(ELEVATION_MODIFY_REQUEST)) + return Global->Elevation->fDetachVirtualDisk(NtObject, VirtualStorageType); + + return false; } string GetLocaleValue(LCID lcid, LCTYPE id) @@ -1757,9 +1789,9 @@ bool GetWindowText(HWND Hwnd, string& Text) { return ApiDynamicStringReceiver(Text, [&](wchar_t* Buffer, size_t Size) { - size_t Length = ::GetWindowTextLength(Hwnd); + const size_t Length = ::GetWindowTextLength(Hwnd); - if (!Length) + if (!Length) return Length; if (Length + 1 > Size) diff --git a/far/farwinapi.hpp b/far/farwinapi.hpp index b0ee0bc552..830d485306 100644 --- a/far/farwinapi.hpp +++ b/far/farwinapi.hpp @@ -40,18 +40,18 @@ namespace os namespace detail { template - class handle_t: public std::unique_ptr, deleter> + class handle_t: public base, deleter>> { - using base = std::unique_ptr, deleter>; + using base_type = typename handle_t::base_type; public: TRIVIALLY_MOVABLE(handle_t); constexpr handle_t() = default; constexpr handle_t(nullptr_t) {} - explicit handle_t(HANDLE Handle): base(normalise(Handle)) {} - void reset(HANDLE Handle = nullptr) { base::reset(normalise(Handle)); } - HANDLE native_handle() const { return base::get(); } + explicit handle_t(HANDLE Handle): base_type(normalise(Handle)) {} + void reset(HANDLE Handle = nullptr) { base_type::reset(normalise(Handle)); } + HANDLE native_handle() const { return base_type::get(); } void close() { reset(); } bool wait(DWORD Milliseconds = INFINITE) const { return WaitForSingleObject(native_handle(), Milliseconds) == WAIT_OBJECT_0; } bool is_signaled() const { return wait(0); } diff --git a/far/fileedit.cpp b/far/fileedit.cpp index 9af9f8b02c..9040254d56 100644 --- a/far/fileedit.cpp +++ b/far/fileedit.cpp @@ -566,12 +566,12 @@ void FileEditor::Init( /* $ 15.12.2000 SVS - Shift-F4, новый файл. Выдает сообщение :-( */ - DWORD FAttr=os::GetFileAttributes(Name); + const os::fs::file_status FileStatus(Name); /* $ 05.06.2001 IS + посылаем подальше всех, кто пытается отредактировать каталог */ - if (FAttr!=INVALID_FILE_ATTRIBUTES && FAttr&FILE_ATTRIBUTE_DIRECTORY) + if (os::fs::is_directory(FileStatus)) { Message(MSG_WARNING, MSG(lng::MEditTitle), { MSG(lng::MEditCanNotEditDirectory) }, @@ -581,18 +581,15 @@ void FileEditor::Init( return; } - if ((m_editor->EdOpt.ReadOnlyLock&2) && - FAttr != INVALID_FILE_ATTRIBUTES && - (FAttr & - (FILE_ATTRIBUTE_READONLY| - /* Hidden=0x2 System=0x4 - располагаются во 2-м полубайте, - поэтому применяем маску 0110.0000 и - сдвигаем на свое место => 0000.0110 и получаем - те самые нужные атрибуты */ - ((m_editor->EdOpt.ReadOnlyLock&0x60)>>4) - ) - ) - ) + if (m_editor->EdOpt.ReadOnlyLock & bit(1) && + FileStatus.check(FILE_ATTRIBUTE_READONLY | + /* Hidden=0x2 System=0x4 - располагаются во 2-м полубайте, + поэтому применяем маску 0110.0000 и + сдвигаем на свое место => 0000.0110 и получаем + те самые нужные атрибуты */ + ((m_editor->EdOpt.ReadOnlyLock & 0b0110'0000) >> 4) + ) + ) { if (Message(MSG_WARNING, MSG(lng::MEditTitle), { Name, MSG(lng::MEditRSH), MSG(lng::MEditROOpen) }, @@ -613,7 +610,7 @@ void FileEditor::Init( При создании файла с нуля так же посылаем плагинам событие EE_READ, дабы не нарушать однообразие. */ - if (FAttr == INVALID_FILE_ATTRIBUTES) + if (!os::fs::exists(FileStatus)) m_Flags.Set(FFILEEDIT_NEW); if (BlankFileName && m_Flags.Check(FFILEEDIT_CANNEWFILE)) @@ -1537,8 +1534,8 @@ int FileEditor::LoadFile(const string& Name,int &UserBreak) m_editor->FreeAllocatedData(); bool bCached = LoadFromCache(pc); - DWORD FileAttributes=os::GetFileAttributes(Name); - if((m_editor->EdOpt.ReadOnlyLock&1) && FileAttributes != INVALID_FILE_ATTRIBUTES && (FileAttributes & (FILE_ATTRIBUTE_READONLY|((m_editor->EdOpt.ReadOnlyLock&0x60)>>4)))) + const os::fs::file_status FileStatus(Name); + if ((m_editor->EdOpt.ReadOnlyLock & bit(1)) && FileStatus.check(FILE_ATTRIBUTE_READONLY | (m_editor->EdOpt.ReadOnlyLock & 0b0110'0000) >> 4)) { m_editor->m_Flags.Swap(Editor::FEDITOR_LOCKMODE); } diff --git a/far/filelist.cpp b/far/filelist.cpp index c7cc1485ea..5b6572ef88 100644 --- a/far/filelist.cpp +++ b/far/filelist.cpp @@ -200,7 +200,6 @@ static bool CanSort(int SortMode) FileListItem::FileListItem() { - static_cast(*this) = {}; m_Owner.assign(1, values::uninitialised(wchar_t())); } @@ -5510,7 +5509,7 @@ void FileList::FileListToPluginItem(const FileListItem& fi, PluginPanelItemHolde size_t FileList::FileListToPluginItem2(const FileListItem& fi,FarGetPluginPanelItem* gpi) const { - size_t size = aligned_sizeof::value, offset = size; + size_t size = aligned_sizeof(), offset = size; size+=fi.CustomColumnNumber*sizeof(wchar_t*); size+=sizeof(wchar_t)*(fi.strName.size()+1); size+=sizeof(wchar_t)*(fi.strShortName.size()+1); @@ -5606,30 +5605,19 @@ FileListItem::FileListItem(const PluginPanelItem& pi) Colors = nullptr; - CustomColumnNumber = pi.CustomColumnNumber; - - if (CustomColumnNumber) + if (pi.CustomColumnData && pi.CustomColumnNumber) { CustomColumnData = new wchar_t*[pi.CustomColumnNumber]; + CustomColumnNumber = pi.CustomColumnNumber; - for (size_t I = 0; I < pi.CustomColumnNumber; I++) + for (size_t i = 0; i != pi.CustomColumnNumber; ++i) { - if (pi.CustomColumnData && pi.CustomColumnData[I]) - { - CustomColumnData[I] = new wchar_t[StrLength(pi.CustomColumnData[I]) + 1]; - wcscpy(CustomColumnData[I], pi.CustomColumnData[I]); - } - else - { - CustomColumnData[I] = new wchar_t[1]; - CustomColumnData[I][0] = 0; - } + const auto Data = NullToEmpty(pi.CustomColumnData[i]); + const auto Size = wcslen(Data); + CustomColumnData[i] = new wchar_t[Size + 1]; + *std::copy(Data, Data + Size, CustomColumnData[i]) = L'\0'; } } - else - { - CustomColumnData = nullptr; - } Position = 0; SortGroup = DEFAULT_SORT_GROUP; diff --git a/far/filelist.hpp b/far/filelist.hpp index b27f2198c4..5b6bd05500 100644 --- a/far/filelist.hpp +++ b/far/filelist.hpp @@ -43,45 +43,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class FileFilter; class Plugin; -namespace detail -{ - struct FileListItemPod - { - // KEEP ALIGNED! - FILETIME CreationTime; - FILETIME AccessTime; - FILETIME WriteTime; - FILETIME ChangeTime; - - unsigned long long FileSize; - unsigned long long AllocationSize; - - UINT64 UserFlags; - UserDataItem UserData; - - DWORD FileAttr; - DWORD ReparseTag; - - mutable const HighlightFiles::highlight_item* Colors; - - wchar_t **CustomColumnData; - size_t CustomColumnNumber; - size_t Position; - - int SortGroup; - DWORD CRC32; - - const wchar_t *DizText; - - char Selected; - char PrevSelected; - char ShowFolderSize; - }; -} - using content_data_ptr = std::unique_ptr>; -class FileListItem: public detail::FileListItemPod +class FileListItem { public: NONCOPYABLE(FileListItem); @@ -105,15 +69,45 @@ class FileListItem: public detail::FileListItemPod bool IsContentDataRead() const; const content_data_ptr& ContentData(const FileList* Owner) const; + // KEEP ALIGNED! + FILETIME CreationTime{}; + FILETIME AccessTime{}; + FILETIME WriteTime{}; + FILETIME ChangeTime{}; + + unsigned long long FileSize{}; + unsigned long long AllocationSize{}; + + UINT64 UserFlags{}; + UserDataItem UserData{}; + + DWORD FileAttr{}; + DWORD ReparseTag{}; + + mutable const HighlightFiles::highlight_item* Colors{}; + + wchar_t** CustomColumnData{}; + size_t CustomColumnNumber{}; + size_t Position{}; + + int SortGroup{}; + DWORD CRC32{}; + + const wchar_t *DizText{}; + + char Selected{}; + char PrevSelected{}; + char ShowFolderSize{}; + string strName; string strShortName; struct values { template - static constexpr T uninitialised(T) { return -2; } + static constexpr T uninitialised(const T&) { return -2; } template - static constexpr T unknown(T) { return -1; } + static constexpr T unknown(const T&) { return -1; } }; private: diff --git a/far/fileowner.cpp b/far/fileowner.cpp index fa416fc392..5610752348 100644 --- a/far/fileowner.cpp +++ b/far/fileowner.cpp @@ -202,10 +202,12 @@ bool SetOwnerInternal(const string& Object, const string& Owner) bool SetFileOwner(const string& Object, const string& Owner) { NTPath strNtObject(Object); - bool Result = SetOwnerInternal(strNtObject, Owner); - if(!Result && ElevationRequired(ELEVATION_MODIFY_REQUEST)) - { - Result = Global->Elevation->fSetOwner(strNtObject, Owner); - } - return Result; + + if (SetOwnerInternal(strNtObject, Owner)) + return true; + + if(ElevationRequired(ELEVATION_MODIFY_REQUEST)) + return Global->Elevation->fSetOwner(strNtObject, Owner); + + return false; } diff --git a/far/grabber.cpp b/far/grabber.cpp index 940f31973d..02c8507a33 100644 --- a/far/grabber.cpp +++ b/far/grabber.cpp @@ -370,7 +370,7 @@ int Grabber::ProcessKey(const Manager::Key& Key) ResetArea = true; } - const auto& Move = [this](COORD& What, int Count, int Direction, int LimitX, int LimitY, int NewX) + const auto& Move = [](COORD& What, int Count, int Direction, int LimitX, int LimitY, int NewX) { for (; Count; --Count) { diff --git a/far/manager.cpp b/far/manager.cpp index 31567b2f09..e8d8a95777 100644 --- a/far/manager.cpp +++ b/far/manager.cpp @@ -506,7 +506,7 @@ void Manager::SwitchWindow(DirectionType Direction) { const auto windows = GetSortedWindows(); auto pos = windows.find(GetBottomWindow()); - const auto& process = [&, this]() + const auto& process = [&]() { if (Direction==Manager::NextWindow) { diff --git a/far/panel.cpp b/far/panel.cpp index 054b7681e3..1a3abb9bb7 100644 --- a/far/panel.cpp +++ b/far/panel.cpp @@ -1045,7 +1045,7 @@ int Panel::SetPluginCommand(int Command,int Param1,void* Param2) Reenter++; ShortcutInfo Info; GetShortcutInfo(Info); - Result = aligned_sizeof::value; + Result = aligned_sizeof(); size_t folderOffset=Result; Result+=static_cast(sizeof(wchar_t)*(Info.ShortcutFolder.size()+1)); size_t pluginFileOffset=Result; diff --git a/far/plugapi.cpp b/far/plugapi.cpp index 04749ee64e..8bee200efb 100644 --- a/far/plugapi.cpp +++ b/far/plugapi.cpp @@ -196,9 +196,8 @@ long long WINAPI apiAtoi64(const wchar_t *s) noexcept void WINAPI apiQsort(void *base, size_t nelem, size_t width, cfunctions::comparer fcmp, void *user) noexcept { - //noexcept - return cfunctions::qsortex((char*)base,nelem,width,fcmp,user); + return cfunctions::qsortex(static_cast(base),nelem,width,fcmp,user); } void *WINAPI apiBsearch(const void *key, const void *base, size_t nelem, size_t width, cfunctions::comparer fcmp, void *user) noexcept @@ -422,7 +421,7 @@ intptr_t WINAPI apiAdvControl(const GUID* PluginId, ADVANCED_CONTROL_COMMANDS Co } if (ACTL_GETWINDOWTYPE==Command) { - WindowType* info=(WindowType*)Param2; + const auto info = static_cast(Param2); if (CheckStructSize(info)) { WINDOWINFO_TYPE type=WindowTypeToPluginWindowType(Manager::GetCurrentWindowType()); @@ -471,7 +470,7 @@ intptr_t WINAPI apiAdvControl(const GUID* PluginId, ADVANCED_CONTROL_COMMANDS Co { case ACTL_GETFARMANAGERVERSION: if (Param2) - *(VersionInfo*)Param2=FAR_VERSION; + *static_cast(Param2) = FAR_VERSION; return TRUE; @@ -482,7 +481,7 @@ intptr_t WINAPI apiAdvControl(const GUID* PluginId, ADVANCED_CONTROL_COMMANDS Co возвращает 0; */ case ACTL_WAITKEY: - WaitKey(Param2?InputRecordToKey((const INPUT_RECORD*)Param2):-1,0,false); + WaitKey(Param2? InputRecordToKey(static_cast(Param2)) : -1, 0, false); return 0; /* $ 04.12.2000 SVS @@ -522,7 +521,7 @@ intptr_t WINAPI apiAdvControl(const GUID* PluginId, ADVANCED_CONTROL_COMMANDS Co */ case ACTL_SETARRAYCOLOR: { - FarSetColors *Pal=(FarSetColors*)Param2; + const auto Pal = static_cast(Param2); if (CheckStructSize(Pal)) { @@ -550,8 +549,13 @@ intptr_t WINAPI apiAdvControl(const GUID* PluginId, ADVANCED_CONTROL_COMMANDS Co */ case ACTL_EJECTMEDIA: { - return CheckStructSize((ActlEjectMedia*)Param2)?EjectVolume((wchar_t)((ActlEjectMedia*)Param2)->Letter, - ((ActlEjectMedia*)Param2)->Flags):FALSE; + const auto Aem = static_cast(Param2); + + if (!CheckStructSize(Aem)) + return FALSE; + + return EjectVolume(static_cast(Aem->Letter), Aem->Flags); + /* if(Param) { @@ -585,7 +589,7 @@ intptr_t WINAPI apiAdvControl(const GUID* PluginId, ADVANCED_CONTROL_COMMANDS Co новые ACTL_ для работы с окнами */ case ACTL_GETWINDOWINFO: { - WindowInfo *wi=(WindowInfo*)Param2; + const auto wi = static_cast(Param2); if (CheckStructSize(wi)) { string strType, strName; @@ -651,10 +655,10 @@ intptr_t WINAPI apiAdvControl(const GUID* PluginId, ADVANCED_CONTROL_COMMANDS Co break; case WTYPE_VMENU: case WTYPE_DIALOG: - wi->Id=(intptr_t)f.get(); // BUGBUG + wi->Id=reinterpret_cast(f.get()); // BUGBUG break; case WTYPE_COMBOBOX: - wi->Id=(intptr_t)std::static_pointer_cast(f)->GetDialog().get(); // BUGBUG + wi->Id=reinterpret_cast(std::static_pointer_cast(f)->GetDialog().get()); // BUGBUG break; default: wi->Id=0; @@ -690,7 +694,7 @@ intptr_t WINAPI apiAdvControl(const GUID* PluginId, ADVANCED_CONTROL_COMMANDS Co return TRUE; case ACTL_GETFARHWND: - return (intptr_t)Console().GetWindow(); + return reinterpret_cast(Console().GetWindow()); case ACTL_REDRAWALL: { @@ -1014,7 +1018,7 @@ HANDLE WINAPI apiDialogInit(const GUID* PluginId, const GUID* Id, intptr_t X1, i return std::make_shared(private_tag(), Src, DlgProc, InitParam); } - intptr_t Proc(Dialog* hDlg, intptr_t Msg, intptr_t Param1, void* Param2) + intptr_t Proc(Dialog* hDlg, intptr_t Msg, intptr_t Param1, void* Param2) const { return m_Proc(hDlg, Msg, Param1, Param2); } @@ -1353,7 +1357,7 @@ intptr_t WINAPI apiPanelControl(HANDLE hPlugin,FILE_CONTROL_COMMANDS Command,int const auto& Str = CmdLine->GetString(); if (Param1&&Param2) { - xwcsncpy((wchar_t*)Param2, Str.data(), Param1); + xwcsncpy(static_cast(Param2), Str.data(), Param1); } return Str.size() + 1; @@ -1365,9 +1369,9 @@ intptr_t WINAPI apiPanelControl(HANDLE hPlugin,FILE_CONTROL_COMMANDS Command,int { SCOPED_ACTION(SetAutocomplete)(CmdLine); if (Command==FCTL_SETCMDLINE) - CmdLine->SetString((const wchar_t*)Param2, true); + CmdLine->SetString(static_cast(Param2), true); else - CmdLine->InsertString((const wchar_t*)Param2); + CmdLine->InsertString(static_cast(Param2)); } CmdLine->Redraw(); return TRUE; @@ -1384,7 +1388,7 @@ intptr_t WINAPI apiPanelControl(HANDLE hPlugin,FILE_CONTROL_COMMANDS Command,int { if (Param2) { - *(int *)Param2=CmdLine->GetCurPos(); + *static_cast(Param2) = CmdLine->GetCurPos(); return TRUE; } @@ -1393,7 +1397,7 @@ intptr_t WINAPI apiPanelControl(HANDLE hPlugin,FILE_CONTROL_COMMANDS Command,int case FCTL_GETCMDLINESELECTION: { - CmdLineSelect *sel=(CmdLineSelect*)Param2; + const auto sel = static_cast(Param2); if (CheckStructSize(sel)) { CmdLine->GetSelection(sel->SelStart,sel->SelEnd); @@ -1405,7 +1409,7 @@ intptr_t WINAPI apiPanelControl(HANDLE hPlugin,FILE_CONTROL_COMMANDS Command,int case FCTL_SETCMDLINESELECTION: { - CmdLineSelect *sel=(CmdLineSelect*)Param2; + const auto sel=static_cast(Param2); if (CheckStructSize(sel)) { CmdLine->Select(sel->SelStart,sel->SelEnd); @@ -1480,7 +1484,7 @@ void WINAPI apiRestoreScreen(HANDLE hScreen) noexcept Global->ScrBuf->FillBuf(); if (hScreen) - delete(SaveScreen *)hScreen; + delete static_cast(hScreen); } catch (...) { @@ -2367,7 +2371,7 @@ intptr_t WINAPI apiMacroControl(const GUID* PluginId, FAR_MACRO_CONTROL_COMMANDS // Param1=0, Param2 - FarMacroLoad* case MCTL_LOADALL: // из реестра в память ФАР с затиранием предыдущего { - FarMacroLoad *Data = (FarMacroLoad*)Param2; + const auto Data = static_cast(Param2); return !Macro.IsRecording() && (!Data || CheckStructSize(Data)) && @@ -2383,7 +2387,7 @@ intptr_t WINAPI apiMacroControl(const GUID* PluginId, FAR_MACRO_CONTROL_COMMANDS // Param1=FARMACROSENDSTRINGCOMMAND, Param2 - MacroSendMacroText* case MCTL_SENDSTRING: { - MacroSendMacroText *Data = (MacroSendMacroText*)Param2; + const auto Data = static_cast(Param2); if (CheckStructSize(Data) && Data->SequenceText) { if (Param1 == MSSC_POST) @@ -2401,7 +2405,7 @@ intptr_t WINAPI apiMacroControl(const GUID* PluginId, FAR_MACRO_CONTROL_COMMANDS // Param1=0, Param2 - MacroExecuteString* case MCTL_EXECSTRING: { - MacroExecuteString *Data = (MacroExecuteString*)Param2; + const auto Data = static_cast(Param2); return CheckStructSize(Data) && Macro.ExecuteString(Data) ? 1 : 0; } @@ -2419,7 +2423,7 @@ intptr_t WINAPI apiMacroControl(const GUID* PluginId, FAR_MACRO_CONTROL_COMMANDS case MCTL_ADDMACRO: { - MacroAddMacro *Data = (MacroAddMacro*)Param2; + const auto Data = static_cast(Param2); if (CheckStructSize(Data) && Data->SequenceText && *Data->SequenceText) { return Macro.AddMacro(*PluginId, Data) ? 1 : 0; @@ -2441,18 +2445,18 @@ intptr_t WINAPI apiMacroControl(const GUID* PluginId, FAR_MACRO_CONTROL_COMMANDS Macro.GetMacroParseError(&ErrCode, &ErrPos, &ErrSrc); - int Size = aligned_sizeof::value; + int Size = aligned_sizeof(); size_t stringOffset = Size; Size += static_cast((ErrSrc.size() + 1)*sizeof(wchar_t)); - MacroParseResult *Result = (MacroParseResult *)Param2; + const auto Result = static_cast(Param2); if (Param1 >= Size && CheckStructSize(Result)) { Result->StructSize = sizeof(MacroParseResult); Result->ErrCode = ErrCode; Result->ErrPos = ErrPos; - Result->ErrSrc = (const wchar_t *)((char*)Param2 + stringOffset); + Result->ErrSrc = reinterpret_cast(static_cast(Param2) + stringOffset); std::copy_n(ErrSrc.data(), ErrSrc.size() + 1, const_cast(Result->ErrSrc)); } @@ -2561,7 +2565,7 @@ intptr_t WINAPI apiFileFilterControl(HANDLE hHandle, FAR_FILE_FILTER_CONTROL_COM if (!hHandle || hHandle == INVALID_HANDLE_VALUE) return FALSE; - Filter = (FileFilter *)hHandle; + Filter = static_cast(hHandle); } switch (Command) @@ -2571,7 +2575,7 @@ intptr_t WINAPI apiFileFilterControl(HANDLE hHandle, FAR_FILE_FILTER_CONTROL_COM if (!Param2) break; - *((HANDLE *)Param2) = INVALID_HANDLE_VALUE; + *static_cast(Param2) = INVALID_HANDLE_VALUE; if (hHandle != nullptr && hHandle != PANEL_ACTIVE && hHandle != PANEL_PASSIVE && hHandle != PANEL_NONE) break; @@ -2589,8 +2593,8 @@ intptr_t WINAPI apiFileFilterControl(HANDLE hHandle, FAR_FILE_FILTER_CONTROL_COM return FALSE; } - Filter = new FileFilter(GetHostPanel(hHandle), (FAR_FILE_FILTER_TYPE)Param1); - *((HANDLE *)Param2) = (HANDLE)Filter; + Filter = new FileFilter(GetHostPanel(hHandle), static_cast(Param1)); + *static_cast(Param2) = Filter; return TRUE; } @@ -2630,16 +2634,16 @@ intptr_t WINAPI apiRegExpControl(HANDLE hHandle, FAR_REGEXP_CONTROL_COMMANDS Com if (!hHandle || hHandle == INVALID_HANDLE_VALUE) return FALSE; - re = (RegExp*)hHandle; + re = static_cast(hHandle); } switch (Command) { case RECTL_CREATE: - *((HANDLE*)Param2) = INVALID_HANDLE_VALUE; + *static_cast(Param2) = INVALID_HANDLE_VALUE; re = new RegExp; - *((HANDLE*)Param2) = (HANDLE)re; + *static_cast(Param2) = static_cast(re); return TRUE; case RECTL_FREE: @@ -2647,20 +2651,20 @@ intptr_t WINAPI apiRegExpControl(HANDLE hHandle, FAR_REGEXP_CONTROL_COMMANDS Com return TRUE; case RECTL_COMPILE: - return re->Compile((const wchar_t*)Param2, OP_PERLSTYLE); + return re->Compile(static_cast(Param2), OP_PERLSTYLE); case RECTL_OPTIMIZE: return re->Optimize(); case RECTL_MATCHEX: { - RegExpSearch* data = (RegExpSearch*)Param2; + const auto data = static_cast(Param2); return re->MatchEx(data->Text, data->Text + data->Position, data->Text + data->Length, data->Match, data->Count); } case RECTL_SEARCHEX: { - RegExpSearch* data = (RegExpSearch*)Param2; + const auto data = static_cast(Param2); return re->SearchEx(data->Text, data->Text + data->Position, data->Text + data->Length, data->Match, data->Count); } @@ -2690,14 +2694,14 @@ intptr_t WINAPI apiSettingsControl(HANDLE hHandle, FAR_SETTINGS_CONTROL_COMMANDS if (!hHandle || hHandle == INVALID_HANDLE_VALUE) return FALSE; - settings = (AbstractSettings*)hHandle; + settings = static_cast(hHandle); } switch (Command) { case SCTL_CREATE: { - FarSettingsCreate* data = (FarSettingsCreate*)Param2; + const auto data = static_cast(Param2); if (CheckStructSize(data)) { if (data->Guid == FarGuid) @@ -2726,20 +2730,20 @@ intptr_t WINAPI apiSettingsControl(HANDLE hHandle, FAR_SETTINGS_CONTROL_COMMANDS return TRUE; case SCTL_SET: - return CheckStructSize((const FarSettingsItem*)Param2) ? settings->Set(*(const FarSettingsItem*)Param2) : FALSE; + return CheckStructSize(static_cast(Param2))? settings->Set(*static_cast(Param2)) : FALSE; case SCTL_GET: - return CheckStructSize((const FarSettingsItem*)Param2) ? settings->Get(*(FarSettingsItem*)Param2) : FALSE; + return CheckStructSize(static_cast(Param2))? settings->Get(*static_cast(Param2)) : FALSE; case SCTL_ENUM: - return CheckStructSize((FarSettingsEnum*)Param2) ? settings->Enum(*(FarSettingsEnum*)Param2) : FALSE; + return CheckStructSize(static_cast(Param2))? settings->Enum(*static_cast(Param2)) : FALSE; case SCTL_DELETE: - return CheckStructSize((const FarSettingsValue*)Param2) ? settings->Delete(*(const FarSettingsValue*)Param2) : FALSE; + return CheckStructSize(static_cast(Param2))? settings->Delete(*static_cast(Param2)) : FALSE; case SCTL_CREATESUBKEY: case SCTL_OPENSUBKEY: - return CheckStructSize((const FarSettingsValue*)Param2) ? settings->SubKey(*(const FarSettingsValue*)Param2, Command == SCTL_CREATESUBKEY) : 0; + return CheckStructSize(static_cast(Param2))? settings->SubKey(*static_cast(Param2), Command == SCTL_CREATESUBKEY) : 0; } return FALSE; } diff --git a/far/scantree.cpp b/far/scantree.cpp index 3f556c1bed..6734d81130 100644 --- a/far/scantree.cpp +++ b/far/scantree.cpp @@ -117,7 +117,7 @@ bool ScanTree::GetNextName(os::FAR_FIND_DATA& fdata,string &strFullName) { if (!LastItem.Find) { - LastItem.Find = std::make_unique(std::move(os::fs::enum_files(strFindPath))); + LastItem.Find = std::make_unique(os::fs::enum_files(strFindPath)); LastItem.Iterator = LastItem.Find->end(); } diff --git a/far/vbuild.m4 b/far/vbuild.m4 index 68f3c9ff17..af0a0efd90 100644 --- a/far/vbuild.m4 +++ b/far/vbuild.m4 @@ -1 +1 @@ -m4_define(BUILD,4908)m4_dnl +m4_define(BUILD,4909)m4_dnl diff --git a/far/vmenu.cpp b/far/vmenu.cpp index 2a4cc346f4..594c96a2a5 100644 --- a/far/vmenu.cpp +++ b/far/vmenu.cpp @@ -2320,7 +2320,8 @@ void VMenu::ShowMenu(bool IsParent) SetColor(Colors[VMenuColorText]); // сделаем добавочку для NO_BOX - Text(string(m_X2 - m_X1 + (m_BoxType == NO_BOX? + 1 : - 1), L' ')); + const auto Size = m_X2 - m_X1 + (m_BoxType == NO_BOX ? +1 : -1); + Text(string(Size, L' ')); } }