📄 ptlib.cxx
字号:
if (dir != NULL) {
PDirectory tmpdir(dir);
operator=(tmpdir);
}
else {
PConfig cfg(PConfig::Environment);
PString path = cfg.GetString("TMPDIR");
if (path.IsEmpty()) {
path = cfg.GetString("TMP");
if (path.IsEmpty())
path = cfg.GetString("TEMP");
}
if (path.IsEmpty() || path[path.GetLength()-1] != '\\')
path += '\\';
*this = path;
}
if (prefix != NULL)
*this += prefix;
else
*this += "PW";
*this += "XXXXXX";
PAssert(_mktemp(GetPointer()) != NULL, "Could not make temporary file");
}
void PFilePath::AssignContents(const PContainer & cont)
{
PCaselessString::AssignContents(cont);
PCaselessString::AssignContents(PDirectory::CreateFullPath(*this, FALSE));
}
static PINDEX GetVolumeSubStringLength(const PString & path)
{
if (path[1] == ':')
return 2;
if (path[0] == '\\' && path[1] == '\\') {
PINDEX backslash = path.Find('\\', 2);
if (backslash != P_MAX_INDEX) {
backslash = path.Find('\\', backslash+1);
if (backslash != P_MAX_INDEX)
return backslash;
}
}
PINDEX backslash = path.Find('\\');
if (backslash != P_MAX_INDEX)
return backslash;
return 0;
}
PCaselessString PFilePath::GetVolume() const
{
return Left(GetVolumeSubStringLength(*this));
}
PDirectory PFilePath::GetDirectory() const
{
PINDEX backslash = FindLast('\\');
if (backslash != P_MAX_INDEX)
return Left(backslash+1);
return PCaselessString();
}
PCaselessString PFilePath::GetPath() const
{
return operator()(GetVolumeSubStringLength(*this), FindLast('\\', GetLength()-2));
}
PCaselessString PFilePath::GetFileName() const
{
PINDEX backslash = FindLast('\\', GetLength()-2);
if (backslash == P_MAX_INDEX)
backslash = 0;
else
backslash++;
return Mid(backslash);
}
PCaselessString PFilePath::GetTitle() const
{
PINDEX backslash = FindLast('\\', GetLength()-2);
if (backslash == P_MAX_INDEX)
backslash = 0;
else
backslash++;
return operator()(backslash, FindLast('.')-1);
}
PCaselessString PFilePath::GetType() const
{
PINDEX dot = Find('.', FindLast('\\'));
if (dot == P_MAX_INDEX)
return PCaselessString();
return operator()(dot, P_MAX_INDEX);
}
void PFilePath::SetType(const PCaselessString & type)
{
PINDEX dot = Find('.', FindLast('\\'));
if (dot != P_MAX_INDEX)
Splice(type, dot, GetLength()-dot);
else
*this += type;
}
///////////////////////////////////////////////////////////////////////////////
// PFile
void PFile::SetFilePath(const PString & newName)
{
if (!IsOpen())
path = newName;
}
BOOL PFile::Access(const PFilePath & name, OpenMode mode)
{
int accmode;
switch (mode) {
case ReadOnly :
#ifndef R_OK
#define R_OK 4
#endif
accmode = R_OK;
break;
case WriteOnly :
#ifndef W_OK
#define W_OK 2
#endif
accmode = W_OK;
break;
default :
accmode = R_OK|W_OK;
}
return access(name, accmode) == 0;
}
BOOL PFile::Remove(const PFilePath & name, BOOL force)
{
if (remove(name) == 0)
return TRUE;
if (!force || errno != EACCES)
return FALSE;
if (_chmod(name, _S_IWRITE) != 0)
return FALSE;
return remove(name) == 0;
}
BOOL PFile::Rename(const PFilePath & oldname, const PString & newname, BOOL force)
{
if (newname.FindOneOf(":\\/") != P_MAX_INDEX) {
#ifdef _WIN32_WCE
set_errno(EINVAL);
#else
errno = EINVAL;
#endif // _WIN32_WCE
return FALSE;
}
PString fullname = oldname.GetDirectory() + newname;
if (rename(oldname, fullname) == 0)
return TRUE;
if (!force || errno == ENOENT || !Exists(fullname))
return FALSE;
if (!Remove(fullname, TRUE))
return FALSE;
return rename(oldname, fullname) == 0;
}
BOOL PFile::Move(const PFilePath & oldname, const PFilePath & newname, BOOL force)
{
if (rename(oldname, newname) == 0)
return TRUE;
if (errno == ENOENT)
return FALSE;
if (force && Exists(newname)) {
if (!Remove(newname, TRUE))
return FALSE;
if (rename(oldname, newname) == 0)
return TRUE;
}
return Copy(oldname, newname, force) && Remove(oldname);
}
#ifdef _WIN32_WCE
BOOL PFile::GetInfo(const PFilePath & name, PFileInfo & info)
{
USES_CONVERSION;
PString fn = name;
PINDEX pos = fn.GetLength()-1;
while (PDirectory::IsSeparator(fn[pos]))
pos--;
fn.Delete(pos+1, P_MAX_INDEX);
HANDLE hFile = CreateFile(A2T((const char*)fn),0,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE)
return false;
bool res=false;
BY_HANDLE_FILE_INFORMATION FInfo;
if (GetFileInformationByHandle(hFile,&FInfo))
{
info.created = FileTimeToTime(FInfo.ftCreationTime);
info.modified = FileTimeToTime(FInfo.ftLastWriteTime);
info.accessed = FileTimeToTime(FInfo.ftLastAccessTime);
info.size = (__int64(FInfo.nFileSizeHigh)<<32)+__int64(FInfo.nFileSizeLow);
info.permissions = PFileInfo::UserRead|PFileInfo::GroupRead|PFileInfo::WorldRead;
if (FInfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY==0)
info.permissions |= PFileInfo::UserWrite|PFileInfo::GroupWrite|PFileInfo::WorldWrite;
if (FInfo.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
info.type = PFileInfo::SubDirectory;
info.permissions |= PFileInfo::UserExecute|PFileInfo::GroupExecute|PFileInfo::WorldExecute;
}
else
{
info.type = PFileInfo::RegularFile;
}
info.hidden = (FInfo.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)!=0;
res=true;
}
CloseHandle(hFile);
return res;
}
#else // !_WIN32_WCE
BOOL PFile::GetInfo(const PFilePath & name, PFileInfo & info)
{
if (name.IsEmpty())
return FALSE;
PString fn = name;
PINDEX pos = fn.GetLength()-1;
while (PDirectory::IsSeparator(fn[pos]))
pos--;
fn.Delete(pos+1, P_MAX_INDEX);
struct stat s;
if (stat(fn, &s) != 0)
return FALSE;
info.created = (s.st_ctime < 0) ? 0 : s.st_ctime;
info.modified = (s.st_mtime < 0) ? 0 : s.st_mtime;
info.accessed = (s.st_atime < 0) ? 0 : s.st_atime;
info.size = s.st_size;
info.permissions = 0;
if ((s.st_mode&S_IREAD) != 0)
info.permissions |=
PFileInfo::UserRead|PFileInfo::GroupRead|PFileInfo::WorldRead;
if ((s.st_mode&S_IWRITE) != 0)
info.permissions |=
PFileInfo::UserWrite|PFileInfo::GroupWrite|PFileInfo::WorldWrite;
if ((s.st_mode&S_IEXEC) != 0)
info.permissions |=
PFileInfo::UserExecute|PFileInfo::GroupExecute|PFileInfo::WorldExecute;
switch (s.st_mode & S_IFMT) {
case S_IFREG :
info.type = PFileInfo::RegularFile;
break;
case S_IFDIR :
info.type = PFileInfo::SubDirectory;
break;
default:
info.type = PFileInfo::UnknownFileType;
break;
}
#if defined(_WIN32)
info.hidden = (GetFileAttributes(name) & FILE_ATTRIBUTE_HIDDEN) != 0;
#else
unsigned int attr;
_dos_getfileattr(name, &attr);
info.hidden = (attr & _A_HIDDEN) != 0;
#endif
return TRUE;
}
#endif // _WIN32_WCE
BOOL PFile::SetPermissions(const PFilePath & name, int permissions)
{
return _chmod(name, permissions&(_S_IWRITE|_S_IREAD)) == 0;
}
BOOL PFile::IsTextFile() const
{
return FALSE;
}
BOOL PFile::Open(OpenMode mode, int opts)
{
Close();
clear();
if (path.IsEmpty())
path = PFilePath("PWL", NULL);
int oflags = IsTextFile() ? _O_TEXT : _O_BINARY;
switch (mode) {
case ReadOnly :
oflags |= O_RDONLY;
if (opts == ModeDefault)
opts = MustExist;
break;
case WriteOnly :
oflags |= O_WRONLY;
if (opts == ModeDefault)
opts = Create|Truncate;
break;
case ReadWrite :
oflags |= O_RDWR;
if (opts == ModeDefault)
opts = Create;
break;
default :
PAssertAlways(PInvalidParameter);
}
if ((opts&Create) != 0)
oflags |= O_CREAT;
if ((opts&Exclusive) != 0)
oflags |= O_EXCL;
if ((opts&Truncate) != 0)
oflags |= O_TRUNC;
if ((opts&Temporary) != 0)
removeOnClose = TRUE;
int sflags = _SH_DENYNO;
if ((opts&DenySharedRead) == DenySharedRead)
sflags = _SH_DENYRD;
else if ((opts&DenySharedWrite) == DenySharedWrite)
sflags = _SH_DENYWR;
else if ((opts&(DenySharedRead|DenySharedWrite)) != 0)
sflags = _SH_DENYWR;
return ConvertOSError(os_handle = _sopen(path, oflags, sflags, S_IREAD|S_IWRITE));
}
BOOL PFile::SetLength(off_t len)
{
return ConvertOSError(_chsize(GetHandle(), len));
}
///////////////////////////////////////////////////////////////////////////////
// PTextFile
BOOL PTextFile::IsTextFile() const
{
return TRUE;
}
BOOL PTextFile::ReadLine(PString & str)
{
char * ptr = str.GetPointer(100);
PINDEX len = 0;
int c;
while ((c = ReadChar()) >= 0 && c != '\n') {
*ptr++ = (char)c;
if (++len >= str.GetSize())
ptr = str.GetPointer(len + 100) + len;
}
*ptr = '\0';
PAssert(str.MakeMinimumSize(), POutOfMemory);
return c >= 0 || len > 0;
}
BOOL PTextFile::WriteLine(const PString & str)
{
return WriteString(str) && WriteChar('\n');
}
///////////////////////////////////////////////////////////////////////////////
// PConsoleChannel
PConsoleChannel::PConsoleChannel()
{
}
PConsoleChannel::PConsoleChannel(ConsoleType type)
{
Open(type);
}
BOOL PConsoleChannel::Open(ConsoleType type)
{
switch (type) {
case StandardInput :
os_handle = 0;
return TRUE;
case StandardOutput :
os_handle = 1;
return TRUE;
case StandardError :
os_handle = 2;
return TRUE;
}
return FALSE;
}
PString PConsoleChannel::GetName() const
{
return "\\\\.\\Console";
}
BOOL PConsoleChannel::Read(void * buffer, PINDEX length)
{
flush();
lastReadCount = _read(os_handle, buffer, length);
return ConvertOSError(lastReadCount, LastReadError) && lastReadCount > 0;
}
BOOL PConsoleChannel::Write(const void * buffer, PINDEX length)
{
flush();
lastWriteCount = _write(os_handle, buffer, length);
return ConvertOSError(lastWriteCount, LastWriteError) && lastWriteCount >= length;
}
BOOL PConsoleChannel::Close()
{
os_handle = -1;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// PProcess
void PProcess::Construct()
{
PSetErrorStream(&cerr);
#if !defined(_WIN32) && defined(_MSC_VER) && defined(_WINDOWS)
_wsetscreenbuf(1, _WINBUFINF);
_wsizeinfo ws;
ws._version = _QWINVER;
ws._type = _WINSIZEMAX;
_wsetsize(1, &ws);
#endif
houseKeeper = NULL;
}
//////////////////////////////////////////////////////////////////////////////
#define INCLUDE_STUFF1(cls) \
cls i##cls; \
i##cls = i##cls
#define INCLUDE_STUFF2(cls) \
INCLUDE_STUFF1(cls); \
i##cls.GetPointer(); \
i##cls.Attach(0, 0); \
i##cls.SetAt(0, 0); \
i##cls.GetAt(0); \
i##cls[0]
void PDummyFunctionToMakeSureSymbolsAreInDEFFile()
{
INCLUDE_STUFF2(PCharArray);
INCLUDE_STUFF2(PShortArray);
INCLUDE_STUFF2(PIntArray);
INCLUDE_STUFF2(PLongArray);
INCLUDE_STUFF2(PBYTEArray);
INCLUDE_STUFF2(PWORDArray);
INCLUDE_STUFF2(PUnsignedArray);
INCLUDE_STUFF2(PDWORDArray);
INCLUDE_STUFF1(PStringSet);
INCLUDE_STUFF1(POrdinalToString);
INCLUDE_STUFF1(PStringToOrdinal);
INCLUDE_STUFF1(PStringToString);
}
// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -