You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.1 KiB
163 lines
5.1 KiB
include yslt.yml2
|
|
|
|
tstylesheet {
|
|
include ./textutils.ysl2
|
|
include ./types_c.ysl2
|
|
|
|
template "/namespace[@name='pEp']" apply "struct", 0;
|
|
|
|
template "struct" {
|
|
const "jname" call "CamelCase" with "text", "@name";
|
|
|
|
document("org_pEp_jniadapter_{$jname}.cc", "text") {
|
|
||
|
|
#include <exception>
|
|
#include <new>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <pEp/«@name».h>
|
|
|
|
#include "jniutils.hh"
|
|
#include "org_pEp_jniadapter_«$jname».h"
|
|
|
|
using namespace std;
|
|
|
|
namespace pEp {
|
|
namespace JNIAdapter {
|
|
static ::«@name» *«@name»_ptr(JNIEnv *env, jobject me) {
|
|
jfieldID handle;
|
|
|
|
try {
|
|
handle = getFieldID(env, "org/pEp/jniadapter/«$jname»", "handle", "J");
|
|
}
|
|
catch (std::exception& ex) {
|
|
assert(0);
|
|
return NULL;
|
|
}
|
|
|
|
return (::«@name» *) (intptr_t) (int64_t) env->GetLongField(me, handle);
|
|
}
|
|
};
|
|
};
|
|
|
|
extern "C" {
|
|
|
|
using namespace pEp::JNIAdapter;
|
|
|
|
JNIEXPORT jlong JNICALL
|
|
Java_org_pEp_jniadapter_«$jname»_init(JNIEnv *env, jobject obj) {
|
|
::«@name» * _obj = ::new_«@name»(PEP_dir_incoming);
|
|
if (!_obj) {
|
|
outOfMemory(env);
|
|
return (jlong) 0;
|
|
}
|
|
return (jlong) (int64_t) (intptr_t) _obj;
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_org_pEp_jniadapter_«$jname»_release(JNIEnv *env, jobject obj, jlong value) {
|
|
if (value) {
|
|
::«@name» *_obj = (::«@name» *) (intptr_t) (int64_t) value;
|
|
::free_«@name»(_obj);
|
|
}
|
|
}
|
|
|
|
||
|
|
apply "*[name(.)!='enum']", 0, mode=entry {
|
|
with "name", "@name";
|
|
with "class" call "CamelCase" with "text", "@name";
|
|
}
|
|
||
|
|
} // extern "C"
|
|
|
|
||
|
|
}
|
|
}
|
|
|
|
function "mangle" {
|
|
param "type";
|
|
param "name";
|
|
param "classname" call "CamelCase" with "text", "../@name";
|
|
const "convert", "$type != 'timestamp'";
|
|
|
|
choose {
|
|
when "$convert"
|
|
> «concat('Java_org_pEp_jniadapter_', $classname, '__1', str:replace($name, '_', '_1'))»
|
|
otherwise
|
|
> «concat('Java_org_pEp_jniadapter_', $classname, '_', str:replace($name, '_', '_1'))»
|
|
}
|
|
}
|
|
|
|
template "*", mode=entry {
|
|
param "name";
|
|
param "class";
|
|
const "ctype" call "toC" with "type", "name(.)";
|
|
const "jname" call "CamelCase" with "text", "name(*[1])";
|
|
const "cname" call "lcase" with "text", "name(*[1])";
|
|
const "type", "name(.)";
|
|
const "getname" call "mangle" {
|
|
with "type", "$type";
|
|
with "name", "concat('get', $jname)";
|
|
}
|
|
const "setname" call "mangle" {
|
|
with "type", "$type";
|
|
with "name", "concat('set', $jname)";
|
|
}
|
|
||
|
|
JNIEXPORT `call "jni_type" with "type", "name(.)"` JNICALL
|
|
«$getname»(JNIEnv *env, jobject obj) {
|
|
«$name» *_obj = «$name»_ptr(env, obj);
|
|
||
|
|
choose {
|
|
when "../enum[@name=$type]"
|
|
|> return (jint) _obj->«$cname»;
|
|
otherwise
|
|
|> return from_«$type»(env, _obj->«$cname»);
|
|
}
|
|
||
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
«$setname»(JNIEnv *env, jobject obj, `call "jni_type" with "type", "name(.)"` value) {
|
|
«$name» *_obj = «$name»_ptr(env, obj);
|
|
||
|
|
choose {
|
|
when "../enum[@name=$type]"
|
|
|> _obj->«$cname» = («$ctype») (int) value;
|
|
otherwise {
|
|
choose {
|
|
when "$type = 'string'" {
|
|
|> free(_obj->«$cname»);
|
|
}
|
|
otherwise {
|
|
const "free" choose {
|
|
when "$ctype = 'pEp_identity'" > identity
|
|
when "contains($ctype, '_t')" value "substring-before($ctype, '_t')";
|
|
otherwise value "$ctype";
|
|
}
|
|
|
|
|> free_«$free»(_obj->«$cname»);
|
|
}
|
|
}
|
|
|> if(value){
|
|
choose {
|
|
when "$type = 'string'" {
|
|
|>> _obj->«$cname» = to_«$type»(env, value);
|
|
}
|
|
otherwise {
|
|
|>> _obj->«$cname» = to_«$type»(env, value);
|
|
}
|
|
}
|
|
|> }else{
|
|
|> _obj->«$cname» = NULL;
|
|
|> }
|
|
}
|
|
}
|
|
||
|
|
}
|
|
|
|
||
|
|
}
|
|
}
|
|
|
|
|