android: Overload for getMeasurement() that takes a String array as argument
This commit is contained in:
@@ -126,27 +126,85 @@ TNC_Result TNC_IMC_NotifyConnectionChange(TNC_IMCID imc_id,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert the native C strings in the enumerator to a Java String array.
|
||||||
|
* The given enumerator gets destroyed.
|
||||||
|
*/
|
||||||
|
static jobjectArray string_array_create(JNIEnv *env, enumerator_t *enumerator)
|
||||||
|
{
|
||||||
|
linked_list_t *list;
|
||||||
|
jobjectArray jarray;
|
||||||
|
jstring jstring;
|
||||||
|
char *native;
|
||||||
|
jclass cls;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
cls = (*env)->FindClass(env, "java/lang/String");
|
||||||
|
list = linked_list_create_from_enumerator(enumerator);
|
||||||
|
jarray = (*env)->NewObjectArray(env, list->get_count(list), cls, NULL);
|
||||||
|
if (!jarray)
|
||||||
|
{
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
enumerator = list->create_enumerator(list);
|
||||||
|
while (enumerator->enumerate(enumerator, (void**)&native))
|
||||||
|
{
|
||||||
|
jstring = (*env)->NewStringUTF(env, native);
|
||||||
|
if (!jstring)
|
||||||
|
{
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
(*env)->SetObjectArrayElement(env, jarray, i++, jstring);
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
list->destroy(list);
|
||||||
|
return jarray;
|
||||||
|
|
||||||
|
failed:
|
||||||
|
androidjni_exception_occurred(env);
|
||||||
|
list->destroy(list);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a measurement for the given attribute type from the Android IMC.
|
* Get a measurement for the given attribute type from the Android IMC.
|
||||||
* NULL is returned if no measurement is available or an error occurred.
|
* NULL is returned if no measurement is available or an error occurred.
|
||||||
|
*
|
||||||
|
* The optional args is an enumerator over char* (gets destroyed).
|
||||||
*/
|
*/
|
||||||
static pa_tnc_attr_t *get_measurement(pen_type_t attr_type)
|
static pa_tnc_attr_t *get_measurement(pen_type_t attr_type, enumerator_t *args)
|
||||||
{
|
{
|
||||||
JNIEnv *env;
|
JNIEnv *env;
|
||||||
pa_tnc_attr_t *attr;
|
pa_tnc_attr_t *attr;
|
||||||
jmethodID method_id;
|
jmethodID method_id;
|
||||||
jbyteArray jmeasurement;
|
jbyteArray jmeasurement;
|
||||||
|
jobjectArray jargs = NULL;
|
||||||
chunk_t data;
|
chunk_t data;
|
||||||
|
|
||||||
androidjni_attach_thread(&env);
|
androidjni_attach_thread(&env);
|
||||||
method_id = (*env)->GetMethodID(env, android_imc_cls, "getMeasurement",
|
if (args)
|
||||||
"(II)[B");
|
{
|
||||||
|
jargs = string_array_create(env, args);
|
||||||
|
if (!jargs)
|
||||||
|
{
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
method_id = (*env)->GetMethodID(env, android_imc_cls, "getMeasurement",
|
||||||
|
"(II[Ljava/lang/String;)[B");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
method_id = (*env)->GetMethodID(env, android_imc_cls, "getMeasurement",
|
||||||
|
"(II)[B");
|
||||||
|
}
|
||||||
if (!method_id)
|
if (!method_id)
|
||||||
{
|
{
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
jmeasurement = (*env)->CallObjectMethod(env, android_imc, method_id,
|
jmeasurement = (*env)->CallObjectMethod(env, android_imc, method_id,
|
||||||
attr_type.vendor_id, attr_type.type);
|
attr_type.vendor_id, attr_type.type,
|
||||||
|
jargs);
|
||||||
if (!jmeasurement || androidjni_exception_occurred(env))
|
if (!jmeasurement || androidjni_exception_occurred(env))
|
||||||
{
|
{
|
||||||
goto failed;
|
goto failed;
|
||||||
@@ -171,14 +229,16 @@ failed:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the measurement for the requested attribute type.
|
* Add the measurement for the requested attribute type with optional
|
||||||
|
* arguments (enumerator over char*, gets destroyed).
|
||||||
*/
|
*/
|
||||||
static void add_measurement(pen_type_t attr_type, imc_msg_t *msg)
|
static void add_measurement(pen_type_t attr_type, imc_msg_t *msg,
|
||||||
|
enumerator_t *args)
|
||||||
{
|
{
|
||||||
pa_tnc_attr_t *attr;
|
pa_tnc_attr_t *attr;
|
||||||
enum_name_t *pa_attr_names;
|
enum_name_t *pa_attr_names;
|
||||||
|
|
||||||
attr = get_measurement(attr_type);
|
attr = get_measurement(attr_type, args);
|
||||||
if (attr)
|
if (attr)
|
||||||
{
|
{
|
||||||
msg->add_attribute(msg, attr);
|
msg->add_attribute(msg, attr);
|
||||||
@@ -216,7 +276,7 @@ static void handle_ietf_attribute(pen_type_t attr_type, pa_tnc_attr_t *attr,
|
|||||||
enumerator = attr_cast->create_enumerator(attr_cast);
|
enumerator = attr_cast->create_enumerator(attr_cast);
|
||||||
while (enumerator->enumerate(enumerator, &entry))
|
while (enumerator->enumerate(enumerator, &entry))
|
||||||
{
|
{
|
||||||
add_measurement(*entry, out_msg);
|
add_measurement(*entry, out_msg, NULL);
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
}
|
}
|
||||||
@@ -247,9 +307,9 @@ TNC_Result TNC_IMC_BeginHandshake(TNC_IMCID imc_id,
|
|||||||
out_msg = imc_msg_create(imc_android, state, connection_id, imc_id,
|
out_msg = imc_msg_create(imc_android, state, connection_id, imc_id,
|
||||||
TNC_IMVID_ANY, msg_types[0]);
|
TNC_IMVID_ANY, msg_types[0]);
|
||||||
add_measurement((pen_type_t){ PEN_IETF, IETF_ATTR_PRODUCT_INFORMATION },
|
add_measurement((pen_type_t){ PEN_IETF, IETF_ATTR_PRODUCT_INFORMATION },
|
||||||
out_msg);
|
out_msg, NULL);
|
||||||
add_measurement((pen_type_t){ PEN_IETF, IETF_ATTR_STRING_VERSION },
|
add_measurement((pen_type_t){ PEN_IETF, IETF_ATTR_STRING_VERSION },
|
||||||
out_msg);
|
out_msg, NULL);
|
||||||
/* send PA-TNC message with the excl flag not set */
|
/* send PA-TNC message with the excl flag not set */
|
||||||
result = out_msg->send(out_msg, FALSE);
|
result = out_msg->send(out_msg, FALSE);
|
||||||
out_msg->destroy(out_msg);
|
out_msg->destroy(out_msg);
|
||||||
|
|||||||
@@ -43,6 +43,20 @@ public class AndroidImc
|
|||||||
* @return encoded attribute, or null if not available or failed
|
* @return encoded attribute, or null if not available or failed
|
||||||
*/
|
*/
|
||||||
public byte[] getMeasurement(int vendor, int type)
|
public byte[] getMeasurement(int vendor, int type)
|
||||||
|
{
|
||||||
|
return getMeasurement(vendor, type, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a measurement (the binary encoding of the requested attribute) for
|
||||||
|
* the given vendor specific attribute type.
|
||||||
|
*
|
||||||
|
* @param vendor vendor ID
|
||||||
|
* @param type vendor specific attribute type
|
||||||
|
* @param args optional arguments for a measurement
|
||||||
|
* @return encoded attribute, or null if not available or failed
|
||||||
|
*/
|
||||||
|
public byte[] getMeasurement(int vendor, int type, String[] args)
|
||||||
{
|
{
|
||||||
AttributeType attributeType = AttributeType.fromValues(vendor, type);
|
AttributeType attributeType = AttributeType.fromValues(vendor, type);
|
||||||
Collector collector = null;
|
Collector collector = null;
|
||||||
|
|||||||
Reference in New Issue
Block a user