summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Help/manual/cmake-server.7.rst15
-rw-r--r--Source/cmServer.cxx38
-rw-r--r--Source/cmServer.h4
-rw-r--r--Source/cmServerProtocol.cxx6
-rw-r--r--Source/cmServerProtocol.h2
5 files changed, 64 insertions, 1 deletions
diff --git a/Help/manual/cmake-server.7.rst b/Help/manual/cmake-server.7.rst
index fd0c9ee..7edb6d3 100644
--- a/Help/manual/cmake-server.7.rst
+++ b/Help/manual/cmake-server.7.rst
@@ -132,6 +132,21 @@ a message of type "reply" or "error" that complete the request.
the request that triggered the responses was delivered.
+Type "message"
+^^^^^^^^^^^^^^
+
+A message is triggered when the server processes a request and produces some
+form of output that should be displayed to the user. A Message has a "message"
+with the actual text to display as well as a "title" with a suggested dialog
+box title.
+
+Example::
+
+ [== CMake Server ==[
+ {"cookie":"","message":"Something happened.","title":"Title Text","inReplyTo":"handshake","type":"message"}
+ ]== CMake Server ==]
+
+
Specific Message Types
----------------------
diff --git a/Source/cmServer.cxx b/Source/cmServer.cxx
index 8fb452b..5d1c73c 100644
--- a/Source/cmServer.cxx
+++ b/Source/cmServer.cxx
@@ -14,6 +14,7 @@
#include "cmServer.h"
#include "cmServerProtocol.h"
+#include "cmSystemTools.h"
#include "cmVersionMacros.h"
#include "cmake.h"
@@ -30,6 +31,7 @@ static const std::string kERROR_MESSAGE_KEY = "errorMessage";
static const std::string kERROR_TYPE = "error";
static const std::string kREPLY_TYPE = "reply";
static const std::string kPROGRESS_TYPE = "progress";
+static const std::string kMESSAGE_TYPE = "message";
static const std::string kSTART_MAGIC = "[== CMake Server ==[";
static const std::string kEND_MAGIC = "]== CMake Server ==]";
@@ -134,6 +136,8 @@ void cmServer::PopOne()
return;
}
+ cmSystemTools::SetMessageCallback(reportMessage,
+ const_cast<cmServerRequest*>(&request));
if (this->Protocol) {
this->Protocol->CMakeInstance()->SetProgressCallback(
reportProgress, const_cast<cmServerRequest*>(&request));
@@ -220,12 +224,25 @@ void cmServer::reportProgress(const char* msg, float progress, void* data)
const cmServerRequest* request = static_cast<const cmServerRequest*>(data);
assert(request);
if (progress < 0.0 || progress > 1.0) {
- request->ReportProgress(0, 0, 0, msg);
+ request->ReportMessage(msg, "");
} else {
request->ReportProgress(0, static_cast<int>(progress * 1000), 1000, msg);
}
}
+void cmServer::reportMessage(const char* msg, const char* title,
+ bool& /* cancel */, void* data)
+{
+ const cmServerRequest* request = static_cast<const cmServerRequest*>(data);
+ assert(request);
+ assert(msg);
+ std::string titleString;
+ if (title) {
+ titleString = title;
+ }
+ request->ReportMessage(std::string(msg), titleString);
+}
+
cmServerResponse cmServer::SetProtocolVersion(const cmServerRequest& request)
{
if (request.Type != "handshake")
@@ -354,6 +371,25 @@ void cmServer::WriteProgress(const cmServerRequest& request, int min,
this->WriteJsonObject(obj);
}
+void cmServer::WriteMessage(const cmServerRequest& request,
+ const std::string& message,
+ const std::string& title) const
+{
+ if (message.empty())
+ return;
+
+ Json::Value obj = Json::objectValue;
+ obj[kTYPE_KEY] = kMESSAGE_TYPE;
+ obj[kREPLY_TO_KEY] = request.Type;
+ obj[kCOOKIE_KEY] = request.Cookie;
+ obj["message"] = message;
+ if (!title.empty()) {
+ obj["title"] = title;
+ }
+
+ WriteJsonObject(obj);
+}
+
void cmServer::WriteParseError(const std::string& message) const
{
Json::Value obj = Json::objectValue;
diff --git a/Source/cmServer.h b/Source/cmServer.h
index 031ab64..29b61bf 100644
--- a/Source/cmServer.h
+++ b/Source/cmServer.h
@@ -44,6 +44,8 @@ private:
void RegisterProtocol(cmServerProtocol* protocol);
static void reportProgress(const char* msg, float progress, void* data);
+ static void reportMessage(const char* msg, const char* title, bool& cancel,
+ void* data);
// Handle requests:
cmServerResponse SetProtocolVersion(const cmServerRequest& request);
@@ -53,6 +55,8 @@ private:
// Write responses:
void WriteProgress(const cmServerRequest& request, int min, int current,
int max, const std::string& message) const;
+ void WriteMessage(const cmServerRequest& request, const std::string& message,
+ const std::string& title) const;
void WriteResponse(const cmServerResponse& response) const;
void WriteParseError(const std::string& message) const;
diff --git a/Source/cmServerProtocol.cxx b/Source/cmServerProtocol.cxx
index ce6be83..26942d3 100644
--- a/Source/cmServerProtocol.cxx
+++ b/Source/cmServerProtocol.cxx
@@ -46,6 +46,12 @@ void cmServerRequest::ReportProgress(int min, int current, int max,
this->m_Server->WriteProgress(*this, min, current, max, message);
}
+void cmServerRequest::ReportMessage(const std::string& message,
+ const std::string& title) const
+{
+ m_Server->WriteMessage(*this, message, title);
+}
+
cmServerResponse cmServerRequest::Reply(const Json::Value& data) const
{
cmServerResponse response(*this);
diff --git a/Source/cmServerProtocol.h b/Source/cmServerProtocol.h
index 03d4300..bab949b 100644
--- a/Source/cmServerProtocol.h
+++ b/Source/cmServerProtocol.h
@@ -70,6 +70,8 @@ private:
void ReportProgress(int min, int current, int max,
const std::string& message) const;
+ void ReportMessage(const std::string& message,
+ const std::string& title) const;
cmServer* m_Server;