1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "LowpanProvision"
18
19#include <android/net/lowpan/LowpanProvision.h>
20
21#include <binder/Parcel.h>
22#include <log/log.h>
23#include <utils/Errors.h>
24
25using android::BAD_TYPE;
26using android::BAD_VALUE;
27using android::NO_ERROR;
28using android::Parcel;
29using android::status_t;
30using android::UNEXPECTED_NULL;
31using android::net::lowpan::LowpanProvision;
32using namespace ::android::binder;
33
34namespace android {
35
36namespace net {
37
38namespace lowpan {
39
40#define RETURN_IF_FAILED(calledOnce)                                     \
41    {                                                                    \
42        status_t returnStatus = calledOnce;                              \
43        if (returnStatus) {                                              \
44            ALOGE("Failed at %s:%d (%s)", __FILE__, __LINE__, __func__); \
45            return returnStatus;                                         \
46         }                                                               \
47    }
48LowpanProvision::LowpanProvision(const LowpanIdentity& identity, const LowpanCredential& credential)
49    : mIdentity(identity), mCredential(credential), mHasCredential(true)
50{
51}
52
53LowpanProvision::LowpanProvision(const LowpanIdentity& identity)
54    : mIdentity(identity), mHasCredential(false)
55{
56}
57
58const LowpanIdentity* LowpanProvision::getLowpanIdentity() const {
59    return &mIdentity;
60}
61
62const LowpanCredential* LowpanProvision::getLowpanCredential() const {
63    return mHasCredential
64        ? &mCredential
65        : NULL;
66}
67
68status_t LowpanProvision::writeToParcel(Parcel* parcel) const {
69    /*
70     * Keep implementation in sync with writeToParcel() in
71     * frameworks/base/lowpan/java/android/net/android/net/lowpan/LowpanProvision.java.
72     */
73
74    RETURN_IF_FAILED(mIdentity.writeToParcel(parcel));
75    RETURN_IF_FAILED(parcel->writeBool(mHasCredential));
76
77    if (mHasCredential) {
78        RETURN_IF_FAILED(mCredential.writeToParcel(parcel));
79    }
80
81    return NO_ERROR;
82}
83
84status_t LowpanProvision::readFromParcel(const Parcel* parcel) {
85    /*
86     * Keep implementation in sync with readFromParcel() in
87     * frameworks/base/lowpan/java/android/net/android/net/lowpan/LowpanProvision.java.
88     */
89
90    RETURN_IF_FAILED(mIdentity.readFromParcel(parcel));
91    RETURN_IF_FAILED(parcel->readBool(&mHasCredential));
92
93    if (mHasCredential) {
94        RETURN_IF_FAILED(mCredential.readFromParcel(parcel));
95    }
96
97    return NO_ERROR;
98}
99
100bool LowpanProvision::operator==(const LowpanProvision& rhs)
101{
102    if (mIdentity != rhs.mIdentity) {
103        return false;
104    }
105
106    if (mHasCredential != rhs.mHasCredential) {
107        return false;
108    }
109
110    if (mHasCredential && mCredential != rhs.mCredential) {
111        return false;
112    }
113
114    return true;
115}
116
117}  // namespace lowpan
118
119}  // namespace net
120
121}  // namespace android
122