WvStreams
wvconstream.cc
00001 /*
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  * 
00005  * Declarations for wvcon, wvin, wvout, and wverr global streams.
00006  */
00007 #include "wvfdstream.h"
00008 #include "wvmoniker.h"
00009 #include "wvlinkerhack.h"
00010 
00011 WV_LINK(WvConStream);
00012 
00013 // just like WvFDStream, but doesn't close the fd
00014 class _WvConStream : public WvFDStream
00015 {
00016 public:
00017     bool isopen;
00018     
00019     _WvConStream(int _rfd, int _wfd, WvStringParm name = WvString::null);
00020     virtual ~_WvConStream();
00021     virtual void close();
00022     virtual bool isok() const;
00023 };
00024 
00025 
00026 _WvConStream::_WvConStream(int _rfd, int _wfd,
00027         WvStringParm name)
00028     : WvFDStream(_rfd, _wfd)
00029 {
00030     isopen = true;
00031     if (!name.isnull())
00032         set_wsname(name);
00033 }
00034 
00035 
00036 _WvConStream::~_WvConStream()
00037 {
00038     close();
00039 }
00040 
00041 
00042 void _WvConStream::close()
00043 {
00044     isopen = false;
00045     setfd(-1); // prevent WvFdStream from closing our fds
00046     WvFDStream::close();
00047 }
00048 
00049 
00050 bool _WvConStream::isok() const
00051 {
00052     return isopen;
00053 }
00054 
00055 
00056 // console streams
00057 #ifdef _WIN32
00058 
00059 #include "streams.h"
00060 SocketFromFDMaker _zero(_dup(0), fd2socket_fwd, false);
00061 SocketFromFDMaker _one(1, socket2fd_fwd, true);
00062 SocketFromFDMaker _two(2, socket2fd_fwd, true);
00063 
00064 static _WvConStream _wvcon(_zero.GetSocket(), _one.GetSocket(), "wvcon");
00065 static _WvConStream _wvin(_zero.GetSocket(), -1, "wvin");
00066 static _WvConStream _wvout(-1, _one.GetSocket(), "wvout");
00067 static _WvConStream _wverr(-1, _two.GetSocket(), "wverr");
00068 
00069 #else // _WIN32
00070 
00071 static _WvConStream _wvcon(0, 1, "wvcon");
00072 static _WvConStream _wvin(0, -1, "wvin");
00073 static _WvConStream _wvout(-1, 1, "wvout");
00074 static _WvConStream _wverr(-1, 2, "wverr");
00075 
00076 #endif // !_WIN32
00077 
00078 WvStream *wvcon = &_wvcon;
00079 WvStream *wvin = &_wvin;
00080 WvStream *wvout = &_wvout;
00081 WvStream *wverr = &_wverr;
00082 
00083 
00084 static IWvStream *create_stdin(WvStringParm s, IObject*)
00085 {
00086     wvin->addRef();
00087     return wvin;
00088 }
00089 static IWvStream *create_stdout(WvStringParm s, IObject*)
00090 {
00091     wvout->addRef();
00092     return wvout;
00093 }
00094 static IWvStream *create_stderr(WvStringParm s, IObject*)
00095 {
00096     wverr->addRef();
00097     return wverr;
00098 }
00099 static IWvStream *create_stdio(WvStringParm s, IObject*)
00100 {
00101     wvcon->addRef();
00102     return wvcon;
00103 }
00104 
00105 static WvMoniker<IWvStream> reg0("stdin",  create_stdin);
00106 static WvMoniker<IWvStream> reg1("stdout", create_stdout);
00107 static WvMoniker<IWvStream> reg2("stderr", create_stderr);
00108 static WvMoniker<IWvStream> reg3("stdio",  create_stdio);
00109