$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Jeff Flinn (TriumphSprint2000_at_[hidden])
Date: 2004-08-31 09:39:30
I've tried to replace a couple of existing derived stream/streambuf classes
that are used with boost::serialization i/o archives to support
Drag/Drop/Copy/Paste in an MFC application.
The Drop/Paste side works great and significantly simplifies and reduces the
amount of code req'd:
class CSharedFileIStream
: public boost::io::stream_facade< boost::io::array_source >
{
   typedef boost::io::array_source             tSource;
   typedef boost::io::stream_facade< tSource > tBase;
   HGLOBAL mMemHdl;
public:
  ~CSharedFileIStream(                 ){ ::GlobalUnlock(mMemHdl); }
   CSharedFileIStream( HGLOBAL aMemHdl )
   :   tBase( (LPTSTR)::GlobalLock(aMemHdl), ::GlobalSize(aMemHdl) )
   , mMemHdl( aMemHdl                                              )
   {}
};
Used like so:
CSharedFileIStream lIn( lMemHdl );
boost::archive::binary_iarchive ia( lIn );
ia >> aVal;
Unfortunately, the Drag/Copy side produces a access violation in the
std::locale copy constructor, when
boost::io::detail::indirect_streambuf::imbue calls
std::basic_streambuf::pbuimbue. I've tried the following with both
binary/text archive types:
struct CSharedFileSink : public boost::io::sink
{
   CSharedFile& mSharedFile;
   CSharedFileSink( CSharedFile& aSharedFile )
   : boost::io::sink()
   , mSharedFile(aSharedFile)
   {}
   void write( const char* s, std::streamsize n ){ mSharedFile.Write( s,
n ); }
};
class CSharedFileOStream : public boost::io::stream_facade<CSharedFileSink>
{
  typedef boost::io::stream_facade<CSharedFileSink> tBase;
  public:
    CSharedFileOStream( CSharedFile& aSharedFile )
    : tBase( CSharedFileSink( aSharedFile ) )
    {}
};
Used like so:
CSharedFile        lOutFile;
CSharedFileOStream lOut( lOutFile );
 boost::archive::text_oarchive oa( lOut );
Am I doing anything obviously wrong? I love the source/sink approach and
would love to take advantage of it's conceptual simplification in dealing
with streams.
Thanks, Jeff