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