⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pchannel.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 2 页
字号:
  if (nextChar != GetNextChar(reply, pos)) {    pos = start;    return FALSE;  }  PINDEX dummyPos = pos;  return GetNextChar(reply, dummyPos) < 0;}BOOL PChannel::SendCommandString(const PString & command){  abortCommandString = FALSE;  int nextChar;  PINDEX sendPosition = 0;  PTimeInterval timeout;  SetWriteTimeout(10000);  while (!abortCommandString) { // not aborted    nextChar = GetNextChar(command, sendPosition, &timeout);    switch (nextChar) {      default :        if (!WriteChar(nextChar))          return FALSE;        break;      case NextCharEndOfString :        return TRUE;  // Success!!      case NextCharSend :        break;      case NextCharDelay : // Delay in send        PThread::Current()->Sleep(timeout);        break;      case NextCharWait : // Wait for reply        PINDEX receivePosition = sendPosition;        if (GetNextChar(command, receivePosition) < 0) {          SetReadTimeout(timeout);          while (ReadChar() >= 0)            if (abortCommandString) // aborted              return FALSE;        }        else {          receivePosition = sendPosition;          do {            if (abortCommandString) // aborted              return FALSE;            if ((nextChar = ReadCharWithTimeout(timeout)) < 0)              return FALSE;          } while (!ReceiveCommandString(nextChar,                                     command, receivePosition, sendPosition));//          nextChar = GetNextChar(command, receivePosition);          sendPosition = receivePosition;        }    }  }  return FALSE;}BOOL PChannel::Shutdown(ShutdownValue){  return FALSE;}PChannel * PChannel::GetBaseReadChannel() const{  return (PChannel *)this;}PChannel * PChannel::GetBaseWriteChannel() const{  return (PChannel *)this;}PString PChannel::GetErrorText(ErrorGroup group) const{  return GetErrorText(lastErrorCode[group], lastErrorNumber[group]);}BOOL PChannel::ConvertOSError(int status, ErrorGroup group){  Errors lastError;  int osError;  BOOL ok = ConvertOSError(status, lastError, osError);  SetErrorValues(lastError, osError, group);  return ok;}BOOL PChannel::SetErrorValues(Errors errorCode, int errorNum, ErrorGroup group){  lastErrorCode[NumErrorGroups] = lastErrorCode[group] = errorCode;  lastErrorNumber[NumErrorGroups] = lastErrorNumber[group] = errorNum;  return errorCode == NoError;}#ifndef P_HAS_RECVMSGBOOL PChannel::Read(const VectorOfSlice & slices){  PINDEX length = 0;  VectorOfSlice::const_iterator r;  for (r = slices.begin(); r != slices.end(); ++r) {    BOOL stat = Read(r->iov_base, r->iov_len);    length        += lastReadCount;    lastReadCount = length;    if (!stat)      return FALSE;  }  return TRUE;}BOOL PChannel::Write(const VectorOfSlice & slices){  PINDEX length = 0;  VectorOfSlice::const_iterator r;  for (r = slices.begin(); r != slices.end(); ++r) {    BOOL stat = Write(r->iov_base, r->iov_len);    length        += lastWriteCount;    lastWriteCount = length;    if (!stat)      return FALSE;  }  return TRUE;}#endif // P_HAS_RECVMSG///////////////////////////////////////////////////////////////////////////////// PIndirectChannelPIndirectChannel::PIndirectChannel(){  readChannel = writeChannel = NULL;  writeAutoDelete = readAutoDelete = FALSE;}PObject::Comparison PIndirectChannel::Compare(const PObject & obj) const{  PAssert(PIsDescendant(&obj, PIndirectChannel), PInvalidCast);  const PIndirectChannel & other = (const PIndirectChannel &)obj;  return readChannel == other.readChannel &&         writeChannel == other.writeChannel ? EqualTo : GreaterThan;}PString PIndirectChannel::GetName() const{  PReadWaitAndSignal mutex(channelPointerMutex);  if (readChannel != NULL && readChannel == writeChannel)    return readChannel->GetName();  PStringStream name;  name << "R<";  if (readChannel != NULL)    name << readChannel->GetName();  name << "> T<";  if (writeChannel != NULL)    name << writeChannel->GetName();  name << '>';  return name;}BOOL PIndirectChannel::Close(){  BOOL retval = TRUE;  flush();  channelPointerMutex.StartRead();  if (readChannel != NULL)    retval = readChannel->Close();  if (readChannel != writeChannel && writeChannel != NULL)    retval = writeChannel->Close() && retval;  channelPointerMutex.EndRead();  channelPointerMutex.StartWrite();  PChannel * r = readChannel;  PChannel * w = writeChannel;  readChannel = NULL;  writeChannel = NULL;  if (readAutoDelete)    delete r;  if (r != w && writeAutoDelete)    delete w;  channelPointerMutex.EndWrite();  return retval;}BOOL PIndirectChannel::IsOpen() const{  PReadWaitAndSignal mutex(channelPointerMutex);  if (readChannel != NULL && readChannel == writeChannel)    return readChannel->IsOpen();  BOOL returnValue = readChannel != NULL ? readChannel->IsOpen() : FALSE;  if (writeChannel != NULL)    returnValue = writeChannel->IsOpen() || returnValue;  return returnValue;}BOOL PIndirectChannel::Read(void * buf, PINDEX len){  flush();  PReadWaitAndSignal mutex(channelPointerMutex);  if (readChannel == NULL) {    SetErrorValues(NotOpen, EBADF, LastReadError);    return FALSE;  }  readChannel->SetReadTimeout(readTimeout);  BOOL returnValue = readChannel->Read(buf, len);  SetErrorValues(readChannel->GetErrorCode(LastReadError),                 readChannel->GetErrorNumber(LastReadError),                 LastReadError);  lastReadCount = readChannel->GetLastReadCount();  return returnValue;}BOOL PIndirectChannel::Write(const void * buf, PINDEX len){  flush();  PReadWaitAndSignal mutex(channelPointerMutex);  if (writeChannel == NULL) {    SetErrorValues(NotOpen, EBADF, LastWriteError);    return FALSE;  }  writeChannel->SetWriteTimeout(writeTimeout);  BOOL returnValue = writeChannel->Write(buf, len);  SetErrorValues(writeChannel->GetErrorCode(LastWriteError),                 writeChannel->GetErrorNumber(LastWriteError),                 LastWriteError);  lastWriteCount = writeChannel->GetLastWriteCount();  return returnValue;}BOOL PIndirectChannel::Shutdown(ShutdownValue value){  PReadWaitAndSignal mutex(channelPointerMutex);  if (readChannel != NULL && readChannel == writeChannel)    return readChannel->Shutdown(value);  BOOL returnValue = readChannel != NULL ? readChannel->Shutdown(value) : FALSE;  if (writeChannel != NULL)    returnValue = writeChannel->Shutdown(value) || returnValue;  return returnValue;}PString PIndirectChannel::GetErrorText(ErrorGroup group) const{  if (readChannel != NULL)    return readChannel->GetErrorText(group);  if (writeChannel != NULL)    return writeChannel->GetErrorText(group);  return PChannel::GetErrorText(group);}BOOL PIndirectChannel::Open(PChannel & channel){  return Open(&channel, (BOOL)FALSE);}BOOL PIndirectChannel::Open(PChannel * channel, BOOL autoDelete){  return Open(channel, channel, autoDelete, autoDelete);}BOOL PIndirectChannel::Open(PChannel * readChan,                            PChannel * writeChan,                            BOOL autoDeleteRead,                            BOOL autoDeleteWrite){  flush();  channelPointerMutex.StartWrite();  if (readChannel != NULL)    readChannel->Close();  if (readChannel != writeChannel && writeChannel != NULL)    writeChannel->Close();  if (readAutoDelete)    delete readChannel;  if (readChannel != writeChannel && writeAutoDelete)    delete writeChannel;  readChannel = readChan;  readAutoDelete = autoDeleteRead;  writeChannel = writeChan;  writeAutoDelete = autoDeleteWrite;  channelPointerMutex.EndWrite();  return IsOpen() && OnOpen();}BOOL PIndirectChannel::OnOpen(){  return TRUE;}BOOL PIndirectChannel::SetReadChannel(PChannel * channel, BOOL autoDelete){  if (readChannel != NULL)    return SetErrorValues(DeviceInUse, EEXIST);  channelPointerMutex.StartWrite();  readChannel = channel;  readAutoDelete = autoDelete;  channelPointerMutex.EndWrite();  return IsOpen();}BOOL PIndirectChannel::SetWriteChannel(PChannel * channel, BOOL autoDelete){  if (writeChannel != NULL)    return SetErrorValues(DeviceInUse, EEXIST);  channelPointerMutex.StartWrite();  writeChannel = channel;  writeAutoDelete = autoDelete;  channelPointerMutex.EndWrite();  return IsOpen();}PChannel * PIndirectChannel::GetBaseReadChannel() const{  PReadWaitAndSignal mutex(channelPointerMutex);  return readChannel != NULL ? readChannel->GetBaseReadChannel() : 0;}PChannel * PIndirectChannel::GetBaseWriteChannel() const{  PReadWaitAndSignal mutex(channelPointerMutex);  return writeChannel != NULL ? writeChannel->GetBaseWriteChannel() : 0;}///////////////////////////////////////////////////////////////////////////////// PFilePFile::~PFile(){  Close();}PObject::Comparison PFile::Compare(const PObject & obj) const{  PAssert(PIsDescendant(&obj, PFile), PInvalidCast);  return path.Compare(((const PFile &)obj).path);}BOOL PFile::Rename(const PString & newname, BOOL force){  Close();  if (!ConvertOSError(Rename(path, newname, force) ? 0 : -1))    return FALSE;  path = path.GetDirectory() + newname;  return TRUE;}BOOL PFile::Close(){  if (!IsOpen())    return SetErrorValues(NotOpen, EBADF);  flush();#ifdef WOT_NO_FILESYSTEM  BOOL ok = TRUE;#else  BOOL ok = ConvertOSError(_close(os_handle));#endif  os_handle = -1;  if (removeOnClose)    Remove();  return ok;}BOOL PFile::Read(void * buffer, PINDEX amount){  flush();#ifdef WOT_NO_FILESYSTEM  lastReadCount = 0;#else  lastReadCount = _read(GetHandle(), buffer, amount);#endif  return ConvertOSError(lastReadCount, LastReadError) && lastReadCount > 0;}BOOL PFile::Write(const void * buffer, PINDEX amount){  flush();#ifdef WOT_NO_FILESYSTEM  lastWriteCount = amount;#else  lastWriteCount = _write(GetHandle(), buffer, amount);#endif  return ConvertOSError(lastWriteCount, LastWriteError) && lastWriteCount >= amount;}BOOL PFile::Open(const PFilePath & name, OpenMode  mode, int opts){  Close();  SetFilePath(name);  return Open(mode, opts);}off_t PFile::GetLength() const{#ifdef WOT_NO_FILESYSTEM  return 0;#else  off_t pos = _lseek(GetHandle(), 0, SEEK_CUR);  off_t len = _lseek(GetHandle(), 0, SEEK_END);  PAssertOS(_lseek(GetHandle(), pos, SEEK_SET) != (off_t)-1);  return len;#endif}BOOL PFile::IsEndOfFile() const{  ((PFile *)this)->flush();  return GetPosition() >= GetLength();}BOOL PFile::SetPosition(off_t pos, FilePositionOrigin origin){#ifdef WOT_NO_FILESYSTEM  return TRUE;#else  return _lseek(GetHandle(), pos, origin) != (off_t)-1;#endif}BOOL PFile::Copy(const PFilePath & oldname, const PFilePath & newname, BOOL force){  PFile oldfile(oldname, ReadOnly);  if (!oldfile.IsOpen())    return FALSE;  PFile newfile(newname,                   WriteOnly, Create|Truncate|(force ? MustExist : Exclusive));  if (!newfile.IsOpen())    return FALSE;  PCharArray buffer(10000);  off_t amount = oldfile.GetLength();  while (amount > 10000) {    if (!oldfile.Read(buffer.GetPointer(), 10000))      return FALSE;    if (!newfile.Write((const char *)buffer, 10000))      return FALSE;    amount -= 10000;  }  if (!oldfile.Read(buffer.GetPointer(), (int)amount))    return FALSE;  if (!newfile.Write((const char *)buffer, (int)amount))    return FALSE;  return newfile.Close();}// End Of File ///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -