summaryrefslogtreecommitdiffstats
path: root/src/plugins/afb
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/afb')
-rw-r--r--src/plugins/afb/AFBApiImpl.cpp87
-rw-r--r--src/plugins/afb/AFBApiImpl.h61
-rw-r--r--src/plugins/afb/AFBRequestImpl.cpp37
-rw-r--r--src/plugins/afb/AFBRequestImpl.h49
-rw-r--r--src/plugins/afb/include/AFBEventImpl.h77
-rw-r--r--src/plugins/afb/src/AFBEventImpl.cpp89
6 files changed, 400 insertions, 0 deletions
diff --git a/src/plugins/afb/AFBApiImpl.cpp b/src/plugins/afb/AFBApiImpl.cpp
new file mode 100644
index 0000000..88d1e7e
--- /dev/null
+++ b/src/plugins/afb/AFBApiImpl.cpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. 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.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file 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.
+ */
+
+#include "afb/AFBApiImpl.h"
+
+#include "afb/include/AFBEventImpl.h"
+#include "utilities/logging/Logger.h"
+
+extern "C" {
+#define AFB_BINDING_VERSION 3
+#define FREEIF(x) \
+ if (!x) { \
+ free(x); \
+ }
+#define BREAKIF(x) \
+ if (x) { \
+ result = false; \
+ break; \
+ }
+
+#include "afb-definitions.h"
+}
+
+static std::string TAG = "vshl::afb::AFBApiImpl";
+
+/**
+ * Specifies the severity level of a log message
+ */
+using Level = vshl::common::interfaces::ILogger::Level;
+using namespace vshl::common::interfaces;
+using namespace vshl::utilities::logging;
+
+namespace vshl {
+namespace afb {
+
+std::unique_ptr<AFBApiImpl> AFBApiImpl::create(AFB_ApiT api) {
+ return std::unique_ptr<AFBApiImpl>(new AFBApiImpl(api));
+}
+
+AFBApiImpl::AFBApiImpl(AFB_ApiT api) : mApi(api), mLogger(Logger::create(api)) {
+}
+
+AFBApiImpl::~AFBApiImpl() {
+}
+
+std::shared_ptr<IAFBApi::IAFBEvent> AFBApiImpl::createEvent(const std::string& eventName) {
+ return AFBEventImpl::create(mLogger, mApi, eventName);
+}
+
+int AFBApiImpl::callSync(
+ const std::string& api,
+ const std::string& verb,
+ struct json_object* request,
+ struct json_object** result,
+ std::string& error,
+ std::string& info) {
+ char* errorStr = NULL;
+ char* infoStr = NULL;
+ int rc = AFB_ApiSync(mApi, api.c_str(), verb.c_str(), request, result, &errorStr, &infoStr);
+
+ if (errorStr) {
+ error = errorStr;
+ free(errorStr);
+ }
+
+ if (infoStr) {
+ info = infoStr;
+ free(infoStr);
+ }
+
+ return rc;
+}
+
+} // namespace afb
+} // namespace vshl
diff --git a/src/plugins/afb/AFBApiImpl.h b/src/plugins/afb/AFBApiImpl.h
new file mode 100644
index 0000000..74aa7ef
--- /dev/null
+++ b/src/plugins/afb/AFBApiImpl.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. 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.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file 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.
+ */
+#ifndef VSHL_AFB_AFBAPIIMPL_H_
+#define VSHL_AFB_AFBAPIIMPL_H_
+
+#include <memory>
+
+extern "C" {
+#include "ctl-plugin.h"
+}
+
+#include "interfaces/afb/IAFBApi.h"
+#include "interfaces/utilities/logging/ILogger.h"
+
+using namespace std;
+
+namespace vshl {
+namespace afb {
+
+class AFBApiImpl : public vshl::common::interfaces::IAFBApi {
+public:
+ static std::unique_ptr<AFBApiImpl> create(AFB_ApiT api);
+
+ ~AFBApiImpl();
+
+ std::shared_ptr<IAFBEvent> createEvent(const std::string& eventName) override;
+
+ int callSync(
+ const std::string& api,
+ const std::string& verb,
+ struct json_object* request,
+ struct json_object** result,
+ std::string& error,
+ std::string& info) override;
+
+private:
+ AFBApiImpl(AFB_ApiT api);
+
+ // AFB API Binding
+ AFB_ApiT mApi;
+
+ // Logger
+ std::shared_ptr<vshl::common::interfaces::ILogger> mLogger;
+};
+
+} // namespace afb
+} // namespace vshl
+
+#endif // VSHL_AFB_AFBAPIIMPL_H_
diff --git a/src/plugins/afb/AFBRequestImpl.cpp b/src/plugins/afb/AFBRequestImpl.cpp
new file mode 100644
index 0000000..8ec5691
--- /dev/null
+++ b/src/plugins/afb/AFBRequestImpl.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. 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.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file 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.
+ */
+
+#include "afb/AFBRequestImpl.h"
+
+extern "C" {
+#include "afb-definitions.h"
+}
+
+namespace vshl {
+namespace afb {
+
+std::unique_ptr<AFBRequestImpl> AFBRequestImpl::create(AFB_ReqT afbRequest) {
+ return std::unique_ptr<AFBRequestImpl>(new AFBRequestImpl(afbRequest));
+}
+
+AFBRequestImpl::AFBRequestImpl(AFB_ReqT afbRequest) : mAfbRequest(afbRequest) {
+}
+
+void* AFBRequestImpl::getNativeRequest() {
+ return mAfbRequest;
+}
+
+} // namespace afb
+} // namespace vshl
diff --git a/src/plugins/afb/AFBRequestImpl.h b/src/plugins/afb/AFBRequestImpl.h
new file mode 100644
index 0000000..2e6f3ab
--- /dev/null
+++ b/src/plugins/afb/AFBRequestImpl.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. 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.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file 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.
+ */
+#ifndef VSHL_AFB_AFBREQUESTIMPL_H_
+#define VSHL_AFB_AFBREQUESTIMPL_H_
+
+#include <memory>
+
+extern "C" {
+#include "ctl-plugin.h"
+}
+
+#include "interfaces/afb/IAFBApi.h"
+
+namespace vshl {
+namespace afb {
+
+/**
+ * AFB Request impl
+ */
+class AFBRequestImpl : public vshl::common::interfaces::IAFBRequest {
+public:
+ static std::unique_ptr<AFBRequestImpl> create(AFB_ReqT afbRequest);
+
+ // {@c IAFBRequest Implementation
+ void *getNativeRequest() override;
+ // @c IAFBRequest Implementation }
+
+private:
+ AFBRequestImpl(AFB_ReqT afbRequest);
+
+ AFB_ReqT mAfbRequest;
+};
+
+} // namespace afb
+} // namespace vshl
+
+#endif // VSHL_AFB_AFBREQUESTIMPL_H_
diff --git a/src/plugins/afb/include/AFBEventImpl.h b/src/plugins/afb/include/AFBEventImpl.h
new file mode 100644
index 0000000..45f85f9
--- /dev/null
+++ b/src/plugins/afb/include/AFBEventImpl.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. 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.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file 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.
+ */
+#ifndef VSHL_AFB_EVENT_H_
+#define VSHL_AFB_EVENT_H_
+
+#include <memory>
+#include <string>
+
+#include "interfaces/afb/IAFBApi.h"
+#include "interfaces/utilities/logging/ILogger.h"
+
+extern "C" {
+#include "ctl-plugin.h"
+#include <json-c/json.h>
+}
+
+using namespace std;
+
+namespace vshl {
+namespace afb {
+/*
+ * This class encapsulates AFB Event.
+ */
+class AFBEventImpl : public vshl::common::interfaces::IAFBApi::IAFBEvent {
+public:
+ static unique_ptr<AFBEventImpl>
+ create(shared_ptr<vshl::common::interfaces::ILogger> logger, AFB_ApiT api,
+ const string &eventName);
+
+ // Destructor
+ ~AFBEventImpl();
+
+ /// { @c IAFBEvent implementation
+ string getName() const override;
+ bool isValid() override;
+ int publishEvent(struct json_object *payload) override;
+ bool subscribe(vshl::common::interfaces::IAFBRequest &request) override;
+ bool unsubscribe(vshl::common::interfaces::IAFBRequest &request) override;
+ /// @c IAFBEvent implementation }
+
+private:
+ AFBEventImpl(shared_ptr<vshl::common::interfaces::ILogger> logger,
+ AFB_ApiT api, const string &eventName);
+
+ // Make the event. This is a lazy make that happens
+ // usually during the subscribe stage.
+ void makeEventIfNeccessary();
+
+ // Binding API reference
+ AFB_ApiT mAfbApi;
+
+ // AFB Event
+ afb_event_t mAfbEvent;
+
+ // Event Name
+ string mEventName;
+
+ // Logger
+ shared_ptr<vshl::common::interfaces::ILogger> mLogger;
+};
+
+} // namespace afb
+} // namespace vshl
+
+#endif // VSHL_AFB_EVENT_H_
diff --git a/src/plugins/afb/src/AFBEventImpl.cpp b/src/plugins/afb/src/AFBEventImpl.cpp
new file mode 100644
index 0000000..e3c902d
--- /dev/null
+++ b/src/plugins/afb/src/AFBEventImpl.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. 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.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0/
+ *
+ * or in the "license" file accompanying this file. This file 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.
+ */
+#include "afb/include/AFBEventImpl.h"
+
+static string TAG = "vshl::afb::Event";
+
+using Level = vshl::common::interfaces::ILogger::Level;
+using namespace vshl::common::interfaces;
+
+namespace vshl {
+namespace afb {
+
+unique_ptr<AFBEventImpl> AFBEventImpl::create(
+ shared_ptr<vshl::common::interfaces::ILogger> logger,
+ AFB_ApiT api,
+ const string& eventName) {
+ return unique_ptr<AFBEventImpl>(new AFBEventImpl(logger, api, eventName));
+}
+
+AFBEventImpl::AFBEventImpl(
+ shared_ptr<vshl::common::interfaces::ILogger> logger,
+ AFB_ApiT api,
+ const string& eventName) :
+ mLogger(logger),
+ mAfbApi(api),
+ mEventName(eventName),
+ mAfbEvent(nullptr) {
+}
+
+AFBEventImpl::~AFBEventImpl() {
+}
+
+string AFBEventImpl::getName() const {
+ return mEventName;
+}
+
+bool AFBEventImpl::isValid() {
+ makeEventIfNeccessary();
+ return afb_event_is_valid(mAfbEvent) == 1 ? true : false;
+}
+
+bool AFBEventImpl::subscribe(IAFBRequest& requestInterface) {
+ makeEventIfNeccessary();
+ auto request = static_cast<AFB_ReqT>(requestInterface.getNativeRequest());
+ if (isValid() && afb_req_subscribe(request, mAfbEvent) == 0) {
+ return true;
+ }
+
+ return false;
+}
+
+bool AFBEventImpl::unsubscribe(IAFBRequest& requestInterface) {
+ makeEventIfNeccessary();
+ auto request = static_cast<AFB_ReqT>(requestInterface.getNativeRequest());
+ if (isValid() && afb_req_unsubscribe(request, mAfbEvent) == 0) {
+ return true;
+ }
+
+ return false;
+}
+
+int AFBEventImpl::publishEvent(struct json_object* payload) {
+ makeEventIfNeccessary();
+ return afb_event_push(mAfbEvent, payload);
+}
+
+void AFBEventImpl::makeEventIfNeccessary() {
+ if (mAfbEvent) {
+ return;
+ }
+
+ mLogger->log(Level::NOTICE, TAG, "Creating VSHL event: " + mEventName);
+ mAfbEvent = afb_api_make_event(mAfbApi, mEventName.c_str());
+}
+
+} // namespace afb
+} // namespace vshl