namespace Cynara {
-void CheckRequest::execute(RequestPtr self, RequestTaker &taker,
+void CheckRequest::execute(RequestPtr self, RequestTakerPtr taker,
RequestContextPtr context) const {
- taker.execute(context, std::dynamic_pointer_cast<CheckRequest>(self));
+ taker->execute(context, std::dynamic_pointer_cast<CheckRequest>(self));
}
} // namespace Cynara
return m_key;
}
- virtual void execute(RequestPtr self, RequestTaker &taker, RequestContextPtr context) const;
+ virtual void execute(RequestPtr self, RequestTakerPtr taker, RequestContextPtr context) const;
};
} // namespace Cynara
Request() = default;
virtual ~Request() = default;
- virtual void execute(RequestPtr self, RequestTaker &taker, RequestContextPtr context) const = 0;
+ virtual void execute(RequestPtr self, RequestTakerPtr taker, RequestContextPtr context) const = 0;
};
} // namespace Cynara
class RequestContext;
typedef std::shared_ptr<RequestContext> RequestContextPtr;
+class RequestTaker;
+typedef std::shared_ptr<RequestTaker> RequestTakerPtr;
+
} // namespace Cynara
#endif /* SRC_COMMON_REQUEST_POINTERS_H_ */
bool Logic::check(RequestContextPtr context UNUSED, const PolicyKey &key,
PolicyResult& result) {
- result = Cynara::getStorage()->checkPolicy(key);
+ result = m_storage->checkPolicy(key);
switch (result.policyType()) {
case PredefinedPolicyType::ALLOW :
#include <types/PolicyKey.h>
#include <types/PolicyResult.h>
+#include <main/pointers.h>
#include <request/pointers.h>
#include <request/RequestTaker.h>
Logic();
virtual ~Logic();
+ void bindStorage(StoragePtr storage) {
+ m_storage = storage;
+ }
+
+ void bindSocketManager(SocketManagerPtr socketManager) {
+ m_socketManager = socketManager;
+ }
+
+ void unbindAll(void) {
+ m_storage.reset();
+ m_socketManager.reset();
+ }
+
virtual void execute(RequestContextPtr context, CheckRequestPtr request);
private:
+ StoragePtr m_storage;
+ SocketManagerPtr m_socketManager;
+
bool check(RequestContextPtr context, const PolicyKey &key, PolicyResult& result);
};
* @brief This file implements main class of cynara service
*/
+#include <memory>
#include <stddef.h>
+#include <exceptions/InitException.h>
+
+#include <logic/Logic.h>
+#include <sockets/SocketManager.h>
#include <storage/InMemoryStorageBackend.h>
+#include <storage/Storage.h>
+#include <storage/StorageBackend.h>
#include "Cynara.h"
: m_logic(nullptr), m_socketManager(nullptr), m_storage(nullptr), m_storageBackend(nullptr) {
}
-Cynara* Cynara::getInstance(void) {
- static Cynara instance;
- return &instance;
-}
-
Cynara::~Cynara() {
+ finalize();
}
void Cynara::init(void) {
- getInstance()->m_logic = new Logic();
- getInstance()->m_socketManager = new SocketManager();
- getInstance()->m_storageBackend = new InMemoryStorageBackend();
- getInstance()->m_storage = new Storage(*getInstance()->m_storageBackend);
-}
+ m_logic = std::make_shared<Logic>();
+ m_socketManager = std::make_shared<SocketManager>();
+ m_storageBackend = std::make_shared<InMemoryStorageBackend>();
+ m_storage = std::make_shared<Storage>(*m_storageBackend);
-void Cynara::run(void) {
- getInstance()->m_socketManager->run();
-}
+ m_logic->bindStorage(m_storage);
+ m_logic->bindSocketManager(m_socketManager);
-void Cynara::finalize(void) {
- delete getInstance()->m_logic;
- delete getInstance()->m_socketManager;
- delete getInstance()->m_storageBackend;
- delete getInstance()->m_storage;
+ m_socketManager->bindLogic(m_logic);
}
-Logic *Cynara::getLogic(void) {
- return getInstance()->m_logic;
+void Cynara::run(void) {
+ m_socketManager->run();
}
-SocketManager *Cynara::getSocketManager(void) {
- return getInstance()->m_socketManager;
-}
+void Cynara::finalize(void) {
+ m_logic->unbindAll();
+ m_socketManager->unbindAll();
-Storage *Cynara::getStorage(void) {
- return getInstance()->m_storage;
+ m_logic.reset();
+ m_socketManager.reset();
+ m_storageBackend.reset();
+ m_storage.reset();
}
} // namespace Cynara
#ifndef SRC_SERVICE_MAIN_CYNARA_H_
#define SRC_SERVICE_MAIN_CYNARA_H_
-#include <logic/Logic.h>
-#include <sockets/SocketManager.h>
-#include <storage/Storage.h>
-#include <storage/StorageBackend.h>
+#include <main/pointers.h>
namespace Cynara {
class Cynara {
private:
- Logic *m_logic;
- SocketManager *m_socketManager;
- Storage *m_storage;
- StorageBackend *m_storageBackend;
-
- Cynara();
-
- static Cynara *getInstance(void);
+ LogicPtr m_logic;
+ SocketManagerPtr m_socketManager;
+ StoragePtr m_storage;
+ StorageBackendPtr m_storageBackend;
public:
+ Cynara();
~Cynara();
- static void init(void);
- static void run(void);
- static void finalize(void);
-
- static Logic *getLogic(void);
- static SocketManager *getSocketManager(void);
- static Storage *getStorage(void);
-
+ void init(void);
+ void run(void);
+ void finalize(void);
};
} // namespace Cynara
#include <log/log.h>
#include "Cynara.h"
-using namespace Cynara;
-
int main(int argc UNUSED, char **argv UNUSED) {
int ret;
init_log();
try {
+ Cynara::Cynara cynara;
LOGI("Cynara service is starting ...");
- Cynara::Cynara::init();
+ cynara.init();
LOGI("Cynara service is started");
ret = sd_notify(0, "READY=1");
}
LOGD("Starting the real job");
- Cynara::Cynara::run();
+ cynara.run();
LOGD("Time to clean up.");
- Cynara::Cynara::finalize();
+ cynara.finalize();
LOGD("Cynara service is stopped");
} catch (std::exception &e) {
LOGC("Cynara stoped because of unhandled exception: %s", e.what());
--- /dev/null
+/*
+ * 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 request base class
+ */
+
+#ifndef SRC_SERVICE_MAIN_POINTERS_H_
+#define SRC_SERVICE_MAIN_POINTERS_H_
+
+#include <memory>
+
+namespace Cynara {
+
+class Logic;
+typedef std::shared_ptr<Logic> LogicPtr;
+
+class SocketManager;
+typedef std::shared_ptr<SocketManager> SocketManagerPtr;
+
+class Storage;
+typedef std::shared_ptr<Storage> StoragePtr;
+
+class StorageBackend;
+typedef std::shared_ptr<StorageBackend> StorageBackendPtr;
+
+} // namespace Cynara
+
+#endif /* SRC_SERVICE_MAIN_POINTERS_H_ */
FD_CLR(fd, &m_writeSet);
}
-RequestTaker &SocketManager::requestTaker(void) {
- //todo change
- return *Cynara::getLogic();
+RequestTakerPtr SocketManager::requestTaker(void) {
+ return std::static_pointer_cast<RequestTaker>(m_logic);
}
} // namespace Cynara
#include <common.h>
+#include <main/pointers.h>
#include <protocol/Protocol.h>
#include <request/RequestTaker.h>
#include "Descriptor.h"
void run(void);
void mainLoopStop(void);
+ void bindLogic(LogicPtr logic) {
+ m_logic = logic;
+ }
+
+ void unbindAll(void) {
+ m_logic.reset();
+ }
+
private:
+ LogicPtr m_logic;
+
typedef std::vector<Descriptor> FDVector;
FDVector m_fds;
void addWriteSocket(int fd);
void removeWriteSocket(int fd);
- RequestTaker &requestTaker(void);
+ RequestTakerPtr requestTaker(void);
};
} // namespace Cynara