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 8edbcdac0d39 created 11 years 8 months ago.
By Nathan Adams, initial commit

Archive Download this file

Branches

Tags

Page rendered in 0.78026s using 11 queries.