blob: 67d7930aa0a72732339c32acc32e31ce1bf5aca3 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* 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.
*/
#include <aidl/test_package/BnTest.h>
#include <stdio.h>
#include <unistd.h>
#include <condition_variable>
#include <mutex>
#include "utilities.h"
using Bar = ::aidl::test_package::Bar;
using ByteEnum = ::aidl::test_package::ByteEnum;
using Foo = ::aidl::test_package::Foo;
using IEmpty = ::aidl::test_package::IEmpty;
using IntEnum = ::aidl::test_package::IntEnum;
using LongEnum = ::aidl::test_package::LongEnum;
using RegularPolygon = ::aidl::test_package::RegularPolygon;
class MyTest : public ::aidl::test_package::BnTest,
public ThisShouldBeDestroyed {
public:
binder_status_t dump(int fd, const char** args, uint32_t numArgs) override {
for (uint32_t i = 0; i < numArgs; i++) {
dprintf(fd, "%s", args[i]);
}
fsync(fd);
return STATUS_OK;
}
::ndk::ScopedAStatus GetName(std::string* _aidl_return) override {
*_aidl_return = "CPP";
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus TestVoidReturn() override {
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus TestOneway() override {
// This return code should be ignored since it is oneway.
return ::ndk::ScopedAStatus(AStatus_fromStatus(STATUS_UNKNOWN_ERROR));
}
::ndk::ScopedAStatus GiveMeMyCallingPid(int32_t* _aidl_return) override {
*_aidl_return = AIBinder_getCallingPid();
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus GiveMeMyCallingUid(int32_t* _aidl_return) override {
*_aidl_return = AIBinder_getCallingUid();
return ::ndk::ScopedAStatus(AStatus_newOk());
}
private:
bool mCached = false;
std::mutex mCachedMutex;
std::condition_variable mCachedCondition;
int mCachedPid = -1;
int mCachedUid = -1;
public:
::ndk::ScopedAStatus CacheCallingInfoFromOneway() override {
std::unique_lock<std::mutex> l(mCachedMutex);
mCached = true;
mCachedPid = AIBinder_getCallingPid();
mCachedUid = AIBinder_getCallingUid();
mCachedCondition.notify_all();
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus GiveMeMyCallingPidFromOneway(
int32_t* _aidl_return) override {
std::unique_lock<std::mutex> l(mCachedMutex);
mCachedCondition.wait(l, [&] { return mCached; });
*_aidl_return = mCachedPid;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus GiveMeMyCallingUidFromOneway(
int32_t* _aidl_return) override {
std::unique_lock<std::mutex> l(mCachedMutex);
mCachedCondition.wait(l, [&] { return mCached; });
*_aidl_return = mCachedUid;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatInt(int32_t in_value,
int32_t* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatLong(int64_t in_value,
int64_t* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatFloat(float in_value,
float* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatDouble(double in_value,
double* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatBoolean(bool in_value,
bool* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatChar(char16_t in_value,
char16_t* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatByte(int8_t in_value,
int8_t* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatByteEnum(ByteEnum in_value, ByteEnum* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatIntEnum(IntEnum in_value, IntEnum* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatLongEnum(LongEnum in_value, LongEnum* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatBinder(const ::ndk::SpAIBinder& in_value,
::ndk::SpAIBinder* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableBinder(
const ::ndk::SpAIBinder& in_value,
::ndk::SpAIBinder* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatInterface(
const std::shared_ptr<IEmpty>& in_value,
std::shared_ptr<IEmpty>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableInterface(
const std::shared_ptr<IEmpty>& in_value,
std::shared_ptr<IEmpty>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatFd(
const ::ndk::ScopedFileDescriptor& in_value,
::ndk::ScopedFileDescriptor* _aidl_return) override {
_aidl_return->set(dup(in_value.get()));
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatFdArray(
const std::vector<::ndk::ScopedFileDescriptor>& in_input,
std::vector<::ndk::ScopedFileDescriptor>* out_repeated,
std::vector<::ndk::ScopedFileDescriptor>* _aidl_return) override {
out_repeated->clear();
for (auto& fd : in_input) {
out_repeated->emplace_back(dup(fd.get()));
_aidl_return->emplace_back(dup(fd.get()));
}
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableFd(
const ::ndk::ScopedFileDescriptor& in_value,
::ndk::ScopedFileDescriptor* _aidl_return) override {
_aidl_return->set(dup(in_value.get()));
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatString(const std::string& in_value,
std::string* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableString(
const std::optional<std::string>& in_value,
std::optional<std::string>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatPolygon(const RegularPolygon& in_value,
RegularPolygon* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullablePolygon(const std::optional<RegularPolygon>& in_value,
std::optional<RegularPolygon>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RenamePolygon(RegularPolygon* value,
const std::string& newName) override {
value->name = newName;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatBooleanArray(
const std::vector<bool>& in_value, std::vector<bool>* out_repeated,
std::vector<bool>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatByteArray(
const std::vector<int8_t>& in_value, std::vector<int8_t>* out_repeated,
std::vector<int8_t>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatCharArray(
const std::vector<char16_t>& in_value,
std::vector<char16_t>* out_repeated,
std::vector<char16_t>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatIntArray(
const std::vector<int32_t>& in_value, std::vector<int32_t>* out_repeated,
std::vector<int32_t>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatLongArray(
const std::vector<int64_t>& in_value, std::vector<int64_t>* out_repeated,
std::vector<int64_t>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatFloatArray(
const std::vector<float>& in_value, std::vector<float>* out_repeated,
std::vector<float>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatDoubleArray(
const std::vector<double>& in_value, std::vector<double>* out_repeated,
std::vector<double>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatByteEnumArray(const std::vector<ByteEnum>& in_value,
std::vector<ByteEnum>* out_repeated,
std::vector<ByteEnum>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatIntEnumArray(const std::vector<IntEnum>& in_value,
std::vector<IntEnum>* out_repeated,
std::vector<IntEnum>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatLongEnumArray(const std::vector<LongEnum>& in_value,
std::vector<LongEnum>* out_repeated,
std::vector<LongEnum>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatStringArray(
const std::vector<std::string>& in_value,
std::vector<std::string>* out_repeated,
std::vector<std::string>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatRegularPolygonArray(
const std::vector<RegularPolygon>& in_value, std::vector<RegularPolygon>* out_repeated,
std::vector<RegularPolygon>* _aidl_return) override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus Repeat2StringList(const std::vector<std::string>& in_input,
std::vector<std::string>* out_repeated,
std::vector<std::string>* _aidl_return) override {
*out_repeated = std::vector<std::string>();
*_aidl_return = std::vector<std::string>();
for (int i = 0; i < 2; i++) {
for (auto& s : in_input) {
out_repeated->emplace_back(s);
_aidl_return->emplace_back(s);
}
}
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus Repeat2RegularPolygonList(
const std::vector<::aidl::test_package::RegularPolygon>& in_input,
std::vector<::aidl::test_package::RegularPolygon>* out_repeated,
std::vector<::aidl::test_package::RegularPolygon>* _aidl_return) override {
*out_repeated = std::vector<::aidl::test_package::RegularPolygon>();
*_aidl_return = std::vector<::aidl::test_package::RegularPolygon>();
for (int i = 0; i < 2; i++) {
for (auto& s : in_input) {
out_repeated->emplace_back(s);
_aidl_return->emplace_back(s);
}
}
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableBooleanArray(
const std::optional<std::vector<bool>>& in_value,
std::optional<std::vector<bool>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableByteArray(
const std::optional<std::vector<int8_t>>& in_value,
std::optional<std::vector<int8_t>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableCharArray(
const std::optional<std::vector<char16_t>>& in_value,
std::optional<std::vector<char16_t>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableIntArray(
const std::optional<std::vector<int32_t>>& in_value,
std::optional<std::vector<int32_t>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableLongArray(
const std::optional<std::vector<int64_t>>& in_value,
std::optional<std::vector<int64_t>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableFloatArray(
const std::optional<std::vector<float>>& in_value,
std::optional<std::vector<float>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableDoubleArray(
const std::optional<std::vector<double>>& in_value,
std::optional<std::vector<double>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableByteEnumArray(
const std::optional<std::vector<ByteEnum>>& in_value,
std::optional<std::vector<ByteEnum>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableIntEnumArray(
const std::optional<std::vector<IntEnum>>& in_value,
std::optional<std::vector<IntEnum>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableLongEnumArray(
const std::optional<std::vector<LongEnum>>& in_value,
std::optional<std::vector<LongEnum>>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus RepeatNullableStringArray(
const std::optional<std::vector<std::optional<std::string>>>& in_value,
std::optional<std::vector<std::optional<std::string>>>* _aidl_return) {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus DoubleRepeatNullableStringArray(
const std::optional<std::vector<std::optional<std::string>>>& in_value,
std::optional<std::vector<std::optional<std::string>>>* out_repeated,
std::optional<std::vector<std::optional<std::string>>>* _aidl_return)
override {
*out_repeated = in_value;
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
#ifdef USING_VERSION_1
::ndk::ScopedAStatus RepeatStringNullableLater(const std::string& in_value,
std::string* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
#else
::ndk::ScopedAStatus RepeatStringNullableLater(
const std::optional<std::string>& in_value,
std::optional<std::string>* _aidl_return) override {
*_aidl_return = in_value;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
#endif
#ifndef USING_VERSION_1
// All methods added from now on should be within this macro
::ndk::ScopedAStatus NewMethodThatReturns10(int32_t* _aidl_return) override {
*_aidl_return = 10;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
#endif
::ndk::ScopedAStatus repeatFoo(const Foo& in_inFoo, Foo* _aidl_return) {
*_aidl_return = in_inFoo;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus renameFoo(Foo* in_foo, const std::string& in_name) {
in_foo->a = in_name;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus renameBar(Foo* in_foo, const std::string& in_name) {
in_foo->d.a = in_name;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
::ndk::ScopedAStatus getF(const Foo& foo, int32_t* _aidl_return) {
*_aidl_return = foo.f;
return ::ndk::ScopedAStatus(AStatus_newOk());
}
};