diff options
author | Ralph Nathan <ralphnathan@google.com> | 2016-01-13 17:22:15 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2016-01-13 17:22:15 +0000 |
commit | 19ba873ed351d646cf5bbf3e42198617d35f2aaf (patch) | |
tree | ad2903310fd14de93b421902f10fad2b0468d2d5 | |
parent | 45f90b9eb2439be5a3664ab26c36bab7d2057c8f (diff) | |
parent | fdcdd225b4f1633320676470952d1b54574fc381 (diff) | |
download | common-19ba873ed351d646cf5bbf3e42198617d35f2aaf.tar.gz |
Merge "Modify service example to use aidl."
-rw-r--r-- | service_example/Android.mk | 49 | ||||
-rw-r--r-- | service_example/android/brillo/example/IAlertCallback.aidl (renamed from service_example/testservice.cpp) | 20 | ||||
-rw-r--r-- | service_example/android/brillo/example/IExampleService.aidl | 31 | ||||
-rw-r--r-- | service_example/brillo_example_client.cpp | 86 | ||||
-rw-r--r-- | service_example/brillo_example_service.cpp | 80 | ||||
-rw-r--r-- | service_example/example_service.rc | 4 | ||||
-rw-r--r-- | service_example/init.testservice.rc.example | 4 |
7 files changed, 238 insertions, 36 deletions
diff --git a/service_example/Android.mk b/service_example/Android.mk index 01f6b9c..007133c 100644 --- a/service_example/Android.mk +++ b/service_example/Android.mk @@ -11,29 +11,40 @@ # 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. +# LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -LOCAL_MODULE := testservice -LOCAL_REQUIRED_MODULES := testservice.rc -LOCAL_SRC_FILES := testservice.cpp -LOCAL_SHARED_LIBRARIES := libc libbase -LOCAL_CFLAGS := -Werror +LOCAL_MODULE := brillo_example_service +LOCAL_SRC_FILES := \ + brillo_example_service.cpp \ + android/brillo/example/IAlertCallback.aidl \ + android/brillo/example/IExampleService.aidl +LOCAL_AIDL_INCLUDES := $(LOCAL_PATH) +LOCAL_CFLAGS := -Wall +LOCAL_SHARED_LIBRARIES := \ + libbinder \ + libbrillo \ + libbrillo-binder \ + libchrome \ + libutils +LOCAL_INIT_RC := example_service.rc include $(BUILD_EXECUTABLE) -ifdef INITRC_TEMPLATE include $(CLEAR_VARS) -LOCAL_MODULE := testservice.rc -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_PATH := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_INITRCD) - -include $(BUILD_SYSTEM)/base_rules.mk - -.PHONY: $(LOCAL_BUILT_MODULE) -$(LOCAL_BUILT_MODULE): my_args := arg1 arg2 -$(LOCAL_BUILT_MODULE): my_groups := inet -$(LOCAL_BUILT_MODULE): $(INITRC_TEMPLATE) - $(call generate-initrc-file,testservice,$(my_args),\ - $(my_groups)) -endif +LOCAL_MODULE := brillo_example_client +LOCAL_SRC_FILES := \ + brillo_example_client.cpp \ + android/brillo/example/IAlertCallback.aidl \ + android/brillo/example/IExampleService.aidl +LOCAL_AIDL_INCLUDES := $(LOCAL_PATH) +LOCAL_CFLAGS := -Wall +LOCAL_SHARED_LIBRARIES := \ + libbinder \ + libbrillo \ + libbrillo-binder \ + libchrome \ + libcutils \ + libutils +include $(BUILD_EXECUTABLE) diff --git a/service_example/testservice.cpp b/service_example/android/brillo/example/IAlertCallback.aidl index 0317b31..a3eb9ee 100644 --- a/service_example/testservice.cpp +++ b/service_example/android/brillo/example/IAlertCallback.aidl @@ -14,18 +14,12 @@ * limitations under the License. */ -#define LOG_TAG "testservice" +package android.brillo.example; -#include <unistd.h> - -#include <android-base/logging.h> - -int main(int argc __unused, char **argv __unused) { - LOG(INFO) << "starting"; - while (1) { - LOG(INFO) << "loop iteration"; - sleep(5); - } - LOG(INFO) << "exiting"; - return 0; +// Interface for a callback object that is to be registered with +// IExampleService. +interface IAlertCallback { + // This should be a oneway call since we don't want services to be blocked on + // clients. + oneway void OnNLogEventsReceivedCallback(int n); } diff --git a/service_example/android/brillo/example/IExampleService.aidl b/service_example/android/brillo/example/IExampleService.aidl new file mode 100644 index 0000000..d478abd --- /dev/null +++ b/service_example/android/brillo/example/IExampleService.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2015 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. + */ + +package android.brillo.example; + +import android.brillo.example.IAlertCallback; + +// Interface for an example service that accepts a string and logs it using +// logcat. It also provides a method to register a callback. +interface IExampleService { + // Registers a callback object of type IAlertCallback with the service. Once + // the service has recieved n calls to Log, then the method + // OnNEventsReceivedCallback on the callback object will be called. + void RegisterCallback(IAlertCallback callback, int n); + + // Logs a string. + void Log(String s); +} diff --git a/service_example/brillo_example_client.cpp b/service_example/brillo_example_client.cpp new file mode 100644 index 0000000..ec63569 --- /dev/null +++ b/service_example/brillo_example_client.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2015 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 <iostream> +#include <string> + +#include <base/at_exit.h> +#include <base/bind.h> +#include <base/logging.h> +#include <base/message_loop/message_loop.h> +#include <binder/IInterface.h> +#include <binder/IServiceManager.h> +#include <brillo/binder_watcher.h> +#include <brillo/message_loops/base_message_loop.h> +#include <brillo/syslog_logging.h> +#include <utils/String16.h> + +#include "android/brillo/example/BnAlertCallback.h" +#include "android/brillo/example/IExampleService.h" + +namespace android { + +class AlertCallback : public android::brillo::example::BnAlertCallback { + public: + binder::Status OnNLogEventsReceivedCallback(int n) { + LOG(INFO) << "Received Callback from service: Received " << n << " log " + << "messages."; + return binder::Status::ok(); + } +}; + +} // namespace android + +// A function to read user input on the console and pass it along to the example +// service for logging. +void StdinCallback( + android::sp<android::brillo::example::IExampleService> service) { + std::string line; + std::cin >> line; + service->Log(android::String16(line.c_str())); +} + +int main() { + // TODO(ralphnathan): Hide this in brillo::BaseMessageLoop. + base::AtExitManager at_exit_manager; + brillo::InitLog(brillo::kLogToSyslog); + // Get handle for the example service. + android::sp<android::brillo::example::IExampleService> service; + android::status_t status = android::getService( + android::String16("android.brillo.example.ExampleService"), &service); + CHECK(status == android::OK) << + "Failed to get IExampleService binder from service manager!"; + + // Register a callback object with the service. + android::sp<android::AlertCallback> cbo = new android::AlertCallback(); + service->RegisterCallback(cbo, 3); + + // Create a message loop. + // TODO(ralphnathan): Change this to brillo::BaseMessageLoop. + base::MessageLoopForIO message_loop_for_io; + + // Initialize a binder watcher. + brillo::BinderWatcher watcher; + watcher.Init(); + + // Poll stdin. + brillo::BaseMessageLoop message_loop(&message_loop_for_io); + base::Closure stdin_callback = base::Bind(&StdinCallback, service); + message_loop.WatchFileDescriptor( + STDIN_FILENO, brillo::BaseMessageLoop::kWatchRead, true, stdin_callback); + // Start the message loop. + message_loop.Run(); +} diff --git a/service_example/brillo_example_service.cpp b/service_example/brillo_example_service.cpp new file mode 100644 index 0000000..4c4af15 --- /dev/null +++ b/service_example/brillo_example_service.cpp @@ -0,0 +1,80 @@ +/* + * Copyright 2015 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 <base/at_exit.h> +#include <base/logging.h> +#include <base/message_loop/message_loop.h> +#include <binder/IServiceManager.h> +#include <binder/Status.h> +#include <brillo/binder_watcher.h> +#include <brillo/syslog_logging.h> +#include <utils/String16.h> + +#include "android/brillo/example/BnExampleService.h" +#include "android/brillo/example/IAlertCallback.h" + +namespace android { + +class ExampleService : public android::brillo::example::BnExampleService { + public: + binder::Status Log(const String16& s) { + LOG(INFO) << String8(s).string(); + count_++; + if (count_ == max_events_) { + cbo_->OnNLogEventsReceivedCallback(count_); + count_ = 0; + } + return binder::Status::ok(); + } + + binder::Status RegisterCallback( + const sp<android::brillo::example::IAlertCallback>& callback, int n) { + cbo_ = callback; + max_events_ = n; + count_ = 0; + return binder::Status::ok(); + } + + private: + sp<android::brillo::example::IAlertCallback> cbo_; + int count_ = 0; + int max_events_ = 0; +}; + +} // namespace android + +int main() { + // TODO(ralphnathan): Hide this in brillo::BaseMessageLoop. + base::AtExitManager at_exit_manager; + brillo::InitLog(brillo::kLogToSyslog); + // Register service with the service manager. + android::status_t status = android::defaultServiceManager()->addService( + android::String16("android.brillo.example.ExampleService"), + new android::ExampleService()); + CHECK(status == android::OK) << + "Failed to get IExampleService binder from service manager!"; + + // Create a message loop. + // TODO(ralphnathan): Change this to brillo::BaseMessageLoop. + base::MessageLoopForIO message_loop_for_io; + + // Initialize a binder watcher. + brillo::BinderWatcher watcher; + watcher.Init(); + + // Run the message loop. + message_loop_for_io.Run(); +} diff --git a/service_example/example_service.rc b/service_example/example_service.rc new file mode 100644 index 0000000..79200e8 --- /dev/null +++ b/service_example/example_service.rc @@ -0,0 +1,4 @@ +service example_service /system/bin/brillo_example_service + class main + user system + group system diff --git a/service_example/init.testservice.rc.example b/service_example/init.testservice.rc.example deleted file mode 100644 index 572d5f3..0000000 --- a/service_example/init.testservice.rc.example +++ /dev/null @@ -1,4 +0,0 @@ -service testservice /system/bin/testservice - class main - user system - group system |