KiCad PCB EDA Suite
Loading...
Searching...
No Matches
gestfich.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2009-2014 Jerry Jacobs
5 * Copyright The KiCad Developers, see AUTHORS.TXT for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21#pragma once
22
23#include <map>
24#include <filesystem>
25#include <functional>
26#include <memory>
27#include <string>
28#include <unordered_set>
29#include <kicommon.h>
30#include <wx/arrstr.h>
31#include <wx/dir.h>
32#include <wx/filename.h>
33#include <wx/process.h>
34#include <wx/zipstrm.h>
35
36
40#define UNIX_STRING_DIR_SEP wxT( "/" )
41#define WIN_STRING_DIR_SEP wxT( "\\" )
42
43/* Forward class declarations. */
44class EDA_LIST_DIALOG;
45class wxFFile;
46class wxOutputStream;
47
48
50{
53};
54
56KICOMMON_API std::filesystem::path ToFsPath( const wxString& aPath );
57
58KICOMMON_API wxString FromFsPath( const std::filesystem::path& aPath );
59
62{
63public:
64 SCOPED_TEMP_PATH() = default;
68
70 bool MakeFile( const wxString& aPrefix );
71
73 bool MakeDirectory( const wxString& aPrefix );
74
75 const wxString& Path() const { return m_path; }
76
77private:
78 wxString m_path;
79};
80
81using ARCHIVE_STREAM_FACTORY = std::function<std::unique_ptr<wxOutputStream>( wxFFile& )>;
82
84KICOMMON_API bool WriteDirectoryArchive( const wxString& aSourceDir, wxOutputStream& aOut,
85 ARCHIVE_FORMAT aFormat, const wxString& aTopDir );
86
88KICOMMON_API bool WriteDirectoryArchive( const wxString& aSourceDir, const wxString& aArchive,
89 ARCHIVE_FORMAT aFormat, const wxString& aTopDir,
90 wxString* aError = nullptr,
91 const ARCHIVE_STREAM_FACTORY& aOpen = {} );
92
93
101KICOMMON_API bool OpenPDF( const wxString& file );
102
108KICOMMON_API void KiCopyFile( const wxString& aSrcPath, const wxString& aDestPath,
109 wxString& aErrors );
110
118KICOMMON_API void CopySexprFile( const wxString& aSrcPath, const wxString& aDestPath,
119 std::function<bool( const std::string& token, wxString& value )> aCallback,
120 wxString& aErrors );
121
132KICOMMON_API int ExecuteFile( const wxString& aEditorName,
133 const wxString& aFileName = wxEmptyString,
134 wxProcess* aCallback = nullptr, bool aFileForKicad = true );
135
148KICOMMON_API int ExecuteCommandThroughShell( const wxString& aCommand, wxProcess* aProcess = nullptr );
149
155KICOMMON_API void QuoteString( wxString& string );
156
167KICOMMON_API wxString FindKicadFile( const wxString& shortname );
168
179KICOMMON_API extern wxString QuoteFullPath( wxFileName& fn, wxPathFormat format = wxPATH_NATIVE );
180
181
186KICOMMON_API bool RmDirRecursive( const wxString& aDirName, wxString* aErrors = nullptr );
187
196KICOMMON_API bool CopyDirectory( const wxString& aSourceDir, const wxString& aDestDir,
197 const std::vector<wxString>& aOverwriteExclusions, wxString& aErrors );
198
199KICOMMON_API bool CopyFilesOrDirectory( const wxString& aSourceDir, const wxString& aDestDir, bool aAllowOverwrite,
200 wxString& aErrors, std::vector<wxString>& aPathsWritten );
201
210KICOMMON_API bool AddDirectoryToZip( wxZipOutputStream& aZip, const wxString& aSourceDir, wxString& aErrors,
211 const wxString& aParentDir = "" );
212
229KICOMMON_API void CollectFilesLoopSafe( const wxString& aRoot, wxArrayString& aFiles,
230 const wxString& aFileSpec = wxEmptyString,
231 int aFlags = wxDIR_DEFAULT );
232
244KICOMMON_API void CollectSubdirsLoopSafe( const wxString& aRoot, wxArrayString& aDirs,
245 int aFlags = wxDIR_DIRS );
246
247
248// how a symlink that resolves outside the scan root is treated
250{
251 CONFINE_TO_ROOT, // descend only into targets that stay inside the root subtree
252 BLOCK_ROOT_ESCAPE // descend anywhere except a link resolving to an ancestor of the root
253};
254
255
256// bounds a hand-rolled recursive dir walk against symlink cycles and root escapes
257// query ShouldDescend before recursing real dirs keyed by name links canonicalized
259{
260public:
261 explicit DIR_LOOP_GUARD( const wxString& aRoot,
263
264 // false when the root itself would not resolve caller must not walk
265 bool IsRooted() const { return !m_root.empty(); }
266
267 bool ShouldDescend( const wxString& aDir );
268
269private:
270 std::filesystem::path m_root;
272 std::unordered_set<std::string> m_visited;
273};
DIR_LOOP_POLICY m_policy
Definition gestfich.h:271
std::unordered_set< std::string > m_visited
Definition gestfich.h:272
bool IsRooted() const
Definition gestfich.h:265
DIR_LOOP_GUARD(const wxString &aRoot, DIR_LOOP_POLICY aPolicy=DIR_LOOP_POLICY::CONFINE_TO_ROOT)
std::filesystem::path m_root
Definition gestfich.h:270
A dialog which shows:
SCOPED_TEMP_PATH(const SCOPED_TEMP_PATH &)=delete
bool MakeFile(const wxString &aPrefix)
Create an empty file with a unique name after aPrefix.
Definition gestfich.cpp:939
bool MakeDirectory(const wxString &aPrefix)
Create an empty directory with a unique name after aPrefix.
Definition gestfich.cpp:946
SCOPED_TEMP_PATH & operator=(const SCOPED_TEMP_PATH &)=delete
SCOPED_TEMP_PATH()=default
wxString m_path
Definition gestfich.h:78
const wxString & Path() const
Definition gestfich.h:75
KICOMMON_API bool CopyFilesOrDirectory(const wxString &aSourceDir, const wxString &aDestDir, bool aAllowOverwrite, wxString &aErrors, std::vector< wxString > &aPathsWritten)
Definition gestfich.cpp:546
KICOMMON_API wxString QuoteFullPath(wxFileName &fn, wxPathFormat format=wxPATH_NATIVE)
Quote return value of wxFileName::GetFullPath().
Definition gestfich.cpp:438
KICOMMON_API bool WriteDirectoryArchive(const wxString &aSourceDir, wxOutputStream &aOut, ARCHIVE_FORMAT aFormat, const wxString &aTopDir)
Write directory entries in sorted archive path order, using the archive root when aTopDir is empty.
Definition gestfich.cpp:793
KICOMMON_API bool CopyDirectory(const wxString &aSourceDir, const wxString &aDestDir, const std::vector< wxString > &aOverwriteExclusions, wxString &aErrors)
Copy a directory and its contents to another directory.
Definition gestfich.cpp:492
KICOMMON_API void KiCopyFile(const wxString &aSrcPath, const wxString &aDestPath, wxString &aErrors)
Definition gestfich.cpp:348
KICOMMON_API int ExecuteCommandThroughShell(const wxString &aCommand, wxProcess *aProcess=nullptr)
Run a user-supplied command line through the platform shell so glob expansion, pipes,...
Definition gestfich.cpp:277
KICOMMON_API bool OpenPDF(const wxString &file)
Run the PDF viewer and display a PDF file.
Definition gestfich.cpp:312
KICOMMON_API void QuoteString(wxString &string)
Add un " to the start and the end of string (if not already done).
Definition gestfich.cpp:57
KICOMMON_API wxString FindKicadFile(const wxString &shortname)
Search the executable file shortname in KiCad binary path and return full file name if found or short...
Definition gestfich.cpp:67
KICOMMON_API void CollectSubdirsLoopSafe(const wxString &aRoot, wxArrayString &aDirs, int aFlags=wxDIR_DIRS)
Recursively collect every subdirectory under aRoot using the same loop detection as CollectFilesLoopS...
KICOMMON_API void CollectFilesLoopSafe(const wxString &aRoot, wxArrayString &aFiles, const wxString &aFileSpec=wxEmptyString, int aFlags=wxDIR_DEFAULT)
Recursively collect every file under aRoot, deduplicating subdirectories by their resolved path.
ARCHIVE_FORMAT
Definition gestfich.h:50
std::function< std::unique_ptr< wxOutputStream >(wxFFile &)> ARCHIVE_STREAM_FACTORY
Definition gestfich.h:81
KICOMMON_API wxString FromFsPath(const std::filesystem::path &aPath)
Definition gestfich.cpp:919
KICOMMON_API bool RmDirRecursive(const wxString &aDirName, wxString *aErrors=nullptr)
Remove the directory aDirName and all its contents including subdirectories and their files.
Definition gestfich.cpp:444
KICOMMON_API void CopySexprFile(const wxString &aSrcPath, const wxString &aDestPath, std::function< bool(const std::string &token, wxString &value)> aCallback, wxString &aErrors)
Definition gestfich.cpp:375
KICOMMON_API int ExecuteFile(const wxString &aEditorName, const wxString &aFileName=wxEmptyString, wxProcess *aCallback=nullptr, bool aFileForKicad=true)
Call the executable file aEditorName with the parameter aFileName.
Definition gestfich.cpp:166
KICOMMON_API std::filesystem::path ToFsPath(const wxString &aPath)
Give aPath to std::filesystem without a detour through the C locale.
Definition gestfich.cpp:909
DIR_LOOP_POLICY
Definition gestfich.h:250
KICOMMON_API bool AddDirectoryToZip(wxZipOutputStream &aZip, const wxString &aSourceDir, wxString &aErrors, const wxString &aParentDir="")
Add a directory and its contents to a zip file.
Definition gestfich.cpp:669
#define KICOMMON_API
Definition kicommon.h:27