Просмотр исходного кода

server-mode: Report Messages from cmake to clients

Pass messages sent from cmake via Error(...) or Message(...) on
to clients.
Tobias Hunger 9 лет назад
Родитель
Сommit
537efe0561
5 измененных файлов с 64 добавлено и 1 удалено
  1. 15 0
      Help/manual/cmake-server.7.rst
  2. 37 1
      Source/cmServer.cxx
  3. 4 0
      Source/cmServer.h
  4. 6 0
      Source/cmServerProtocol.cxx
  5. 2 0
      Source/cmServerProtocol.h

+ 15 - 0
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
 ----------------------
 

+ 37 - 1
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;

+ 4 - 0
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;
 

+ 6 - 0
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);

+ 2 - 0
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;