/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef INCLUDED_LOOLSESSION_HPP #define INCLUDED_LOOLSESSION_HPP #include #include #define LOK_USE_UNSTABLE_API #include #include #include #include #include #include "TileCache.hpp" class LOOLSession { public: LOOLSession(Poco::UInt64 childId, const std::string& jail); LOOLSession(Poco::Net::WebSocket& ws, LibreOfficeKit *loKit = nullptr); ~LOOLSession(); bool handleInput(char *buffer, int length); bool haveSeparateProcess() const; bool toChildProcess() const; void sendTextFrame(const std::string& text); void sendBinaryFrame(const char *buffer, int length); // Set up the chroot environment for one child process and start // it, in advance of it being actually needed static void preFork(); private: bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens); bool getStatus(const char *buffer, int length); void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens); bool keyEvent(const char *buffer, int length, Poco::StringTokenizer& tokens); bool mouseEvent(const char *buffer, int length, Poco::StringTokenizer& tokens); bool unoCommand(const char *buffer, int length, Poco::StringTokenizer& tokens); bool selectText(const char *buffer, int length, Poco::StringTokenizer& tokens); bool selectGraphic(const char *buffer, int length, Poco::StringTokenizer& tokens); bool resetSelection(const char *buffer, int length, Poco::StringTokenizer& tokens); bool saveAs(const char *buffer, int length, Poco::StringTokenizer& tokens); void dispatchChild(); void forwardRequest(const char *buffer, int length); static Poco::Path getJailPath(Poco::UInt64 childId); bool isChildProcess() const; // Fields common to parent and child: // In the parent process, the websocket to the LOOL client or the // child process. In a child process, the websocket to the // parent. Poco::Net::WebSocket *_ws; std::unique_ptr _tileCache; // Whether this session is to a LOOL client or to a child process bool _toChildProcess; // In the parent, the actual URL. In the child, the copy inside the chroot jail. std::string _docURL; // Parent only: // In sessions to LOOL clients only: // This points to the other websocket to the child process handling the // document in question, if any. (If haveSeparateProcess() is true // and the child process has started and completed its handshake // with the parent process). In the session to the child process, // this points to the websocket to the LOOL client. Poco::Net::WebSocket *_peerWs; // The id of the child process Poco::UInt64 _childId; // Map from child ids to the corresponding session to the child // process. static std::map _childIdToChildSession; // Pre-forked child processes that haven't yet connected. static std::set _pendingPreForkedChildren; // Child processes that have connected but are not yet assigned a // document to work on. static std::set _availableChildSessions; // Child only: std::string _jail; std::string _loSubPath; LibreOfficeKit *_loKit; LibreOfficeKitDocument *_loKitDocument; }; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */