blob: c2a857bd70784a5e8df0ef886661507d3fd43b87 [file] [log] [blame]
// Copyright 2005-2009 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================
//
// Parse command-line options
//
// Class CommandParsing supports two kinds of command line options:
// 1) Traditional option, like "-b -v 100"
// 2) Name-value-pairs, like "b=&v=100"
#ifndef OMAHA_COMMON_COMMANDS_H_
#define OMAHA_COMMON_COMMANDS_H_
#include <atlstr.h>
#include <vector>
#include "base/basictypes.h"
namespace omaha {
enum ThreeValue {
VALUE_NOT_SET = 0,
TRUE_VALUE = 1,
FALSE_VALUE = 2
};
enum CommandOptionType {
COMMAND_OPTION_BOOL = 0x1,
COMMAND_OPTION_INT = 0x2,
COMMAND_OPTION_UINT = 0x3,
COMMAND_OPTION_STRING = 0x4,
COMMAND_OPTION_THREE = 0x5,
COMMAND_OPTION_UNESCAPE = 0x1000,
COMMAND_OPTION_MULTIPLE = 0x2000
};
#define COMMAND_OPTION_FLAGS_MASK 0x0FFF
struct CommandOption {
void Init(const TCHAR* name, CommandOptionType type,
void* value, int max_value_len);
void Copy(const CommandOption& option);
CString name;
CommandOptionType type;
void* value;
int max_value_len;
};
class CommandParsingSimple {
public:
// Static Helper function that splits a command line
// string into executable and any arguments
static HRESULT SplitExeAndArgs(const TCHAR* cmd_line,
CString* exe,
CString* args);
// Static Helper function that splits a command line
// string into executable and any arguments. Tries to
// guess the positioning of the EXE argument in cases
// where the EXE argument has spaces and is not enclosed
// in quotes. For instance, earlier versions of Google Desktop
// used to have an "Uninstall" string of the form:
// C:\Program Files\Google\Google Toolbar\GoogleToolbarSetup.exe -uninstall
// This function is meant to accomodate such cases.
static HRESULT SplitExeAndArgsGuess(const TCHAR* cmd_line,
CString* exe,
CString* args);
// Static Helper function that returns the number of arguments
// in the passed in cmd_line
static HRESULT GetNumberOfArgs(const TCHAR* cmd_line, uint32* number_of_args);
// Converted to a string
HRESULT ToString(CString* cmd_line);
protected:
// Constructor
CommandParsingSimple();
// Constructor
explicit CommandParsingSimple(TCHAR separator);
// Parse a command line string into args
HRESULT ParseSimple(const TCHAR* cmd_line);
// Get the arg at specified position from the command line
HRESULT GetAt(uint32 position, CString* arg);
// Remove the arg at specified position from the command line
HRESULT RemoveAt(uint32 position);
TCHAR separator_; // Separator
std::vector<CString> args_; // Splitted args
private:
DISALLOW_EVIL_CONSTRUCTORS(CommandParsingSimple);
};
class CommandParsing : public CommandParsingSimple {
public:
// Constructor
CommandParsing(CommandOption* options, int options_count);
CommandParsing(CommandOption* options, int options_count,
TCHAR separator, bool as_name_value_pair);
// Parse a command line string
HRESULT Parse(const TCHAR* cmd_line, bool ignore_unknown_args);
// Parse a list of command line arguments
HRESULT ParseArguments(int argc, TCHAR* argv[]);
// Remove an option from the command line
HRESULT Remove(const TCHAR* option_name);
private:
// Internal parsing
HRESULT InternalParse(bool ignore_unknown_args);
// Extract the name
HRESULT ExtractName(CString* name, std::vector<CString>::const_iterator* it);
// Extract the value
// Also validate the value length if necessary
HRESULT ExtractValue(const CommandOption& option,
CString* value,
std::vector<CString>::const_iterator* it,
const std::vector<CString>::const_iterator& end);
// Set the parsed value
template<class T>
static void SetParsedValue(const CommandOption& option, const T& value);
// Helper function to find an option in the CommandOption list
int FindOption(const TCHAR* option_name);
CommandOption* options_; // Command-line option list
int options_count_; // Count of command-line options
bool as_name_value_pair_; // Parse as name-value-pair
DISALLOW_EVIL_CONSTRUCTORS(CommandParsing);
};
} // namespace omaha
#endif // OMAHA_COMMON_COMMANDS_H_