RemoveComponentCommand.cc Source File

Back to the index.

RemoveComponentCommand.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008-2010 Anders Gavare. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * 3. The name of the author may not be used to endorse or promote products
13  * derived from this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  */
27 
29 #include "GXemul.h"
30 
31 
33  : Command("remove", "path")
34 {
35 }
36 
37 
39 {
40 }
41 
42 
43 static void ShowMsg(GXemul& gxemul, const string& msg)
44 {
45  gxemul.GetUI()->ShowDebugMessage(msg);
46 }
47 
48 
49 bool RemoveComponentCommand::Execute(GXemul& gxemul, const vector<string>& arguments)
50 {
51  if (arguments.size() < 1) {
52  ShowMsg(gxemul, "No path given.\n");
53  return false;
54  }
55 
56  if (arguments.size() > 1) {
57  ShowMsg(gxemul, "Too many arguments.\n");
58  return false;
59  }
60 
61  string path = arguments[0];
62 
63  vector<string> matches = gxemul.GetRootComponent()->
64  FindPathByPartialMatch(path);
65  if (matches.size() == 0) {
66  ShowMsg(gxemul, path+" is not a path to a known component.\n");
67  return false;
68  }
69  if (matches.size() > 1) {
70  ShowMsg(gxemul, path+" matches multiple components:\n");
71  for (size_t i=0; i<matches.size(); i++)
72  ShowMsg(gxemul, " " + matches[i] + "\n");
73  return false;
74  }
75 
76  refcount_ptr<Component> whatToRemove =
77  gxemul.GetRootComponent()->LookupPath(matches[0]);
78  if (whatToRemove.IsNULL()) {
79  ShowMsg(gxemul, "Lookup of " + path + " failed.\n");
80  return false;
81  }
82 
83  refcount_ptr<Component> parent = whatToRemove->GetParent();
84  if (parent.IsNULL()) {
85  ShowMsg(gxemul, "Cannot remove the root component.\n");
86  return false;
87  }
88 
89  parent->RemoveChild(whatToRemove);
90 
91  return true;
92 }
93 
94 
96 {
97  return "Removes a component from the emulation.";
98 }
99 
100 
102 {
103  return
104  "Removes a component (given a path) from the current emulation setup.\n"
105  "The following example shows how to remove cpu1 from a particular machine:\n"
106  "\n"
107  "> root\n"
108  " root\n"
109  " \\-- machine0 [testmips]\n"
110  " \\-- mainbus0\n"
111  " |-- ram0 (32 MB at offset 0)\n"
112  " |-- rom0 (16 MB at offset 0x1fc00000)\n"
113  " |-- cpu0 (MIPS, 100 MHz)\n"
114  " \\-- cpu1 (MIPS, 100 MHz)\n"
115  "> remove cpu1 \n"
116  "> root\n"
117  " root\n"
118  " \\-- machine0 [testmips]\n"
119  " \\-- mainbus0\n"
120  " |-- ram0 (32 MB at offset 0)\n"
121  " |-- rom0 (16 MB at offset 0x1fc00000)\n"
122  " \\-- cpu0 (MIPS, 100 MHz)\n"
123  "\n"
124  "See also: add (to add new components)\n"
125  " root (to inspect the current emulation setup)\n";
126 }
127 
RemoveComponentCommand::RemoveComponentCommand
RemoveComponentCommand()
Constructs a RemoveComponentCommand.
Definition: RemoveComponentCommand.cc:32
refcount_ptr::IsNULL
bool IsNULL() const
Checks whether or not an object is referenced by the reference counted pointer.
Definition: refcount_ptr.h:216
GXemul
The main emulator class.
Definition: GXemul.h:54
RemoveComponentCommand::GetLongDescription
virtual string GetLongDescription() const
Returns a long description/help message for the command.
Definition: RemoveComponentCommand.cc:101
refcount_ptr< Component >
Command
A Command is a named function, executed by the CommandInterpreter.
Definition: Command.h:48
Component::RemoveChild
size_t RemoveChild(Component *childToRemove)
Removes a reference to a child component.
Definition: Component.cc:655
GXemul::GetRootComponent
refcount_ptr< Component > GetRootComponent()
Gets a pointer to the root configuration component.
Definition: GXemul.cc:667
RemoveComponentCommand::Execute
virtual bool Execute(GXemul &gxemul, const vector< string > &arguments)
Executes the command on a given GXemul instance.
Definition: RemoveComponentCommand.cc:49
UI::ShowDebugMessage
virtual void ShowDebugMessage(const string &msg)=0
Shows a debug message.
RemoveComponentCommand::~RemoveComponentCommand
virtual ~RemoveComponentCommand()
Definition: RemoveComponentCommand.cc:38
Component::LookupPath
const refcount_ptr< Component > LookupPath(string path) const
Looks up a path from this Component, and returns a pointer to the found Component,...
Definition: Component.cc:778
Component::GetParent
Component * GetParent()
Gets this component's parent component, if any.
Definition: Component.cc:381
GXemul::GetUI
UI * GetUI()
Gets a pointer to the GXemul instance' active UI.
Definition: GXemul.cc:661
RemoveComponentCommand.h
GXemul.h
RemoveComponentCommand::GetShortDescription
virtual string GetShortDescription() const
Returns a short (one-line) description of the command.
Definition: RemoveComponentCommand.cc:95

Generated on Tue Mar 24 2020 14:04:48 for GXemul by doxygen 1.8.17