WvStreams
|
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