|  | #include <binder/Parcel.h>
#include <utils/Log.h>
#include "BpAndroidShm.h"
namespace android{
    int BpAndroidShm::sendCommand(const char*command) {
        Parcel data, reply;
        data.writeInterfaceToken(
                IAndroidShm::getInterfaceDescriptor());
        data.writeCString(command);
        status_t status = remote()->transact(HW_SENDCOMMAND, data, &reply);
        if(status != NO_ERROR) {
            ALOGE("print sendCommand error: %s", strerror(-status));
        } else {
            status= reply.readInt32();
        }
        return status;
    }
    sp<IMemoryHeap> BpAndroidShm::getBuffer(int index) {
        Parcel data, reply;
        sp<IMemoryHeap> memHeap = NULL;
        data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
        data.writeInt32(index);
        remote()->transact(HW_GETBUFFER, data, &reply);
        memHeap = interface_cast<IMemoryHeap> (reply.readStrongBinder());
        return memHeap;
    }
    BpAndroidShm::BpAndroidShm( const sp<IBinder>& impl)
        : BpInterface<IAndroidShm>(impl)
    {}
    BpAndroidShm::~BpAndroidShm()
    {}
    int BpAndroidShm::allocShm(const int size) { // if negative return value is error
        Parcel data, reply;
        data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
        data.writeInt32(size);
        status_t status = remote()->transact(HW_ALLOC_SHM, data, &reply);
        if(status != NO_ERROR) {
            ALOGE("print allocShm error: %s", strerror(-status));
        } else {
            status= reply.readInt32();
        }
        return status;
    }
    
    int BpAndroidShm::removeShm(const unsigned int index) { // shared memory Á¦°Å 
        Parcel data, reply;
        data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
        data.writeInt32(index);
        status_t status = remote()->transact(HW_REMOVE_SHM, data, &reply);
        if(status != NO_ERROR) {
            ALOGE("print removeShm error: %s", strerror(-status));
        } else {
            status= reply.readInt32();
        }
        return status;
    }
    int BpAndroidShm::isAllocated(const unsigned int index) { // allocated ¿©ºÎ È®ÀÎ
        Parcel data, reply;
        data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
        data.writeInt32(index);
        status_t status = remote()->transact(HW_IS_ALLOCATED, data, &reply);
        if(status != NO_ERROR) {
            ALOGE("print isAllocated error: %s", strerror(-status));
        } else {
            status= reply.readInt32();
        }
        return status;
    }
    int BpAndroidShm::setRegistryIndex(const unsigned int index) {
        Parcel data, reply;
        data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
        data.writeInt32(index);
        status_t status = remote()->transact(HW_SET_REGISTRY_INDEX, data, &reply);
        if(status != NO_ERROR) {
            ALOGE("print setRegistryIndex error: %s", strerror(-status));
        } else {
            status= reply.readInt32();
        }
        return status;
    }
    int BpAndroidShm::getRegistryIndex() {
        Parcel data, reply;
        data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
        status_t status = remote()->transact(HW_GET_REGISTRY_INDEX, data, &reply);
        if(status != NO_ERROR) {
            ALOGE("print getRegistryIndex error: %s", strerror(-status));
        } else {
            status= reply.readInt32();
        }
        return status;
    }
    sp<IMemoryHeap> BpAndroidShm::InitSemaphore(const char* name) {
        Parcel data, reply;
        sp<IMemoryHeap> memHeap = NULL;
        data.writeInterfaceToken(IAndroidShm::getInterfaceDescriptor());
        data.writeCString(name);
        status_t status = remote()->transact(HW_INIT_SEMAPHORE, data, &reply);
        memHeap = interface_cast<IMemoryHeap> (reply.readStrongBinder());
        return memHeap;
    }
};
 |