1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
#pragma once
#include "iversioncontrol.h"
#include "itextstream.h"
#include "MapResourceStream.h"
namespace stream
{
// Loading the given archive file into a buffer
// to serve the contents as MapResourceStream
class VcsMapResourceStream :
public MapResourceStream
{
private:
std::stringstream _contentStream;
bool _opened;
public:
using Ptr = std::shared_ptr<VcsMapResourceStream>;
VcsMapResourceStream(const ArchiveTextFilePtr& vcsArchive)
{
rMessage() << "Opened text file in VCS: " << vcsArchive->getName() << std::endl;
// We can't be sure if the returned stream is seekable,
// so load everything into a seekable string stream
std::istream vfsStream(&(vcsArchive->getInputStream()));
_contentStream << vfsStream.rdbuf();
}
// Returns true if the stream has been successfully opened
virtual bool isOpen() const override
{
return true;
}
// Returns the (seekable) input stream
virtual std::istream& getStream() override
{
return _contentStream;
}
// Factory method which will return a stream reference of the given VCS file
static Ptr OpenFromVcs(vcs::IVersionControlModule& module, const std::string& uri)
{
auto file = module.openTextFile(uri);
if (!file)
{
rMessage() << "Could not open file " << uri << " from VCS module " << module.getUriPrefix() << std::endl;
return Ptr();
}
return std::make_shared<VcsMapResourceStream>(file);
}
};
}
|