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

📄 pkgadmindlg.cpp

📁 eCos1.31版
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 ();}

⌨️ 快捷键说明

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