summaryrefslogtreecommitdiffstats
path: root/wsd/AdminModel.hpp
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2016-11-24 14:52:34 +0000
committerMichael Meeks <michael.meeks@collabora.com>2016-11-25 09:58:48 +0000
commitcca657c8f2031ec88366c52f5e8e10c2e04129f9 (patch)
treea2273ed56080856d8494ba759b8ed0e435ebba99 /wsd/AdminModel.hpp
parentRevert "loolwsd: support reading long messages directly" (diff)
downloadonline-cca657c8f2031ec88366c52f5e8e10c2e04129f9.tar.gz
online-cca657c8f2031ec88366c52f5e8e10c2e04129f9.zip
Apply the pre-branch rename script to re-organize the source.
Diffstat (limited to 'wsd/AdminModel.hpp')
-rw-r--r--wsd/AdminModel.hpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/wsd/AdminModel.hpp b/wsd/AdminModel.hpp
new file mode 100644
index 0000000000..f2163b52ec
--- /dev/null
+++ b/wsd/AdminModel.hpp
@@ -0,0 +1,191 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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_ADMINMODEL_HPP
+#define INCLUDED_ADMINMODEL_HPP
+
+#include <memory>
+#include <set>
+#include <string>
+
+#include <Poco/Process.h>
+
+#include "Log.hpp"
+#include <LOOLWebSocket.hpp>
+#include "Util.hpp"
+
+/// A client view in Admin controller.
+class View
+{
+public:
+ View(const std::string& sessionId) :
+ _sessionId(sessionId),
+ _start(std::time(nullptr))
+ {
+ }
+
+ void expire() { _end = std::time(nullptr); }
+ bool isExpired() const { return _end != 0 && std::time(nullptr) >= _end; }
+
+private:
+ const std::string _sessionId;
+ const std::time_t _start;
+ std::time_t _end = 0;
+};
+
+/// A document in Admin controller.
+class Document
+{
+public:
+ Document(const std::string& docKey,
+ Poco::Process::PID pid,
+ const std::string& filename)
+ : _docKey(docKey),
+ _pid(pid),
+ _filename(filename),
+ _start(std::time(nullptr))
+ {
+ }
+
+ Poco::Process::PID getPid() const { return _pid; }
+
+ std::string getFilename() const { return _filename; }
+
+ bool isExpired() const { return _end != 0 && std::time(nullptr) >= _end; }
+
+ std::time_t getElapsedTime() const { return std::time(nullptr) - _start; }
+
+ void addView(const std::string& sessionId);
+
+ int expireView(const std::string& sessionId);
+
+ unsigned getActiveViews() const { return _activeViews; }
+
+ const std::map<std::string, View>& getViews() const { return _views; }
+
+private:
+ const std::string _docKey;
+ const Poco::Process::PID _pid;
+ /// SessionId mapping to View object
+ std::map<std::string, View> _views;
+ /// Total number of active views
+ unsigned _activeViews = 0;
+ /// Hosted filename
+ std::string _filename;
+
+ std::time_t _start;
+ std::time_t _end = 0;
+};
+
+/// An Admin session subscriber.
+class Subscriber
+{
+public:
+ Subscriber(int sessionId, std::shared_ptr<LOOLWebSocket>& ws)
+ : _sessionId(sessionId),
+ _ws(ws),
+ _start(std::time(nullptr))
+ {
+ Log::info("Subscriber ctor.");
+ }
+
+ ~Subscriber()
+ {
+ Log::info("Subscriber dtor.");
+ }
+
+ bool notify(const std::string& message);
+
+ bool subscribe(const std::string& command);
+
+ void unsubscribe(const std::string& command);
+
+ void expire() { _end = std::time(nullptr); }
+
+ bool isExpired() const { return _end != 0 && std::time(nullptr) >= _end; }
+
+private:
+ /// Admin session Id
+ int _sessionId;
+
+ /// LOOLWebSocket to use to send messages to session
+ std::weak_ptr<LOOLWebSocket> _ws;
+
+ std::set<std::string> _subscriptions;
+
+ std::time_t _start;
+ std::time_t _end = 0;
+};
+
+/// The Admin controller implementation.
+class AdminModel
+{
+public:
+ AdminModel()
+ {
+ Log::info("AdminModel ctor.");
+ }
+
+ ~AdminModel()
+ {
+ Log::info("AdminModel dtor.");
+ }
+
+ std::string query(const std::string& command);
+
+ /// Returns memory consumed by all active loolkit processes
+ unsigned getTotalMemoryUsage();
+
+ void subscribe(int sessionId, std::shared_ptr<LOOLWebSocket>& ws);
+ void subscribe(int sessionId, const std::string& command);
+
+ void unsubscribe(int sessionId, const std::string& command);
+
+ void clearMemStats() { _memStats.clear(); }
+
+ void clearCpuStats() { _cpuStats.clear(); }
+
+ void addMemStats(unsigned memUsage);
+
+ void addCpuStats(unsigned cpuUsage);
+
+ void setCpuStatsSize(unsigned size);
+
+ void setMemStatsSize(unsigned size);
+
+ void notify(const std::string& message);
+
+ void addDocument(const std::string& docKey, Poco::Process::PID pid, const std::string& filename, const std::string& sessionId);
+
+ void removeDocument(const std::string& docKey, const std::string& sessionId);
+ void removeDocument(const std::string& docKey);
+
+private:
+ std::string getMemStats();
+
+ std::string getCpuStats();
+
+ unsigned getTotalActiveViews();
+
+ std::string getDocuments() const;
+
+private:
+ std::map<int, Subscriber> _subscribers;
+ std::map<std::string, Document> _documents;
+
+ std::list<unsigned> _memStats;
+ unsigned _memStatsSize = 100;
+
+ std::list<unsigned> _cpuStats;
+ unsigned _cpuStatsSize = 100;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */