#include "MakeJNI.h"
#include <windows.h>
#include <string.h>
#include <assert.h>
#include <atlbase.h>
CComModule _Module;

#include <atlcom.h>
#include <atlconv.h>

JNIEXPORT jint JNICALL Java_MakeJNI_JNIMake( JNIEnv *env, jclass cla2s, jstring s, jlong nClomn,  jlong nErr, jlong nHLRatio, jlong nHeight) 
{
	assert(1 == 0);
	::CoInitialize( NULL );			// COM 初始化
	USES_CONVERSION;				// 字符串转换
assert(1 == 2);
//产生正确的文件名
	char szFileName[MAX_PATH];
	ZeroMemory(szFileName, MAX_PATH);
	::GetCurrentDirectory(MAX_PATH, szFileName);

	strcat(szFileName, "\\temp.bmp");
	if(s==NULL) 
	{
		MessageBox(NULL, "the Barcode infomation is NULL", "讯息", MB_OK|MB_ICONERROR);
		return -1;                  // 条码信息为空，直接退出
	}

//启动组件
	CLSID clsid; //= {0x2B24C886,0x9E81,0x4A02,{0x83,0x76,0xD0,0xF7,0x2A,0xB7,0x98,0x6E}};				// 通过 ProgID 取得组件的 CLSID
	HRESULT hr = ::CLSIDFromProgID( L"MakePdf417.BarCodePDF417.1", &clsid );
	if(! SUCCEEDED( hr ) )
	{
		MessageBox(NULL, "CreateDispatch FAILED, 没有注册组件!", "讯息", MB_OK|MB_ICONERROR); 
		return -1;					// 如果失败，说明没有注册组件
	}

	CComPtr < IUnknown > spUnk;		// 由CLSID启动组件，并得到 IUnknown 指针
	hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IUnknown, (LPVOID *)&spUnk );
	if(! SUCCEEDED( hr ) )
	{
		MessageBox(NULL, "没有初始化 COM!", "讯息", MB_OK|MB_ICONERROR);
		return -1;					// 如果失败，说明没有初始化 COM
	}
assert(1 == 3);
//生成条码
//编码转换
	int len = 512*2;
	char* szStr = new char[len];
	wchar_t *w_buffer = new wchar_t[512];
	wcscpy(w_buffer,env->GetStringChars(s,0));
	env->ReleaseStringChars(s,w_buffer);
	assert(1 == 9);
	WideCharToMultiByte(CP_UTF8, 0, w_buffer, 1024, szStr, len, NULL, NULL);
	//Make((unsigned char*)szStr, strlen(szStr), szFileName, nClumn, nErr, nHLRatio);

//条码生成
	VARIANT var[6];
	for(int i=0; i<6; i++)
		VariantInit(&var[i]);
	SAFEARRAYBOUND sab[1];
	sab[0].cElements = strlen(szStr);
	sab[0].lLbound = 0;
	SAFEARRAY* psa = ::SafeArrayCreate(VT_UI1, 1, sab);
	BYTE* byData;
	::SafeArrayAccessData(psa, (void**)&byData);
	for(unsigned int j = 0; j<strlen(szStr); j++)
		byData[j] = szStr[j];
	::SafeArrayUnaccessData(psa);
assert(1 == 11);						
	var[5].vt = VT_ARRAY|VT_UI1;    var[5].parray = psa;		// 第1个参数，条码字符串信息
	var[4].vt = VT_BSTR;   var[4].bstrVal = A2BSTR(szFileName);	// 第2个参数，条码图片文件 文件名
	var[3].vt = VT_I4;				var[3].lVal = nClomn;			// 第3个参数，整数3, 列数
	var[2].vt = VT_I4;				var[2].lVal = nErr;			// 第4个参数，整数3, 校验等级
	var[1].vt = VT_I4;				var[1].lVal = nHLRatio;			// 第5个参数，整数3, 长宽比
	var[0].vt = VT_I4;				var[0].lVal = nHeight;			// 第5个参数，整数3, 长宽比

	CComDispatchDriver spDisp( spUnk );	// 构造智能指针
	VARIANT vResult;					// 参数
	assert(1 == 5);
	hr = spDisp.InvokeN(	
		L"MakeBinary",						// 函数名是 Make
		var,
		6,
		&vResult);						// 返回值
	assert(1 == 6);
	for(int k=0; k<6; k++)
		VariantClear(&var[k]);
	
	if(! SUCCEEDED( hr ) )
	{
		MessageBox(NULL, "运行 MakeBinary 函数出错，可能组件中没有 MakeBinary 函数!", "讯息", MB_OK|MB_ICONERROR);
		return -1;						// 如果失败，说明组件可能没有 Make 函数
	}
	assert(1 == 4);
	return 0;
}

JNIEXPORT jlong JNICALL Java_MakeJNI_JNIMixText( JNIEnv *env, jclass cla2s, jstring s, jlong lFontSize,  jlong lTxtHeight, jlong lHmargin, jlong lVmargin, jlong lTxtCntOneLine) 
{
assert(0 == 1);
	::CoInitialize( NULL );			// COM 初始化
	USES_CONVERSION;				// 字符串转换
assert(0 == 2);
//产生正确的文件名
	char szSrcFileName[MAX_PATH];
	ZeroMemory(szSrcFileName, MAX_PATH);
	::GetCurrentDirectory(MAX_PATH, szSrcFileName);

	strcat(szSrcFileName, "\\temp.bmp");

//产生正确的文件名
	char szDstFileName[MAX_PATH];
	ZeroMemory(szDstFileName, MAX_PATH);
	::GetCurrentDirectory(MAX_PATH, szSrcFileName);

	strcat(szDstFileName, "\\QR_BAR.bmp");
	if(s==NULL) 
	{
		MessageBox(NULL, "the Barcode infomation is NULL", "讯息", MB_OK|MB_ICONERROR);
		return -1;                  // 条码信息为空，直接退出
	}

//启动组件
	
	CLSID clsid; //= {0x2B24C886,0x9E81,0x4A02,{0x83,0x76,0xD0,0xF7,0x2A,0xB7,0x98,0x6E}};				// 通过 ProgID 取得组件的 CLSID
	HRESULT hr = ::CLSIDFromProgID( L"MakePdf417.BarCodePDF417.1", &clsid );
	if(! SUCCEEDED( hr ) )
	{
		MessageBox(NULL, "CreateDispatch FAILED, 没有注册组件!", "讯息", MB_OK|MB_ICONERROR); 
		return -1;					// 如果失败，说明没有注册组件
	}

	CComPtr < IUnknown > spUnk;		// 由CLSID启动组件，并得到 IUnknown 指针
	hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IUnknown, (LPVOID *)&spUnk );
	if(! SUCCEEDED( hr ) )
	{
		MessageBox(NULL, "没有初始化 COM!", "讯息", MB_OK|MB_ICONERROR);
		return -1;					// 如果失败，说明没有初始化 COM
	}
assert(0 == 3);

/*
//生成条码
//编码转换
	int len = 512*2;
	char* szStr = new char[len];
	//wchar_t *w_buffer = new wchar_t[512];
assert(0 == 4);
	strcpy(szStr,env->GetStringChars(s,0));
assert(0 == 5);
	env->ReleaseStringChars(s,szStr);
assert(0 == 6);
	//WideCharToMultiByte(CP_ACP, 0, w_buffer, 1024, szStr, len, NULL, NULL);//crash????????
	//Make((unsigned char*)szStr, strlen(szStr), szFileName, nClumn, nErr, nHLRatio);
assert(0 == 7);
*/
//条码生成
	VARIANT var[8];
	for(int i=0; i<8; i++)
		VariantInit(&var[i]);
assert(0 == 8);
/*	SAFEARRAYBOUND sab[1];
	sab[0].cElements = strlen(szStr);
	sab[0].lLbound = 0;
	SAFEARRAY* psa = ::SafeArrayCreate(VT_UI1, 1, sab);
	BYTE* byData;
	::SafeArrayAccessData(psa, (void**)&byData);
	for(unsigned int j = 0; j<strlen(szStr); j++)
		byData[j] = szStr[j];
	::SafeArrayUnaccessData(psa);*/
char szStr[256] = "abcdefghijklmn";
	var[7].vt = VT_BSTR;			var[7].bstrVal = A2BSTR(szSrcFileName); // source file
	var[6].vt = VT_BSTR;			var[6].bstrVal = A2BSTR(szSrcFileName); // target file
	var[5].vt = VT_BSTR;			var[5].bstrVal = A2BSTR(szStr);
	//var[5].vt = VT_ARRAY|VT_UI1;    var[5].parray = psa;		// 第1个参数，条码字符串信息
	var[4].vt = VT_I4;				var[4].lVal = lFontSize;	// 第2个参数，条码图片文件 文件名
	var[3].vt = VT_I4;				var[3].lVal = lTxtHeight;			// 第3个参数，整数3, 列数
	var[2].vt = VT_I4;				var[2].lVal = lHmargin;			// 第4个参数，整数3, 校验等级
	var[1].vt = VT_I4;				var[1].lVal = lVmargin;			// 第5个参数，整数3, 长宽比
	var[0].vt = VT_I4;				var[0].lVal = lTxtCntOneLine;			// 第5个参数，整数3, 长宽比

	CComDispatchDriver spDisp( spUnk );	// 构造智能指针
	VARIANT vResult;					// 参数
	hr = spDisp.InvokeN(	
		L"MixText",						// 函数名是 MixText
		var,
		8,
		&vResult);						// 返回值

	for(int k=0; k<8; k++)
		VariantClear(&var[k]);
	
	if(! SUCCEEDED( hr ) )
	{
		MessageBox(NULL, "运行 MixText 函数出错，可能组件中没有 MixText 函数!", "讯息", MB_OK|MB_ICONERROR);
		return -1;						// 如果失败，说明组件可能没有 Make 函数
	}
	assert(0 == "return 0");
	return 0;
}