PTLib Version 2.12.9

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List
- File Members

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
channel.h
Go to the documentation of this file.
1 /*
2 * channel.h
3 *
4 * I/O channel ancestor class.
5 *
6 * Portable Windows Library
7 *
8 * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
9 *
10 * The contents of this file are subject to the Mozilla Public License
11 * Version 1.0 (the "License"); you may not use this file except in
12 * compliance with the License. You may obtain a copy of the License at
13 * http://www.mozilla.org/MPL/
14 *
15 * Software distributed under the License is distributed on an "AS IS"
16 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17 * the License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * The Original Code is Portable Windows Library.
21 *
22 * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23 *
24 * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
25 * All Rights Reserved.
26 *
27 * Contributor(s): ______________________________________.
28 *
29 * $Revision: 29415 $
30 * $Author: rjongbloed $
31 * $Date: 2013-04-03 08:41:13 +1100 (Wed, 03 Apr 2013) $
32 */
33
34 #ifndef PTLIB_CHANNEL_H
35 #define PTLIB_CHANNEL_H
36
37 #ifdef P_USE_PRAGMA
38 #pragma interface
39 #endif
40
41 #include <ptlib/mutex.h>
42
44 // I/O Channels
45
46 class PChannel;
47
48 /* Buffer class used in PChannel stream.
49 This class is necessary for implementing the standard C++ iostream interface
50 on <code>PChannel</code> classes and its descendents. It is an internal class and
51 should not ever be used by application writers.
52 */
53 class PChannelStreamBuffer : public streambuf {
54
55 protected:
56 /* Construct the streambuf for standard streams on a channel. This is used
57 internally by the <code>PChannel</code> class.
58 */
59 PChannelStreamBuffer(
60 PChannel * chan // Channel the buffer operates on.
61 );
62
63 virtual int_type overflow(int_type = EOF);
64 virtual int_type underflow();
65 virtual int sync();
66 virtual pos_type seekoff(off_type, ios_base::seekdir, ios_base::openmode = ios_base::in | ios_base::out);
67 virtual pos_type seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out);
68
69 PBoolean SetBufferSize(
70 PINDEX newSize
71 );
72
73 private:
74 // Member variables
75 PChannel * channel;
76 PCharArray input, output;
77
78 public:
79 PChannelStreamBuffer(const PChannelStreamBuffer & sbuf);
80 PChannelStreamBuffer & operator=(const PChannelStreamBuffer & sbuf);
81
82 friend class PChannel;
83 };
84
85
107 class PChannel : public PObject, public P_IOSTREAM {
108 PCLASSINFO(PChannel, PObject);
109
112 protected:
114 PChannel();
115
116 public:
118 ~PChannel();
120
132 virtual Comparison Compare(
133 const PObject & obj
134 ) const;
135
149 virtual PINDEX HashFunction() const;
151
161 virtual PBoolean IsOpen() const;
162
168 virtual PString GetName() const { return channelName; }
169
175 P_INT_PTR GetHandle() const;
176
186 virtual PChannel * GetBaseReadChannel() const;
187
197 virtual PChannel * GetBaseWriteChannel() const;
199
205 enum Errors {
206 NoError,
207 NotFound,
208 FileExists,
209 DiskFull,
210 AccessDenied,
211 DeviceInUse,
212 BadParameter,
213 NoMemory,
214 NotOpen,
215 Timeout,
216 Interrupted,
217 BufferTooSmall,
218 Miscellaneous,
219 ProtocolFailure,
220 Unavailable,
221 NumNormalisedErrors
222 };
223
229 enum ErrorGroup {
230 LastReadError,
231 LastWriteError,
232 LastGeneralError,
233 NumErrorGroups
234 };
235
240 Errors GetErrorCode(
241 ErrorGroup group = NumErrorGroups
242 ) const;
243
249 int GetErrorNumber(
250 ErrorGroup group = NumErrorGroups
251 ) const;
252
258 virtual PString GetErrorText(
259 ErrorGroup group = NumErrorGroups
260 ) const;
261
268 static PString GetErrorText(
269 Errors lastError,
270 int osError = 0
271 );
272
279 static PBoolean ConvertOSError(
280 P_INT_PTR libcReturnValue,
281 Errors & lastError,
282 int & osError
283 );
285
295 void SetReadTimeout(
296 const PTimeInterval & time
297 );
298
305 PTimeInterval GetReadTimeout() const;
306
319 virtual PBoolean Read(
320 void * buf,
321 PINDEX len
322 );
323
338 virtual PINDEX GetLastReadCount() const;
339
347 virtual int ReadChar();
348
357 PBoolean ReadBlock(
358 void * buf,
359 PINDEX len
360 );
361
369 PString ReadString(
370 PINDEX len
371 );
373
383 void SetWriteTimeout(
384 const PTimeInterval & time
385 );
386
394 PTimeInterval GetWriteTimeout() const;
395
407 virtual PBoolean Write(
408 const void * buf,
409 PINDEX len
410 );
411
424 virtual PBoolean Write(
425 const void * buf,
426 PINDEX len,
427 const void * /*mark*/
428 ) { return Write(buf,len); }
429
430
443 virtual PINDEX GetLastWriteCount() const;
444
453 PBoolean WriteChar(int c);
454
461 PBoolean WriteString(
462 const PString & str
463 );
465
468 class AsyncContext;
469 typedef PNotifierTemplate<PChannel::AsyncContext &> AsyncNotifier;
470 #define PDECLARE_AsyncNotifier(cls, fn) PDECLARE_NOTIFIER2(PChannel, cls, fn, PChannel::AsyncContext &)
471 #define PCREATE_AsyncNotifier(fn) PCREATE_NOTIFIER2(fn, PChannel::AsyncContext &)
472
473 #ifdef _MSC_VER
474 #pragma pack(push)
475 #if P_64BIT
476 #pragma pack(8)
477 #else
478 #pragma pack(4)
479 #endif
480 #endif
481
483 #ifdef _WIN32
484 typedef OVERLAPPED AsyncContextBase;
485 #elif defined _AIO_H
486 typedef struct aiocb AsyncContextBase;
487 #else
488 class AsyncContextBase { off_t m_offset; };
489 #endif
490 class AsyncContext : public AsyncContextBase
491 {
492 public:
493 AsyncContext(
494 void * buf = NULL,
495 PINDEX len = 0,
496 const AsyncNotifier & notifier = AsyncNotifier()
497 );
498
501 void SetOffset(off_t offset);
502
503 void * m_buffer;
504 PINDEX m_length;
505 AsyncNotifier m_notifier;
506
507 Errors m_errorCode;
508 int m_errorNumber;
509
510 // Internal stuff
511 PChannel * m_channel;
512 typedef void (PChannel::*CompletionFunction)(AsyncContext &);
513 CompletionFunction m_onComplete;
514 bool Initialise(PChannel * channel, CompletionFunction onComplete);
515 void OnIOComplete(PINDEX length, int errorNumber);
516 };
517 #ifdef _MSC_VER
518 #pragma pack(pop)
519 #endif
520
534 virtual bool ReadAsync(
535 AsyncContext & context
536 );
537
543 virtual void OnReadComplete(
544 AsyncContext & context
545 );
546
560 virtual bool WriteAsync(
561 AsyncContext & context
562 );
563
569 virtual void OnWriteComplete(
570 AsyncContext & context
571 );
573
580 virtual PBoolean Close();
581
582 enum ShutdownValue {
583 ShutdownRead = 0,
584 ShutdownWrite = 1,
585 ShutdownReadAndWrite = 2
586 };
587
595 virtual PBoolean Shutdown(
596 ShutdownValue option
597 );
598
606 virtual bool SetLocalEcho(
607 bool localEcho
608 );
609
613 virtual bool FlowControl(const void * flowData);
614
620 PBoolean SetBufferSize(
621 PINDEX newSize
622 );
623
662 PBoolean SendCommandString(
663 const PString & command
664 );
665
670 void AbortCommandString();
672
673 protected:
674 PChannel(const PChannel &);
675 PChannel & operator=(const PChannel &);
676 // Prevent usage by external classes
677
678
685 virtual PBoolean ConvertOSError(
686 P_INT_PTR libcReturnValue,
687 ErrorGroup group = LastGeneralError
688 );
689
690 public:
694 PBoolean SetErrorValues(
695 Errors errorCode,
696 int osError,
697 ErrorGroup group = LastGeneralError
698 );
699
700 protected:
709 int ReadCharWithTimeout(
710 PTimeInterval & timeout // Timeout for read.
711 );
712
713 // Receive a (partial) command string, determine if completed yet.
714 PBoolean ReceiveCommandString(
715 int nextChar,
716 const PString & reply,
717 PINDEX & pos,
718 PINDEX start
719 );
720
721
722 // Member variables
724 P_INT_PTR os_handle;
726 Errors lastErrorCode[NumErrorGroups+1];
728 int lastErrorNumber[NumErrorGroups+1];
730 PINDEX lastReadCount;
732 PINDEX lastWriteCount;
734 PTimeInterval readTimeout;
736 PTimeInterval writeTimeout;
738 PString channelName;
739
740 private:
741 // New functions for class
742 void Construct();
743 // Complete platform dependent construction.
744
745 // Member variables
746 PBoolean abortCommandString;
747 // Flag to abort the transmission of a command in SendCommandString().
748
749
750 // Include platform dependent part of class
751 #ifdef _WIN32
752 #include "msos/ptlib/channel.h"
753 #else
754 #include "unix/ptlib/channel.h"
755 #endif
756
757 };
758
759
762 class PNullChannel : public PChannel
763 {
764 PCLASSINFO(PNullChannel, PChannel)
765 public:
766 PNullChannel();
767
768 PBoolean Read(void *, PINDEX);
769 PBoolean Write(const void *, PINDEX);
770 };
771
772
773 #endif // PTLIB_CHANNEL_H
774
775
776 // End Of File ///////////////////////////////////////////////////////////////