Merge "ContextHubService: Simplify hubId logic, ensure type correctness"
This commit is contained in:
@@ -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 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;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user