ptypes

ptypes Mercurial Source Tree


Root/doc/include/pstreams.h.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<!--
Syntax highlighting generated by Web C Plus Plus software v0.8.4
Webcpp Copyright (C)2001-2004 Jeffrey Bakker under the GNU GPL
Get webcpp at http://webcpp.sf.net
-->

<html>
<head>
<title>pstreams.h</title>
<style type="text/css">

/*
Webcpp v0.8.1 compatible StyleSheet
http://webcpp.sf.net
Theme: ide-msvcpp
*/

body
{
background-color: #ffffff
}

.webcpp a:link    {color:#000000}
.webcpp a:visited {color:#008000}
.webcpp a:active  {color:#0000ff}
.webcpp a:hover   {color:#0000ff}

.webcpp pre
{
color: #000000
}

.webcpp font
{
font-size:100%
}

.webcpp .symbols
{
color: #000000
}

.webcpp .preproc
{
color: #0000ff
}

.webcpp .integer
{
color: #000000
}

.webcpp .floatpt
{
color: #000000
}

.webcpp .dblquot
{
color: #000000
}

.webcpp .sinquot
{
color: #000000
}

.webcpp .keyword
{
color: #0000ff;

}

.webcpp .keytype
{
color: #0000ff;

}

.webcpp .comment
{
color: #008000;

}

</style>
</head>
<body bgcolor="#FFFFFF" leftmargin="40" marginwidth="40"> <p><a href="../htsrc.html">Index</a><hr noshade></p>

<div class="webcpp">
<pre>


<font CLASS=preproc>#ifndef</font> __PSTREAMS_H__ 
<font CLASS=preproc>#define</font> __PSTREAMS_H__ 

<font CLASS=preproc>#ifndef</font> __PPORT_H__ 
<font CLASS=preproc>#include</font> <font CLASS=dblquot>"pport.h"</font> 
<font CLASS=preproc>#endif</font> 

<font CLASS=preproc>#ifndef</font> __PTYPES_H__ 
<font CLASS=preproc>#include</font> <font CLASS=dblquot>"ptypes.h"</font> 
<font CLASS=preproc>#endif</font> 

<font CLASS=preproc>#ifndef</font> PTYPES_ST 
<font CLASS=preproc>#</font>  ifndef __PASYNC_H__ 
<font CLASS=preproc>#</font>    include <font CLASS=dblquot>"pasync.h"</font>  <font CLASS=comment>// for logfile.lock </font>
<font CLASS=preproc>#</font>  endif 
<font CLASS=preproc>#endif</font> 

<font CLASS=preproc>#include</font> <stdarg.h> 
<font CLASS=preproc>#include</font> <errno.h> 


<font CLASS=preproc>#ifdef</font> WIN32 
<font CLASS=preproc>#</font>  define _WINSOCKAPI_   <font CLASS=comment>// prevent inclusion of winsock.h, because we need winsock2.h </font>
<font CLASS=preproc>#</font>  include <font CLASS=dblquot>"windows.h"</font>   <font CLASS=comment>// for OVERLAPPED </font>
<font CLASS=preproc>#endif</font> 


PTYPES_BEGIN


<font CLASS=preproc>#ifdef</font> _MSC_VER 
<font CLASS=preproc>#pragma</font> pack(push, <font CLASS=integer>4</font>) 
<font CLASS=preproc>#endif</font> 


<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// ---  abstract stream i/o classes ----------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>


<font CLASS=comment>//</font>
<font CLASS=comment>// stream exception class</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> iobase;

<font CLASS=keyword>class</font> estream: public exception 
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    <font CLASS=keytype>int</font> code;
    iobase* errstm;
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    estream(iobase* ierrstm, <font CLASS=keytype>int</font> icode, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* imsg);
    estream(iobase* ierrstm, <font CLASS=keytype>int</font> icode, <font CLASS=keyword>const</font> string& imsg);
    <font CLASS=keyword>virtual</font> ~estream();
    <font CLASS=keytype>int</font> get_code()          { <font CLASS=keyword>return</font> code; }
    iobase* get_errstm()    { <font CLASS=keyword>return</font> errstm; }
};


<font CLASS=keyword>typedef</font> <font CLASS=keytype>void</font> (*iostatusevent)(iobase* sender, <font CLASS=keytype>int</font> code);

<font CLASS=keytype>int</font> unixerrno();
<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* unixerrmsg(<font CLASS=keytype>int</font> code);


<font CLASS=comment>// status codes: compatible with WinInet API</font>
<font CLASS=comment>// additional status codes are defined in pinet.h for ipsocket</font>

<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> IO_CREATED <font CLASS=symbols>=</font> <font CLASS=integer>1</font>;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> IO_OPENING <font CLASS=symbols>=</font> <font CLASS=integer>5</font>;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> IO_OPENED <font CLASS=symbols>=</font> <font CLASS=integer>35</font>;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> IO_READING <font CLASS=symbols>=</font> <font CLASS=integer>37</font>;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> IO_WRITING <font CLASS=symbols>=</font> <font CLASS=integer>38</font>;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> IO_EOF <font CLASS=symbols>=</font> <font CLASS=integer>45</font>;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> IO_CLOSING <font CLASS=symbols>=</font> <font CLASS=integer>250</font>;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> IO_CLOSED <font CLASS=symbols>=</font> <font CLASS=integer>253</font>;


<font CLASS=comment>//</font>
<font CLASS=comment>// iobase</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>enum</font> ioseekmode 
{
    IO_BEGIN,
    IO_CURRENT,
    IO_END
};


<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> invhandle <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>;


<font CLASS=keyword>class</font> iobase: public component 
{
    <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> fdxoutstm;

<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    <font CLASS=keytype>bool</font>    active;         <font CLASS=comment>// active status, changed by open() and close()</font>
    <font CLASS=keytype>bool</font>    cancelled;      <font CLASS=comment>// the stream was cancelled by cancel()</font>
    <font CLASS=keytype>bool</font>    eof;            <font CLASS=comment>// end of file reached, only for input streams</font>
    <font CLASS=keytype>int</font>     handle;         <font CLASS=comment>// used in many derivative classes</font>
    large   abspos;         <font CLASS=comment>// physical stream position</font>
    <font CLASS=keytype>int</font>     bufsize;        <font CLASS=comment>// buffer size, can be changed only when not active</font>
    <font CLASS=keytype>char</font>*   bufdata;        <font CLASS=comment>// internal: allocated buffer data</font>
    <font CLASS=keytype>int</font>     bufpos;         <font CLASS=comment>// internal: current position</font>
    <font CLASS=keytype>int</font>     bufend;         <font CLASS=comment>// internal: current data size in the buffer</font>
    <font CLASS=keytype>int</font>     stmerrno;       <font CLASS=comment>// UNIX-compatible error numbers, see comments in piobase.cxx</font>
    string  deferrormsg;    <font CLASS=comment>// internal: default error message when an exception is thrown,</font>
    <font CLASS=keytype>int</font>     status;         <font CLASS=comment>// stream status code, see IO_xxx constants above</font>
    iostatusevent onstatus; <font CLASS=comment>// user-defined status change handler</font>

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> bufalloc();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> buffree();
    <font CLASS=keytype>void</font> bufclear() { bufpos <font CLASS=symbols>=</font> <font CLASS=integer>0</font>; bufend <font CLASS=symbols>=</font> <font CLASS=integer>0</font>; }

    <font CLASS=keytype>void</font> errstminactive();
    <font CLASS=keytype>void</font> errbufrequired();
    <font CLASS=keytype>void</font> requireactive()        { <font CLASS=keyword>if</font> (!active) errstminactive(); }
    <font CLASS=keytype>void</font> requirebuf()           { requireactive(); <font CLASS=keyword>if</font> (bufdata <font CLASS=symbols>==</font> <font CLASS=integer>0</font>) errbufrequired(); }
    <font CLASS=keytype>int</font>  convertoffset(large);

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen() <font CLASS=symbols>=</font> <font CLASS=integer>0</font>;
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();
    <font CLASS=keyword>virtual</font> large doseek(large newpos, ioseekmode mode);

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> chstat(<font CLASS=keytype>int</font> newstat);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> uerrno();
    <font CLASS=keyword>virtual</font> <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* uerrmsg(<font CLASS=keytype>int</font> code);

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    iobase(<font CLASS=keytype>int</font> ibufsize <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);
    <font CLASS=keyword>virtual</font> ~iobase();

    <font CLASS=keytype>void</font> open();
    <font CLASS=keytype>void</font> close();
    <font CLASS=keytype>void</font> cancel();
    <font CLASS=keytype>void</font> reopen()                                   { open(); }
    large seekx(large newpos, ioseekmode mode <font CLASS=symbols>=</font> IO_BEGIN);
    <font CLASS=keytype>int</font> seek(<font CLASS=keytype>int</font> newpos, ioseekmode mode <font CLASS=symbols>=</font> IO_BEGIN) { <font CLASS=keyword>return</font> convertoffset(seekx(newpos, mode)); }
    <font CLASS=keytype>void</font> error(<font CLASS=keytype>int</font> code, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* defmsg);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> flush();

    <font CLASS=keyword>virtual</font> string get_errormsg();
    <font CLASS=keyword>virtual</font> string get_errstmname();
    <font CLASS=keyword>virtual</font> string get_streamname() <font CLASS=symbols>=</font> <font CLASS=integer>0</font>;

    <font CLASS=keytype>bool</font> get_active()                               { <font CLASS=keyword>return</font> active; }
    <font CLASS=keytype>void</font> set_active(<font CLASS=keytype>bool</font> newval);
    <font CLASS=keytype>bool</font> get_cancelled()                            { <font CLASS=keyword>return</font> cancelled; }
    <font CLASS=keytype>void</font> set_cancelled(<font CLASS=keytype>bool</font> newval)                 { cancelled <font CLASS=symbols>=</font> newval; }
    <font CLASS=keytype>int</font>  get_handle()                               { <font CLASS=keyword>return</font> handle; }
    <font CLASS=keytype>int</font>  get_bufsize()                              { <font CLASS=keyword>return</font> bufsize; }
    <font CLASS=keytype>void</font> set_bufsize(<font CLASS=keytype>int</font> newval);
    <font CLASS=keytype>int</font>  get_stmerrno()                             { <font CLASS=keyword>return</font> stmerrno; }
    <font CLASS=keytype>int</font>  get_status()                               { <font CLASS=keyword>return</font> status; }
    iostatusevent get_onstatus()                    { <font CLASS=keyword>return</font> onstatus; }
    <font CLASS=keytype>void</font> set_onstatus(iostatusevent newval)         { onstatus <font CLASS=symbols>=</font> newval; }
};
<font CLASS=keyword>typedef</font> iobase* piobase;


<font CLASS=keyword>extern</font> <font CLASS=keytype>int</font> defbufsize;
<font CLASS=keyword>extern</font> <font CLASS=keytype>int</font> stmbalance;


<font CLASS=comment>//</font>
<font CLASS=comment>// instm - abstract input stream</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>const</font> <font CLASS=keytype>char</font> eofchar <font CLASS=symbols>=</font> <font CLASS=integer>0</font>;

<font CLASS=keyword>class</font> instm: public iobase 
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> dorawread(<font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);
    <font CLASS=keytype>int</font> rawread(<font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> bufvalidate();
    <font CLASS=keytype>void</font> skipeol();

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    instm(<font CLASS=keytype>int</font> ibufsize <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);
    <font CLASS=keyword>virtual</font> ~instm();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();

    <font CLASS=keytype>bool</font> get_eof();
    <font CLASS=keytype>void</font> set_eof(<font CLASS=keytype>bool</font> ieof)     { eof <font CLASS=symbols>=</font> ieof; }
    <font CLASS=keytype>bool</font> get_eol();
    <font CLASS=keytype>int</font>  get_dataavail();
    <font CLASS=keytype>char</font> preview();
    <font CLASS=keytype>char</font> get();
    <font CLASS=keytype>void</font> putback();
    string token(<font CLASS=keyword>const</font> cset& chars);
    string token(<font CLASS=keyword>const</font> cset& chars, <font CLASS=keytype>int</font> limit);
    <font CLASS=keytype>int</font> token(<font CLASS=keyword>const</font> cset& chars, char* buf, <font CLASS=keytype>int</font> size);
    string line();
    string line(<font CLASS=keytype>int</font> limit);
    <font CLASS=keytype>int</font> line(<font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> size, <font CLASS=keytype>bool</font> eateol <font CLASS=symbols>=</font> <font CLASS=keyword>true</font>);
    <font CLASS=keytype>int</font> read(<font CLASS=keytype>void</font>* buf, <font CLASS=keytype>int</font> count);
    <font CLASS=keytype>int</font> skip(<font CLASS=keytype>int</font> count);
    <font CLASS=keytype>int</font> skiptoken(<font CLASS=keyword>const</font> cset& chars);
    <font CLASS=keytype>void</font> skipline(<font CLASS=keytype>bool</font> eateol <font CLASS=symbols>=</font> <font CLASS=keyword>true</font>);
    large tellx();
    <font CLASS=keytype>int</font> tell()  { <font CLASS=keyword>return</font> convertoffset(tellx()); }
    large seekx(large newpos, ioseekmode mode <font CLASS=symbols>=</font> IO_BEGIN);
    <font CLASS=keytype>int</font> seek(<font CLASS=keytype>int</font> newpos, ioseekmode mode <font CLASS=symbols>=</font> IO_BEGIN)   { <font CLASS=keyword>return</font> convertoffset(seekx(newpos, mode)); }
};
<font CLASS=keyword>typedef</font> instm* pinstm;


<font CLASS=comment>//</font>
<font CLASS=comment>// outstm - abstract output stream</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> outstm: public iobase 
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    <font CLASS=keytype>bool</font> flusheol;

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> dorawwrite(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);
    <font CLASS=keytype>int</font> rawwrite(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> bufvalidate();
    <font CLASS=keytype>void</font> bufadvance(<font CLASS=keytype>int</font> delta)  
        { bufpos <font CLASS=symbols>+=</font> delta; <font CLASS=keyword>if</font> (bufend < bufpos) bufend <font CLASS=symbols>=</font> bufpos; }
    <font CLASS=keytype>bool</font> canwrite();

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    outstm(<font CLASS=keytype>bool</font> iflusheol <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>, <font CLASS=keytype>int</font> ibufsize <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>);
    <font CLASS=keyword>virtual</font> ~outstm();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();

    <font CLASS=keytype>bool</font> get_flusheol()             { <font CLASS=keyword>return</font> flusheol; }
    <font CLASS=keytype>void</font> set_flusheol(<font CLASS=keytype>bool</font> newval)  { flusheol <font CLASS=symbols>=</font> newval; }

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> flush();
    <font CLASS=keytype>bool</font> get_eof()                  { <font CLASS=keyword>return</font> eof; }
    <font CLASS=keytype>void</font> put(<font CLASS=keytype>char</font> c);
    <font CLASS=keytype>void</font> put(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* str);
    <font CLASS=keytype>void</font> put(<font CLASS=keyword>const</font> string& str);
    <font CLASS=keytype>void</font> vputf(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* fmt, va_list);
    <font CLASS=keytype>void</font> putf(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* fmt, ...);
    <font CLASS=keytype>void</font> putline(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* str);
    <font CLASS=keytype>void</font> putline(<font CLASS=keyword>const</font> string& str);
    <font CLASS=keytype>void</font> puteol();
    <font CLASS=keytype>int</font> write(<font CLASS=keyword>const</font> <font CLASS=keytype>void</font>* buf, <font CLASS=keytype>int</font> count);
    large tellx()                   { <font CLASS=keyword>return</font> abspos <font CLASS=symbols>+</font> bufpos; }
    <font CLASS=keytype>int</font> tell()                      { <font CLASS=keyword>return</font> convertoffset(tellx()); }
    large seekx(large newpos, ioseekmode mode <font CLASS=symbols>=</font> IO_BEGIN);
    <font CLASS=keytype>int</font> seek(<font CLASS=keytype>int</font> newpos, ioseekmode mode <font CLASS=symbols>=</font> IO_BEGIN)  { <font CLASS=keyword>return</font> convertoffset(seekx(newpos, mode)); }
};
<font CLASS=keyword>typedef</font> outstm* poutstm;


<font CLASS=comment>// %t and %T formats</font>
<font CLASS=keyword>extern</font> <font CLASS=keytype>char</font>* shorttimefmt;  <font CLASS=comment>// "%d-%b-%Y %X"</font>
<font CLASS=keyword>extern</font> <font CLASS=keytype>char</font>* longtimefmt;   <font CLASS=comment>// "%a %b %d %X %Y"</font>


<font CLASS=comment>//</font>
<font CLASS=comment>// internal class used in fdxstm</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> fdxstm;


<font CLASS=keyword>class</font> fdxoutstm: public outstm
{
    <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> fdxstm;

<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    fdxstm* in;
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> chstat(<font CLASS=keytype>int</font> newstat);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> uerrno();
    <font CLASS=keyword>virtual</font> <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* uerrmsg(<font CLASS=keytype>int</font> code);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> dorawwrite(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    fdxoutstm(<font CLASS=keytype>int</font> ibufsize, fdxstm* iin);
    <font CLASS=keyword>virtual</font> ~fdxoutstm();
    <font CLASS=keyword>virtual</font> string get_streamname();
};
<font CLASS=keyword>typedef</font> fdxstm* pfdxstm;


<font CLASS=comment>//</font>
<font CLASS=comment>// fdxstm: abstract full-duplex stream (for sockets and pipes)</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> fdxstm: public instm
{
    <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> fdxoutstm;

<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    fdxoutstm out;

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> dorawwrite(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>

    fdxstm(<font CLASS=keytype>int</font> ibufsize <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);
    <font CLASS=keyword>virtual</font> ~fdxstm();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();

    <font CLASS=keytype>void</font> set_bufsize(<font CLASS=keytype>int</font> newval);       <font CLASS=comment>// sets both input and output buffer sizes</font>

    <font CLASS=keytype>void</font> open();            <font CLASS=comment>// rewritten to pass the call to the output stream too</font>
    <font CLASS=keytype>void</font> close();
    <font CLASS=keytype>void</font> cancel();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> flush();
    large tellx(<font CLASS=keytype>bool</font>);      <font CLASS=comment>// true for input and false for output</font>
    <font CLASS=keytype>int</font> tell(<font CLASS=keytype>bool</font> forin)                    { <font CLASS=keyword>return</font> convertoffset(tellx(forin)); }

    // output interface: pretend <font CLASS=keyword>this</font> <font CLASS=keyword>class</font> is derived both
    // from instm and outstm. actually we can<font CLASS=sinquot>'t use multiple
    // inheritance here, since this is a full-duplex stream,
    // hence everything must be duplicated for input and output
    void putf(const char* fmt, ...);
    void put(char c)                        { out.put(c); }
    void put(const char* str)               { out.put(str); }
    void put(const string& str)             { out.put(str); }
    void putline(const char* str)           { out.putline(str); }
    void putline(const string& str)         { out.putline(str); }
    void puteol()                           { out.puteol(); }
    int  write(const void* buf, int count)  { return out.write(buf, count); }
    bool get_flusheol()                     { return out.get_flusheol(); }
    void set_flusheol(bool newval)          { out.set_flusheol(newval); }

    operator outstm&()			            { return out; }
};


<font CLASS=comment>//</font>
<font CLASS=comment>// abstract input filter class</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> infilter: public instm 
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    instm*   stm;
    <font CLASS=keytype>char</font>*    savebuf;
    <font CLASS=keytype>int</font>      savecount;
    string   postponed;

    <font CLASS=keytype>void</font> copytobuf(string& s);
    <font CLASS=keytype>void</font> copytobuf(pconst& buf, <font CLASS=keytype>int</font>& count);
    <font CLASS=keytype>bool</font> copytobuf(<font CLASS=keytype>char</font> c);

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> freenotify(component* sender);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font>  dorawread(<font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> dofilter() <font CLASS=symbols>=</font> <font CLASS=integer>0</font>;

    <font CLASS=keytype>bool</font> bufavail()  { <font CLASS=keyword>return</font> savecount > <font CLASS=integer>0</font>; }
    <font CLASS=keytype>void</font> post(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);
    <font CLASS=keytype>void</font> post(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s);
    <font CLASS=keytype>void</font> post(<font CLASS=keytype>char</font> c);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> post(string s);

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    infilter(instm* istm, <font CLASS=keytype>int</font> ibufsize <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);
    <font CLASS=keyword>virtual</font> ~infilter();

    <font CLASS=keyword>virtual</font> string get_errstmname();

    instm* get_stm()  { <font CLASS=keyword>return</font> stm; }
    <font CLASS=keytype>void</font> set_stm(instm* stm);
};


<font CLASS=comment>//</font>
<font CLASS=comment>// abstract output filter class</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> outfilter: public outstm
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    outstm* stm;
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> freenotify(component* sender);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    outfilter(outstm* istm, <font CLASS=keytype>int</font> ibufsize <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);
    <font CLASS=keyword>virtual</font> ~outfilter();
    <font CLASS=keyword>virtual</font> string get_errstmname();
    outstm* get_stm()  { <font CLASS=keyword>return</font> stm; }
    <font CLASS=keytype>void</font> set_stm(outstm* stm);
};


<font CLASS=comment>//</font>
<font CLASS=comment>// inmemory - memory stream</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> inmemory: public instm 
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    string mem;
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> bufalloc();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> buffree();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> bufvalidate();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();
    <font CLASS=keyword>virtual</font> large doseek(large newpos, ioseekmode mode);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> dorawread(<font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    inmemory(<font CLASS=keyword>const</font> string& imem);
    <font CLASS=keyword>virtual</font> ~inmemory();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();
    <font CLASS=keyword>virtual</font> string get_streamname();
    large seekx(large newpos, ioseekmode mode <font CLASS=symbols>=</font> IO_BEGIN);
    <font CLASS=keytype>int</font> seek(<font CLASS=keytype>int</font> newpos, ioseekmode mode <font CLASS=symbols>=</font> IO_BEGIN)  { <font CLASS=keyword>return</font> convertoffset(seekx(newpos, mode)); }
    string get_strdata()  { <font CLASS=keyword>return</font> mem; }
    <font CLASS=keytype>void</font> set_strdata(<font CLASS=keyword>const</font> string& data);
};


<font CLASS=comment>//</font>
<font CLASS=comment>// outmemory - memory stream</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> outmemory: public outstm 
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    string mem;
    <font CLASS=keytype>int</font> limit;

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();
    <font CLASS=keyword>virtual</font> large doseek(large newpos, ioseekmode mode);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> dorawwrite(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    outmemory(<font CLASS=keytype>int</font> limit <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);
    <font CLASS=keyword>virtual</font> ~outmemory();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();
    <font CLASS=keyword>virtual</font> string get_streamname();
    large tellx()               { <font CLASS=keyword>return</font> abspos; }
    <font CLASS=keytype>int</font> tell()                  { <font CLASS=keyword>return</font> (<font CLASS=keytype>int</font>)abspos; }
    string get_strdata();
};


<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// ---  file input/output --------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>


<font CLASS=comment>//</font>
<font CLASS=comment>// infile - file input</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> outfile;

<font CLASS=keyword>class</font> infile: public instm
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    string filename;
    <font CLASS=keytype>int</font>    syshandle;   <font CLASS=comment>// if not -1, assigned to handle in open() instead of opening a file by a name</font>
    <font CLASS=keytype>int</font>    peerhandle;  <font CLASS=comment>// pipe peer handle, needed for closing the peer after fork() on unix</font>

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    infile();
    infile(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* ifn);
    infile(<font CLASS=keyword>const</font> string& ifn);
    <font CLASS=keyword>virtual</font> ~infile();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();

    <font CLASS=keytype>void</font> pipe(outfile&);
    <font CLASS=keyword>virtual</font> string get_streamname();
    <font CLASS=keytype>int</font> get_syshandle()                     { <font CLASS=keyword>return</font> syshandle; }
    <font CLASS=keytype>void</font> set_syshandle(<font CLASS=keytype>int</font> ihandle)         { close(); syshandle <font CLASS=symbols>=</font> ihandle; }
    <font CLASS=keytype>int</font> get_peerhandle()                    { <font CLASS=keyword>return</font> peerhandle; }
    string get_filename()                   { <font CLASS=keyword>return</font> filename; }
    <font CLASS=keytype>void</font> set_filename(<font CLASS=keyword>const</font> string& ifn)    { close(); filename <font CLASS=symbols>=</font> ifn; }
    <font CLASS=keytype>void</font> set_filename(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* ifn)      { close(); filename <font CLASS=symbols>=</font> ifn; }
};


<font CLASS=comment>//</font>
<font CLASS=comment>// outfile - file output</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> outfile: public outstm
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> infile; <font CLASS=comment>// infile::pipe() needs access to peerhandle</font>

    string filename;
    <font CLASS=keytype>int</font>    syshandle;   <font CLASS=comment>// if not -1, assigned to handle in open() instead of opening a file by a name</font>
    <font CLASS=keytype>int</font>    peerhandle;  <font CLASS=comment>// pipe peer handle, needed for closing the peer after fork() on unix</font>
    <font CLASS=keytype>int</font>    umode;       <font CLASS=comment>// unix file mode (unix only), default = 644</font>
    <font CLASS=keytype>bool</font>   append;      <font CLASS=comment>// append (create new if needed), default = false</font>

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    outfile();
    outfile(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* ifn, <font CLASS=keytype>bool</font> iappend <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>);
    outfile(<font CLASS=keyword>const</font> string& ifn, <font CLASS=keytype>bool</font> iappend <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>);
    <font CLASS=keyword>virtual</font> ~outfile();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> flush();
    <font CLASS=keyword>virtual</font> string get_streamname();

    <font CLASS=keytype>int</font> get_syshandle()                     { <font CLASS=keyword>return</font> syshandle; }
    <font CLASS=keytype>void</font> set_syshandle(<font CLASS=keytype>int</font> ihandle)         { close(); syshandle <font CLASS=symbols>=</font> ihandle; }
    <font CLASS=keytype>int</font> get_peerhandle()                    { <font CLASS=keyword>return</font> peerhandle; }
    string get_filename()                   { <font CLASS=keyword>return</font> filename; }
    <font CLASS=keytype>void</font> set_filename(<font CLASS=keyword>const</font> string& ifn)    { close(); filename <font CLASS=symbols>=</font> ifn; }
    <font CLASS=keytype>void</font> set_filename(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* ifn)      { close(); filename <font CLASS=symbols>=</font> ifn; }
    <font CLASS=keytype>bool</font> get_append()                       { <font CLASS=keyword>return</font> append; }
    <font CLASS=keytype>void</font> set_append(<font CLASS=keytype>bool</font> iappend)           { close(); append <font CLASS=symbols>=</font> iappend; }
    <font CLASS=keytype>int</font>  get_umode()                        { <font CLASS=keyword>return</font> umode; }
    <font CLASS=keytype>void</font> set_umode(<font CLASS=keytype>int</font> iumode)              { close(); umode <font CLASS=symbols>=</font> iumode; }
};


<font CLASS=comment>//</font>
<font CLASS=comment>// logfile - file output with thread-safe putf()</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> logfile: public outfile
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=preproc>#ifndef</font> PTYPES_ST 
    mutex lock;
<font CLASS=preproc>#endif</font> 
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    logfile();
    logfile(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* ifn, <font CLASS=keytype>bool</font> iappend <font CLASS=symbols>=</font> <font CLASS=keyword>true</font>);
    logfile(<font CLASS=keyword>const</font> string& ifn, <font CLASS=keytype>bool</font> iappend <font CLASS=symbols>=</font> <font CLASS=keyword>true</font>);
    <font CLASS=keyword>virtual</font> ~logfile();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();

    <font CLASS=keytype>void</font> vputf(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* fmt, va_list);
    <font CLASS=keytype>void</font> putf(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* fmt, ...);
};


<font CLASS=comment>//</font>
<font CLASS=comment>// intee - UNIX tee-style utility class</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>class</font> intee: public infilter {
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    outfile file;
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> dofilter();
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    intee(instm* istm, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* ifn, <font CLASS=keytype>bool</font> iappend <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>);
    intee(instm* istm, <font CLASS=keyword>const</font> string& ifn, <font CLASS=keytype>bool</font> iappend <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>);
    <font CLASS=keyword>virtual</font> ~intee();

    outfile* get_file()   { <font CLASS=keyword>return</font> &file; }
    <font CLASS=keyword>virtual</font> string get_streamname();
};


<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// ---  named pipes --------------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>


<font CLASS=comment>// on Unix this directory can be overridden by providing the</font>
<font CLASS=comment>// full path, e.g. '/var/run/mypipe'. the path is ignored on </font>
<font CLASS=comment>// Windows and is always replaced with '\\<server>\pipe\'</font>

<font CLASS=preproc>#ifndef</font> WIN32 
<font CLASS=preproc>#</font>  define DEF_NAMED_PIPES_DIR <font CLASS=dblquot>"/tmp/"</font> 
<font CLASS=preproc>#endif</font> 


<font CLASS=preproc>#ifdef</font> WIN32 

<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> DEF_PIPE_TIMEOUT <font CLASS=symbols>=</font> <font CLASS=integer>20000</font>;         <font CLASS=comment>// in milliseconds, for reading and writing</font>
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> DEF_PIPE_OPEN_TIMEOUT <font CLASS=symbols>=</font> <font CLASS=integer>1000</font>;     <font CLASS=comment>// for connecting to the remote pipe:</font>
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> DEF_PIPE_OPEN_RETRY <font CLASS=symbols>=</font> <font CLASS=integer>5</font>;          <font CLASS=comment>//    will double the timeout value for each retry,</font>
                                            <font CLASS=comment>//    i.e. 1 second, then 2, then 4 etc.</font>
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> DEF_PIPE_SYSTEM_BUF_SIZE <font CLASS=symbols>=</font> <font CLASS=integer>4096</font>;

<font CLASS=preproc>#endif</font> 


<font CLASS=keyword>class</font> namedpipe: public fdxstm
{
    <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> npserver;

<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    string pipename;
    <font CLASS=keytype>int</font>    svhandle;

<font CLASS=preproc>#ifdef</font> WIN32 
    // we use overlapped IO in order to have timed waiting in serve()
    // and also to implement timeout error on the client side
    OVERLAPPED ovr;
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> dorawread(<font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> dorawwrite(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);
    <font CLASS=keytype>static</font> string realpipename(<font CLASS=keyword>const</font> string& pipename, <font CLASS=keyword>const</font> string& svrname <font CLASS=symbols>=</font> nullstring);
    <font CLASS=keytype>void</font> initovr();
<font CLASS=preproc>#else</font> 
    <font CLASS=keytype>static</font> string realpipename(<font CLASS=keyword>const</font> string& pipename);
    <font CLASS=keytype>static</font> <font CLASS=keytype>bool</font> setupsockaddr(<font CLASS=keyword>const</font> string& pipename, <font CLASS=keytype>void</font>* sa);
    <font CLASS=keytype>void</font> initovr()  {}
<font CLASS=preproc>#endif</font> 

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();
    <font CLASS=keyword>virtual</font> large doseek(large, ioseekmode);

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    namedpipe();
    namedpipe(<font CLASS=keyword>const</font> string& ipipename);
<font CLASS=preproc>#ifdef</font> WIN32 
    namedpipe(<font CLASS=keyword>const</font> string& ipipename, <font CLASS=keyword>const</font> string& servername);
<font CLASS=preproc>#endif</font> 
    <font CLASS=keyword>virtual</font> ~namedpipe();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> flush();
    <font CLASS=keyword>virtual</font> string get_streamname();

    string get_pipename()   { <font CLASS=keyword>return</font> pipename; }
    <font CLASS=keytype>void</font> set_pipename(<font CLASS=keyword>const</font> string&);
    <font CLASS=keytype>void</font> set_pipename(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*);
};


<font CLASS=keyword>class</font> npserver: public unknown
{
    string pipename;
    <font CLASS=keytype>int</font>    handle;
    <font CLASS=keytype>bool</font>   active;

    <font CLASS=keytype>void</font> error(<font CLASS=keytype>int</font> code, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* defmsg);
    <font CLASS=keytype>void</font> open();
    <font CLASS=keytype>void</font> close();
<font CLASS=preproc>#ifdef</font> WIN32 
    <font CLASS=keytype>void</font> openinst();
    <font CLASS=keytype>void</font> closeinst();
<font CLASS=preproc>#endif</font> 

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    npserver(<font CLASS=keyword>const</font> string& ipipename);
    ~npserver();

    <font CLASS=keytype>bool</font> serve(namedpipe& client, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);
};


<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// ---  utility streams ----------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>

<font CLASS=comment>//</font>
<font CLASS=comment>// MD5 -- message digest algorithm</font>
<font CLASS=comment>// Derived from L. Peter Deutsch's work, please see src/pmd5.cxx</font>
<font CLASS=comment>//</font>


<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> md5_digsize <font CLASS=symbols>=</font> <font CLASS=integer>16</font>;
<font CLASS=keyword>typedef</font> uchar md5_digest[md5_digsize];

<font CLASS=comment>// from md5.h</font>

<font CLASS=keyword>typedef</font> <font CLASS=keytype>unsigned</font> <font CLASS=keytype>char</font> md5_byte_t; <font CLASS=comment>/* 8-bit byte */</font>
<font CLASS=keyword>typedef</font> <font CLASS=keytype>unsigned</font> <font CLASS=keytype>int</font> md5_word_t; <font CLASS=comment>/* 32-bit word */</font>


<font CLASS=keyword>typedef</font> <font CLASS=keyword>struct</font> md5_state_s
{
    md5_word_t count[<font CLASS=integer>2</font>];	<font CLASS=comment>/* message length in bits, lsw first */</font>
    md5_word_t abcd[<font CLASS=integer>4</font>];		<font CLASS=comment>/* digest buffer */</font>
    md5_byte_t buf[<font CLASS=integer>64</font>];		<font CLASS=comment>/* accumulate block */</font>
} md5_state_t;


<font CLASS=keyword>class</font> outmd5: public outfilter
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    md5_state_s ctx;
    md5_digest digest;

    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> dorawwrite(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> count);

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    outmd5(outstm* istm <font CLASS=symbols>=</font> nil);
    <font CLASS=keyword>virtual</font> ~outmd5();
    
    <font CLASS=keyword>virtual</font> string get_streamname();

    <font CLASS=keyword>const</font> <font CLASS=keytype>unsigned</font> <font CLASS=keytype>char</font>* get_bindigest()  { close(); <font CLASS=keyword>return</font> digest; }
    string get_digest();
};


<font CLASS=comment>//</font>
<font CLASS=comment>// null output stream</font>
<font CLASS=comment>//</font>


<font CLASS=keyword>class</font> outnull: public outstm
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font>  dorawwrite(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*, <font CLASS=keytype>int</font>);
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doopen();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> doclose();
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    outnull();
    <font CLASS=keyword>virtual</font> ~outnull();
    <font CLASS=keyword>virtual</font> string get_streamname();
};


<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// ---  unit ---------------------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>


<font CLASS=preproc>#ifdef</font> _MSC_VER 
<font CLASS=comment>// disable "type name first seen using 'struct' now seen using 'class'" warning</font>
<font CLASS=preproc>#</font>  pragma warning (disable: <font CLASS=integer>4099</font>) 
<font CLASS=comment>// disable "class '...' needs to have dll-interface to be used by clients of class </font>
<font CLASS=comment>// '...'" warning, since the compiler may sometimes give this warning incorrectly.</font>
<font CLASS=preproc>#</font>  pragma warning (disable: <font CLASS=integer>4251</font>) 
<font CLASS=preproc>#endif</font> 

<font CLASS=keyword>class</font> unit_thread;

<font CLASS=keyword>class</font> unit: public component
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
    <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> unit_thread;

    unit*         pipe_next;    <font CLASS=comment>// next unit in the pipe chain, assigned by connect()</font>
    unit_thread*  main_thread;  <font CLASS=comment>// async execution thread, started by run() if necessary</font>
    <font CLASS=keytype>int</font>           running;      <font CLASS=comment>// running status, to protect from recursive calls to run() and waitfor()</font>

    <font CLASS=keytype>void</font> do_main();

<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
    compref<instm> uin;
    compref<outstm> uout;

    unit();
    <font CLASS=keyword>virtual</font> ~unit();
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();

    // things that may be overridden in descendant classes
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> main();        <font CLASS=comment>// main code, called from run()</font>
    <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> cleanup();     <font CLASS=comment>// main code cleanup, called from run()</font>

    // service methods
    <font CLASS=keytype>void</font> connect(unit* next);
    <font CLASS=keytype>void</font> run(<font CLASS=keytype>bool</font> async <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>);
    <font CLASS=keytype>void</font> waitfor();
};
<font CLASS=keyword>typedef</font> unit* punit;


<font CLASS=keyword>typedef</font> unit CUnit;         <font CLASS=comment>// send me a $10 check if you use this alias (not obligatory though,</font>
                            <font CLASS=comment>// because the library is free, after all)</font>


<font CLASS=comment>//</font>
<font CLASS=comment>// standard input, output and error devices</font>
<font CLASS=comment>//</font>

<font CLASS=keyword>extern</font> infile  pin;
<font CLASS=keyword>extern</font> logfile pout;
<font CLASS=keyword>extern</font> logfile perr;
<font CLASS=keyword>extern</font> outnull pnull;


<font CLASS=preproc>#ifdef</font> _MSC_VER 
<font CLASS=preproc>#pragma</font> pack(pop) 
<font CLASS=preproc>#endif</font> 


PTYPES_END

<font CLASS=preproc>#endif</font> <font CLASS=comment>// __PSTREAMS_H__ </font>




</pre>

</div>


<hr noshade></body>
</html>
Source at commit 209d6fa3805c created 11 years 7 months ago.
By Nathan Adams, Updating tparray to use variants as array because tpodlist was causing variant data corruption

Archive Download this file

Branches

Tags

Page rendered in 0.76887s using 11 queries.