blob: 1ac8ea199984f8b9ca0a800e8ba25f9c223724dc [file] [log] [blame]
// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "libprotobinder/iservice_manager.h"
#include "libprotobinder/binder_host.h"
#include "libprotobinder/binder_proxy.h"
#include "libprotobinder/parcel.h"
namespace protobinder {
IServiceManager* g_service_manager = nullptr;
IServiceManager* GetServiceManager() {
if (g_service_manager)
return g_service_manager;
g_service_manager = CreateInterface<IServiceManager>(
new BinderProxy(0)).release();
return g_service_manager;
}
class IServiceManagerProxy : public BinderProxyInterface<IServiceManager> {
public:
explicit IServiceManagerProxy(BinderProxy* proxy)
: BinderProxyInterface<IServiceManager>(proxy) {}
virtual Status AddService(const char* name, BinderHost* binder) {
Parcel data, reply;
data.WriteInt32(0);
data.WriteString16("android.os.IServiceManager");
data.WriteString16(name);
data.WriteStrongBinderFromIBinder(*binder);
return Remote()->Transact(ADD_SERVICE_TRANSACTION, &data, &reply, 0);
}
virtual BinderProxy* GetService(const char* name) {
Parcel data, reply;
data.WriteInt32(0);
data.WriteString16("android.os.IServiceManager");
data.WriteString16(name);
if (!Remote()->Transact(CHECK_SERVICE_TRANSACTION, &data, &reply, 0))
return nullptr;
IBinder* binder = nullptr;
return reply.ReadStrongBinderToIBinder(&binder) ? binder->GetBinderProxy()
: nullptr;
}
};
IMPLEMENT_META_INTERFACE(ServiceManager, "Test")
} // namespace protobinder