changeset 910:28a52982196e plugins

refactoring
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 20 Jun 2014 13:38:19 +0200
parents ef71057d8b26
children 306afd58a0b3
files CMakeLists.txt Core/HttpServer/HttpOutput.cpp Core/HttpServer/HttpOutput.h Core/HttpServer/HttpOutputStream.cpp Core/HttpServer/HttpOutputStream.h Core/HttpServer/IHttpOutputStream.h
diffstat 6 files changed, 185 insertions(+), 189 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Fri Jun 20 13:30:53 2014 +0200
+++ b/CMakeLists.txt	Fri Jun 20 13:38:19 2014 +0200
@@ -81,7 +81,6 @@
   Core/HttpServer/FilesystemHttpHandler.cpp
   Core/HttpServer/HttpHandler.cpp
   Core/HttpServer/HttpOutput.cpp
-  Core/HttpServer/HttpOutputStream.cpp
   Core/HttpServer/MongooseServer.cpp
   Core/HttpServer/HttpFileSender.cpp
   Core/HttpServer/FilesystemHttpSender.cpp
--- a/Core/HttpServer/HttpOutput.cpp	Fri Jun 20 13:30:53 2014 +0200
+++ b/Core/HttpServer/HttpOutput.cpp	Fri Jun 20 13:38:19 2014 +0200
@@ -42,6 +42,103 @@
 
 namespace Orthanc
 {
+  class HttpOutput::StateMachine : public boost::noncopyable
+  {
+  protected:
+    enum State
+    {
+      State_WaitingHttpStatus,
+      State_WritingHeader,      
+      State_WritingBody
+    };
+
+  private:
+    IHttpOutputStream& stream_;
+    State state_;
+
+  public:
+    HttpStateMachine() : 
+      state_(State_WaitingHttpStatus)
+    {
+    }
+
+    void SendHttpStatus(HttpStatus status);
+
+    void SendHeaderData(const void* buffer, size_t length);
+
+    void SendHeaderString(const std::string& str);
+
+    void SendBodyData(const void* buffer, size_t length);
+
+    void SendBodyString(const std::string& str);
+  };
+
+
+  void HttpOutput::StateMachine::SendHttpStatus(HttpStatus status)
+  {
+    if (state_ != State_WaitingHttpStatus)
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+
+    OnHttpStatusReceived(status);
+    state_ = State_WritingHeader;
+
+    std::string s = "HTTP/1.1 " + 
+      boost::lexical_cast<std::string>(status) +
+      " " + std::string(EnumerationToString(status)) +
+      "\r\n";
+
+    Send(true, &s[0], s.size());
+  }
+
+  void HttpOutput::StateMachine::SendHeaderData(const void* buffer, size_t length)
+  {
+    if (state_ != State_WritingHeader)
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+
+    Send(true, buffer, length);
+  }
+
+  void HttpOutput::StateMachine::SendHeaderString(const std::string& str)
+  {
+    if (str.size() > 0)
+    {
+      SendHeaderData(&str[0], str.size());
+    }
+  }
+
+  void HttpOutput::StateMachine::SendBodyData(const void* buffer, size_t length)
+  {
+    if (state_ == State_WaitingHttpStatus)
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+    }
+
+    if (state_ == State_WritingHeader)
+    {
+      // Close the HTTP header before writing the body
+      Send(true, "\r\n", 2);
+      state_ = State_WritingBody;
+    }
+
+    if (length > 0)
+    {
+      Send(false, buffer, length);
+    }
+  }
+
+  void HttpOutput::StateMachine::SendBodyString(const std::string& str)
+  {
+    if (str.size() > 0)
+    {
+      SendBodyData(&str[0], str.size());
+    }
+  }
+
+
   void HttpOutput::PrepareOkHeader(Header& header,
                                    const char* contentType,
                                    bool hasContentLength,
--- a/Core/HttpServer/HttpOutput.h	Fri Jun 20 13:30:53 2014 +0200
+++ b/Core/HttpServer/HttpOutput.h	Fri Jun 20 13:38:19 2014 +0200
@@ -36,7 +36,7 @@
 #include <string>
 #include <stdint.h>
 #include "../Enumerations.h"
-#include "HttpOutputStream.h"
+#include "IHttpOutputStream.h"
 #include "HttpHandler.h"
 
 namespace Orthanc
@@ -46,6 +46,38 @@
   private:
     typedef std::list< std::pair<std::string, std::string> >  Header;
 
+    class StateMachine : public boost::noncopyable
+    {
+    protected:
+      enum State
+      {
+        State_WaitingHttpStatus,
+        State_WritingHeader,      
+        State_WritingBody
+      };
+
+    private:
+      IHttpOutputStream& stream_;
+      State state_;
+
+    public:
+      HttpStateMachine(IHttpOutputStream& stream) : 
+        stream_(stream)
+        state_(State_WaitingHttpStatus)
+      {
+      }
+
+      void SendHttpStatus(HttpStatus status);
+
+      void SendHeaderData(const void* buffer, size_t length);
+
+      void SendHeaderString(const std::string& str);
+
+      void SendBodyData(const void* buffer, size_t length);
+
+      void SendBodyString(const std::string& str);
+    };
+
     void PrepareOkHeader(Header& header,
                          const char* contentType,
                          bool hasContentLength,
@@ -57,10 +89,10 @@
     void PrepareCookies(Header& header,
                         const HttpHandler::Arguments& cookies);
 
-    HttpOutputStream& stream_;
+    StateMachine stateMachine_;
 
   public:
-    HttpOutput(HttpOutputStream& stream) : stream_(stream)
+    HttpOutput(IHttpOutputStream& stream) : stateMachine_(stream)
     {
     }
 
--- a/Core/HttpServer/HttpOutputStream.cpp	Fri Jun 20 13:30:53 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/**
- * Orthanc - A Lightweight, RESTful DICOM Store
- * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege,
- * Belgium
- *
- * This program is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * In addition, as a special exception, the copyright holders of this
- * program give permission to link the code of its release with the
- * OpenSSL project's "OpenSSL" library (or with modified versions of it
- * that use the same license as the "OpenSSL" library), and distribute
- * the linked executables. You must obey the GNU General Public License
- * in all respects for all of the code used other than "OpenSSL". If you
- * modify file(s) with this exception, you may extend this exception to
- * your version of the file(s), but you are not obligated to do so. If
- * you do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source files
- * in the program, then also delete it here.
- * 
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- **/
-
-
-#include "HttpOutputStream.h"
-
-#include "../OrthancException.h"
-
-#include <boost/lexical_cast.hpp>
-
-namespace Orthanc
-{
-  void HttpOutputStream::SendHttpStatus(HttpStatus status)
-  {
-    if (state_ != State_WaitingHttpStatus)
-    {
-      throw OrthancException(ErrorCode_BadSequenceOfCalls);
-    }
-
-    OnHttpStatusReceived(status);
-    state_ = State_WritingHeader;
-
-    std::string s = "HTTP/1.1 " + 
-      boost::lexical_cast<std::string>(status) +
-      " " + std::string(EnumerationToString(status)) +
-      "\r\n";
-
-    Send(true, &s[0], s.size());
-  }
-
-  void HttpOutputStream::SendHeaderData(const void* buffer, size_t length)
-  {
-    if (state_ != State_WritingHeader)
-    {
-      throw OrthancException(ErrorCode_BadSequenceOfCalls);
-    }
-
-    Send(true, buffer, length);
-  }
-
-  void HttpOutputStream::SendHeaderString(const std::string& str)
-  {
-    if (str.size() > 0)
-    {
-      SendHeaderData(&str[0], str.size());
-    }
-  }
-
-  void HttpOutputStream::SendBodyData(const void* buffer, size_t length)
-  {
-    if (state_ == State_WaitingHttpStatus)
-    {
-      throw OrthancException(ErrorCode_BadSequenceOfCalls);
-    }
-
-    if (state_ == State_WritingHeader)
-    {
-      // Close the HTTP header before writing the body
-      Send(true, "\r\n", 2);
-      state_ = State_WritingBody;
-    }
-
-    if (length > 0)
-    {
-      Send(false, buffer, length);
-    }
-  }
-
-  void HttpOutputStream::SendBodyString(const std::string& str)
-  {
-    if (str.size() > 0)
-    {
-      SendBodyData(&str[0], str.size());
-    }
-  }
-}
--- a/Core/HttpServer/HttpOutputStream.h	Fri Jun 20 13:30:53 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/**
- * Orthanc - A Lightweight, RESTful DICOM Store
- * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege,
- * Belgium
- *
- * This program is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * In addition, as a special exception, the copyright holders of this
- * program give permission to link the code of its release with the
- * OpenSSL project's "OpenSSL" library (or with modified versions of it
- * that use the same license as the "OpenSSL" library), and distribute
- * the linked executables. You must obey the GNU General Public License
- * in all respects for all of the code used other than "OpenSSL". If you
- * modify file(s) with this exception, you may extend this exception to
- * your version of the file(s), but you are not obligated to do so. If
- * you do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source files
- * in the program, then also delete it here.
- * 
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- **/
-
-
-#pragma once
-
-#include "../Enumerations.h"
-
-#include <string>
-#include <boost/noncopyable.hpp>
-
-namespace Orthanc
-{
-  class HttpOutputStream : public boost::noncopyable
-  {
-  protected:
-    enum State
-    {
-      State_WaitingHttpStatus,
-      State_WritingHeader,      
-      State_WritingBody
-    };
-
-  private:
-    State state_;
-
-  protected:
-    virtual void OnHttpStatusReceived(HttpStatus status)
-    {
-    }
-
-    virtual void Send(bool isHeader, const void* buffer, size_t length) = 0;
-
-  public:
-    HttpOutputStream() : state_(State_WaitingHttpStatus)
-    {
-    }
-
-    virtual ~HttpOutputStream()
-    {
-    }
-
-    void SendHttpStatus(HttpStatus status);
-
-    void SendHeaderData(const void* buffer, size_t length);
-
-    void SendHeaderString(const std::string& str);
-
-    void SendBodyData(const void* buffer, size_t length);
-
-    void SendBodyString(const std::string& str);
-  };
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Core/HttpServer/IHttpOutputStream.h	Fri Jun 20 13:38:19 2014 +0200
@@ -0,0 +1,53 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include "../Enumerations.h"
+
+#include <string>
+#include <boost/noncopyable.hpp>
+
+namespace Orthanc
+{
+  class IHttpOutputStream : public boost::noncopyable
+  {
+  public:
+    virtual ~IHttpOutputStream()
+    {
+    }
+
+    virtual void OnHttpStatusReceived(HttpStatus status) = 0;
+
+    virtual void Send(bool isHeader, const void* buffer, size_t length) = 0;
+  };
+}