return m_socketClient->isConnected() || m_socketClient->connect();
}
-template<typename T, typename... Args>
-int OnlineLogic::askCynaraAndInterpreteCodeResponse(Args... args) {
+template<typename Req, typename Res, typename... ReqArgs>
+int OnlineLogic::getResponse(std::shared_ptr<Res> &retResponse, ReqArgs... args) {
if (!ensureConnection()) {
LOGE("Cannot connect to cynara. Service not available.");
return CYNARA_API_SERVICE_NOT_AVAILABLE;
ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
- //Ask cynara service
- CodeResponsePtr codeResponse;
-
- RequestPtr request = std::make_shared<T>(args..., sequenceNumber);
+ RequestPtr request = std::make_shared<Req>(args..., sequenceNumber);
ResponsePtr response;
while (!(response = m_socketClient->askCynaraServer(request))) {
if (!m_socketClient->connect())
return CYNARA_API_SERVICE_NOT_AVAILABLE;
}
- codeResponse = std::dynamic_pointer_cast<CodeResponse>(response);
- if (!codeResponse) {
- LOGC("Critical error. Casting Response to CodeResponse failed.");
+ retResponse = std::dynamic_pointer_cast<Res>(response);
+ if (!retResponse) {
+ LOGC("Critical error. Casting Response failed.");
return CYNARA_API_UNKNOWN_ERROR;
}
- LOGD("codeResponse: code [%" PRIu16 "]", codeResponse->m_code);
- switch (codeResponse->m_code) {
+ return CYNARA_API_SUCCESS;
+}
+
+static int interpretCodeResponse(const CodeResponse::Code &code) {
+ LOGD("codeResponse: code [%" PRIu16 "]", code);
+ switch (code) {
case CodeResponse::Code::OK:
LOGI("Cynara command finished successfully.");
return CYNARA_API_SUCCESS;
return CYNARA_API_OPERATION_FAILED;
default:
LOGE("Unexpected response code from server: [%d]",
- static_cast<int>(codeResponse->m_code));
+ static_cast<int>(code));
return CYNARA_API_UNKNOWN_ERROR;
}
}
int OnlineLogic::setPolicies(const ApiInterface::PoliciesByBucket &insertOrUpdate,
- const ApiInterface::KeysByBucket &remove) {
- return askCynaraAndInterpreteCodeResponse<SetPoliciesRequest>(insertOrUpdate, remove);
+ const ApiInterface::KeysByBucket &remove) {
+ CodeResponsePtr codeResponse;
+ int ret = getResponse<SetPoliciesRequest>(codeResponse, insertOrUpdate, remove);
+ if (ret != CYNARA_API_SUCCESS) {
+ return ret;
+ }
+
+ return interpretCodeResponse(codeResponse->m_code);
}
int OnlineLogic::insertOrUpdateBucket(const PolicyBucketId &bucket,
- const PolicyResult &policyResult) {
- return askCynaraAndInterpreteCodeResponse<InsertOrUpdateBucketRequest>(bucket, policyResult);
-}
+ const PolicyResult &policyResult) {
+ CodeResponsePtr codeResponse;
+ int ret = getResponse<InsertOrUpdateBucketRequest>(codeResponse, bucket, policyResult);
+ if (ret != CYNARA_API_SUCCESS) {
+ return ret;
+ }
-int OnlineLogic::removeBucket(const PolicyBucketId &bucket) {
- return askCynaraAndInterpreteCodeResponse<RemoveBucketRequest>(bucket);
+ return interpretCodeResponse(codeResponse->m_code);
}
-int OnlineLogic::adminCheck(const PolicyBucketId &startBucket, bool recursive, const PolicyKey &key,
- PolicyResult &result) {
- if (!ensureConnection()) {
- LOGE("Cannot connect to cynara. Service not available.");
- return CYNARA_API_SERVICE_NOT_AVAILABLE;
+int OnlineLogic::removeBucket(const PolicyBucketId &bucket) {
+ CodeResponsePtr codeResponse;
+ int ret = getResponse<RemoveBucketRequest>(codeResponse, bucket);
+ if (ret != CYNARA_API_SUCCESS) {
+ return ret;
}
- ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
+ return interpretCodeResponse(codeResponse->m_code);
+}
- //Ask cynara service
+int OnlineLogic::adminCheck(const PolicyBucketId &startBucket, bool recursive, const PolicyKey &key,
+ PolicyResult &result) {
AdminCheckResponsePtr adminCheckResponse;
-
- RequestPtr request = std::make_shared<AdminCheckRequest>(key, startBucket, recursive,
- sequenceNumber);
- ResponsePtr response;
- while (!(response = m_socketClient->askCynaraServer(request))) {
- if (!m_socketClient->connect())
- return CYNARA_API_SERVICE_NOT_AVAILABLE;
- }
-
- adminCheckResponse = std::dynamic_pointer_cast<AdminCheckResponse>(response);
- if (!adminCheckResponse) {
- LOGC("Casting Response to AdminCheckResponse failed.");
- return CYNARA_API_UNKNOWN_ERROR;
+ int ret = getResponse<AdminCheckRequest>(adminCheckResponse, key, startBucket, recursive);
+ if (ret != CYNARA_API_SUCCESS) {
+ return ret;
}
LOGD("AdminCheckResponse: policyType [%" PRIu16 "], metadata <%s>, bucketValid [%d]",
int OnlineLogic::listPolicies(const PolicyBucketId &bucket, const PolicyKey &filter,
std::vector<Policy> &policies) {
- if (!ensureConnection()) {
- LOGE("Cannot connect to cynara. Service not available.");
- return CYNARA_API_SERVICE_NOT_AVAILABLE;
- }
-
- ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
-
- //Ask cynara service
ListResponsePtr listResponse;
-
- RequestPtr request = std::make_shared<ListRequest>(bucket, filter, sequenceNumber);
- ResponsePtr response;
- while (!(response = m_socketClient->askCynaraServer(request))) {
- if (!m_socketClient->connect())
- return CYNARA_API_SERVICE_NOT_AVAILABLE;
- }
-
- listResponse = std::dynamic_pointer_cast<ListResponse>(response);
- if (!listResponse) {
- LOGC("Casting Response to ListResponse failed.");
- return CYNARA_API_UNKNOWN_ERROR;
+ int ret = getResponse<ListRequest>(listResponse, bucket, filter);
+ if (ret != CYNARA_API_SUCCESS) {
+ return ret;
}
LOGD("listResponse: number of policies [%zu], bucketValid [%d]",
int OnlineLogic::erasePolicies(const PolicyBucketId &startBucket, bool recursive,
const PolicyKey &filter) {
- return askCynaraAndInterpreteCodeResponse<EraseRequest>(startBucket, recursive, filter);
+ CodeResponsePtr codeResponse;
+ int ret = getResponse<EraseRequest>(codeResponse, startBucket, recursive, filter);
+ if (ret != CYNARA_API_SUCCESS) {
+ return ret;
+ }
+
+ return interpretCodeResponse(codeResponse->m_code);
}
int OnlineLogic::listDescriptions(std::vector<PolicyDescription> &descriptions) {