From 0f26ab693e82d1c56ea0be653a8cd670abeb8f89 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Fri, 3 Oct 2014 15:54:36 +0000 Subject: Tweaked Bu::Uuid loading to pad it's data more cleanly. This will help ensure that we don't get valgrind errors, and is probably safer in general. Added Bu::ArchiveStream. It could use some tweaks, but as a quick hack it's handy to allow systems that can only read/write from/to streams to work with archives. --- src/unstable/archivestream.cpp | 127 +++++++++++++++++++++++++++++++++++++++++ src/unstable/archivestream.h | 49 ++++++++++++++++ src/unstable/uuid.cpp | 3 +- 3 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 src/unstable/archivestream.cpp create mode 100644 src/unstable/archivestream.h diff --git a/src/unstable/archivestream.cpp b/src/unstable/archivestream.cpp new file mode 100644 index 0000000..aa45e50 --- /dev/null +++ b/src/unstable/archivestream.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2007-2014 Xagasoft, All rights reserved. + * + * This file is part of the libbu++ library and is released under the + * terms of the license contained in the file LICENSE. + */ + +#include "bu/archivestream.h" + +Bu::ArchiveStream::ArchiveStream( Bu::ArchiveBase &ar ) : + ar( ar ), + iPos( 0 ) +{ +} + +Bu::ArchiveStream::~ArchiveStream() +{ +} + +void Bu::ArchiveStream::close() +{ + ar.close(); +} + +Bu::size Bu::ArchiveStream::read( void *pBuf, size iBytes ) +{ + ar.read( pBuf, iBytes ); + iPos += iBytes; + return iBytes; +} + +Bu::size Bu::ArchiveStream::write( const void *pBuf, size iBytes ) +{ + ar.write( pBuf, iBytes ); + iPos += iBytes; + return iBytes; +} + +Bu::size Bu::ArchiveStream::tell() +{ + return iPos; +} + +void Bu::ArchiveStream::seek( Bu::size ) +{ + throw Bu::UnsupportedException(); +} + +void Bu::ArchiveStream::setPos( Bu::size ) +{ + throw Bu::UnsupportedException(); +} + +void Bu::ArchiveStream::setPosEnd( Bu::size ) +{ + throw Bu::UnsupportedException(); +} + +bool Bu::ArchiveStream::isEos() +{ + return false; +} + +bool Bu::ArchiveStream::isOpen() +{ + return true; +} + +void Bu::ArchiveStream::flush() +{ +} + +bool Bu::ArchiveStream::canRead() +{ + return true; +} + +bool Bu::ArchiveStream::canWrite() +{ + return true; +} + +bool Bu::ArchiveStream::isReadable() +{ + return true; +} + +bool Bu::ArchiveStream::isWritable() +{ + return true; +} + +bool Bu::ArchiveStream::isSeekable() +{ + return false; +} + +bool Bu::ArchiveStream::isBlocking() +{ + return false; +} + +void Bu::ArchiveStream::setBlocking( bool ) +{ + throw Bu::UnsupportedException(); +} + +void Bu::ArchiveStream::setSize( Bu::size ) +{ + throw Bu::UnsupportedException(); +} + +Bu::size Bu::ArchiveStream::getSize() const +{ + return iPos; +} + +Bu::size Bu::ArchiveStream::getBlockSize() const +{ + return 1; +} + +Bu::String Bu::ArchiveStream::getLocation() const +{ + return "Archive"; +} + diff --git a/src/unstable/archivestream.h b/src/unstable/archivestream.h new file mode 100644 index 0000000..a8ef903 --- /dev/null +++ b/src/unstable/archivestream.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2007-2014 Xagasoft, All rights reserved. + * + * This file is part of the libbu++ library and is released under the + * terms of the license contained in the file LICENSE. + */ +#ifndef BU_ARCHIVE_STREAM_H +#define BU_ARCHIVE_STREAM_H + +#include "bu/archivebase.h" +#include "bu/stream.h" + +namespace Bu +{ + class ArchiveStream : public Stream + { + public: + ArchiveStream( Bu::ArchiveBase &ar ); + virtual ~ArchiveStream(); + + virtual void close(); + virtual size read( void *pBuf, size iBytes ); + virtual size write( const void *pBuf, size iBytes ); + virtual size tell(); + virtual void seek( size offset ); + virtual void setPos( size pos ); + virtual void setPosEnd( size pos ); + virtual bool isEos(); + virtual bool isOpen(); + virtual void flush(); + virtual bool canRead(); + virtual bool canWrite(); + virtual bool isReadable(); + virtual bool isWritable(); + virtual bool isSeekable(); + virtual bool isBlocking(); + virtual void setBlocking( bool bBlocking=true ); + virtual void setSize( size iSize ); + virtual size getSize() const; + virtual size getBlockSize() const; + virtual Bu::String getLocation() const; + + private: + Bu::ArchiveBase &ar; + size iPos; + }; +} + +#endif diff --git a/src/unstable/uuid.cpp b/src/unstable/uuid.cpp index db758d0..22517d7 100644 --- a/src/unstable/uuid.cpp +++ b/src/unstable/uuid.cpp @@ -104,7 +104,8 @@ Bu::Uuid Bu::Uuid::generate( Bu::Uuid::Type eType ) case System: #if defined(linux) Bu::File fIn( "/proc/sys/kernel/random/uuid", Bu::File::Read ); - char dat[36]; + char dat[37]; + memset( dat, 0, 37 ); fIn.read( dat, 36 ); id.set( dat ); #elif defined(WIN32) -- cgit v1.2.3