ptlib.cxx
来自「pwlib源码库」· CXX 代码 · 共 1,293 行 · 第 1/3 页
CXX
1,293 行
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#if defined(_WIN32)static void TwiddleBits(int newPermissions, int & oldPermissions, int permission, DWORD & mask, DWORD access){ if (newPermissions < 0) { if ((mask&access) == access) oldPermissions |= permission; } else { if ((newPermissions&permission) != 0) mask |= access; else mask &= ~access; }}static int FileSecurityPermissions(const PFilePath & filename, int newPermissions){ // All of the following is to support cygwin style permissions PBYTEArray storage(sizeof(SECURITY_DESCRIPTOR)); SECURITY_DESCRIPTOR * descriptor = (SECURITY_DESCRIPTOR *)storage.GetPointer(); DWORD lengthNeeded = 0; if (!GetFileSecurity(filename, DACL_SECURITY_INFORMATION, descriptor, storage.GetSize(), &lengthNeeded)) { if (GetLastError() != ERROR_INSUFFICIENT_BUFFER || lengthNeeded == 0) return -1; descriptor = (SECURITY_DESCRIPTOR *)storage.GetPointer(lengthNeeded); if (!GetFileSecurity(filename, DACL_SECURITY_INFORMATION, descriptor, storage.GetSize(), &lengthNeeded)) return -1; } BOOL daclPresent, daclDefaulted; PACL dacl; if (!GetSecurityDescriptorDacl(descriptor, &daclPresent, &dacl, &daclDefaulted)) return -1; if (!daclPresent || daclDefaulted || dacl == NULL) return -1; ACL_SIZE_INFORMATION aclSize; if (!GetAclInformation(dacl, &aclSize, sizeof(aclSize), AclSizeInformation)) return -1; int oldPermissions = 0; int cygwinMask = 0; for (DWORD aceIndex = 0; aceIndex< aclSize.AceCount; aceIndex++) { LPVOID acePtr; GetAce(dacl, aceIndex, &acePtr); ACE_HEADER * aceHdr = (ACE_HEADER *)acePtr; if (aceHdr->AceType == ACCESS_ALLOWED_ACE_TYPE) { ACCESS_ALLOWED_ACE * ace = (ACCESS_ALLOWED_ACE *)acePtr; PString account, domain; DWORD accountLen = 1000; DWORD domainLen = 1000; SID_NAME_USE usage; if (LookupAccountSid(NULL, &ace->SidStart, account.GetPointer(1000), &accountLen, domain.GetPointer(1000), &domainLen, &usage)) { if (account *= "None") { cygwinMask |= 2; TwiddleBits(newPermissions, oldPermissions, PFileInfo::WorldRead, ace->Mask, FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA); TwiddleBits(newPermissions, oldPermissions, PFileInfo::WorldWrite, ace->Mask, FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA); TwiddleBits(newPermissions, oldPermissions, PFileInfo::WorldExecute, ace->Mask, FILE_EXECUTE); } else if (account *= "EVERYONE") { cygwinMask |= 1; TwiddleBits(newPermissions, oldPermissions, PFileInfo::GroupRead, ace->Mask, FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA); TwiddleBits(newPermissions, oldPermissions, PFileInfo::GroupWrite, ace->Mask, FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA); TwiddleBits(newPermissions, oldPermissions, PFileInfo::GroupExecute, ace->Mask, FILE_EXECUTE); } else if (account == PProcess::Current().GetUserName()) { cygwinMask |= 4; TwiddleBits(newPermissions, oldPermissions, PFileInfo::UserRead, ace->Mask, FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA); TwiddleBits(newPermissions, oldPermissions, PFileInfo::UserWrite, ace->Mask, FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA); TwiddleBits(newPermissions, oldPermissions, PFileInfo::UserExecute, ace->Mask, FILE_EXECUTE); } } } } // Only do it if have the three ACE entries as per cygwin if (cygwinMask != 7) return -1; if (newPermissions != -1) SetFileSecurity(filename, DACL_SECURITY_INFORMATION, descriptor); return oldPermissions;}#endifBOOL 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;#if defined(_WIN32) info.permissions = FileSecurityPermissions(name, -1); if (info.permissions < 0)#endif { 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_WCEBOOL PFile::SetPermissions(const PFilePath & name, int permissions){#if defined(_WIN32) && !defined(_WIN32_WCE) FileSecurityPermissions(name, permissions);#endif 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; os_handle = _sopen(path, oflags, sflags, S_IREAD|S_IWRITE); // As ConvertOSError tests for < 0 and some return values _sopen may be // negative, only pass -1 through. return ConvertOSError(os_handle == -1 ? -1 : 0);}BOOL PFile::SetLength(off_t len){ return ConvertOSError(_chsize(GetHandle(), len));}///////////////////////////////////////////////////////////////////////////////// PTextFileBOOL 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');}///////////////////////////////////////////////////////////////////////////////// PConsoleChannelPConsoleChannel::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;}///////////////////////////////////////////////////////////////////////////////// PProcessvoid 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;}BOOL PProcess::SetMaxHandles(int /*newLimit*/){ // Not applicable return TRUE;}//////////////////////////////////////////////////////////////////////////////#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 + =
减小字号Ctrl + -
显示快捷键?