Extract BaseService from Service class 59/30959/4
authorLukasz Kostyra <l.kostyra@samsung.com>
Wed, 26 Nov 2014 09:49:33 +0000 (10:49 +0100)
committerRafal Krypa <r.krypa@samsung.com>
Wed, 7 Jan 2015 16:36:12 +0000 (08:36 -0800)
BaseService will be a base class for SM services, eg. a master service coming
up in next patches.

[Verification]  Build, install, run tests.

Change-Id: Ie55d1b22c8887ee605e16b86adee75cfffdbe147

src/server/CMakeLists.txt
src/server/service/base-service.cpp [new file with mode: 0644]
src/server/service/include/base-service.h [new file with mode: 0644]
src/server/service/include/service.h
src/server/service/service.cpp

index e006592..753eb96 100644 (file)
@@ -25,6 +25,7 @@ SET(SERVER_SOURCES
     ${SERVER_PATH}/main/generic-socket-manager.cpp
     ${SERVER_PATH}/main/socket-manager.cpp
     ${SERVER_PATH}/main/server-main.cpp
+    ${SERVER_PATH}/service/base-service.cpp
     ${SERVER_PATH}/service/service.cpp
     )
 
diff --git a/src/server/service/base-service.cpp b/src/server/service/base-service.cpp
new file mode 100644 (file)
index 0000000..519c46a
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ *  Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Rafal Krypa <r.krypa@samsung.com>
+ *
+ *  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        base-service.cpp
+ * @author      Lukasz Kostyra <l.kostyra@samsung.com>
+ * @author      Rafal Krypa <r.krypa@samsung.com>
+ * @brief       Implementation of security-manager base service.
+ */
+
+#include <cstring>
+#include <unordered_set>
+
+#include <dpl/log/log.h>
+
+#include "base-service.h"
+
+namespace SecurityManager {
+
+BaseService::BaseService()
+{
+}
+
+void BaseService::accept(const AcceptEvent &event)
+{
+    LogDebug("Accept event. ConnectionID.sock: " << event.connectionID.sock <<
+             " ConnectionID.counter: " << event.connectionID.counter <<
+             " ServiceID: " << event.interfaceID);
+
+    auto &info = m_connectionInfoMap[event.connectionID.counter];
+    info.interfaceID = event.interfaceID;
+}
+
+void BaseService::write(const WriteEvent &event)
+{
+    LogDebug("WriteEvent. ConnectionID: " << event.connectionID.sock <<
+             " Size: " << event.size <<
+             " Left: " << event.left);
+
+    if (event.left == 0)
+        m_serviceManager->Close(event.connectionID);
+}
+
+void BaseService::process(const ReadEvent &event)
+{
+    LogDebug("Read event for counter: " << event.connectionID.counter);
+    auto &info = m_connectionInfoMap[event.connectionID.counter];
+    info.buffer.Push(event.rawBuffer);
+
+    // We can get several requests in one package.
+    // Extract and process them all
+    while (processOne(event.connectionID, info.buffer, info.interfaceID));
+}
+
+void BaseService::close(const CloseEvent &event)
+{
+    LogDebug("CloseEvent. ConnectionID: " << event.connectionID.sock);
+    m_connectionInfoMap.erase(event.connectionID.counter);
+}
+
+} // namespace SecurityManager
diff --git a/src/server/service/include/base-service.h b/src/server/service/include/base-service.h
new file mode 100644 (file)
index 0000000..b2d06f3
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ *  Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Rafal Krypa <r.krypa@samsung.com>
+ *
+ *  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        base-service.h
+ * @author      Lukasz Kostyra <l.kostyra@samsung.com>
+ * @author      Rafal Krypa <r.krypa@samsung.com>
+ * @brief       Implementation of security-manager base service
+ */
+
+#ifndef _SECURITY_MANAGER_BASE_SERVICE_
+#define _SECURITY_MANAGER_BASE_SERVICE_
+
+#include <service-thread.h>
+#include <generic-socket-manager.h>
+#include <message-buffer.h>
+#include <connection-info.h>
+
+namespace SecurityManager {
+
+class BaseServiceException
+{
+public:
+    DECLARE_EXCEPTION_TYPE(SecurityManager::Exception, Base)
+    DECLARE_EXCEPTION_TYPE(Base, InvalidAction)
+};
+
+class BaseService :
+    public SecurityManager::GenericSocketService,
+    public SecurityManager::ServiceThread<BaseService>
+{
+public:
+    BaseService();
+    virtual ServiceDescriptionVector GetServiceDescription() = 0;
+
+    DECLARE_THREAD_EVENT(AcceptEvent, accept)
+    DECLARE_THREAD_EVENT(WriteEvent, write)
+    DECLARE_THREAD_EVENT(ReadEvent, process)
+    DECLARE_THREAD_EVENT(CloseEvent, close)
+
+    void accept(const AcceptEvent &event);
+    void write(const WriteEvent &event);
+    void process(const ReadEvent &event);
+    void close(const CloseEvent &event);
+
+protected:
+    ConnectionInfoMap m_connectionInfoMap;
+
+    /**
+     * Handle request from a client
+     *
+     * @param  conn        Socket connection information
+     * @param  buffer      Raw received data buffer
+     * @param  interfaceID identifier used to distinguish source socket
+     * @return             true on success
+     */
+    virtual bool processOne(const ConnectionID &conn,
+                            MessageBuffer &buffer,
+                            InterfaceID interfaceID) = 0;
+};
+
+} // namespace SecurityManager
+
+#endif // _SECURITY_MANAGER_BASE_SERVICE_
index 19385f7..f7b8d21 100644 (file)
 #ifndef _SECURITY_MANAGER_SERVICE_
 #define _SECURITY_MANAGER_SERVICE_
 
-#include <service-thread.h>
-#include <generic-socket-manager.h>
-#include <message-buffer.h>
-#include <connection-info.h>
+#include "base-service.h"
 
 namespace SecurityManager {
 
@@ -40,26 +37,13 @@ public:
 };
 
 class Service :
-    public SecurityManager::GenericSocketService,
-    public SecurityManager::ServiceThread<Service>
+    public SecurityManager::BaseService
 {
 public:
     Service();
     ServiceDescriptionVector GetServiceDescription();
 
-    DECLARE_THREAD_EVENT(AcceptEvent, accept)
-    DECLARE_THREAD_EVENT(WriteEvent, write)
-    DECLARE_THREAD_EVENT(ReadEvent, process)
-    DECLARE_THREAD_EVENT(CloseEvent, close)
-
-    void accept(const AcceptEvent &event);
-    void write(const WriteEvent &event);
-    void process(const ReadEvent &event);
-    void close(const CloseEvent &event);
-
 private:
-    ConnectionInfoMap m_connectionInfoMap;
-
     /**
      * Handle request from a client
      *
index 046dd20..faa337c 100644 (file)
@@ -47,43 +47,6 @@ GenericSocketService::ServiceDescriptionVector Service::GetServiceDescription()
     };
 }
 
-void Service::accept(const AcceptEvent &event)
-{
-    LogDebug("Accept event. ConnectionID.sock: " << event.connectionID.sock <<
-             " ConnectionID.counter: " << event.connectionID.counter <<
-             " ServiceID: " << event.interfaceID);
-
-    auto &info = m_connectionInfoMap[event.connectionID.counter];
-    info.interfaceID = event.interfaceID;
-}
-
-void Service::write(const WriteEvent &event)
-{
-    LogDebug("WriteEvent. ConnectionID: " << event.connectionID.sock <<
-             " Size: " << event.size <<
-             " Left: " << event.left);
-
-    if (event.left == 0)
-        m_serviceManager->Close(event.connectionID);
-}
-
-void Service::process(const ReadEvent &event)
-{
-    LogDebug("Read event for counter: " << event.connectionID.counter);
-    auto &info = m_connectionInfoMap[event.connectionID.counter];
-    info.buffer.Push(event.rawBuffer);
-
-    // We can get several requests in one package.
-    // Extract and process them all
-    while (processOne(event.connectionID, info.buffer, info.interfaceID));
-}
-
-void Service::close(const CloseEvent &event)
-{
-    LogDebug("CloseEvent. ConnectionID: " << event.connectionID.sock);
-    m_connectionInfoMap.erase(event.connectionID.counter);
-}
-
 static bool getPeerID(int sock, uid_t &uid, pid_t &pid) {
     struct ucred cr;
     socklen_t len = sizeof(cr);
@@ -113,7 +76,7 @@ bool Service::processOne(const ConnectionID &conn, MessageBuffer &buffer,
     uid_t uid;
     pid_t pid;
 
-    if(!getPeerID(conn.sock, uid, pid)) {
+    if (!getPeerID(conn.sock, uid, pid)) {
         LogError("Closing socket because of error: unable to get peer's uid and pid");
         m_serviceManager->Close(conn);
         return false;
@@ -157,7 +120,7 @@ bool Service::processOne(const ConnectionID &conn, MessageBuffer &buffer,
             LogError("Broken protocol.");
         } Catch (ServiceException::Base) {
             LogError("Broken protocol.");
-        } catch (std::exception &e) {
+        } catch (const std::exception &e) {
             LogError("STD exception " << e.what());
         } catch (...) {
             LogError("Unknown exception");