libreoffice-online/loolwsd/LOOLSession.hpp
Tor Lillqvist 422dfd1767 Start on load testing
Add a new program, loadtest, that runs a requested number of client sessions
in parallel to a loolwsd server. A client session loads one of a list of test
documents, and does some operations on it.

Move the getTokenInteger() and getTokenString() functions out from LOOLSession
into a new namespace LOOLProtocol, as they are neeeded also in the loadtest
program.

Add, also in LOOLProtocol, functions to parse some of the messages from the
server. (In general that is done in client JavaScript code, of course; only
for testing purposes needed in C++ code.)
2015-03-26 17:04:08 +02:00

97 lines
3.2 KiB
C++

/* -*- 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
#define LOK_USE_UNSTABLE_API
#include <LibreOfficeKit/LibreOfficeKit.h>
#include <Poco/Net/WebSocket.h>
#include <Poco/Buffer.h>
#include <Poco/StringTokenizer.h>
#include <Poco/Types.h>
#include "TileCache.hpp"
class LOOLSession
{
public:
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);
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 forkOff();
void forwardRequest(const char *buffer, int length);
std::string _docURL;
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> _tileCache;
// Whether this session is to a LOOL client or to a child process
bool _toChildProcess;
// 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;
// Buffer for requests to be forwarded to the child process once
// it has completed its handshake.
std::vector<Poco::Buffer<char>*> _backLog;
// Map from child ids to the corresponding client session
static std::map<Poco::UInt64, LOOLSession*> _childToClient;
// Child only:
LibreOfficeKit *_loKit;
LibreOfficeKitDocument *_loKitDocument;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */