1d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 2d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#define LOG_TAG "hidl_test" 3d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 4d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#include "Foo.h" 5d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#include <android-base/logging.h> 630dc3dee3c248b95e4fea676021c980f69bed4caYifan Hong#include <hidl-test/FooHelper.h> 7d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#include <inttypes.h> 8d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong#include <utils/Timers.h> 9d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 10d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace android { 11d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace hardware { 12d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace tests { 13d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace foo { 14d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace V1_0 { 15d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hongnamespace implementation { 16d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 17d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong// Methods from ::android::hardware::tests::foo::V1_0::IFoo follow. 183bcfa475e29a169e888215d9b52cda50fa645ca5Steven MorelandReturn<void> Foo::convertToBoolIfSmall(Discriminator d, const hidl_vec<Union>& u, 193bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland convertToBoolIfSmall_cb _hidl_cb) { 203bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland hidl_vec<ContainsUnion> res(u.size()); 213bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland for (size_t i = 0; i < u.size(); i++) { 223bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland ContainsUnion& outValue = res[i]; 233bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland 243bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland if (d == Discriminator::BOOL) { 253bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland outValue.discriminator = Discriminator::BOOL; 263bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland outValue.value.boolValue = u[i].boolValue; 273bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland } else { 283bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland uint64_t value = u[i].intValue; 293bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland if (value == 0 || value == 1) { 303bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland outValue.discriminator = Discriminator::BOOL; 313bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland outValue.value.boolValue = static_cast<bool>(value); 323bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland } else { 333bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland outValue.discriminator = Discriminator::INT; 343bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland outValue.value.intValue = value; 353bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland } 363bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland } 373bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland } 383bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland _hidl_cb(res); 393bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland return Void(); 403bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland} 413bcfa475e29a169e888215d9b52cda50fa645ca5Steven Moreland 42d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::doThis(float param) { 430c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) doThis(" << param << ")"; 44d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 45d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 46d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 47d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 48d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<int32_t> Foo::doThatAndReturnSomething( 49d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong int64_t param) { 50d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong LOG(INFO) << "SERVER(Foo) doThatAndReturnSomething(" << param << ")"; 51d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 52d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return 666; 53d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 54d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 55d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<double> Foo::doQuiteABit( 56d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong int32_t a, 57d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong int64_t b, 58d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong float c, 59d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong double d) { 60d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong LOG(INFO) << "SERVER(Foo) doQuiteABit(" 61d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong << a 62d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong << ", " 63d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong << b 64d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong << ", " 65d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong << c 66d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong << ", " 67d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong << d 68d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong << ")"; 69d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 70d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return 666.5; 71d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 72d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 73d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::doSomethingElse( 74d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong const hidl_array<int32_t, 15> ¶m, doSomethingElse_cb _cb) { 750c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) doSomethingElse(...)"; 76d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 77d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong hidl_array<int32_t, 32> result; 78d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t i = 0; i < 15; ++i) { 79d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong result[i] = 2 * param[i]; 80d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong result[15 + i] = param[i]; 81d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 82d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong result[30] = 1; 83d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong result[31] = 2; 84d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 85d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _cb(result); 86d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 87d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 88d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 89d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 90d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::doStuffAndReturnAString( 91d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong doStuffAndReturnAString_cb _cb) { 920c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) doStuffAndReturnAString"; 93d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 9454813ed7c631ee5bfa499e87da65cacbf10efc9bSteven Moreland _cb("Hello, world"); 95d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 96d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 97d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 98d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 99d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::mapThisVector( 100d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong const hidl_vec<int32_t> ¶m, mapThisVector_cb _cb) { 1010c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) mapThisVector"; 102d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 103d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong hidl_vec<int32_t> out; 104d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong out.resize(param.size()); 105d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 106d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t i = 0; i < out.size(); ++i) { 107d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong out[i] = param[i] * 2; 108d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 109d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 110d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _cb(out); 111d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 112d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 113d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 114d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 115d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::callMe( 116d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong const sp<IFooCallback> &cb) { 1170c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callMe " << cb.get(); 118d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 119d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong if (cb != NULL) { 120d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong hidl_array<nsecs_t, 3> c; 1210c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callMe " 1220c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << cb.get() 1230c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " calling IFooCallback::heyItsYou, should return immediately"; 124d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong c[0] = systemTime(); 125d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong cb->heyItsYou(cb); 126d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong c[0] = systemTime() - c[0]; 1270c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callMe " 1280c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << cb.get() 1290c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " calling IFooCallback::heyItsYou, returned after" 1300c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << c[0] 1310c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << "ns"; 1320c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callMe " 1330c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << cb.get() 1340c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " calling IFooCallback::heyItsYouIsntIt, should block for" 1350c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << DELAY_S 1360c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " seconds"; 137d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong c[1] = systemTime(); 138fafbbd7026dc48054f3c68b0484b3ffa972d7ab6Steven Moreland bool answer = cb->heyItsYouIsntIt(cb); 139d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong c[1] = systemTime() - c[1]; 140d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 1410c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callMe " 1420c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << cb.get() 1430c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " calling IFooCallback::heyItsYouIsntIt, responded with " 1440c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << answer 1450c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " after " 1460c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << c[1] 1470c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << "ns"; 1480c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong 1490c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callMe " 1500c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << cb.get() 1510c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " calling IFooCallback::heyItsTheMeaningOfLife," 1520c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " should return immediately"; 153d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong c[2] = systemTime(); 154d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong cb->heyItsTheMeaningOfLife(42); 155d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong c[2] = systemTime() - c[2]; 156d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 1570c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callMe " 1580c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << cb.get() 1590c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " cAfter call to IFooCallback::heyItsTheMeaningOfLife responded after " 1600c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << c[2] 1610c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << "ns"; 1620c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callMe " 1630c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << cb.get() 1640c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " calling IFooCallback::youBlockedMeFor to report times"; 165d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong cb->youBlockedMeFor(c); 1660c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callMe " 1670c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << cb.get() 1680c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << " After call to IFooCallback::youBlockedMeFor"; 169d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 170d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 171d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 172d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 173d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 174d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<Foo::SomeEnum> Foo::useAnEnum(SomeEnum param) { 1750c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) useAnEnum " << (int)param; 176d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 177d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return SomeEnum::goober; 178d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 179d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 180d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveAGooberVec(const hidl_vec<Goober>& param) { 1810c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) haveAGooberVec ¶m = " << ¶m; 182d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 183d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 184d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 185d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 186d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveAGoober(const Goober &g) { 1870c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) haveaGoober g=" << &g; 188d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 189d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 190d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 191d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 192d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveAGooberArray(const hidl_array<Goober, 20> & /* lots */) { 1930c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) haveAGooberArray"; 194d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 195d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 196d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 197d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 198d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveATypeFromAnotherFile(const Abc &def) { 1990c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) haveATypeFromAnotherFile def=" << &def; 200d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 201d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 202d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 203d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 204d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveSomeStrings( 205d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong const hidl_array<hidl_string, 3> &array, 206d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong haveSomeStrings_cb _cb) { 2070c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong 2080c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) haveSomeStrings([\"" 2090c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << array[0].c_str() 2100c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << "\", \"" 2110c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << array[1].c_str() 2120c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << "\", \"" 2130c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << array[2].c_str() 2140c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << "\"])"; 215d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 216d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong hidl_array<hidl_string, 2> result; 217d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong result[0] = "Hello"; 218d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong result[1] = "World"; 219d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 220d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _cb(result); 221d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 222d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 223d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 224d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 225d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::haveAStringVec( 226d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong const hidl_vec<hidl_string> &vector, 227d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong haveAStringVec_cb _cb) { 2280c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) haveAStringVec([\"" 2290c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << vector[0].c_str() 2300c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << "\", \"" 2310c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << vector[1].c_str() 2320c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << "\", \"" 2330c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << vector[2].c_str() 2340c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong << "\"])"; 235d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 236d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong hidl_vec<hidl_string> result; 237d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong result.resize(2); 238d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 239d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong result[0] = "Hello"; 240d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong result[1] = "World"; 241d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 242d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _cb(result); 243d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 244d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 245d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 246d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 247d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::transposeMe( 248d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong const hidl_array<float, 3, 5> &in, transposeMe_cb _cb) { 2490c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) transposeMe(" << to_string(in).c_str() << ")"; 250d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 251d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong hidl_array<float, 5, 3> out; 252d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t i = 0; i < 5; ++i) { 253d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t j = 0; j < 3; ++j) { 254d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong out[i][j] = in[j][i]; 255d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 256d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 257d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 2580c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) transposeMe returning " << to_string(out).c_str(); 259d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 260d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _cb(out); 261d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 262d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 263d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 264d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 265d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::callingDrWho( 266d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong const MultiDimensional &in, callingDrWho_cb _hidl_cb) { 2670c4c7a30c21a0bde5879c5e26c02b35fb91266b2Yifan Hong LOG(INFO) << "SERVER(Foo) callingDrWho(" << MultiDimensionalToString(in).c_str() << ")"; 268d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 269d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong MultiDimensional out; 270d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t i = 0; i < 5; ++i) { 271d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t j = 0; j < 3; ++j) { 272d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong out.quuxMatrix[i][j].first = in.quuxMatrix[4 - i][2 - j].last; 273d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong out.quuxMatrix[i][j].last = in.quuxMatrix[4 - i][2 - j].first; 274d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 275d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 276d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 277d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _hidl_cb(out); 278d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 279d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 280d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 281d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 282d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::transpose(const StringMatrix5x3 &in, transpose_cb _hidl_cb) { 283d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong LOG(INFO) << "SERVER(Foo) transpose " << to_string(in); 284d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 285d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong StringMatrix3x5 out; 286d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t i = 0; i < 3; ++i) { 287d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t j = 0; j < 5; ++j) { 288d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong out.s[i][j] = in.s[j][i]; 289d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 290d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 291d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 292d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _hidl_cb(out); 293d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 294d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 295d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 296d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 297d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::transpose2( 298d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong const hidl_array<hidl_string, 5, 3> &in, transpose2_cb _hidl_cb) { 299d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong LOG(INFO) << "SERVER(Foo) transpose2 " << to_string(in); 300d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 301d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong hidl_array<hidl_string, 3, 5> out; 302d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t i = 0; i < 3; ++i) { 303d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong for (size_t j = 0; j < 5; ++j) { 304d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong out[i][j] = in[j][i]; 305d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 306d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong } 307d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 308d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _hidl_cb(out); 309d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 310d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 311d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 312d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 313d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::sendVec( 314d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong const hidl_vec<uint8_t> &data, sendVec_cb _hidl_cb) { 315d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _hidl_cb(data); 316d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 317d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 318d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 319d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 320d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongReturn<void> Foo::sendVecVec(sendVecVec_cb _hidl_cb) { 321d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong hidl_vec<hidl_vec<uint8_t>> data; 322d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong _hidl_cb(data); 323d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 324d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return Void(); 325d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 326d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 327847b14511a973be167af465491226a86492a10c6Andreas HuberReturn<void> Foo::haveAVectorOfInterfaces( 328847b14511a973be167af465491226a86492a10c6Andreas Huber const hidl_vec<sp<ISimple> > &in, 329847b14511a973be167af465491226a86492a10c6Andreas Huber haveAVectorOfInterfaces_cb _hidl_cb) { 330847b14511a973be167af465491226a86492a10c6Andreas Huber _hidl_cb(in); 331847b14511a973be167af465491226a86492a10c6Andreas Huber 332847b14511a973be167af465491226a86492a10c6Andreas Huber return Void(); 333847b14511a973be167af465491226a86492a10c6Andreas Huber} 334847b14511a973be167af465491226a86492a10c6Andreas Huber 335847b14511a973be167af465491226a86492a10c6Andreas HuberReturn<void> Foo::haveAVectorOfGenericInterfaces( 336ebcc3328e8bd0415514751853a5de8010cc8c6baYifan Hong const hidl_vec<sp<android::hidl::base::V1_0::IBase> > &in, 337847b14511a973be167af465491226a86492a10c6Andreas Huber haveAVectorOfGenericInterfaces_cb _hidl_cb) { 338847b14511a973be167af465491226a86492a10c6Andreas Huber _hidl_cb(in); 339ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong return Void(); 340ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong} 341ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong 342ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan HongReturn<void> Foo::createMyHandle(createMyHandle_cb _hidl_cb) { 343ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong native_handle_t* nh = native_handle_create(0, 10); 344ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong int data[] = {2,3,5,7,11,13,17,19,21,23}; 345ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong CHECK(sizeof(data) == 10 * sizeof(int)); 346ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong memcpy(nh->data, data, sizeof(data)); 347ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong mHandles.push_back(nh); 348ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong 349ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong MyHandle h; 350ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong h.guard = 666; 351ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong h.h = nh; 352ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong _hidl_cb(h); 353ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong return Void(); 354ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong} 355847b14511a973be167af465491226a86492a10c6Andreas Huber 356ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan HongReturn<void> Foo::createHandles(uint32_t size, createHandles_cb _hidl_cb) { 357403161ab73ad230ab27321a570b1c41d3b1af4a2Martijn Coenen hidl_vec<hidl_handle> handles; 358ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong handles.resize(size); 359ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong for(uint32_t i = 0; i < size; ++i) { 360ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong createMyHandle([&](const MyHandle& h) { 361ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong handles[i] = h.h; 362ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong }); 363ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong } 364ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong _hidl_cb(handles); 365ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong return Void(); 366ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong} 367ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong 368ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan HongReturn<void> Foo::closeHandles() { 369ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong for(native_handle_t* h : mHandles) { 370ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong native_handle_delete(h); 371ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong } 372ebfa633103e4efbe4c39c8abf906ae597a1d7a5bYifan Hong mHandles.clear(); 373847b14511a973be167af465491226a86492a10c6Andreas Huber return Void(); 374847b14511a973be167af465491226a86492a10c6Andreas Huber} 375d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 376b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn CoenenReturn<void> Foo::echoNullInterface(const sp<IFooCallback> &cb, echoNullInterface_cb _hidl_cb) { 377b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen _hidl_cb(cb == nullptr, cb); 378b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen 379b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen return Void(); 380b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen} 381b7307d5c8acedec902c2a39de62065b2dbb9ae1aMartijn Coenen 382d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan HongIFoo* HIDL_FETCH_IFoo(const char* /* name */) { 383d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong return new Foo(); 384d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} 385d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong 386d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} // namespace implementation 387d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} // namespace V1_0 388d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} // namespace foo 389d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} // namespace tests 390d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} // namespace hardware 391d5b5b2eceaf4ac1469825ff47fe17e403f2ed400Yifan Hong} // namespace android 392