WvStreams
pwvstream.h
00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  */ 
00005 #ifndef __PWVSTREAM_H
00006 #define __PWVSTREAM_H
00007 
00008 #include "iwvstream.h"
00009 #include "wvstream.h"      // FIXME: don't include this!
00010 #include "wvstreamclone.h" // FIXME: don't include this!
00011 #include "wvmoniker.h"
00012 #include "wvtr1.h"
00013 
00036 class PWvStream : public wv::shared_ptr<WvStream>
00037 {
00038     static WvStream *clean_stream(IWvStream *s)
00039     {
00040         WvStream *ss = dynamic_cast<WvStream *>(s);
00041         if (ss)
00042             return ss;
00043         else
00044             return new WvStreamClone(s);
00045     }
00046     
00047     static WvStream *make_stream(WvStringParm moniker, IObject *obj)
00048     {
00049         IWvStream *s = IWvStream::create(moniker, obj);
00050         if (!s)
00051             s = wvcreate<IWvStream>("null:");
00052         assert(s != NULL);
00053         return clean_stream(s);
00054     }
00055     
00056 public:
00057     PWvStream()
00058     {
00059         // Pointer points to NULL right now, but it could be reassigned
00060         // later using operator=().
00061     }
00062     
00063     PWvStream(IWvStream *s)
00064         : wv::shared_ptr<WvStream>(clean_stream(s),
00065                                   wv::bind(&IWvStream::release, _1))
00066     {
00067     }
00068     
00069     PWvStream(WvStringParm moniker, IObject *obj = 0)
00070         : wv::shared_ptr<WvStream>(make_stream(moniker, obj),
00071                                   wv::bind(&IWvStream::release, _1))
00072     {
00073         // Note: pointer is definitely not NULL here, because make_stream is
00074         // careful.
00075     }
00076     
00077     WvStream *addRef() const
00078     {
00079         if (get())
00080             get()->addRef();
00081         return get();
00082     }
00083 };
00084 
00085 #endif // __PWVSTREAM_H