legatt 32f4597c4d Base frontend module
- Naming style migrated to camel-case
- P7lib logger sources added
- Vcpkg manifest, CMake presets and build moved to root
- SDL2, Vulkan and RmlUi dependencies added
- Logger LOG macro added
- Logger  configuration
- SDL2 window configuration
- Vulkan configuration
- RmlUi configuration
- SDL event loop
2025-08-08 00:07:32 +03:00

363 lines
10 KiB
C++

////////////////////////////////////////////////////////////////////////////////
// /
// 2012-2020 (c) Baical /
// /
// This library is free software; you can redistribute it and/or /
// modify it under the terms of the GNU Lesser General Public /
// License as published by the Free Software Foundation; either /
// version 3.0 of the License, or (at your option) any later version. /
// /
// This library is distributed in the hope that it will be useful, /
// but WITHOUT ANY WARRANTY; without even the implied warranty of /
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /
// Lesser General Public License for more details. /
// /
// You should have received a copy of the GNU Lesser General Public /
// License along with this library. /
// /
////////////////////////////////////////////////////////////////////////////////
#ifndef PFILESYSTEM_H
#define PFILESYSTEM_H
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <fnmatch.h>
#include <pwd.h>
class CFSYS
{
public:
////////////////////////////////////////////////////////////////////////////
//Directory_Exists
static tBOOL Directory_Exists(const tACHAR *i_pPath)
{
struct stat l_sStat;
l_sStat.st_mode = 0;
if (0 == stat(i_pPath, &l_sStat))
{
if (0 != (l_sStat.st_mode & S_IFDIR))
{
return TRUE;
}
}
return FALSE;
}//Directory_Exists
////////////////////////////////////////////////////////////////////////////
//Directory_Create
static tBOOL Directory_Create(const tACHAR *i_pDir)
{
if (NULL == i_pDir)
{
return FALSE;
}
char *l_pDir = (char *)malloc(strlen(i_pDir) + 1);
char *l_pIter = l_pDir;
if (NULL == l_pDir)
{
return FALSE;
}
strcpy(l_pDir, i_pDir);
while (*l_pIter)
{
if ('/' == (*l_pIter))
{
*l_pIter = 0;
if ( (FALSE == CFSYS::Directory_Exists(l_pDir))
&& (l_pIter != l_pDir)
)
{
mkdir(l_pDir, S_IRWXU | S_IRWXG | S_IROTH);
}
*l_pIter = '/';
}
l_pIter++;
}
free(l_pDir);
l_pDir = NULL;
mkdir(i_pDir, S_IRWXU | S_IRWXG | S_IROTH);
return Directory_Exists((tACHAR*)i_pDir);
}//Directory_Create
////////////////////////////////////////////////////////////////////////////
//Directory_Delete
static tBOOL Directory_Delete(const tACHAR *i_pDir)
{
if (NULL == i_pDir)
{
return FALSE;
}
return (0 == rmdir(i_pDir));
}//Directory_Delete
////////////////////////////////////////////////////////////////////////////
//File_Exists
static tBOOL File_Exists(const tACHAR * i_pFileName)
{
struct stat l_sStat;
l_sStat.st_mode = 0;
if (0 == stat(i_pFileName, &l_sStat))
{
if (0 != (l_sStat.st_mode & S_IFREG))
{
return TRUE;
}
}
return FALSE;
}//File_Exists
////////////////////////////////////////////////////////////////////////////
// Enumerate_Files
static void Enumerate_Files(CBList<CWString*> *i_pDll_List,
CWString *i_pDirectory,
const char *i_pMask, //for example L"*.so"
tUINT32 i_dwDepth = 0xFFFFFFul
)
{
tUINT32 l_dwLength = i_pDirectory->Length();
if ( (NULL == i_pDll_List)
|| (NULL == i_pDirectory)
|| (NULL == i_pMask)
)
{
return;
}
DIR *l_pDir = opendir(i_pDirectory->Get());
dirent *l_pDir_Entry = 0;
if (!l_pDir)
{
return;
}
while ((l_pDir_Entry = readdir(l_pDir)) != 0)
{
if (DT_REG == l_pDir_Entry->d_type)
{
if (0 == fnmatch(i_pMask, l_pDir_Entry->d_name, FNM_NOESCAPE | FNM_CASEFOLD))
{
CWString *i_pFile = new CWString();
if (i_pFile)
{
i_pFile->Set(i_pDirectory->Get());
i_pFile->Append(2, L"/", l_pDir_Entry->d_name);
i_pDll_List->Add_After(i_pDll_List->Get_Last(), i_pFile);
}
}
}
else if ( (DT_DIR == l_pDir_Entry->d_type)
&& (0 != PStrCmp(l_pDir_Entry->d_name, "."))
&& (0 != PStrCmp(l_pDir_Entry->d_name, ".."))
&& (i_dwDepth)
)
{
i_pDirectory->Append(2, L"/", l_pDir_Entry->d_name);
Enumerate_Files(i_pDll_List, i_pDirectory, i_pMask, i_dwDepth - 1);
i_pDirectory->Trim(l_dwLength);
}
}
closedir(l_pDir);
l_pDir = 0;
}// Enumerate_Files
////////////////////////////////////////////////////////////////////////////
// Enumerate_Dirs
static void Enumerate_Dirs(CBList<CWString*> *io_pList, const tXCHAR *i_pRoot)
{
if (NULL == io_pList)
{
return;
}
if (!i_pRoot)
{
i_pRoot = "/";
}
DIR *l_pDir = opendir(i_pRoot);
dirent *l_pDir_Entry = 0;
if (!l_pDir)
{
return;
}
while ((l_pDir_Entry = readdir(l_pDir)) != 0)
{
if ( (DT_DIR == l_pDir_Entry->d_type)
&& (0 != PStrCmp(l_pDir_Entry->d_name, "."))
&& (0 != PStrCmp(l_pDir_Entry->d_name, ".."))
)
{
CWString *i_pFile = new CWString();
if (i_pFile)
{
i_pFile->Set(i_pRoot);
i_pFile->Append(2, "/", l_pDir_Entry->d_name);
io_pList->Add_After(io_pList->Get_Last(), i_pFile);
}
}
}
closedir(l_pDir);
l_pDir = 0;
}// Enumerate_Dirs
////////////////////////////////////////////////////////////////////////////
//Get_File_Size
static tUINT64 Get_File_Size(const tACHAR *i_pFile)
{
struct stat l_sStat;
l_sStat.st_size = 0;
if (0 == stat(i_pFile, &l_sStat))
{
return (tUINT64)l_sStat.st_size;
}
return 0;
}//Get_File_Size
////////////////////////////////////////////////////////////////////////////
//Get_Version
static tUINT64 Get_Version(const char *i_pFile)
{
UNUSED_ARG(i_pFile);
return 0ull;
}//Get_Version
// ////////////////////////////////////////////////////////////////////////////
// //Get_Process_Directory
// static BOOL Get_Process_Directory(CWString *o_pDirectory)
// {
// BOOL l_bReturn = FALSE;
// DWORD l_dwLength = 4096;
// if ( (NULL == o_pDirectory)
// || (FALSE == o_pDirectory->Realloc(l_dwLength))
// )
// {
// return l_bReturn;
// }
// if (0 != GetModuleFileNameW(GetModuleHandleW(NULL),
// o_pDirectory->Get(),
// o_pDirectory->Max_Length())
// )
// {
// wchar_t *l_pExe_Name = NULL;
// if ( (l_pExe_Name = wcsrchr(o_pDirectory->Get(), L'\\'))
// || (l_pExe_Name = wcsrchr(o_pDirectory->Get(), L'/'))
// )
// {
// o_pDirectory->Trim((DWORD)(l_pExe_Name - o_pDirectory->Get()));
// l_bReturn = TRUE;
// }
// }
// return l_bReturn;
// }//Get_Process_Directory
////////////////////////////////////////////////////////////////////////////
//Delete_File
static tBOOL Delete_File(const char *i_pFile_Name)
{
if (NULL == i_pFile_Name)
{
return FALSE;
}
return (0 == remove(i_pFile_Name));
}//Delete_File
////////////////////////////////////////////////////////////////////////////
//GetUserDirectory
static tBOOL GetUserDirectory(CWString *o_pPath)
{
if ( (NULL == o_pPath)
|| (FALSE == o_pPath->Realloc(4096))
)
{
return TRUE;
}
struct passwd *pw = getpwuid(getuid());
if (!pw)
{
return FALSE;
}
o_pPath->Set(pw->pw_dir);
return TRUE;
}
////////////////////////////////////////////////////////////////////////////
//GetUserDirectory
static tBOOL GetDirectoryParent(CWString &i_rChild, CWString &o_rParent)
{
o_rParent.Set(i_rChild.Get());
size_t l_szDir = o_rParent.Length();
tXCHAR *l_pDir = o_rParent.Get();
//cut trailing '/' or '\'
while ( (l_szDir > 1)
&& (TM('/') == l_pDir[l_szDir - 1])
)
{
l_pDir[--l_szDir] = 0;
}
tXCHAR *l_pTemp = strrchr(l_pDir, TM('/'));
if (!l_pTemp)
{
o_rParent.Set(TM(""));
return TRUE;
}
l_pTemp++;
*l_pTemp = 0;
l_pTemp--;
//removing duplicates of '/'
while ( (TM('/') == *l_pTemp)
&& (l_pTemp > l_pDir)
)
{
*l_pTemp = 0;
l_pTemp--;
}
return (*l_pDir) ? TRUE : FALSE;
}
};
#endif //PFILESYSTEM_H