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

📄 asn1parsepage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Asn1ParsePage.cpp : implementation file
//

#include "stdafx.h"
#include "MiniCA.h"
#include "Asn1ParsePage.h"
#include "MiniMainDlg.h"
#include <locale.h>
#include ".\GenericClass\Language.h"
#include "minict.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAsn1ParsePage property page

IMPLEMENT_DYNCREATE(CAsn1ParsePage, CPropertyPage)

CAsn1ParsePage::CAsn1ParsePage() : CPropertyPage(CAsn1ParsePage::IDD)
{
	//{{AFX_DATA_INIT(CAsn1ParsePage)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_TreeItem=NULL;
}

CAsn1ParsePage::~CAsn1ParsePage()
{
}

void CAsn1ParsePage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAsn1ParsePage)
//	DDX_Control(pDX, IDC_EDIT_PATH, m_XpEdit);
	DDX_Control(pDX, IDC_B_READ, m_Bread);
	DDX_Control(pDX, IDC_ASN1_TREE, m_Tree);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAsn1ParsePage, CPropertyPage)
	//{{AFX_MSG_MAP(CAsn1ParsePage)
	ON_BN_CLICKED(IDC_B_READ, OnBRead)
	ON_NOTIFY(TVN_SELCHANGED, IDC_ASN1_TREE, OnSelchangedAsn1Tree)
	ON_WM_DESTROY()
	ON_NOTIFY(NM_RCLICK, IDC_ASN1_TREE, OnRclickAsn1Tree)
	ON_COMMAND(ID_MENUITEM_EXPANE, OnMenuitemExpane)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAsn1ParsePage message handlers
BOOL CAsn1ParsePage::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	// TODO: Add extra initialization here
	m_Bread.SetThemeHelper(((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
//	m_Bread.DrawAsToolbar(TRUE);
	m_Bread.SetIcon(IDI_ICON_SELECTDIR);
	m_Bread.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);

	//m_Bread.SetFlat(FALSE);
	CImageList * pImgList = ((CMiniCaApp *)AfxGetApp())->GetImgList();
	m_Tree.SetImageList(pImgList,TVSIL_NORMAL);
	//XP风格菜单,表现为选中时候图标偏移
	BCMenu::SetMenuDrawMode( BCMENU_DRAWMODE_XP );

	m_toolTip.Create(this);
	m_toolTip.AddTool(GetDlgItem(IDC_B_READ), CMiniCaApp::NormalCode("选择被解码的文件\r文件长度小于10K字节"));


	if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
	{
		ClassXP(GetDlgItem(IDC_EDIT_PATH)->m_hWnd,TRUE);
//		ClassXP(GetDlgItem(IDC_ASN1_TREE)->m_hWnd,TRUE);
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CAsn1ParsePage::OnBRead() 
{
	// TODO: Add your control notification handler code here
	CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT /*| OFN_NOCHANGEDIR */,
	MiniCT_1600, NULL);

	dlgOpen.m_ofn.lStructSize = sizeof(OPENFILENAME);
	CString str = MiniCT_1601;
	dlgOpen.m_ofn.lpstrTitle = str;//标题条 LPCTSTR
	if(dlgOpen.DoModal()!=IDOK) return;
	CString fileName=dlgOpen.GetPathName();
	GetAsn1Info(fileName);
}


void CAsn1ParsePage::OnSelchangedAsn1Tree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	HTREEITEM handle=m_Tree.GetSelectedItem();
	POSITION pos;
	stuNODE * tNode;
	CString str;
	for( pos = m_NodeList.GetHeadPosition(); pos != NULL; )
	{
		tNode=(stuNODE *)m_NodeList.GetNext(pos);
		if(tNode->NODE==handle)
		{
			str.Format("%s:%d\r\n%s:%d\r\n%s:%s", 
				MiniCT_1602, tNode->EXCURSION, MiniCT_1603,
				tNode->LENGTH, MiniCT_1604, tNode->INFO);
			SetDlgItemText(IDC_EDIT_INFO,str);
			break;
		}

	}
	*pResult = 0;
}

void CAsn1ParsePage::OnDestroy() 
{
	CPropertyPage::OnDestroy();	
	// TODO: Add your message handler code here
	stuNODE * LIST=NULL;
	for(;!m_NodeList.IsEmpty();)
	{
		LIST=(stuNODE *)m_NodeList.RemoveHead();
		delete LIST;
	}
}

void CAsn1ParsePage::OnRclickAsn1Tree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here

	CPoint point;
	GetCursorPos(&point); // 当前鼠标坐标
	CPoint PointInTree = point;
	m_Tree.ScreenToClient( &PointInTree);
	
	UINT nFlag;
	m_TreeItem = m_Tree.HitTest( PointInTree, &nFlag );

	if(m_TreeItem == NULL)
		return;
	
	m_Tree.SelectItem(m_TreeItem);//设置选中

	HTREEITEM item = m_Tree.GetChildItem(m_TreeItem);//是否有子项
	if(item==NULL)
		return;

	int nState= m_Tree.GetItemState(m_TreeItem,TVIF_STATE)& TVIS_EXPANDED ;//是否已经展开
	
	BCMenu m_PopMenu;
	m_PopMenu.LoadMenu(IDR_MENU_ASN1VIEW);
	m_PopMenu.LoadToolbar(IDR_MINICAMENU);

	CMenu * pPopup = m_PopMenu.GetSubMenu(0);
	SetForegroundWindow(); //点击可以关闭
	ASSERT(pPopup);

	//ModifyODMenuA
	if(nState!=0)//已经展开
		m_PopMenu.ModifyODMenu(MiniCT_1605, ID_MENUITEM_EXPANE);
	else
		m_PopMenu.ModifyODMenu(MiniCT_1606, ID_MENUITEM_EXPANE);//展开

	UINT nSelection = pPopup->TrackPopupMenu(TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN, point.x, 
		point.y,this, NULL);
	m_PopMenu.DestroyMenu();
	*pResult = 0;
}

void CAsn1ParsePage::OnMenuitemExpane() //展开
{
	// TODO: Add your command handler code here
	ExpandAll(m_TreeItem,TVE_TOGGLE);
}

void CAsn1ParsePage::ExpandAll(HTREEITEM item,UINT nCode )////展开,收缩
{
	m_Tree.SetRedraw(FALSE);
	if( m_Tree.ItemHasChildren( item ))
	{
		m_Tree.Expand( item, nCode );
		item = m_Tree.GetChildItem( item );
		do
		{
			ExpandAll(item,nCode);
		}while( (item = m_Tree.GetNextSiblingItem( item )) != NULL );
	}
	m_Tree.EnsureVisible( m_Tree.GetSelectedItem());
	m_Tree.SetRedraw();

}

void CAsn1ParsePage::GetAsn1Info(CString strpath)
{

	//由于PEM格式解码经常崩溃,所以在开始时候限制文件大小为2K
	CFile file;
	if(file.Open(strpath,CFile::modeRead))
	{
		if(file.GetLength() >= 10*1024)
		{
			file.Close();
			AddMsg(MiniCT_1607, M_WARING); //文件长度超过10K字节
			return;
		}
		file.Close();
	}
	else
		return;

	m_Tree.DeleteAllItems();
	SetDlgItemText(IDC_EDIT_INFO,"");
	SetDlgItemText(IDC_EDIT_PATH,strpath);
	
	stuNODE * LIST=NULL;
	for(;!m_NodeList.IsEmpty();)
	{
		LIST=(stuNODE *)m_NodeList.RemoveHead();
		delete [] LIST;
	}
	
	char buf[255]={0};
	stuTREE * TREEPEM = NULL, * TREEDER = NULL, * temp = NULL;

	if(Asn1Parse(strpath.GetBuffer(0),TREEDER,DER,buf))//==1 ok
	{
		HTREEITEM depth[20]={0};//深度
		depth[0]=TVI_ROOT;
		CString str;
		for(temp=TREEDER;temp!=NULL;temp=temp->Link)
		{
			stuNODE * pNode=new stuNODE;
			depth[temp->DEPTH+1]=m_Tree.InsertItem(temp->TYPE,10,10,depth[temp->DEPTH]);
			pNode->NODE=depth[temp->DEPTH+1];
			pNode->EXCURSION=temp->EXCURSION;
			pNode->LENGTH=temp->LENGTH;
			if(strlen(temp->INFO))
			{
				strncpy(pNode->INFO,temp->INFO,sizeof(pNode->INFO));
			}
			m_NodeList.AddHead(pNode);
		}
		FreeTree(TREEPEM);
		FreeTree(TREEDER);
		return;
	}
	strpath.ReleaseBuffer();
	

	if(Asn1Parse(strpath.GetBuffer(0),TREEPEM,PEM,buf))//==1 ok
	{
		HTREEITEM depth[20]={0};//深度
		depth[0]=TVI_ROOT;
		CString str;
		for(temp=TREEPEM;temp!=NULL;temp=temp->Link)
		{
			stuNODE * pNode=new stuNODE;
			depth[temp->DEPTH+1]=m_Tree.InsertItem(temp->TYPE,10,10,depth[temp->DEPTH]);
			pNode->NODE=depth[temp->DEPTH+1];
			pNode->EXCURSION=temp->EXCURSION;
			pNode->LENGTH=temp->LENGTH;
			if(strlen(temp->INFO))
			{
				strncpy(pNode->INFO,temp->INFO,sizeof(pNode->INFO));
			}
			m_NodeList.AddHead(pNode);
		}
	}
	else
		AddMsg(buf, M_ERROR);
	strpath.ReleaseBuffer();

	FreeTree(TREEPEM);
	FreeTree(TREEDER);
}

void CAsn1ParsePage::AddMsg(CString info, DWORD type)
{
	((CMiniMainDlg *)GetParent())->AddMsg(MiniCT_0005, info, type);

}


BOOL CAsn1ParsePage::PreTranslateMessage(MSG* pMsg)
{
	// CG: The following block was added by the ToolTips component.	m_toolTip.RelayEvent(pMsg);
	return CPropertyPage::PreTranslateMessage(pMsg);	// CG: This was added by the ToolTips component.
}

/*添加链表节点*/
int CAsn1ParsePage::AddTree(stuTREE *& Head,UINT Excursion,UINT Depth,UINT Length,char * Type)//返回当前序号
{
	int index=0;
	stuTREE * End=new stuTREE(Excursion,Depth,Length,Type);//钥增加的节点
	if(Head==NULL)
	{
		Head=End;
	}
	else 
	{
		stuTREE * p=Head;
		index+=1;
		while(p->Link!=NULL)
		{
			index++;
			p=p->Link;
		}
		p->Link=End; 
	}

	return index;
}

void CAsn1ParsePage::FreeTree(stuTREE *& Head)
{
	stuTREE * temp =NULL;

	while(Head!=NULL)//遍历链表
	{
	    temp=Head;
		Head=Head->Link;
		delete [] temp;
	}

}
int CAsn1ParsePage::asn1_print_info(int tag, int xclass, int constructed,
					int indent,char * str)
{
//	if (constructed & V_ASN1_CONSTRUCTED)
//		p="cons: ";
//	else
//		p="prim: ";
//	if (BIO_write(bp,p,6) < 6) goto err;
//	BIO_indent(bp,indent,128);
	const char *p;
	if ((xclass & V_ASN1_PRIVATE) == V_ASN1_PRIVATE)
		sprintf(str,"Private[%d] ",tag);
	else if ((xclass & V_ASN1_CONTEXT_SPECIFIC) == V_ASN1_CONTEXT_SPECIFIC)
		sprintf(str,"Context[%d]",tag);
	else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION)
		sprintf(str,"Application [%d]",tag);
	else 
	{
		p = ASN1_tag2str(tag);
		sprintf(str,p);
	}
	return(1);
}

void CAsn1ParsePage::Utf8ToAnsi(UCHAR * lpsrc, int srclen, LPSTR lpdst, int& dstlen)
{
	WCHAR * Unicode;
    int len = MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) lpsrc ,-1 ,NULL,0);
    Unicode = new WCHAR[len * sizeof(WCHAR)];
    MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) lpsrc, -1, Unicode , len );
    len = WideCharToMultiByte(CP_ACP,0,Unicode,-1,NULL,0,NULL,NULL);
    dstlen = WideCharToMultiByte (CP_ACP,0,Unicode,-1,lpdst,len,NULL,NULL);
    delete []Unicode;
}

BOOL CAsn1ParsePage::GetAsn1Str(ASN1_STRING * str,char * outName)
{
	if(str==NULL)
		return FALSE;
	setlocale(LC_CTYPE, "");
	//判断str是否为UTF-8
	int len = 0;
	unsigned char * tmp = NULL; 
	if (str && ASN1_STRING_type(str) == V_ASN1_UTF8STRING)
	{
		len = ASN1_STRING_length(str);
		if (len >= 0)
		{
			tmp = (UCHAR *)OPENSSL_malloc(len+1);
			if (tmp)
			{
				memcpy(tmp, ASN1_STRING_data(str), len);
				tmp[len] = '\0';
			}
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -