diff options
-rw-r--r-- | Help/manual/cmake-server.7.rst | 15 | ||||
-rw-r--r-- | Source/cmServer.cxx | 38 | ||||
-rw-r--r-- | Source/cmServer.h | 4 | ||||
-rw-r--r-- | Source/cmServerProtocol.cxx | 6 | ||||
-rw-r--r-- | Source/cmServerProtocol.h | 2 |
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; |