// KeyDView.cpp : implementation file // #include "stdafx.h" #include "KeyRing.h" #include "MainFrm.h" #include "keyobjs.h" #include "KeyDView.h" #include "machine.h" #include "KRDoc.h" #include "KRView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern CKeyRingView* g_pTreeView; ///////////////////////////////////////////////////////////////////////////// // CKeyDataView IMPLEMENT_DYNCREATE(CKeyDataView, CFormView) CKeyDataView::CKeyDataView() : CFormView(CKeyDataView::IDD) { //{{AFX_DATA_INIT(CKeyDataView) m_szBits = _T(""); m_szCountry = _T(""); m_szName = _T(""); m_szDNNetAddress = _T(""); m_szOrganization = _T(""); m_szStatus = _T(""); m_szUnit = _T(""); m_szState = _T(""); m_szLocality = _T(""); m_szExpires = _T(""); m_szStarts = _T(""); //}}AFX_DATA_INIT } CKeyDataView::~CKeyDataView() { } void CKeyDataView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CKeyDataView) DDX_Control(pDX, IDC_GROUP_DN, m_ctrlGroupDN); DDX_Control(pDX, IDC_STATIC_STARTS, m_ctrlStarts); DDX_Control(pDX, IDC_STATIC_EXPIRES, m_ctrlExpires); DDX_Control(pDX, IDC_STATIC_STATEPROVICE, m_ctrlState); DDX_Control(pDX, IDC_STATIC_LOCALITY, m_ctrlLocality); DDX_Control(pDX, IDC_STATIC_UNIT, m_ctrlUnit); DDX_Control(pDX, IDC_STATIC_ORG, m_ctrlOrg); DDX_Control(pDX, IDC_STATIC_NETADDR, m_ctrlNetAddr); DDX_Control(pDX, IDC_STATIC_NAME, m_ctrlStaticName); DDX_Control(pDX, IDC_STATIC_COUNTRY, m_ctrlCountry); DDX_Control(pDX, IDC_STATIC_BITS, m_ctrlBits); DDX_Control(pDX, IDC_VIEWKEY_NAME, m_ctrlName); DDX_Text(pDX, IDC_VIEWKEY_BITS, m_szBits); DDX_Text(pDX, IDC_VIEWKEY_COUNTRY, m_szCountry); DDX_Text(pDX, IDC_VIEWKEY_NAME, m_szName); DDX_Text(pDX, IDC_VIEWKEY_NETADDR, m_szDNNetAddress); DDX_Text(pDX, IDC_VIEWKEY_ORG, m_szOrganization); DDX_Text(pDX, IDC_VIEWKEY_STATUS, m_szStatus); DDX_Text(pDX, IDC_VIEWKEY_UNIT, m_szUnit); DDX_Text(pDX, IDC_VIEWKEY_STATEPROVINCE, m_szState); DDX_Text(pDX, IDC_VIEWKEY_LOCALITY, m_szLocality); DDX_Text(pDX, IDC_VIEWKEY_EXPIRES, m_szExpires); DDX_Text(pDX, IDC_VIEWKEY_STARTS, m_szStarts); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CKeyDataView, CFormView) //{{AFX_MSG_MAP(CKeyDataView) ON_EN_CHANGE(IDC_VIEWKEY_NAME, OnChangeViewkeyName) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CKeyDataView diagnostics #ifdef _DEBUG void CKeyDataView::AssertValid() const { CFormView::AssertValid(); } void CKeyDataView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CKeyDataView message handlers //---------------------------------------------------------------------------- void CKeyDataView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { CKey* pKey = (CKey*)g_pTreeView->PGetSelectedItem(); // we only work on selection changes an "none" hints switch ( lHint ) { case HINT_None: case HINT_ChangeSelection: break; default: return; } // if there is no selected key, bail if ( !pKey || !pKey->IsKindOf(RUNTIME_CLASS(CKey)) ) { EnableDataView( FALSE, FALSE ); return; } else { EnableDataView( TRUE, TRUE ); } // put all the string stuff into a try/catch to get mem errors try { ASSERT( pKey ); ASSERT( pKey->IsKindOf(RUNTIME_CLASS(CKey)) ); // set the character strings m_szName = pKey->GetName(); // get certificate specific info directly out of the certifiect FillInCrackedInfo( pKey ); // if this key is not completed, disable the button altogether if ( !pKey->m_pCertificate ) // the item is not completed { EnableDataView( FALSE, TRUE ); m_szStatus.LoadString(IDS_KEY_STATUS_INCOMPLETE); } // set the data into the form UpdateData( FALSE ); } catch( CException e ) { } } //---------------------------------------------------------------------------- void CKeyDataView::OnChangeViewkeyName() { CKey* pKey = (CKey*)g_pTreeView->PGetSelectedItem(); if ( !pKey || !pKey->IsKindOf(RUNTIME_CLASS(CKey)) ) { ASSERT( FALSE ); return; } // get the data from the form UpdateData( TRUE ); pKey->SetName( m_szName ); } //---------------------------------------------------------------------------- void CKeyDataView::EnableDataView( BOOL fEnable, BOOL fEnableName ) { // enable the name seperately from the rest if ( fEnableName ) { m_ctrlName.EnableWindow( TRUE ); m_ctrlStaticName.EnableWindow( TRUE ); } else { m_szName.Empty(); m_ctrlName.EnableWindow( FALSE ); m_ctrlStaticName.EnableWindow( FALSE ); } // do the right thing. (wasn't a bad movie) if ( fEnable ) { // enable what needs to be enabled. The DoUpdate routine takes care of the rest m_ctrlGroupDN.EnableWindow( TRUE ); m_ctrlUnit.EnableWindow( TRUE ); m_ctrlUnit.EnableWindow( TRUE ); m_ctrlNetAddr.EnableWindow( TRUE ); m_ctrlCountry.EnableWindow( TRUE ); m_ctrlState.EnableWindow( TRUE ); m_ctrlLocality.EnableWindow( TRUE ); m_ctrlBits.EnableWindow( TRUE ); m_ctrlOrg.EnableWindow( TRUE ); m_ctrlExpires.EnableWindow( TRUE ); m_ctrlStarts.EnableWindow( TRUE ); } else // disabling the window { // empty the information strings m_szCountry.Empty(); m_szState.Empty(); m_szLocality.Empty(); m_szDNNetAddress.Empty(); m_szOrganization.Empty(); m_szUnit.Empty(); m_szBits.Empty(); m_szExpires.Empty(); m_szStarts.Empty(); // set the status string m_szStatus.LoadString(IDS_MACHINE_SELECTED); // set the data into the form UpdateData( FALSE ); // disable everything m_ctrlGroupDN.EnableWindow( FALSE ); m_ctrlUnit.EnableWindow( FALSE ); m_ctrlOrg.EnableWindow( FALSE ); m_ctrlNetAddr.EnableWindow( FALSE ); m_ctrlCountry.EnableWindow( FALSE ); m_ctrlState.EnableWindow( FALSE ); m_ctrlLocality.EnableWindow( FALSE ); m_ctrlBits.EnableWindow( FALSE ); m_ctrlExpires.EnableWindow( FALSE ); m_ctrlStarts.EnableWindow( FALSE ); } } //---------------------------------------------------------------------------- void CKeyDataView::FillInCrackedInfo( CKey* pKey ) { CKeyCrackedData cracker; // crack the key if ( !cracker.CrackKey(pKey) ) return; // fill in the distinguishing information cracker.GetDNCountry( m_szCountry ); cracker.GetDNState( m_szState ); cracker.GetDNLocality( m_szLocality ); cracker.GetDNNetAddress( m_szDNNetAddress ); cracker.GetDNOrganization( m_szOrganization ); cracker.GetDNUnit( m_szUnit ); // set the bit length DWORD nBits = cracker.GetBitLength(); if ( nBits ) m_szBits.Format( "%d", nBits ); else m_szBits.LoadString( IDS_KEY_UNKNOWN ); // get the dates FILETIME timeStart = cracker.GetValidFrom(); FILETIME timeEnd = cracker.GetValidUntil(); // set the start date string CTime ctimeStart( timeStart ); m_szStarts = ctimeStart.Format( IDS_EXPIRETIME_FORMAT ); // set the end date string CTime ctimeEnd( timeEnd ); m_szExpires = ctimeEnd.Format( IDS_EXPIRETIME_FORMAT ); // get the current time CTime ctimeCurrent = CTime::GetCurrentTime(); #ifdef _DEBUG CString szTest = ctimeCurrent.Format( IDS_EXPIRETIME_FORMAT ); #endif // get the expire soon test time - current time plus two weeks CTimeSpan ctsSoonSpan(14,0,0,0); // two weeks CTime ctimeSoon = ctimeCurrent + ctsSoonSpan; #ifdef _DEBUG szTest = ctimeSoon.Format( IDS_EXPIRETIME_FORMAT ); #endif // test if it has expired first if ( ctimeCurrent > ctimeEnd ) { m_szStatus.LoadString(IDS_KEY_STATUS_EXPIRED); } else if ( ctimeSoon > ctimeEnd ) { // well then does it expire soon? m_szStatus.LoadString(IDS_KEY_STATUS_EXPIRES_SOON); } else { // that must mean it is ok m_szStatus.LoadString(IDS_KEY_STATUS_COMPLETE); } } //---------------------------------------------------------------------------- BOOL CKeyDataView::PreTranslateMessage(MSG* pMsg) { // The user pushes the tab button, send the focus back to the tree view if ( pMsg->message == WM_KEYDOWN ) { int nVirtKey = (int) pMsg->wParam; if ( nVirtKey == VK_TAB ) { // get the parental frame window CMainFrame* pFrame = (CMainFrame*)GetParentFrame(); // give the data view the focus pFrame->SetActiveView( g_pTreeView ); return TRUE; } } return CFormView::PreTranslateMessage(pMsg); }