📄 asn1parsepage.cpp
字号:
// 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 + -