⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dcasnberjavalib.cpp

📁 ASN.1解析解码工具,可以解析各种ASN.1格式的文件,并对相应的BER文件解码
💻 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 + -