?? pkgadmindlg.cpp
字號:
const std::vector<std::string>& packages = m_CdlPkgData->get_packages (); for (std::vector<std::string>::const_iterator package = packages.begin (); package != packages.end (); package++) { // add a package node TRACE (_T("Adding package %s:"), CString (package->c_str ())); HTREEITEM hPackage = m_ctrlPackageTree.InsertItem (CString (m_CdlPkgData->get_package_aliases (*package) [0].c_str ())); m_ctrlPackageTree.SetItemData (hPackage, (DWORD) new CString (package->c_str ())); m_ctrlPackageTree.SetItemImage (hPackage, 0, 0); const std::vector<std::string>& versions = m_CdlPkgData->get_package_versions (* package); for (std::vector<std::string>::const_iterator version = versions.begin (); version != versions.end (); version++) { // add a version node TRACE (_T(" %s"), CString (version->c_str ())); const HTREEITEM hVersion = m_ctrlPackageTree.InsertItem (CString (version->c_str ()), hPackage); m_ctrlPackageTree.SetItemImage (hVersion, 1, 1); } TRACE (_T("\n")); m_ctrlPackageTree.SortChildren (hPackage); // sort the version nodes } m_ctrlPackageTree.SortChildren (NULL); // sort the package nodes if(this==AfxGetApp()->m_pMainWnd){ // if the dialog is the application // update the caption bar CString strCaption (m_strRepository); strCaption.Replace (_TCHAR('/'), _TCHAR('\\')); strCaption += _T(" - eCos Package Administration Tool"); SetWindowText (strCaption); } return true;}void CPkgAdminDlg::OnPkgadminRemove() { const HTREEITEM hTreeItem = m_ctrlPackageTree.GetSelectedItem (); if (! hTreeItem) return; if (IDYES != CWnd::MessageBox (_T("The selected package will be deleted from the repository. Core eCos packages may be restored only by reinstalling eCos.\n\nDo you wish to continue?"), _T("Remove Package"), MB_YESNO | MB_ICONEXCLAMATION)) return; const CString * pstrPackage = (const CString *) m_ctrlPackageTree.GetItemData (hTreeItem); if (pstrPackage) // if a package node is selected { // remove all package version nodes bool bStatus = true; HTREEITEM hChildItem = m_ctrlPackageTree.GetChildItem (hTreeItem); while (hChildItem && bStatus) { const HTREEITEM hNextChildItem = m_ctrlPackageTree.GetNextSiblingItem (hChildItem); bStatus = RemovePackageVersion (hChildItem); hChildItem = hNextChildItem; } // remove the package node if (bStatus) { delete pstrPackage; m_ctrlPackageTree.DeleteItem (hTreeItem); } } else // a version node is selected { // remove the version node const HTREEITEM hParentItem = m_ctrlPackageTree.GetParentItem (hTreeItem); ASSERT (hParentItem); if (RemovePackageVersion (hTreeItem) && ! m_ctrlPackageTree.ItemHasChildren (hParentItem)) // if the only version was deleted { // remove the package node delete pstrPackage; m_ctrlPackageTree.DeleteItem (hParentItem); } }}void CPkgAdminDlg::ClearPackageTree(){ HTREEITEM hPackage = m_ctrlPackageTree.GetRootItem (); if (! hPackage) // if no packages in the tree... return; // ...nothing to do while (hPackage) { const HTREEITEM hNextPackage = m_ctrlPackageTree.GetNextSiblingItem (hPackage); TRACE (_T("Deleting package %s\n"), * ((CString *) m_ctrlPackageTree.GetItemData (hPackage))); delete (CString *) m_ctrlPackageTree.GetItemData (hPackage); m_ctrlPackageTree.DeleteItem (hPackage); hPackage = hNextPackage; }}void CPkgAdminDlg::OnDestroy() { CeCosDialog::OnDestroy(); // free memory allocated to the tree item data CStrings ClearPackageTree (); // free memory allocated to the CDL database if (m_CdlPkgData) delete m_CdlPkgData;}void CPkgAdminDlg::OnPkgadminAdd() { CFileDialog dlg (TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT, _T("eCos Package Files (*.epk)|*.epk||"), GetParent ()); TCHAR szBuffer [MAX_PATH * 16] = _T(""); dlg.m_ofn.lpstrFile = szBuffer; dlg.m_ofn.nMaxFile = MAX_PATH * 16; dlg.m_ofn.lpstrTitle = _T("Open eCos Package Files"); if (IDOK == dlg.DoModal ()) { bool bRepositoryChanged = false; POSITION posPathName = dlg.GetStartPosition (); while (posPathName) { // get an eCos package distribution file CString strPathName = dlg.GetNextPathName (posPathName); // extract the licence file CString strCommand; strCommand.Format (_T("add %s --extract_license"), strPathName); strCommand.Replace (_TCHAR('\\'), _TCHAR('/')); // backslashes -> forward slashes for Tcl_EvalFile EvalTclFile (3, strCommand); CString strLicenseFile = m_strRepository + _T("/pkgadd.txt"); strLicenseFile.Replace (_TCHAR('/'), _TCHAR('\\')); // forward slashes -> backslashes for Win32 // read the license file CFile fileLicenseFile; if (fileLicenseFile.Open (strLicenseFile, CFile::modeRead)) { TRACE (_T("License file found at %s\n"), strLicenseFile); const DWORD dwLicenseLength = fileLicenseFile.GetLength (); char * pszBuffer = new char [dwLicenseLength + 1]; // allocate a buffer fileLicenseFile.Read (pszBuffer, dwLicenseLength); fileLicenseFile.Close (); CFile::Remove (strLicenseFile); // delete the license file when read pszBuffer [dwLicenseLength] = NULL; // terminate the string in the buffer CString strLicenseText (pszBuffer); // copy into a CString to convert to Unicode delete [] pszBuffer; if (-1 == strLicenseText.Find (_T("\r\n"))) // if the file has LF line endings... strLicenseText.Replace (_T("\n"), _T("\r\n")); // ... replace with CRLF line endings // display the license text CPkgAdminLicenseDlg dlgLicense (this); dlgLicense.m_strLicense = strLicenseText; dlgLicense.SetCaption (strPathName + _T(" - Add Packages")); if (IDOK != dlgLicense.DoModal ()) // if license not accepted by user continue; // try the next file } // add the contents of the package distribution file strCommand.Format (_T("add %s --accept_license"), strPathName); strCommand.Replace (_TCHAR('\\'), _TCHAR('/')); // backslashes -> forward slashes for Tcl_EvalFile if (! EvalTclFile (3, strCommand)) // if not successful continue; // try the next file bRepositoryChanged = true; } // refresh the package tree only if necessary if (bRepositoryChanged && ! PopulatePackageTree (m_strRepository)) DestroyWindow (); }}bool CPkgAdminDlg::EvalTclFile(int nArgc, LPCTSTR pszArgv){ CPkgAdminTclWaitDlg dlgWait; TRACE (_T("Evaluating ecosadmin.tcl %s\n"), pszArgv); // set up the data structure which is passed to the Tcl thread CString strArgc; strArgc.Format (_T("%d"), nArgc); std::string argv0 = UnicodeToStdStr (m_strRepository) + "/ecosadmin.tcl"; std::string argv = UnicodeToStdStr (pszArgv); std::string argc = UnicodeToStdStr (strArgc); dlgWait.etsInfo.argv0 = (char *) argv0.c_str (); dlgWait.etsInfo.argv = (char *) argv.c_str (); dlgWait.etsInfo.argc = (char *) argc.c_str (); // display the 'please wait' dialog // the Tcl command is invoked from CPkgAdminTclWaitDlg::OnCreate() CWaitCursor curWait; dlgWait.DoModal (); curWait.Restore (); // retrieve status information from the data structure int nStatus = dlgWait.etsInfo.status; CString strErrorMessage (dlgWait.etsInfo.result); // report any error if (! strErrorMessage.IsEmpty ()) { AfxMessageBox (_T("Command execution error:\n\n") + strErrorMessage); return false; } else if (TCL_OK != nStatus) { AfxMessageBox (_T("Command execution error")); return false; } return true;}bool CPkgAdminDlg::RemovePackageVersion(HTREEITEM hTreeItem){ const HTREEITEM hParentItem = m_ctrlPackageTree.GetParentItem (hTreeItem); ASSERT (hParentItem); CString * pstrPackage = (CString *) m_ctrlPackageTree.GetItemData (hParentItem); ASSERT (pstrPackage); CString strCommand; strCommand.Format (_T("remove %s --version %s"), * pstrPackage, m_ctrlPackageTree.GetItemText (hTreeItem)); if (! EvalTclFile (3, strCommand)) // if not successful return false; m_ctrlPackageTree.DeleteItem (hTreeItem); // remove the selected item from the tree return true;}void CPkgAdminDlg::OnPkgadminRepository() { CFileDialog dlg (TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, _T("eCos Package Database Files (ecos.db)|ecos.db||"), GetParent ()); dlg.m_ofn.lpstrTitle = _T("Open eCos Package Database File"); int nStatus; do { nStatus = dlg.DoModal (); if (IDOK == nStatus) { const CString strPathName = dlg.GetPathName (); const int nPathNameIndex = strPathName.ReverseFind (_TCHAR('\\')); ASSERT (nPathNameIndex != -1); m_strRepository = strPathName.Mid (0, nPathNameIndex); m_strRepository.Replace (_TCHAR('\\'), _TCHAR('/')); } } while ((IDOK == nStatus) && ! PopulatePackageTree (m_strRepository));}void CPkgAdminDlg::OnSelchangedPkgadminTree(NMHDR*, LRESULT* pResult) { //NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // enable the remove button only if a node is selected m_btnRemove.EnableWindow (NULL != m_ctrlPackageTree.GetSelectedItem ()); *pResult = 0;}std::string CPkgAdminDlg::UnicodeToStdStr(LPCTSTR str){ int nLength = 1 + _tcslen (str); char * pszString = new char [nLength]; #ifdef _UNICODE WideCharToMultiByte (CP_ACP, 0, str, -1, pszString, nLength, NULL, NULL); #else strcpy (pszString, str); #endif std::string stdstr = std::string (pszString); delete [] pszString; return stdstr;}bool CPkgAdminDlg::FindUserToolsPath(){ HKEY hKey; if (ERROR_SUCCESS != RegOpenKeyEx (HKEY_CURRENT_USER, _T("Software\\Red Hat\\eCos\\Configuration Tool\\User Tools"), 0, KEY_READ, &hKey)) return false; TCHAR szBuffer [MAX_PATH + 1]; DWORD dwBufferLength = MAX_PATH + 1; LONG lStatus = RegQueryValueEx (hKey, _T("Folder"), NULL, NULL, (LPBYTE) szBuffer, &dwBufferLength); RegCloseKey (hKey); if (ERROR_SUCCESS != lStatus) return false; m_strUserTools = szBuffer; TRACE (_T("User tools found at %s\n"), m_strUserTools); return ! m_strUserTools.IsEmpty ();}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -