Loading libs/binder/ndk/ibinder.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -181,7 +181,7 @@ status_t ABBinder::onTransact(transaction_code_t code, const Parcel& data, Parce binder_status_t status = getClass()->onTransact(this, code, &in, &out); return PruneStatusT(status); } else if (code == SHELL_COMMAND_TRANSACTION) { } else if (code == SHELL_COMMAND_TRANSACTION && getClass()->handleShellCommand != nullptr) { int in = data.readFileDescriptor(); int out = data.readFileDescriptor(); int err = data.readFileDescriptor(); Loading libs/binder/ndk/ibinder_internal.h +5 −5 Original line number Diff line number Diff line Loading @@ -115,13 +115,13 @@ struct AIBinder_Class { const ::android::String16& getInterfaceDescriptor() const { return mInterfaceDescriptor; } // required to be non-null, implemented for every class const AIBinder_Class_onCreate onCreate; const AIBinder_Class_onDestroy onDestroy; const AIBinder_Class_onTransact onTransact; const AIBinder_Class_onCreate onCreate = nullptr; const AIBinder_Class_onDestroy onDestroy = nullptr; const AIBinder_Class_onTransact onTransact = nullptr; // optional methods for a class AIBinder_onDump onDump; AIBinder_handleShellCommand handleShellCommand; AIBinder_onDump onDump = nullptr; AIBinder_handleShellCommand handleShellCommand = nullptr; private: // This must be a String16 since BBinder virtual getInterfaceDescriptor returns a reference to Loading libs/binder/ndk/tests/iface.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,7 @@ IFoo::~IFoo() { AIBinder_Weak_delete(mWeakBinder); } binder_status_t IFoo::addService(const char* instance) { AIBinder* IFoo::getBinder() { AIBinder* binder = nullptr; if (mWeakBinder != nullptr) { Loading @@ -132,8 +132,18 @@ binder_status_t IFoo::addService(const char* instance) { AIBinder_Weak_delete(mWeakBinder); } mWeakBinder = AIBinder_Weak_new(binder); // WARNING: it is important that this class does not implement debug or // shell functions because it does not use special C++ wrapper // functions, and so this is how we test those functions. } return binder; } binder_status_t IFoo::addService(const char* instance) { AIBinder* binder = getBinder(); binder_status_t status = AServiceManager_addService(binder, instance); // Strong references we care about kept by remote process AIBinder_decStrong(binder); Loading libs/binder/ndk/tests/include/iface/iface.h +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,9 @@ class IFoo : public virtual ::android::RefBase { static AIBinder_Class* kClass; // binder representing this interface with one reference count AIBinder* getBinder(); // Takes ownership of IFoo binder_status_t addService(const char* instance); static ::android::sp<IFoo> getService(const char* instance, AIBinder** outBinder = nullptr); Loading libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -185,6 +185,26 @@ TEST(NdkBinder, CheckServiceThatDoesExist) { AIBinder_decStrong(binder); } TEST(NdkBinder, UnimplementedDump) { sp<IFoo> foo = IFoo::getService(IFoo::kSomeInstanceName); ASSERT_NE(foo, nullptr); AIBinder* binder = foo->getBinder(); EXPECT_EQ(OK, AIBinder_dump(binder, STDOUT_FILENO, nullptr, 0)); AIBinder_decStrong(binder); } TEST(NdkBinder, UnimplementedShell) { // libbinder_ndk doesn't support calling shell, so we are calling from the // libbinder across processes to the NDK service which doesn't implement // shell static const sp<android::IServiceManager> sm(android::defaultServiceManager()); sp<IBinder> testService = sm->getService(String16(IFoo::kSomeInstanceName)); Vector<String16> argsVec; EXPECT_EQ(OK, IBinder::shellCommand(testService, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO, argsVec, nullptr, nullptr)); } TEST(NdkBinder, DoubleNumber) { sp<IFoo> foo = IFoo::getService(IFoo::kSomeInstanceName); ASSERT_NE(foo, nullptr); Loading Loading
libs/binder/ndk/ibinder.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -181,7 +181,7 @@ status_t ABBinder::onTransact(transaction_code_t code, const Parcel& data, Parce binder_status_t status = getClass()->onTransact(this, code, &in, &out); return PruneStatusT(status); } else if (code == SHELL_COMMAND_TRANSACTION) { } else if (code == SHELL_COMMAND_TRANSACTION && getClass()->handleShellCommand != nullptr) { int in = data.readFileDescriptor(); int out = data.readFileDescriptor(); int err = data.readFileDescriptor(); Loading
libs/binder/ndk/ibinder_internal.h +5 −5 Original line number Diff line number Diff line Loading @@ -115,13 +115,13 @@ struct AIBinder_Class { const ::android::String16& getInterfaceDescriptor() const { return mInterfaceDescriptor; } // required to be non-null, implemented for every class const AIBinder_Class_onCreate onCreate; const AIBinder_Class_onDestroy onDestroy; const AIBinder_Class_onTransact onTransact; const AIBinder_Class_onCreate onCreate = nullptr; const AIBinder_Class_onDestroy onDestroy = nullptr; const AIBinder_Class_onTransact onTransact = nullptr; // optional methods for a class AIBinder_onDump onDump; AIBinder_handleShellCommand handleShellCommand; AIBinder_onDump onDump = nullptr; AIBinder_handleShellCommand handleShellCommand = nullptr; private: // This must be a String16 since BBinder virtual getInterfaceDescriptor returns a reference to Loading
libs/binder/ndk/tests/iface.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,7 @@ IFoo::~IFoo() { AIBinder_Weak_delete(mWeakBinder); } binder_status_t IFoo::addService(const char* instance) { AIBinder* IFoo::getBinder() { AIBinder* binder = nullptr; if (mWeakBinder != nullptr) { Loading @@ -132,8 +132,18 @@ binder_status_t IFoo::addService(const char* instance) { AIBinder_Weak_delete(mWeakBinder); } mWeakBinder = AIBinder_Weak_new(binder); // WARNING: it is important that this class does not implement debug or // shell functions because it does not use special C++ wrapper // functions, and so this is how we test those functions. } return binder; } binder_status_t IFoo::addService(const char* instance) { AIBinder* binder = getBinder(); binder_status_t status = AServiceManager_addService(binder, instance); // Strong references we care about kept by remote process AIBinder_decStrong(binder); Loading
libs/binder/ndk/tests/include/iface/iface.h +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,9 @@ class IFoo : public virtual ::android::RefBase { static AIBinder_Class* kClass; // binder representing this interface with one reference count AIBinder* getBinder(); // Takes ownership of IFoo binder_status_t addService(const char* instance); static ::android::sp<IFoo> getService(const char* instance, AIBinder** outBinder = nullptr); Loading
libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -185,6 +185,26 @@ TEST(NdkBinder, CheckServiceThatDoesExist) { AIBinder_decStrong(binder); } TEST(NdkBinder, UnimplementedDump) { sp<IFoo> foo = IFoo::getService(IFoo::kSomeInstanceName); ASSERT_NE(foo, nullptr); AIBinder* binder = foo->getBinder(); EXPECT_EQ(OK, AIBinder_dump(binder, STDOUT_FILENO, nullptr, 0)); AIBinder_decStrong(binder); } TEST(NdkBinder, UnimplementedShell) { // libbinder_ndk doesn't support calling shell, so we are calling from the // libbinder across processes to the NDK service which doesn't implement // shell static const sp<android::IServiceManager> sm(android::defaultServiceManager()); sp<IBinder> testService = sm->getService(String16(IFoo::kSomeInstanceName)); Vector<String16> argsVec; EXPECT_EQ(OK, IBinder::shellCommand(testService, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO, argsVec, nullptr, nullptr)); } TEST(NdkBinder, DoubleNumber) { sp<IFoo> foo = IFoo::getService(IFoo::kSomeInstanceName); ASSERT_NE(foo, nullptr); Loading