📄 dcasnberjavalib.cpp
字号:
/****************************************************************************************
* Copyrights 2006,深圳天源迪科信息技术股份有限公司
*
* All rights reserved.
*
* Filename: DCAsnBerJavaLib.cpp
* Indentifier:
* Description: java所需的动态库
* Version: V1.0
* Author: wangbin
* Finished: 2007年7月2日
* History:
******************************************************************************************/
#ifdef WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include "com_tydic_asnjava_cpp_DCBerDecoder.h"
#include "com_tydic_asnjava_cpp_DCAsnParser.h"
#include "dicasnutil/DCAsnParser.h"
#include "dicasnutil/DCAsnBerDecoder.h"
#define ASN_JAVA_MAX_FILE_LEN 512
namespace dicasn1p
{
/*****************************************************************************************************************/
/* */
/*****************************************************************************************************************/
typedef struct
{
DCTlvFileBuf *file_buf;
FILE *fp;
}DCBerFileJava;
/*****************************************************************************************************************/
/* */
/*****************************************************************************************************************/
jobject asnjava_from_node(JNIEnv *jenv,DCAsnBerValue *value);
jobject asnjava_static_field_value(JNIEnv *jenv,const char* class_name,const char* field_name,const char* field_sig);
/*****************************************************************************************************************/
jobject asnjava_from_node(JNIEnv *jenv,DCAsnBerValue *value)
{
jclass cls;
jobject obj;
jmethodID mth_init;
cls = jenv->FindClass("com.tydic.asnjava.cpp.DCAsnBerValue");
jfieldID fid_value_type = jenv->GetFieldID(cls,"value_type","Lcom.tydic.asnjava.cpp.DCAsnBerValue$T_valueType;");
jfieldID fid_name = jenv->GetFieldID(cls,"name","Ljava.lang.String;");
jfieldID fid_tag = jenv->GetFieldID(cls,"tag","I");
jfieldID fid_depth = jenv->GetFieldID(cls,"depth","I");
wchar_t sObjName[ASN_JAVA_MAX_FILE_LEN];
size_t obj_name_len = mbstowcs(sObjName,value->name.c_str(),ASN_JAVA_MAX_FILE_LEN);
jstring obj_name = jenv->NewString((jchar*)sObjName,obj_name_len);
switch(value->value_type)
{
case DCAsnBerValue::TYPE_BASIC:
{
jfieldID fid_buffer;
jfieldID fid_type;
jobject type_obj = NULL;
jbyteArray buffer_obj = NULL;
DCBasicValue *basic_value = (DCBasicValue*)value;
cls = jenv->FindClass("com.tydic.asnjava.cpp.DCBasicValue");
mth_init = jenv->GetMethodID(cls,"<init>","()V");
fid_buffer = jenv->GetFieldID(cls,"buffer","[B");
fid_type = jenv->GetFieldID(cls,"type","Lcom.tydic.asnjava.cpp.DCBasicValue$T_basicType;");
obj = jenv->NewObject(cls,mth_init);
jenv->SetObjectField(obj,fid_value_type,asnjava_static_field_value(
jenv,"com.tydic.asnjava.cpp.DCAsnBerValue$T_valueType",
"TYPE_BASIC","Lcom.tydic.asnjava.cpp.DCAsnBerValue$T_valueType;") );
switch(basic_value->type)
{
case DCBasicValue::TYPE_INT:
{
type_obj = asnjava_static_field_value(jenv,"com.tydic.asnjava.cpp.DCBasicValue$T_basicType",
"TYPE_INT","Lcom.tydic.asnjava.cpp.DCBasicValue$T_basicType;");
break;
}
case DCBasicValue::TYPE_OBJID:
{
type_obj = asnjava_static_field_value(jenv,"com.tydic.asnjava.cpp.DCBasicValue$T_basicType",
"TYPE_OBJID","Lcom.tydic.asnjava.cpp.DCBasicValue$T_basicType;");
break;
}
case DCBasicValue::TYPE_STRING:
{
type_obj = asnjava_static_field_value(jenv,"com.tydic.asnjava.cpp.DCBasicValue$T_basicType",
"TYPE_STRING","Lcom.tydic.asnjava.cpp.DCBasicValue$T_basicType;");
break;
}
case DCBasicValue::TYPE_UTCTIME:
{
type_obj = asnjava_static_field_value(jenv,"com.tydic.asnjava.cpp.DCBasicValue$T_basicType",
"TYPE_UTCTIME","Lcom.tydic.asnjava.cpp.DCBasicValue$T_basicType;");
break;
}
case DCBasicValue::TYPE_ANY:
{
type_obj = asnjava_static_field_value(jenv,"com.tydic.asnjava.cpp.DCBasicValue$T_basicType",
"TYPE_ANY","Lcom.tydic.asnjava.cpp.DCBasicValue$T_basicType;");
break;
}
}
jenv->SetObjectField(obj,fid_type,type_obj);
buffer_obj = jenv->NewByteArray(basic_value->size);
jenv->SetByteArrayRegion(buffer_obj,0,basic_value->size,(jbyte*)basic_value->buf);
break;
}
case DCAsnBerValue::TYPE_STRUCT:
{
DCStructValue *struct_value = (DCStructValue*)value;
jfieldID fid_members;
jfieldID fid_type;
jfieldID fid_buffer;
jobject type_obj = NULL;
jbyteArray buffer_obj = NULL;
DCBasicValue *basic_value = (DCBasicValue*)value;
cls = jenv->FindClass("com.tydic.asnjava.cpp.DCBasicValue");
mth_init = jenv->GetMethodID(cls,"<init>","()V");
fid_buffer = jenv->GetFieldID(cls,"buffer","[B");
fid_type = jenv->GetFieldID(cls,"type","Lcom.tydic.asnjava.cpp.DCBasicValue$T_basicType;");
obj = jenv->NewObject(cls,mth_init);
jenv->SetObjectField(obj,fid_value_type,asnjava_static_field_value(
jenv,"com.tydic.asnjava.cpp.DCAsnBerValue$T_valueType",
"TYPE_BASIC","Lcom.tydic.asnjava.cpp.DCAsnBerValue$T_valueType;") );
switch(struct_value->type)
{
case DCStructValue::TYPE_CHOICE:
{
}
}
}
}
jenv->SetObjectField(obj,fid_name,obj_name);
jenv->SetIntField(obj,fid_tag,(jint)value->tag);
jenv->SetIntField(obj,fid_depth,(jint)value->depth);
return obj;
}
jobject asnjava_static_field_value(JNIEnv *jenv,const char* class_name,const char* field_name,const char* field_sig)
{
jclass cls = jenv->FindClass(class_name);
jfieldID fid = jenv->GetStaticFieldID(cls,field_name,field_sig);
jobject obj = jenv->GetStaticObjectField(cls,fid);
return obj;
}
/*****************************************************************************************************************/
/* */
/*****************************************************************************************************************/
}
/*****************************************************************************************************************/
/* */
/*****************************************************************************************************************/
using namespace dicasn1p;
/*
* Class: com_tydic_asnjava_cpp_DCBerDecoder
* Method: openFile0
*/
JNIEXPORT jlong JNICALL Java_com_tydic_asnjava_cpp_DCBerDecoder_openFile0
(JNIEnv * env, jobject obj, jstring file_name){ char cstr[ASN_JAVA_MAX_FILE_LEN]; wcstombs(cstr,(wchar_t*)env->GetStringChars(file_name,0),ASN_JAVA_MAX_FILE_LEN-1); FILE *fp = fopen(cstr,"rb"); if(fp == NULL) return 0; DCBerFileJava *filebuf = new DCBerFileJava; filebuf->file_buf = new DCTlvFileBuf(fp); filebuf->fp = fp; return (jlong)filebuf;}
/*
* Class: com_tydic_asnjava_cpp_DCBerDecoder
* Method: readFile0
*/
JNIEXPORT jobject JNICALL Java_com_tydic_asnjava_cpp_DCBerDecoder_readFile0
(JNIEnv * jenv, jobject jthis, jlong lpFileBuf, jlong lpAsnType,jlong lpAsn){ DCBerFileJava *filebuf = (DCBerFileJava*)lpFileBuf; asn1p_t *asn = (asn1p_t*)lpAsn; asn1p_expr_t *expr = (asn1p_expr_t*)lpAsnType; arg_t arg; memset(&arg,0,sizeof(arg) ); arg.asn = asn; arg.expr = expr; DCAsnBerValue *value = DCAsnBerValue::fromExpr(&arg); DCBerTlvNode *root = filebuf->file_buf->read_tlv_tree(); if (root)
{
value->fromNode(root);
}
return 0;}/*
* Class: com_tydic_asnjava_cpp_DCBerDecoder
* Method: closeFile0
*/
JNIEXPORT void JNICALL Java_com_tydic_asnjava_cpp_DCBerDecoder_closeFile0
(JNIEnv *, jobject, jlong lpFileBuf){ DCBerFileJava *filebuf = (DCBerFileJava*)lpFileBuf; delete filebuf->file_buf; fclose(filebuf->fp); delete filebuf;}/*****************************************************************************************************************/
/* */
/*****************************************************************************************************************/
JNIEXPORT jlong JNICALL Java_com_tydic_asnjava_cpp_DCAsnParser_parseFile0
(JNIEnv *env, jobject jthis, jstring file_name){ char cstr[ASN_JAVA_MAX_FILE_LEN]; asn1p_t *asn; asn1p_debug = 0;
asn1p__flex_debug = 0;
wcstombs(cstr,(wchar_t*)env->GetStringChars(file_name,0),ASN_JAVA_MAX_FILE_LEN-1);
asn1p_in = fopen(cstr,"r");
asn1p_parse(&asn); fclose(asn1p_in); if(asn == NULL)
{
return 0;
}
if(asn1f_process(asn,A1F_NOFLAGS,NULL) < 0)
return 0;
return (jlong)asn;
}
/*
* Class: com_tydic_asnjava_cpp_DCAsnParser
* Method: release0
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_com_tydic_asnjava_cpp_DCAsnParser_release0
(JNIEnv *env, jobject jthis, jlong lpAsn){ asn1p_t *asn = (asn1p_t*)lpAsn; asn1p_delete(asn);}
/*
* Class: com_tydic_asnjava_cpp_DCAsnParser
* Method: getType0
* Signature: (JLjava/lang/String;Ljava/lang/String;)J
*/
JNIEXPORT jlong JNICALL Java_com_tydic_asnjava_cpp_DCAsnParser_getType0
(JNIEnv *env, jobject jthis, jlong lpAsn, jstring module_name, jstring type_name){ char cstr[ASN_JAVA_MAX_FILE_LEN]; arg_t arg; asn1p_expr_t *member; memset(&arg,0,sizeof(arg)); arg.asn = (asn1p_t*)lpAsn; wcstombs(cstr,(wchar_t*)env->GetStringChars(module_name,0),ASN_JAVA_MAX_FILE_LEN-1);
asn1p_module_t* module = asn1f_lookup_module(&arg,cstr,NULL);
wcstombs(cstr,(wchar_t*)env->GetStringChars(type_name,0),ASN_JAVA_MAX_FILE_LEN-1);
TQ_FOR(member,&(module->members),next)
{
if (member->Identifier && strcmp(member->Identifier,cstr) == 0)
{
arg.expr = member;
}
}
return (jlong)arg.expr;}/*****************************************************************************************************************/
/* */
/*****************************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -