Use shared and weak pointers for ReponseTaker and RequestContext
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 26 Jun 2014 10:12:13 +0000 (12:12 +0200)
committerRafal Krypa <r.krypa@samsung.com>
Thu, 3 Jul 2014 12:19:10 +0000 (14:19 +0200)
Change-Id: I711a2c97819d7a363fa1b2d1401e7156554a2e09

15 files changed:
src/service/logic/Logic.cpp
src/service/logic/Logic.h
src/service/request/CheckRequest.cpp
src/service/request/CheckRequest.h
src/service/request/Request.h
src/service/request/RequestContext.h
src/service/request/RequestTaker.cpp
src/service/request/RequestTaker.h
src/service/request/pointers.h
src/service/response/ResponseTaker.cpp
src/service/response/ResponseTaker.h
src/service/response/pointers.h [new file with mode: 0644]
src/service/sockets/Descriptor.cpp
src/service/sockets/Descriptor.h
src/service/sockets/SocketManager.cpp

index 9aa2e30..3944a8f 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <main/Cynara.h>
 #include <request/CheckRequest.h>
+#include <request/RequestContext.h>
 #include <response/CheckResponse.h>
 #include <storage/Storage.h>
 
@@ -38,14 +39,14 @@ Logic::Logic() {
 Logic::~Logic() {
 }
 
-void Logic::execute(const RequestContext &context, CheckRequestPtr request) {
+void Logic::execute(RequestContextPtr context, CheckRequestPtr request) {
     PolicyResult result(PredefinedPolicyType::DENY);
     if (check(context, request->key(), result)) {
-        context.returnResponse(CheckResponse(result));
+        context->returnResponse(context, CheckResponse(result));
     }
 }
 
-bool Logic::check(const RequestContext &context UNUSED, const PolicyKey &key,
+bool Logic::check(RequestContextPtr context UNUSED, const PolicyKey &key,
                   PolicyResult& result) {
     result = Cynara::getStorage()->checkPolicy(key);
 
index 362b47c..9ef96f4 100644 (file)
@@ -27,7 +27,6 @@
 #include <types/PolicyResult.h>
 
 #include <request/pointers.h>
-#include <request/RequestContext.h>
 #include <request/RequestTaker.h>
 
 namespace Cynara {
@@ -37,10 +36,10 @@ public:
     Logic();
     virtual ~Logic();
 
-    virtual void execute(const RequestContext &context, CheckRequestPtr request);
+    virtual void execute(RequestContextPtr context, CheckRequestPtr request);
 
 private:
-    bool check(const RequestContext &context, const PolicyKey &key, PolicyResult& result);
+    bool check(RequestContextPtr context, const PolicyKey &key, PolicyResult& result);
 
 };
 
index 8bcbf65..5473a79 100644 (file)
@@ -27,7 +27,7 @@
 namespace Cynara {
 
 void CheckRequest::execute(RequestPtr self, RequestTaker &taker,
-                           const RequestContext &context) const {
+                           RequestContextPtr context) const {
     taker.execute(context, std::dynamic_pointer_cast<CheckRequest>(self));
 }
 
index 54a8acf..83f0203 100644 (file)
@@ -27,7 +27,6 @@
 
 #include <request/pointers.h>
 #include <request/Request.h>
-#include <request/RequestContext.h>
 #include <request/RequestTaker.h>
 
 namespace Cynara {
@@ -46,7 +45,7 @@ public:
         return m_key;
     }
 
-    virtual void execute(RequestPtr self, RequestTaker &taker, const RequestContext &context) const;
+    virtual void execute(RequestPtr self, RequestTaker &taker, RequestContextPtr context) const;
 };
 
 } // namespace Cynara
index 8df08b9..fa76ffa 100644 (file)
@@ -24,7 +24,7 @@
 #define SRC_SERVICE_REQUEST_REQUEST_H_
 
 #include <request/pointers.h>
-#include <request/RequestContext.h>
+#include <request/pointers.h>
 #include <request/RequestTaker.h>
 
 namespace Cynara {
@@ -34,8 +34,7 @@ public:
     Request() = default;
     virtual ~Request() = default;
 
-    virtual void execute(RequestPtr self, RequestTaker &taker,
-                         const RequestContext &context) const = 0;
+    virtual void execute(RequestPtr self, RequestTaker &taker, RequestContextPtr context) const = 0;
 };
 
 } // namespace Cynara
index 55ff9fe..d8e9578 100644 (file)
 #ifndef SRC_SERVICE_REQUEST_REQUESTCONTEXT_H_
 #define SRC_SERVICE_REQUEST_REQUESTCONTEXT_H_
 
+#include <memory>
+
 #include <common.h>
 
+#include <request/pointers.h>
+#include <response/pointers.h>
 #include <response/ResponseTaker.h>
 
 namespace Cynara {
@@ -32,17 +36,23 @@ namespace Cynara {
 class RequestContext {
 private:
     int m_desc;
-    ResponseTaker &m_responseTaker;
+    ResponseTakerWeakPtr m_responseTaker;
     BinaryQueue &m_responseQueue;
 
 public:
-    RequestContext(int desc, ResponseTaker &responseTaker, BinaryQueue &responseQueue)
+    RequestContext(int desc, ResponseTakerPtr responseTaker, BinaryQueue &responseQueue)
         : m_desc(desc), m_responseTaker(responseTaker), m_responseQueue(responseQueue) {
     }
 
     template <class T>
-    void returnResponse(T &&response) const {
-        m_responseTaker.appendResponseToBuffer(m_responseQueue, std::move(response));
+    void returnResponse(RequestContextPtr self, T &&response) const {
+        ResponseTakerPtr taker = m_responseTaker.lock();
+        if (taker)
+            taker->execute(self, std::move(response));
+    }
+
+    BinaryQueue &responseQueue(void) const {
+        return m_responseQueue;
     }
 };
 
index e56f4aa..f634ea8 100644 (file)
  * @brief       This file implements RequestTaker class
  */
 
+#include <common.h>
+
 #include <exceptions/NotImplementedException.h>
 
 #include "RequestTaker.h"
 
 namespace Cynara {
 
-void RequestTaker::execute(const RequestContext &context UNUSED, CheckRequestPtr request UNUSED) {
+void RequestTaker::execute(RequestContextPtr context UNUSED, CheckRequestPtr request UNUSED) {
     throw NotImplementedException();
 }
 
index 5564ece..9ebbe32 100644 (file)
@@ -24,7 +24,6 @@
 #define SRC_SERVICE_REQUEST_REQUESTTAKER_H_
 
 #include <request/pointers.h>
-#include <request/RequestContext.h>
 
 namespace Cynara {
 
@@ -33,7 +32,7 @@ public:
     RequestTaker() = default;
     virtual ~RequestTaker() = default;
 
-    virtual void execute(const RequestContext &context, CheckRequestPtr request);
+    virtual void execute(RequestContextPtr context, CheckRequestPtr request);
 };
 
 } // namespace Cynara
index 79f1539..7bfc66e 100644 (file)
 
 namespace Cynara {
 
+class CheckRequest;
+typedef std::shared_ptr<CheckRequest> CheckRequestPtr;
+
 class Request;
 typedef std::shared_ptr<Request> RequestPtr;
 
-class CheckRequest;
-typedef std::shared_ptr<CheckRequest> CheckRequestPtr;
+class RequestContext;
+typedef std::shared_ptr<RequestContext> RequestContextPtr;
 
 } // namespace Cynara
 
index 9ce248a..fff9774 100644 (file)
@@ -28,8 +28,7 @@
 
 namespace Cynara {
 
-void ResponseTaker::appendResponseToBuffer(BinaryQueue &queue UNUSED,
-                                           CheckResponse &&response UNUSED) {
+void ResponseTaker::execute(RequestContextPtr context UNUSED, CheckResponse &&response UNUSED) {
     throw NotImplementedException();
 }
 
index 771adbc..0c880b6 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <common.h>
 
+#include <request/pointers.h>
 #include <response/CheckResponse.h>
 
 namespace Cynara {
@@ -34,7 +35,7 @@ public:
     ResponseTaker() = default;
     virtual ~ResponseTaker() = default;
 
-    virtual void appendResponseToBuffer(BinaryQueue &queue, CheckResponse &&response);
+    virtual void execute(RequestContextPtr context, CheckResponse &&response);
 };
 
 } // namespace Cynara
diff --git a/src/service/response/pointers.h b/src/service/response/pointers.h
new file mode 100644 (file)
index 0000000..6d12a8b
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        pointers.h
+ * @author      Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ * @version     1.0
+ * @brief       This file defines response classes pointers
+ */
+
+#ifndef SRC_SERVICE_RESPONSE_POINTERS_H_
+#define SRC_SERVICE_RESPONSE_POINTERS_H_
+
+#include <memory>
+
+namespace Cynara {
+
+class ResponseTaker;
+typedef std::shared_ptr<ResponseTaker> ResponseTakerPtr;
+typedef std::weak_ptr<ResponseTaker> ResponseTakerWeakPtr;
+
+} // namespace Cynara
+
+#endif /* SRC_SERVICE_RESPONSE_POINTERS_H_ */
index 661833d..f58d28e 100644 (file)
@@ -31,6 +31,10 @@ bool Descriptor::hasDataToWrite(void) const {
     return !(m_writeQueue.empty() && m_writeBuffer.empty());
 }
 
+ResponseTakerPtr Descriptor::responseTaker(void) const {
+    return std::static_pointer_cast<ResponseTaker>(m_protocol);
+}
+
 void Descriptor::pushReadBuffer(const RawBuffer &readbuffer) {
     m_readQueue.appendCopy(readbuffer.data(), readbuffer.size());
 }
index 769abdd..86ee4db 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <protocol/Protocol.h>
 #include <request/Request.h>
+#include <response/pointers.h>
 
 namespace Cynara {
 
@@ -60,9 +61,7 @@ public:
         return m_protocol;
     }
 
-    ResponseTaker &responseTaker(void) {
-        return *m_protocol;
-    }
+    ResponseTakerPtr responseTaker(void) const;
 
     BinaryQueue &writeQueue(void) {
         return m_writeQueue;
index aa7cb51..fae4984 100644 (file)
@@ -227,7 +227,8 @@ bool SocketManager::handleRead(int fd, const RawBuffer &readbuffer) {
             LOGD("request extracted");
 
             //build context
-            RequestContext context(fd, desc.responseTaker(), desc.writeQueue());
+            auto context = std::make_shared<RequestContext>(fd, desc.responseTaker(),
+                                                            desc.writeQueue());
             //pass request to request taker
             req->execute(req, requestTaker(), context);
         }