--- /dev/null
+//####COPYRIGHTBEGIN####
+//
+// ----------------------------------------------------------------------------
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
+//
+// This program is part of the eCos host tools.
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 of the License, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+// more details.
+//
+// You should have received a copy of the GNU General Public License along with
+// this program; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+// ----------------------------------------------------------------------------
+//
+//####COPYRIGHTEND####
+// ConfigToolDoc.cpp : implementation of the CConfigToolDoc class
+//
+//
+//===========================================================================
+//===========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): sdf
+// Contact(s): sdf
+// Date: 1998/08/11
+// Version: 0.01
+// Purpose:
+// Description: This is the implementation of the document class
+// Requires:
+// Provides:
+// See also:
+// Known bugs:
+// Usage:
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+
+#include "stdafx.h"
+
+#include "CTUtils.h"
+#include "CdlTemplatesDialog.h"
+#include "CellView.h"
+#include "ConfigItem.h"
+#include "ConfigTool.h"
+#include "ConfigToolDoc.h"
+#include "eCosTest.h"
+#include "IdleMessage.h"
+#include "MainFrm.h"
+#include "PlatformDialog.h"
+#include "PkgAdminDlg.h"
+#include "RegKeyEx.h"
+#include "RunTestsSheet.h"
+#include "Thermometer.h"
+
+#define INCLUDEFILE "build.hxx"
+#include "IncludeSTL.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+// a trivial CDL parse error handler
+
+/////////////////////////////////////////////////////////////////////////////
+// CConfigToolDoc
+
+IMPLEMENT_DYNCREATE(CConfigToolDoc, CDocument)
+
+BEGIN_MESSAGE_MAP(CConfigToolDoc, CDocument)
+//{{AFX_MSG_MAP(CConfigToolDoc)
+ON_COMMAND(ID_CONFIGURATION_REPOSITORY, OnConfigurationRepository)
+ON_COMMAND(ID_BUILD_TEMPLATES, OnBuildTemplates)
+ON_COMMAND(ID_BUILD_PACKAGES, OnBuildPackages)
+ON_COMMAND(ID_TOOLS_ADMINISTRATION, OnToolsAdministration)
+ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
+ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
+//}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CConfigToolDoc construction/destruction
+
+
+CConfigToolDoc::CConfigToolDoc():
+ m_bUseCustomViewer(false),
+ m_nFindFlags(0),
+ m_nFindWhere(InMacro),
+ m_bUseExternalBrowser(false),
+ m_bAutoExpand(false),
+ m_bMacroNames(false),
+ m_bHex(false),
+ m_CdlConfig(NULL),
+ m_CdlPkgData(NULL),
+ m_CdlInterp(NULL),
+ m_template_version(""),
+ m_bRepositoryOpen(false)
+{
+ CConfigTool::SetDocument(this);
+ LoadProfileSettings();
+}
+
+CConfigToolDoc::~CConfigToolDoc()
+{
+ CConfigTool::SetDocument(0);
+ SaveProfileSettings();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// CConfigToolDoc serialization
+
+void CConfigToolDoc::Serialize(CArchive& ar)
+{
+ if (ar.IsStoring())
+ {
+ // TODO: add storing code here
+ }
+ else
+ {
+ // TODO: add loading code here
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// CConfigToolDoc diagnostics
+
+#ifdef _DEBUG
+void CConfigToolDoc::AssertValid() const
+{
+ CDocument::AssertValid();
+}
+
+void CConfigToolDoc::Dump(CDumpContext& dc) const
+{
+ CDocument::Dump(dc);
+}
+#endif //_DEBUG
+
+/////////////////////////////////////////////////////////////////////////////
+// CConfigToolDoc commands
+
+bool CConfigToolDoc::SwitchMemoryLayout (BOOL bNewTargetPlatform)
+{
+ bool rc=true;
+ if (bNewTargetPlatform && ! m_strBuildTree.IsEmpty ()) // the user has changed target/platform within a build tree
+ {
+ // copy default MLT save files for the selected target/platform from the repository to the build tree if they do not already exist
+
+ CFileFind ffFileFind;
+ BOOL bLastFile = ffFileFind.FindFile (CFileName (m_strPackagesDir, m_strMemoryLayoutFolder, _T("include\\pkgconf\\*.mlt")));
+ while (bLastFile)
+ {
+ bLastFile = ffFileFind.FindNextFile ();
+ if (! CFileName(MLTDir (), ffFileFind.GetFileName ()).Exists () &&
+ !CUtils::CopyFile (ffFileFind.GetFilePath (), CFileName(MLTDir (), ffFileFind.GetFileName ()))){
+ return false; // message already emitted
+ }
+ }
+ }
+
+ if (m_strBuildTree.IsEmpty ()) // load the memory layout from the repository
+ rc&=NewMemoryLayout (CFileName (m_strPackagesDir, m_strMemoryLayoutFolder, _T("include\\pkgconf")));
+ else // load the memory layout from the build tree
+ rc&=NewMemoryLayout (MLTDir ());
+
+ return true; // FIXME
+}
+
+void CConfigToolDoc::OnCloseDocument()
+{
+ MemoryMap.new_memory_layout (); // called to free up memory
+ CloseRepository();
+ CDocument::OnCloseDocument();
+}
+
+
+BOOL CConfigToolDoc::OnNewDocument()
+{
+ m_strBuildTree=_T("");
+ if (!CDocument::OnNewDocument()){
+ return FALSE;
+ }
+ m_bRepositoryOpen = false;
+ if(!OpenRepository()){
+ PostQuitMessage (1);
+ return FALSE;
+ }
+ // load the memory layout for the default target-platform-startup from the current repository
+
+ MemoryMap.set_map_size (0xFFFFFFFF); // set the maximum memory map size
+ NewMemoryLayout (CFileName (m_strPackagesDir, m_strMemoryLayoutFolder, _T("include\\pkgconf")));
+ UpdateBuildInfo();
+ return TRUE;
+}
+
+BOOL CConfigToolDoc::OnOpenDocument(LPCTSTR lpszPathName)
+{
+ BOOL rc=FALSE; // Assume the worst
+ CString strFileName;
+ CdlInterpreter NewCdlInterp = NULL;
+ CdlConfiguration NewCdlConfig = NULL;
+
+
+ CFileName strFolder (lpszPathName);
+ strFolder = strFolder.Left (strFolder.ReverseFind (_TCHAR('\\'))); // extract folder from file path
+
+ if(CConfigTool::GetMain()){
+ CString str;
+ str.Format(_T("Opening save file %s"),lpszPathName);
+ CConfigTool::GetMain()->m_wndStatusBar.SetPaneText(CMainFrame::StatusPane,str);
+ CConfigTool::GetMain()->m_wndStatusBar.SetPaneText(CMainFrame::FailRulePane,_T(""));
+ }
+
+ TRACE(_T("###Open document - save file=%s\n"), lpszPathName);
+
+ // disable the transaction callback before attempting changes
+
+ EnableCallbacks(false);
+
+ // load the new configuration
+
+ try
+ {
+ NewCdlInterp = CdlInterpreterBody::make ();
+ NewCdlConfig = CdlConfigurationBody::load (CUtils::UnicodeToStdStr (lpszPathName), m_CdlPkgData, NewCdlInterp, &CdlLoadErrorHandler, &CdlLoadWarningHandler);
+ rc = TRUE;
+ }
+ catch (CdlStringException exception)
+ {
+ CUtils::MessageBoxF(_T("Error opening eCos configuration:\n\n%s"), CString (exception.get_message ().c_str ()));
+ }
+ catch (...)
+ {
+ CUtils::MessageBoxF(_T("Error opening eCos configuration"));
+ }
+
+ if (rc)
+ {
+ rc=false;
+ // check the new configuration
+
+ ASSERT (NewCdlConfig->check_this (cyg_extreme));
+
+ // switch to the new configuration
+
+ deleteZ(m_CdlConfig);
+ deleteZ(m_CdlInterp);
+ m_CdlInterp = NewCdlInterp;
+ m_CdlConfig = NewCdlConfig;
+ SetPathName (lpszPathName, TRUE); // called to ensure that MLTDir() will work in this function
+
+ AddAllItems (); // must precede NewMemoryLayout() [CurrentLinkerScript() calls Find()]
+
+ // load the memory layout from the build tree
+ NewMemoryLayout (MLTDir ());
+
+ // generate the CConfigItems from their CDL descriptions
+
+
+ UpdateAllViews (NULL,AllSaved,0);
+ UpdateFailingRuleCount();
+ UpdateBuildInfo();
+ rc=true;
+ }
+
+ // re-enable the transaction callback
+
+ EnableCallbacks(true);
+
+ return rc;
+}
+
+BOOL CConfigToolDoc::OnSaveDocument(LPCTSTR lpszPathName)
+{
+ const CString strOldPath(GetPathName());
+ bool bSaveAs=(lpszPathName!=strOldPath);
+ if(!bSaveAs && !IsModified()){
+ return true;
+ }
+
+ bool rc=false;
+ if(CheckConflictsBeforeSave()){ // errors already emitted
+
+ const CFileName strPathName(lpszPathName);
+
+ TRACE(_T("###Save document %s\n"),lpszPathName);
+
+ CString str;
+ str.Format(_T("Saving configuration %s"), lpszPathName);
+ CIdleMessage IM(str);
+ if(CConfigTool::GetCellView()){
+ CConfigTool::GetCellView()->CancelCellEdit();
+ }
+
+ // check the configuration
+
+ ASSERT (m_CdlConfig->check_this (cyg_extreme));
+
+ // save the configuration
+
+ try
+ {
+ m_CdlConfig->save (CUtils::UnicodeToStdStr (lpszPathName));
+ rc=true;
+ }
+
+ catch (CdlStringException exception)
+ {
+ CUtils::MessageBoxF(_T("Error saving eCos configuration:\n\n%s"), CString (exception.get_message ().c_str ()));
+ }
+
+ catch (...)
+ {
+ CUtils::MessageBoxF(_T("Error saving eCos configuration"));
+ }
+
+ if(rc){
+ rc=false;
+ SetPathName (lpszPathName, FALSE); // called to ensure that MLTDir() will work in this function
+
+ // save the memory layout files to the build tree and copy to the install tree
+
+ if (bSaveAs || MemoryMap.map_modified ()) {
+ SaveMemoryMap();
+ } else {
+ TRACE(_T("Memory layout not modified\n"));
+ }
+
+ UpdateAllViews (NULL,AllSaved,0);
+
+ if(!m_strBuildTree.CreateDirectory() || !m_strInstallTree.CreateDirectory()){
+ CUtils::MessageBoxF(_T("Failed to save %s - %s"),lpszPathName,CUtils::GetLastErrorMessageString());
+ } else if(GenerateHeaders() && CopyMLTFiles()){ // in each case errors already emitted
+ // copy new MLT files to the build tree as necessary
+ rc=generate_build_tree (GetCdlConfig(), CUtils::UnicodeToStdStr(m_strBuildTree), CUtils::UnicodeToStdStr(m_strInstallTree));
+ }
+ }
+ }
+ if(rc){
+ SetModifiedFlag (false);
+ SetPathName (lpszPathName, TRUE); // add to MRU
+ } else {
+ SetPathName (strOldPath, FALSE);
+ }
+ return rc;
+}
+
+BOOL CConfigToolDoc::Reload()
+{
+ TRACE(_T("###ReOpen document - build tree=%s\n"),m_strBuildTree);
+ UpdateAllViews (NULL,AllSaved,0);
+ UpdateAllViews (NULL,ExternallyChanged,0);
+ UpdateFailingRuleCount();
+
+ return TRUE;
+}
+
+void CConfigToolDoc::OnConfigurationRepository()
+{
+ SaveModified ();
+ m_bRepositoryOpen=false;
+ if(OpenRepository(Repository(),true)){
+ // reset the document title as shown in the frame window
+ GetDocTemplate ()->SetDefaultTitle (this);
+
+ // load the memory layout for the default target-platform-startup from the new repository
+ NewMemoryLayout (CFileName (m_strPackagesDir, m_strMemoryLayoutFolder, _T("include\\pkgconf")));
+ UpdateAllViews(NULL);
+ UpdateFailingRuleCount();
+ } else {
+ m_bRepositoryOpen=true; // keep what we had
+ }
+
+}
+
+//////////////////////////////////////////////////////////////
+// MLT-specific member functions
+
+void CConfigToolDoc::OnUpdateEditDelete(CCmdUI* pCmdUI)
+{
+ // enable the 'delete' menu item and toolbar button only if there is a region or section selected
+
+ pCmdUI->Enable ((strSelectedRegion != _T("")) || (strSelectedSection != _T("")));
+}
+
+
+void CConfigToolDoc::OnUpdateEditNewSection(CCmdUI* pCmdUI)
+{
+ // enable the 'new section' menu item and toolbar button only if there is at least one memory region defined
+
+ pCmdUI->Enable (MemoryMap.region_list.size () > 0);
+}
+
+void CConfigToolDoc::OnUpdateEditProperties(CCmdUI* pCmdUI)
+{
+ // enable the 'properties' menu item and toolbar button if there is a memory region or section selected
+ pCmdUI->Enable ((strSelectedRegion != _T("")) || (strSelectedSection != _T("")));
+}
+
+void CConfigToolDoc::LoadProfileSettings()
+{
+ CConfigToolApp *pApp=(CConfigToolApp *)AfxGetApp();
+ m_eUseCustomBrowser=(BrowserType)pApp->GetProfileInt (_T("View"), _T("CustomBrowser"), Internal);
+ m_bHex= pApp->GetProfileInt (_T("Format"),_T("Hex"), 0);
+ m_bMacroNames= pApp->GetProfileInt (_T("Format"),_T("MacroNames"), 0);
+ m_nFindFlags= pApp->GetProfileInt (_T("Find"), _T("Flags"), FR_DOWN);
+ m_strFind= pApp->GetProfileString(_T("Find"), _T("String"));
+ m_nFindWhere=(WhereType)pApp->GetProfileInt (_T("Find"), _T("Where"),0);
+ m_bUseCustomViewer= pApp->GetProfileInt (_T("View"), _T("CustomViewer"), 0);
+ m_bAutoExpand= pApp->GetProfileInt (_T("View"), _T("Auto-expand"), 1);
+ m_nRuleChecking= pApp->GetProfileInt (_T("Rule"), _T("Checking"), Immediate|Deferred|SuggestFixes);
+
+ CRegKeyEx k(HKEY_CURRENT_USER,CUtils::LoadString(IDS_REPOSITORY_REGKEY), KEY_READ);
+
+ if(!k.QueryValue(CUtils::LoadString(IDS_REPOSITORY_REGVALUE), m_strRepository)){
+ CStringArray arstr;
+ switch(pApp->GetRepositoryRegistryClues(arstr,_T("eCos"))){
+ case 0:
+ break;
+ case 1:
+ default:
+ SetRepository(arstr[0]);
+ break;
+ }
+ }
+}
+
+void CConfigToolDoc::SaveProfileSettings()
+{
+ CConfigToolApp *pApp=(CConfigToolApp *)AfxGetApp();
+ pApp->WriteProfileInt (_T("Find"), _T("Where"),m_nFindWhere);
+ pApp->WriteProfileString(_T("View"), _T("Viewer"), m_strViewer);
+ pApp->WriteProfileInt (_T("View"), _T("CustomViewer"), m_bUseCustomViewer);
+ pApp->WriteProfileInt (_T("View"), _T("CustomBrowser"), m_eUseCustomBrowser);
+ pApp->WriteProfileInt (_T("View"), _T("Auto-expand"), m_bAutoExpand);
+
+ pApp->WriteProfileInt (_T("Format"), _T("Hex"), m_bHex);
+ pApp->WriteProfileInt (_T("Format"), _T("MacroNames"), m_bMacroNames);
+
+ pApp->WriteProfileInt (_T("Find"), _T("Flags"), m_nFindFlags);
+ pApp->WriteProfileString(_T("Find"), _T("String"), m_strFind);
+
+ pApp->WriteProfileInt (_T("Rule"), _T("Checking"), m_nRuleChecking);
+
+ CRegKeyEx k(HKEY_CURRENT_USER,CUtils::LoadString(IDS_REPOSITORY_REGKEY), KEY_WRITE);
+ k.SetValue(m_strRepository, CUtils::LoadString(IDS_REPOSITORY_REGVALUE));
+}
+
+void CConfigToolDoc::OnBuildTemplates ()
+{
+ CCdlTemplatesDialog dlg (FALSE);
+
+ if (IDOK == dlg.DoModal ()){
+ SelectHardware(dlg.GetSelectedHardware());
+ SelectTemplate(dlg.GetSelectedTemplate(), dlg.GetSelectedTemplateVersion());
+ }
+}
+
+void CConfigToolDoc::OnBuildPackages()
+{
+ SelectPackages ();
+}
+
+
+bool CConfigToolDoc::ShowURL(LPCTSTR pszURL)
+{
+ bool rc=true;
+
+ CString strURL(pszURL);
+ if(!QualifyDocURL(strURL)){
+ return false; // error message already output
+ }
+
+ CConfigToolApp*pApp=(CConfigToolApp*)AfxGetApp();
+
+ switch(m_eUseCustomBrowser){
+ case Internal:
+ rc=CConfigToolDoc::ShowHtmlHelp(strURL);
+ break;
+ case AssociatedExternal:
+ {
+ // A bit of a problem here: we can't execute the document, because this doesn't work with "file" schemes or
+ // with URL fragments (#...). So we'll launch the associated program and hope there aren't too many interesting
+ // flags specified with the association
+ CString strBrowser;
+ if(DefaultExternalBrowser().IsEmpty()){
+ CUtils::MessageBoxF(_T("Failed to to determine associated external browser to open %s"),strURL);
+ } else {
+ pApp->Launch(strURL,DefaultExternalBrowser());
+ }
+ }
+ break;
+ case CustomExternal:
+ pApp->Launch(strURL,m_strBrowser);
+ break;
+ default:
+ ASSERT(FALSE);
+ }
+ return rc;
+}
+
+const CString CConfigToolDoc::CurrentTargetPrefix()
+{
+ CConfigItem *pItem=Find(_T("CYGBLD_GLOBAL_COMMAND_PREFIX"));
+ return pItem?pItem->StringValue():_T("");
+}
+
+int CConfigToolDoc::GetCompilationCount(LPCTSTR psz)
+{
+ int rc=0;
+ CStringArray arstr;
+ const CString strPrefix(CurrentTargetPrefix());
+ for(int i=CUtils::Chop(psz,arstr,_T("\n"))-1;i>=0;--i){
+ if(-1!=arstr[i].Find(strPrefix)){
+ rc++;
+ }
+ }
+ return rc;
+}
+
+void CConfigToolDoc::RunTests()
+{
+ const CString strTarget(CurrentTestingIdentifier());
+ TRACE (_T("OnRunSim(): test target ID = '%s'\n"), strTarget);
+
+ if (NULL==CeCosTestPlatform::Get(strTarget)) {
+ if(IDNO==CUtils::MessageBoxFT(MB_YESNO,_T("%s is not a recognized platform - do you wish to add it?"),strTarget)){
+ return;
+ }
+ CPlatformDialog dlg;
+ dlg.m_strPlatform=strTarget;
+ dlg.m_strPrefix=CurrentTargetPrefix();
+ dlg.m_strCaption=_T("New Platform");
+ if(IDCANCEL==dlg.DoModal()){
+ return;
+ }
+ CeCosTestPlatform::Add(CeCosTestPlatform(dlg.m_strPlatform,dlg.m_strPrefix,dlg.m_strPrompt,dlg.m_strGDB,dlg.m_bServerSideGdb,dlg.m_strInferior));
+ CeCosTestPlatform::Save();
+ }
+
+ CFileNameArray ar;
+ CFileNameArray arTestsMissing;
+ int nTests=GetTestExeNames(ar,arTestsMissing);
+ CRunTestsSheet sheet(_T("Run Tests"), NULL, 0, 0);
+ sheet.SetTarget(strTarget);
+ const CeCosTestPlatform * etPlatform = CeCosTestPlatform::Get(strTarget);
+ ASSERT (NULL != etPlatform);
+ if (-1 != CString (etPlatform->GdbCmds ()).Find (_T("cyg_test_is_simulator"))) { // if a simulator target
+ sheet.SetResetNone(); // disable 'reset hardware' message box
+ }
+ sheet.HideRemoteControls();
+ if(arTestsMissing.GetSize()){
+ if(IDYES==CUtils::MessageBoxFT(MB_YESNO,_T("Not all tests are built. Do you wish to build them now?"))){
+ CConfigTool::GetMain()->SendMessage(WM_COMMAND,ID_BUILD_TESTS);
+ return;
+ }
+ }
+ if(CConfigTool::GetMain()->PrepareEnvironment()){
+ for(int i=0;i<nTests;i++){
+ sheet.Populate(ar[i],true);
+ }
+ for(i=0;i<arTestsMissing.GetSize();i++){
+ sheet.Populate(arTestsMissing[i],false);
+ }
+ sheet.DoModal();
+ }
+}
+
+void CConfigToolDoc::OnToolsAdministration()
+{
+ if(IDYES==CUtils::MessageBoxFT(MB_YESNO,_T("This command will close the current document.\n\nDo you wish to continue?"))){
+ // ensure that the user tools are on the path for use by ecosadmin.tcl
+ if(CConfigTool::GetMain()->PrepareEnvironment(/* bWithBuildTools = */ false)){
+ CConfigToolApp *pApp=(CConfigToolApp *)AfxGetApp();
+ CPkgAdminDlg dlg(PackagesDir(),pApp->m_strUserToolsDir); // make sure we use doc data before the doc is destroyed
+ CMainFrame *pMain=CConfigTool::GetMain();
+ if(IDOK==dlg.DoModal()){
+ pMain->PostMessage(WM_COMMAND,ID_FILE_NEW);
+ }
+ }
+ }
+}