Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d730c0f authored by Brian Duddie's avatar Brian Duddie Committed by Android (Google) Code Review
Browse files

Merge "ContextHubService: Simplify hubId logic, ensure type correctness"

parents d915dea6 8c51b00e
Loading
Loading
Loading
Loading
+33 −45
Original line number Diff line number Diff line
@@ -14,7 +14,6 @@
 * limitations under the License.
 */


#undef LOG_NDEBUG
#undef LOG_TAG
#define LOG_NDEBUG 0
@@ -39,20 +38,19 @@
#include "core_jni_helpers.h"
#include "JNIHelp.h"

using IContexthub = android::hardware::contexthub::V1_0::IContexthub;

using Result = android::hardware::contexthub::V1_0::Result;
using ContextHubMsg = android::hardware::contexthub::V1_0::ContextHubMsg;
using IContexthubCallback = android::hardware::contexthub::V1_0::IContexthubCallback;
using AsyncEventType = android::hardware::contexthub::V1_0::AsyncEventType;
using TransactionResult = android::hardware::contexthub::V1_0::TransactionResult;
using ContextHub = android::hardware::contexthub::V1_0::ContextHub;
using HubAppInfo = android::hardware::contexthub::V1_0::HubAppInfo;
using android::hardware::contexthub::V1_0::AsyncEventType;
using android::hardware::contexthub::V1_0::ContextHub;
using android::hardware::contexthub::V1_0::ContextHubMsg;
using android::hardware::contexthub::V1_0::HubAppInfo;
using android::hardware::contexthub::V1_0::IContexthub;
using android::hardware::contexthub::V1_0::IContexthubCallback;
using android::hardware::contexthub::V1_0::Result;
using android::hardware::contexthub::V1_0::TransactionResult;

template<typename T>
using Return = android::hardware::Return<T>;
using android::hardware::Return;

using std::chrono::steady_clock;

// If a transaction takes longer than this, we'll allow it to be
// canceled by a new transaction.  Note we do _not_ automatically
// cancel a transaction after this much time.  We can have a
@@ -361,11 +359,12 @@ struct ContextHubServiceDb {

ContextHubServiceDb db;

int getHubIdForHubHandle(int hubHandle) {
    if (hubHandle < 0 || hubHandle >= db.hubInfo.numHubs) {
      return -1;
bool getHubIdForHubHandle(int hubHandle, uint32_t *hubId) {
    if (hubHandle < 0 || hubHandle >= db.hubInfo.numHubs || hubId == nullptr) {
        return false;
    } else {
      return db.hubInfo.hubs[hubHandle].hubId;
        *hubId = db.hubInfo.hubs[hubHandle].hubId;
        return true;
    }
}

@@ -380,17 +379,6 @@ int getHubHandleForAppInstance(jint id) {
    return db.appInstances[id].hubHandle;
}

int getHubIdForAppInstance(jint id) {
    int hubHandle = getHubHandleForAppInstance(id);

    if (hubHandle < 0) {
        ALOGD("Cannot find hub instance for app instance %d", id);
        return -1;
    }

    return db.hubInfo.hubs[hubHandle].hubId;
}

jint getAppInstanceForAppId(uint64_t app_id) {
    auto end = db.appInstances.end();
    for (auto current = db.appInstances.begin(); current != end; ++current) {
@@ -1012,19 +1000,18 @@ jint nativeSendMessage(JNIEnv *env,
    jint retVal = -1; // Default to failure

    jint *header = env->GetIntArrayElements(header_, 0);
    unsigned int numHeaderElements = env->GetArrayLength(header_);
    size_t numHeaderElements = env->GetArrayLength(header_);
    jbyte *data = env->GetByteArrayElements(data_, 0);
    int dataBufferLength = env->GetArrayLength(data_);
    size_t dataBufferLength = env->GetArrayLength(data_);

    if (numHeaderElements < MSG_HEADER_SIZE) {
        ALOGW("Malformed header len");
        return -1;
    }

    uint32_t appInstanceHandle = header[HEADER_FIELD_APP_INSTANCE];
    jint appInstanceHandle = header[HEADER_FIELD_APP_INSTANCE];
    uint32_t msgType = header[HEADER_FIELD_MSG_TYPE];
    int hubHandle = -1;
    int hubId;
    uint64_t appId;

    if (msgType == CONTEXT_HUB_UNLOAD_APP) {
@@ -1042,7 +1029,8 @@ jint nativeSendMessage(JNIEnv *env,
        hubHandle = header[HEADER_FIELD_HUB_HANDLE];
    }

    if (hubHandle < 0) {
    uint32_t hubId = -1;
    if (!getHubIdForHubHandle(hubHandle, &hubId)) {
        ALOGD("Invalid hub Handle %d", hubHandle);
        return -1;
    }
@@ -1072,18 +1060,16 @@ jint nativeSendMessage(JNIEnv *env,
    Result result;

    if (msgType == CONTEXT_HUB_UNLOAD_APP) {
        hubId = getHubIdForHubHandle(hubHandle);
        ALOGW("Calling UnLoad NanoApp for app %" PRIx64 " on hub %d",
        ALOGW("Calling UnLoad NanoApp for app %" PRIx64 " on hub %" PRIu32,
              db.appInstances[appInstanceHandle].appInfo.appId,
              hubId);
        result = db.hubInfo.contextHub->unloadNanoApp(
                hubId, db.appInstances[appInstanceHandle].appInfo.appId, CONTEXT_HUB_UNLOAD_APP);
    } else {
        if (header[HEADER_FIELD_APP_INSTANCE] == OS_APP_ID) {
        if (appInstanceHandle == OS_APP_ID) {
            if (msgType == CONTEXT_HUB_LOAD_APP) {
                std::vector<uint8_t> dataVector(reinterpret_cast<uint8_t *>(data),
                                                reinterpret_cast<uint8_t *>(data + dataBufferLength));
                hubId = getHubIdForHubHandle(hubHandle);
                ALOGW("Calling Load NanoApp on hub %d", hubId);
                result = db.hubInfo.contextHub->loadNanoApp(hubId,
                                                            dataVector,
@@ -1093,25 +1079,27 @@ jint nativeSendMessage(JNIEnv *env,
                result = Result::BAD_PARAMS;
            }
        } else {

            appId = getAppIdForAppInstance(header[HEADER_FIELD_APP_INSTANCE]);
            hubId = getHubIdForAppInstance(header[HEADER_FIELD_APP_INSTANCE]);

            if (appId != static_cast<uint64_t>(INVALID_APP_ID) && hubId >= 0) {
            appId = getAppIdForAppInstance(appInstanceHandle);
            if (appId == static_cast<uint64_t>(INVALID_APP_ID)) {
                ALOGD("Cannot find application instance %d", appInstanceHandle);
                result = Result::BAD_PARAMS;
            } else if (hubHandle != getHubHandleForAppInstance(appInstanceHandle)) {
                ALOGE("Given hubHandle (%d) doesn't match expected for app instance (%d)",
                      hubHandle,
                      getHubHandleForAppInstance(appInstanceHandle));
                result = Result::BAD_PARAMS;
            } else {
                ContextHubMsg msg;
                msg.appName = appId;
                msg.msgType = msgType;
                msg.msg.setToExternal((unsigned char *)data, dataBufferLength);

                ALOGW("Sending msg of type %" PRIu32 " len %u to app %" PRIx64 " on hub %d",
                ALOGW("Sending msg of type %" PRIu32 " len %zu to app %" PRIx64 " on hub %" PRIu32,
                       msgType,
                       dataBufferLength,
                       appId,
                       hubId);
                result = db.hubInfo.contextHub->sendMessageToHub(hubId, msg);
            } else {
                ALOGD("Cannot find application instance %u", header[HEADER_FIELD_APP_INSTANCE]);
                result = Result::BAD_PARAMS;
            }
        }
    }