CMCore/src/SystemInfo.cpp
2020-01-23 21:01:08 +08:00

137 lines
4.4 KiB
C++

#include<hgl/platform/SystemInfo.h>
#include<hgl/log/LogInfo.h>
#include<hgl/PlugIn.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/Info.h>
namespace hgl
{
using namespace filesystem;
MemInfo::MemInfo()
{
memset(this,0,sizeof(MemInfo));
}
SystemInfo::SystemInfo()
{
memset(os_name,0,sizeof(os_name));
}
bool GetSystemPath(OSString &);
void GetOSPath(SystemPath &cp);
bool CheckEnginePath(OSString &cur_path,
const OSString &work,
const OSString &start,
const OSString &cm,
const OSString &sub)
{
cur_path=MergeFilename(work,sub);
if(IsDirectory(cur_path))
return(true);
if(work!=start)
{
cur_path=MergeFilename(start,sub);
if(IsDirectory(cur_path))
return(true);
}
if(work!=cm)
{
cur_path=MergeFilename(cm,sub);
if(IsDirectory(cur_path))
return(true);
}
OSString out_str=OS_TEXT("Don't find <")+sub+OS_TEXT("> folder from : \"")+work+OS_TEXT("\"");
if(work!=start) out_str+=(OS_TEXT(",\"")+start +OS_TEXT("\""));
if(work!=cm) out_str+=(OS_TEXT(",\"")+cm +OS_TEXT("\""));
LOG_INFO(out_str);
return(false);
}
void GetSystemPath(SystemPath &cp)
{
OSString cur_prog;
OSString cur_path;
hgl::GetCurrentPath(cp.start);
if(!GetSystemPath(cp.cm))
cp.cm=cp.start; //如果没有找到CMGDK系统变量
hgl::GetCurrentProgram(cur_prog);
cur_path=cur_prog;
const int end_index=cur_path.FindRightChar(HGL_DIRECTORY_SEPARATOR);
cur_path.ClipLeft(end_index);
CheckEnginePath(cp.gui, cp.start,cur_path,cp.cm,OS_TEXT("gui"));
CheckEnginePath(cp.plug_ins, cp.start,cur_path,cp.cm,OS_TEXT("plug-in") + OSString(HGL_DIRECTORY_SEPARATOR_STR) + HGL_PLATFORM_STRING); //HGL_PLATFORM_STRING在CMAKE中定义
GetOSPath(cp);
hgl::info::SetString(hfsCMGDKPath, cp.engine );
hgl::info::SetString(hfsPlugInPath, cp.plug_ins );
hgl::info::SetString(hfsStartPath, cp.start );
hgl::info::SetString(hfsOSPath, cp.os );
hgl::info::SetString(hfsOSLibraryPath, cp.library );
hgl::info::SetString(hfsUserDesktopPath, cp.mydesktop);
hgl::info::SetString(hfsCommonDesktopPath, cp.desktop );
hgl::info::SetString(hfsTempPath, cp.temp );
hgl::info::SetString(hfsUserDataPath, cp.mydata );
hgl::info::SetString(hfsUserProgramPath, cp.myprogram);
hgl::info::SetString(hfsAppFileName, cur_prog );
LOG_INFO( OS_TEXT(" current program: ")+cur_prog +OS_TEXT("\n\n")
OS_TEXT(" program start folder: ")+cp.start +OS_TEXT("\n\n")
OS_TEXT("operator system folder: ")+cp.os +OS_TEXT("\n")
OS_TEXT(" os fonts folder: ")+cp.osfont +OS_TEXT("\n")
OS_TEXT(" common library folder: ")+cp.library +OS_TEXT("\n\n")
OS_TEXT(" common data folder: ")+cp.common_data +OS_TEXT("\n")
OS_TEXT(" local data folder: ")+cp.local_data +OS_TEXT("\n")
OS_TEXT(" user data folder: ")+cp.mydata +OS_TEXT("\n\n")
OS_TEXT(" temp file folder: ")+cp.temp +OS_TEXT("\n")
OS_TEXT(" user menu folder: ")+cp.myprogram +OS_TEXT("\n")
OS_TEXT(" user desktop folder: ")+cp.mydesktop +OS_TEXT("\n")
OS_TEXT(" common desktop folder: ")+cp.desktop +OS_TEXT("\n\n")
OS_TEXT(" Engine folder: ")+cp.engine +OS_TEXT("\n")
OS_TEXT(" Engine Plug-in folder: ")+cp.plug_ins +OS_TEXT("\n"));
}
struct CheckInterface
{
void (*Check)(SystemInfo *);
};
void SystemCheck(SystemInfo *si)
{
PlugIn *pi=LoadPlugIn(OS_TEXT("SystemCheck"));
if(!pi)return;
CheckInterface ci;
pi->GetInterface(2,&ci);
ci.Check(si);
UnloadPlugIn(pi);
}
}//namespace hgl