00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef PTLIB_CHANNEL_H
00035 #define PTLIB_CHANNEL_H
00036
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040
00041 #include <ptlib/mutex.h>
00042
00044
00045
00046 class PChannel;
00047
00048
00049
00050
00051
00052
00053 class PChannelStreamBuffer : public streambuf {
00054
00055 protected:
00056
00057
00058
00059 PChannelStreamBuffer(
00060 PChannel * chan
00061 );
00062
00063 virtual int_type overflow(int_type = EOF);
00064 virtual int_type underflow();
00065 virtual int sync();
00066 virtual pos_type seekoff(off_type, ios_base::seekdir, ios_base::openmode = ios_base::in | ios_base::out);
00067 virtual pos_type seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out);
00068
00069 PBoolean SetBufferSize(
00070 PINDEX newSize
00071 );
00072
00073 private:
00074
00075 PChannel * channel;
00076 PCharArray input, output;
00077
00078 public:
00079 PChannelStreamBuffer(const PChannelStreamBuffer & sbuf);
00080 PChannelStreamBuffer & operator=(const PChannelStreamBuffer & sbuf);
00081
00082 friend class PChannel;
00083 };
00084
00085
00107 class PChannel : public PObject, public iostream {
00108 PCLASSINFO(PChannel, PObject);
00109
00110 public:
00113
00114 PChannel();
00115
00117 ~PChannel();
00119
00131 virtual Comparison Compare(
00132 const PObject & obj
00133 ) const;
00134
00148 virtual PINDEX HashFunction() const;
00150
00160 virtual PBoolean IsOpen() const;
00161
00167 virtual PString GetName() const;
00168
00174 int GetHandle() const;
00175
00185 virtual PChannel * GetBaseReadChannel() const;
00186
00196 virtual PChannel * GetBaseWriteChannel() const;
00198
00208 void SetReadTimeout(
00209 const PTimeInterval & time
00210 );
00211
00218 PTimeInterval GetReadTimeout() const;
00219
00232 virtual PBoolean Read(
00233 void * buf,
00234 PINDEX len
00235 );
00236
00251 virtual PINDEX GetLastReadCount() const;
00252
00260 virtual int ReadChar();
00261
00270 PBoolean ReadBlock(
00271 void * buf,
00272 PINDEX len
00273 );
00274
00282 PString ReadString(
00283 PINDEX len
00284 );
00285
00297 virtual PBoolean ReadAsync(
00298 void * buf,
00299 PINDEX len
00300 );
00301
00306 virtual void OnReadComplete(
00307 void * buf,
00308 PINDEX len
00309 );
00311
00321 void SetWriteTimeout(
00322 const PTimeInterval & time
00323 );
00324
00332 PTimeInterval GetWriteTimeout() const;
00333
00345 virtual PBoolean Write(
00346 const void * buf,
00347 PINDEX len
00348 );
00349
00362 virtual PBoolean Write(
00363 const void * buf,
00364 PINDEX len,
00365 const void * mark
00366 );
00367
00380 virtual PINDEX GetLastWriteCount() const;
00381
00390 PBoolean WriteChar(int c);
00391
00398 PBoolean WriteString(const PString & str);
00399
00409 virtual PBoolean WriteAsync(
00410 const void * buf,
00411 PINDEX len
00412 );
00413
00419 virtual void OnWriteComplete(
00420 const void * buf,
00421 PINDEX len
00422 );
00424
00431 virtual PBoolean Close();
00432
00433 enum ShutdownValue {
00434 ShutdownRead = 0,
00435 ShutdownWrite = 1,
00436 ShutdownReadAndWrite = 2
00437 };
00438
00446 virtual PBoolean Shutdown(
00447 ShutdownValue option
00448 );
00449
00457 virtual bool SetLocalEcho(
00458 bool localEcho
00459 );
00460
00464 virtual bool FlowControl(const void * flowData);
00465
00471 PBoolean SetBufferSize(
00472 PINDEX newSize
00473 );
00474
00513 PBoolean SendCommandString(
00514 const PString & command
00515 );
00516
00521 void AbortCommandString();
00523
00529 enum Errors {
00530 NoError,
00532 NotFound,
00534 FileExists,
00536 DiskFull,
00538 AccessDenied,
00540 DeviceInUse,
00542 BadParameter,
00544 NoMemory,
00546 NotOpen,
00548 Timeout,
00550 Interrupted,
00552 BufferTooSmall,
00554 Miscellaneous,
00556 ProtocolFailure,
00557 NumNormalisedErrors
00558 };
00559
00565 enum ErrorGroup {
00566 LastReadError,
00567 LastWriteError,
00568 LastGeneralError,
00569 NumErrorGroups
00570 };
00571
00576 Errors GetErrorCode(
00577 ErrorGroup group = NumErrorGroups
00578 ) const;
00579
00585 int GetErrorNumber(
00586 ErrorGroup group = NumErrorGroups
00587 ) const;
00588
00594 virtual PString GetErrorText(
00595 ErrorGroup group = NumErrorGroups
00596 ) const;
00597
00604 static PString GetErrorText(
00605 Errors lastError,
00606 int osError = 0
00607 );
00609
00616 static PBoolean ConvertOSError(
00617 int libcReturnValue,
00618 Errors & lastError,
00619 int & osError
00620 );
00621
00626 #if P_HAS_RECVMSG
00627 typedef iovec Slice;
00628 #else
00629 struct Slice {
00630 void * iov_base;
00631 size_t iov_len;
00632 };
00633 #endif
00634
00635 typedef std::vector<Slice> VectorOfSlice;
00636
00646 virtual PBoolean Read(
00647 const VectorOfSlice & slices
00648 );
00649
00659 virtual PBoolean Write(
00660 const VectorOfSlice & slices
00661 );
00663
00664 protected:
00665 PChannel(const PChannel &);
00666 PChannel & operator=(const PChannel &);
00667
00668
00669
00676 virtual PBoolean ConvertOSError(
00677 int libcReturnValue,
00678 ErrorGroup group = LastGeneralError
00679 );
00680
00681 public:
00685 PBoolean SetErrorValues(
00686 Errors errorCode,
00687 int osError,
00688 ErrorGroup group = LastGeneralError
00689 );
00690
00691 protected:
00700 int ReadCharWithTimeout(
00701 PTimeInterval & timeout
00702 );
00703
00704
00705 PBoolean ReceiveCommandString(
00706 int nextChar,
00707 const PString & reply,
00708 PINDEX & pos,
00709 PINDEX start
00710 );
00711
00712
00713
00715 int os_handle;
00717 Errors lastErrorCode[NumErrorGroups+1];
00719 int lastErrorNumber[NumErrorGroups+1];
00721 PINDEX lastReadCount;
00723 PINDEX lastWriteCount;
00725 PTimeInterval readTimeout;
00727 PTimeInterval writeTimeout;
00728
00729
00730 private:
00731
00732 void Construct();
00733
00734
00735
00736 PBoolean abortCommandString;
00737
00738
00739
00740
00741 #ifdef _WIN32
00742 #include "msos/ptlib/channel.h"
00743 #else
00744 #include "unix/ptlib/channel.h"
00745 #endif
00746
00747 };
00748
00749
00750 #endif // PTLIB_CHANNEL_H
00751
00752
00753