1 ///////////////////////////////////////////////////////////////////////////////
2 // BOSSA
3 //
4 // Copyright (c) 2011-2018, ShumaTech
5 // All rights reserved.
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions are met:
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above copyright
12 // notice, this list of conditions and the following disclaimer in the
13 // documentation and/or other materials provided with the distribution.
14 // * Neither the name of the <organization> nor the
15 // names of its contributors may be used to endorse or promote products
16 // derived from this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 ///////////////////////////////////////////////////////////////////////////////
29 #include <stdio.h>
30 #include <exception>
31
32 #include "Shell.h"
33 #include "Command.h"
34
35 using namespace std;
36
Shell()37 Shell::Shell() :
38 _exitFlag(false)
39 {
40 Command::setShell(this);
41
42 add(new CommandBod);
43 add(new CommandBootf);
44 add(new CommandBor);
45 add(new CommandConnect);
46 add(new CommandDebug);
47 add(new CommandDump);
48 add(new CommandErase);
49 add(new CommandExit);
50 add(new CommandGo);
51 add(new CommandHelp);
52 add(new CommandHistory);
53 add(new CommandLock);
54 add(new CommandInfo);
55 add(new CommandMrb);
56 add(new CommandMrf);
57 add(new CommandMrw);
58 add(new CommandMwb);
59 add(new CommandMwf);
60 add(new CommandMww);
61 add(new CommandPio);
62 add(new CommandRead);
63 add(new CommandSecurity);
64 add(new CommandVerify);
65 add(new CommandWrite);
66 add(new CommandReset);
67 add(new CommandOptions);
68
69 _commandList.sort();
70 }
71
~Shell()72 Shell::~Shell()
73 {
74 CommandList::iterator it;
75
76 for (it = _commandList.begin();
77 it != _commandList.end();
78 it++)
79 {
80 delete *it;
81 }
82 }
83
84 Command*
find(const char * name)85 Shell::find(const char* name)
86 {
87 CommandList::iterator it;
88 int len;
89 Command *command = NULL;
90
91 len = strlen(name);
92 for (it = _commandList.begin();
93 it != _commandList.end();
94 it++)
95 {
96 if (strncmp((*it)->name(), name, len) == 0)
97 {
98 if (command)
99 {
100 printf("Ambiguous command: \"%s\". Try \"help\".\n", name);
101 return NULL;
102 }
103 command = *it;
104 }
105 }
106
107 if (!command)
108 {
109 printf("Undefined command: \"%s\". Try \"help\".\n", name);
110 return NULL;
111 }
112
113 return command;
114 }
115
116 void
invoke(char * argv[],int argc)117 Shell::invoke(char* argv[], int argc)
118 {
119 Command* command;
120
121 command = find(argv[0]);
122 if (!command)
123 return;
124
125 try
126 {
127 command->invoke(argv, argc);
128 }
129 catch (SambaError& e)
130 {
131 printf("\n%s.\nPort is disconnected.\n", e.what());
132 Command::disconnect();
133 }
134 catch (exception& e)
135 {
136 printf("\n%s.\n", e.what());
137 }
138 }
139
140 void
help()141 Shell::help()
142 {
143 CommandList::iterator it;
144
145 for (it = _commandList.begin();
146 it != _commandList.end();
147 it++)
148 {
149 printf("%s -- %s\n", (*it)->name(), (*it)->help());
150 }
151 }
152
153 void
usage(const char * name)154 Shell::usage(const char* name)
155 {
156 Command* command;
157
158 command = find(name);
159 if (!command)
160 return;
161
162 printf("%s\n", command->help());
163 printf("Usage: %s\n", command->usage());
164 }
165
166 void
add(Command * command)167 Shell::add(Command* command)
168 {
169 _commandList.push_back(command);
170 }
171