loolwsd/LOOLWSD.hpp | 4 ++- loolwsd/Storage.hpp | 63 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 4 deletions(-)
New commits: commit 743311af2137089e16bae3168a6e5413e3aee751 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Thu Mar 3 21:05:30 2016 -0500 loolwsd: added wopi storage manager Change-Id: Ia28fb3d42c43387432e0b183a1bcf6b0924da820 Reviewed-on: https://gerrit.libreoffice.org/22885 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/LOOLWSD.hpp b/loolwsd/LOOLWSD.hpp index ba11e68..a41cceb 100644 --- a/loolwsd/LOOLWSD.hpp +++ b/loolwsd/LOOLWSD.hpp @@ -100,7 +100,9 @@ public: else { Log::info("Public URI [" + uriPublic.toString() + - "] is not a file."); + "] assuming cloud storage."); + //TODO: Configure the storage to use. For now, assume it's WOPI. + std::unique_ptr<StorageBase> storage(new WopiStorage(docPath.toString())); } auto document = std::shared_ptr<DocumentURI>(new DocumentURI(uriPublic, uriJailed, childId)); diff --git a/loolwsd/Storage.hpp b/loolwsd/Storage.hpp index 1cf2991..f38c593 100644 --- a/loolwsd/Storage.hpp +++ b/loolwsd/Storage.hpp @@ -13,6 +13,8 @@ #include <string> +#include <Poco/Net/HTTPResponse.h> + #include "Auth.hpp" #include "Util.hpp" @@ -21,13 +23,20 @@ class StorageBase { public: - /// Returns a local file path given a URI. + StorageBase(const std::string& localStorePath) : + _localStorePath(localStorePath) + { + } + + /// Returns a local file path given a URI or ID. /// If necessary copies the file locally first. virtual std::string getFilePathFromURI(const std::string& uri) = 0; - /// Writes the contents of the file back to the URI. + /// Writes the contents of the file back to the source. virtual bool restoreFileToURI(const std::string& path, const std::string& uri) = 0; +protected: + const std::string _localStorePath; }; /// Trivial implementation of local storage that does not need do anything. @@ -51,11 +60,59 @@ public: } }; +class WopiStorage : public StorageBase +{ +public: + WopiStorage(const std::string& localStorePath) : + StorageBase(localStorePath) + { + } + + /// uri format: http://server/<...>/wopi*/files/<id>/content + std::string getFilePathFromURI(const std::string& uri) override + { + Poco::URI uriObject(uri); + Poco::Net::HTTPClientSession session(uriObject.getHost(), uriObject.getPort()); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, uri, Poco::Net::HTTPMessage::HTTP_1_1); + Poco::Net::HTTPResponse response; + session.sendRequest(request); + std::istream& rs = session.receiveResponse(response); + Log::info() << "WOPI::GetFile Status: " << response.getStatus() << " " << response.getReason() << Log::end; + + //TODO: Get proper filename. + const std::string local_filename = _localStorePath + "/filename"; + std::ofstream ofs(local_filename); + std::copy(std::istreambuf_iterator<char>(rs), + std::istreambuf_iterator<char>(), + std::ostreambuf_iterator<char>(ofs)); + return local_filename; + } + + bool restoreFileToURI(const std::string& path, const std::string& uri) override + { + Poco::URI uriObject(uri); + Poco::Net::HTTPClientSession session(uriObject.getHost(), uriObject.getPort()); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, uri, Poco::Net::HTTPMessage::HTTP_1_1); + + std::ifstream ifs(path); + request.read(ifs); + + Poco::Net::HTTPResponse response; + session.sendRequest(request); + Log::info() << "WOPI::PutFile Status: " << response.getStatus() << " " << response.getReason() << Log::end; + + return (response.getStatus() == Poco::Net::HTTPResponse::HTTP_OK); + } +}; + class WebDAVStorage : public StorageBase { public: - WebDAVStorage(const std::string& url, std::unique_ptr<AuthBase> authAgent) : + WebDAVStorage(const std::string& localStorePath, + const std::string& url, + std::unique_ptr<AuthBase> authAgent) : + StorageBase(localStorePath), _url(url), _authAgent(std::move(authAgent)) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits