[Libreoffice-commits] online.git: loolwsd/LOOLKit.cpp
Henry Castro
hcastro at collabora.com
Sat Jan 9 03:28:52 PST 2016
loolwsd/LOOLKit.cpp | 54 ++++++++++++++++++++--------------------------------
1 file changed, 21 insertions(+), 33 deletions(-)
New commits:
commit d20e9399fc194143d71383d4bfefb5f3eef2a947
Author: Henry Castro <hcastro at collabora.com>
Date: Sat Jan 9 07:27:57 2016 -0400
loolwsd: revert, refactor lokit Document
I did not consider shared document case.
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index 32c8f4d..ff7c3c3 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -470,13 +470,14 @@ private:
class Document
{
public:
- Document(LibreOfficeKit *loKit, const std::string& jailId)
+ Document(LibreOfficeKit *loKit, const std::string& jailId,
+ const std::string& url)
: _loKit(loKit),
_jailId(jailId),
- _url(""),
+ _url(url),
_loKitDocument(nullptr)
{
- Log::info("Document ctor on child [" + jailId + "].");
+ Log::info("Document ctor for url [" + url + "] on child [" + jailId + "].");
}
~Document()
@@ -505,10 +506,9 @@ public:
}
}
- void createSession(const std::string& sessionId, const std::string& url)
+ void createSession(const std::string& sessionId)
{
const auto& aItem = _connections.find(sessionId);
- _url = url;
if (aItem != _connections.end())
{
@@ -579,19 +579,13 @@ public:
return _connections.size() > 0;
}
- const std::string& getURL()
- {
- return _url;
- }
-
private:
void onLoad(LibreOfficeKitDocument *loKitDocument, const int viewId)
{
Log::info("Document [" + _url + "] loaded as view #" + std::to_string(viewId) + ".");
- // TODO. destroy lokit document when changed URL
- // if (_loKitDocument != nullptr)
- // assert(_loKitDocument == loKitDocument);
+ if (_loKitDocument != nullptr)
+ assert(_loKitDocument == loKitDocument);
_loKitDocument = loKitDocument;
}
@@ -604,7 +598,7 @@ private:
LibreOfficeKit *_loKit;
const std::string _jailId;
- std::string _url;
+ const std::string _url;
LibreOfficeKitDocument *_loKitDocument;
@@ -627,6 +621,8 @@ void lokit_main(const std::string &loSubPath, const std::string& jailId, const s
assert(!jailId.empty());
assert(!loSubPath.empty());
+ std::map<std::string, std::shared_ptr<Document>> _documents;
+
static const std::string process_name = "loolkit";
#ifdef __linux
if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(process_name.c_str()), 0, 0, 0) != 0)
@@ -650,9 +646,6 @@ void lokit_main(const std::string &loSubPath, const std::string& jailId, const s
exit(-1);
}
- // Singlenton instance
- std::shared_ptr<Document> pDocument(std::make_shared<Document>(loKit.get(), jailId));
-
try
{
int writerBroker;
@@ -729,16 +722,14 @@ void lokit_main(const std::string &loSubPath, const std::string& jailId, const s
if (tokens[0] == "search")
{
- // remove unloaded documents
- pDocument->purgeSessions();
-
- if (!pDocument->hasConnections())
+ if (_documents.empty())
{
aResponse += "empty \r\n";
}
else
{
- aResponse += (pDocument->getURL() == tokens[1] ? "ok \r\n" : "no \r\n");
+ const auto& it = _documents.find(tokens[1]);
+ aResponse += (it != _documents.end() ? "ok \r\n" : "no \r\n");
}
}
else if (tokens[0] == "thread")
@@ -746,16 +737,13 @@ void lokit_main(const std::string &loSubPath, const std::string& jailId, const s
const std::string& sessionId = tokens[1];
const std::string& url = tokens[2];
- if (!pDocument->hasConnections() || pDocument->getURL() == url)
- {
- Log::debug("Thread request for session [" + sessionId + "], url: [" + url + "].");
- pDocument->createSession(sessionId, url);
- aResponse += "ok \r\n";
- }
- else
- {
- aResponse += "no \r\n";
- }
+ Log::debug("Thread request for session [" + sessionId + "], url: [" + url + "].");
+ auto it = _documents.lower_bound(url);
+ if (it == _documents.end())
+ it = _documents.emplace_hint(it, url, std::make_shared<Document>(loKit.get(), jailId, url));
+
+ it->second->createSession(sessionId);
+ aResponse += "ok \r\n";
}
else
{
@@ -786,7 +774,7 @@ void lokit_main(const std::string &loSubPath, const std::string& jailId, const s
Log::error(std::string("Exception: ") + exc.what());
}
- pDocument.reset();
+ _documents.clear();
// Destroy LibreOfficeKit
loKit->pClass->destroy(loKit.get());
More information about the Libreoffice-commits
mailing list