summaryrefslogtreecommitdiffstats
path: root/src/plugins/afb/src/AFBEventImpl.cpp
blob: 86cbd4cf463c3f8c470b50466f946a5c1b55fe90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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 = "vshlcapabilities::afb::Event";

using Level = vshlcapabilities::common::interfaces::ILogger::Level;
using namespace vshlcapabilities::common::interfaces;

namespace vshlcapabilities {
namespace afb {

unique_ptr<AFBEventImpl> AFBEventImpl::create(
    shared_ptr<vshlcapabilities::common::interfaces::ILogger> logger,
    afb_api_t api,
    const string& eventName) {
    return unique_ptr<AFBEventImpl>(new AFBEventImpl(logger, api, eventName));
}

AFBEventImpl::AFBEventImpl(
    shared_ptr<vshlcapabilities::common::interfaces::ILogger> logger,
    afb_api_t 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_req_t>(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_req_t>(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