loolwsd/Common.hpp | 1 loolwsd/LOOLWSD.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++-- loolwsd/discovery.xml | 44 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-)
New commits: commit 8a2bd1127b025bd8b8713b3b5b38db511c7589e6 Author: Henry Castro <[email protected]> Date: Tue Mar 15 11:35:59 2016 -0400 loolwsd: WOPI, handle request discovery diff --git a/loolwsd/Common.hpp b/loolwsd/Common.hpp index d6b7b3f..053ce94 100644 --- a/loolwsd/Common.hpp +++ b/loolwsd/Common.hpp @@ -36,6 +36,7 @@ constexpr int SMALL_MESSAGE_SIZE = READ_BUFFER_SIZE / 2; static const std::string JailedDocumentRoot = "/user/docs/"; static const std::string CHILD_URI = "/loolws/child?"; +static const std::string LOLEAFLET_PATH = "/loleaflet/dist/loleaflet.html?"; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index f98429b..fcb7da6 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -92,6 +92,13 @@ DEALINGS IN THE SOFTWARE. #include <Poco/Util/OptionException.h> #include <Poco/Util/OptionSet.h> #include <Poco/Util/ServerApplication.h> +#include <Poco/DOM/DOMParser.h> +#include <Poco/DOM/DOMWriter.h> +#include <Poco/SAX/InputSource.h> +#include <Poco/DOM/AutoPtr.h> +#include <Poco/DOM/Document.h> +#include <Poco/DOM/NodeList.h> +#include <Poco/DOM/Element.h> #include "Admin.hpp" #include "Auth.hpp" @@ -148,6 +155,13 @@ using Poco::Util::MissingOptionException; using Poco::Util::Option; using Poco::Util::OptionSet; using Poco::Util::ServerApplication; +using Poco::XML::InputSource; +using Poco::XML::AutoPtr; +using Poco::XML::DOMParser; +using Poco::XML::DOMWriter; +using Poco::XML::Node; +using Poco::XML::NodeList; +using Poco::XML::Element; std::map<std::string, std::shared_ptr<DocumentBroker>> LOOLWSD::DocBrokers; std::mutex LOOLWSD::DocBrokersMutex; @@ -329,7 +343,7 @@ private: void handlePostRequest(HTTPServerRequest& request, HTTPServerResponse& response, const std::string& id) { - Log::info("Post request: " + request.getURI() + "]"); + Log::info("Post request: [" + request.getURI() + "]"); StringTokenizer tokens(request.getURI(), "/?"); if (tokens.count() >= 2 && tokens[1] == "convert-to") { @@ -615,6 +629,37 @@ private: } } + void handleGetDiscovery(HTTPServerRequest& request, HTTPServerResponse& response) + { + DOMParser parser; + DOMWriter writer; + const std::string discoveryPath = Path(Application::instance().commandPath()).parent().toString() + "discovery.xml"; + const std::string mediaType = "text/xml"; + const std::string action = "action"; + const std::string urlsrc = "urlsrc"; + const std::string uriValue = "http://" + request.getHost() + LOLEAFLET_PATH; + + InputSource inputSrc(discoveryPath); + AutoPtr<Poco::XML::Document> docXML = parser.parse(&inputSrc); + AutoPtr<NodeList> listNodes = docXML->getElementsByTagName(action); + + for (unsigned long it = 0; it < listNodes->length(); it++) + { + static_cast<Element*>(listNodes->item(it))->setAttribute(urlsrc, uriValue); + } + + std::ostringstream ostrXML; + writer.writeNode(ostrXML, docXML); + + response.set("User-Agent", "LOOLWSD WOPI Agent"); + response.setContentLength(ostrXML.str().length()); + response.setContentType(mediaType); + response.setChunkedTransferEncoding(false); + + std::ostream& ostr = response.send(); + ostr << ostrXML.str(); + } + public: void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) override @@ -629,7 +674,12 @@ public: try { - if (!(request.find("Upgrade") != request.end() && Poco::icompare(request["Upgrade"], "websocket") == 0)) + if (request.getMethod() == HTTPRequest::HTTP_GET && request.getURI() == "/hosting/discovery") + { + // http://server/hosting/discovery + handleGetDiscovery(request, response); + } + else if (!(request.find("Upgrade") != request.end() && Poco::icompare(request["Upgrade"], "websocket") == 0)) { handlePostRequest(request, response, id); } diff --git a/loolwsd/discovery.xml b/loolwsd/discovery.xml new file mode 100755 index 0000000..ac78c20 --- /dev/null +++ b/loolwsd/discovery.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<wopi-discovery> + <net-zone name="external-http"> + <app name=" "> + <action name="edit" ext="odt"/> + </app> + <app name="application/vnd.oasis.opendocument.presentation"> + <action name="edit" ext="odp"/> + </app> + <app name="application/vnd.oasis.opendocument.spreadsheet"> + <action name="edit" ext="ods"/> + </app> + <app name="application/vnd.oasis.opendocument.graphics"> + <action name="edit" ext="odg"/> + </app> + <app name="application/msword"> + <action name="edit" ext="doc"/> + </app> + <app name="application/vnd.lotus-wordpro"> + <action name="edit" ext="lwp"/> + </app> + <app name="image/svg+xml"> + <action name="edit" ext="svg"/> + </app> + <app name="application/vnd.ms-powerpoint"> + <action name="edit" ext="pot"/> + </app> + <app name="application/vnd.ms-excel"> + <action name="edit" ext="xla"/> + </app> + <app name="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"> + <action name="edit" ext="xlsx"/> + </app> + <app name="application/vnd.visio"> + <action name="edit" ext="vsd"/> + </app> + <app name="application/vnd.wordperfect"> + <action name="edit" ext="wpd"/> + </app> + <app name="application/vnd.wordperfect"> + <action name="edit" ext="wpd"/> + </app> + </net-zone> +</wopi-discovery> _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
