From 117d9839769ab9f2c18e69ab827b38ba698b8ff9 Mon Sep 17 00:00:00 2001 From: Lukasz Kostyra Date: Wed, 26 Nov 2014 10:49:33 +0100 Subject: [PATCH] Extract BaseService from Service class 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 | 1 + src/server/service/base-service.cpp | 75 +++++++++++++++++++++++++++++ src/server/service/include/base-service.h | 78 +++++++++++++++++++++++++++++++ src/server/service/include/service.h | 20 +------- src/server/service/service.cpp | 41 +--------------- 5 files changed, 158 insertions(+), 57 deletions(-) create mode 100644 src/server/service/base-service.cpp create mode 100644 src/server/service/include/base-service.h diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index e006592..753eb96 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -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 index 0000000..519c46a --- /dev/null +++ b/src/server/service/base-service.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Contact: Rafal Krypa + * + * 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 + * @author Rafal Krypa + * @brief Implementation of security-manager base service. + */ + +#include +#include + +#include + +#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 index 0000000..b2d06f3 --- /dev/null +++ b/src/server/service/include/base-service.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Contact: Rafal Krypa + * + * 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 + * @author Rafal Krypa + * @brief Implementation of security-manager base service + */ + +#ifndef _SECURITY_MANAGER_BASE_SERVICE_ +#define _SECURITY_MANAGER_BASE_SERVICE_ + +#include +#include +#include +#include + +namespace SecurityManager { + +class BaseServiceException +{ +public: + DECLARE_EXCEPTION_TYPE(SecurityManager::Exception, Base) + DECLARE_EXCEPTION_TYPE(Base, InvalidAction) +}; + +class BaseService : + public SecurityManager::GenericSocketService, + public SecurityManager::ServiceThread +{ +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_ diff --git a/src/server/service/include/service.h b/src/server/service/include/service.h index 19385f7..f7b8d21 100644 --- a/src/server/service/include/service.h +++ b/src/server/service/include/service.h @@ -25,10 +25,7 @@ #ifndef _SECURITY_MANAGER_SERVICE_ #define _SECURITY_MANAGER_SERVICE_ -#include -#include -#include -#include +#include "base-service.h" namespace SecurityManager { @@ -40,26 +37,13 @@ public: }; class Service : - public SecurityManager::GenericSocketService, - public SecurityManager::ServiceThread + 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 * diff --git a/src/server/service/service.cpp b/src/server/service/service.cpp index 046dd20..faa337c 100644 --- a/src/server/service/service.cpp +++ b/src/server/service/service.cpp @@ -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"); -- 2.7.4