| Index: common/extra_args_parser.cc
|
| diff --git a/common/extra_args_parser.cc b/common/extra_args_parser.cc
|
| deleted file mode 100644
|
| index f6658a557d6d975b390f8202eafe6f1c1c8d39ed..0000000000000000000000000000000000000000
|
| --- a/common/extra_args_parser.cc
|
| +++ /dev/null
|
| @@ -1,319 +0,0 @@
|
| -// Copyright 2008-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.
|
| -// ========================================================================
|
| -
|
| -#include "omaha/common/extra_args_parser.h"
|
| -#include "omaha/base/constants.h"
|
| -#include "omaha/base/debug.h"
|
| -#include "omaha/base/error.h"
|
| -#include "omaha/base/logging.h"
|
| -#include "omaha/base/string.h"
|
| -#include "omaha/base/utils.h"
|
| -#include "omaha/common/command_line.h"
|
| -#include "omaha/common/const_cmd_line.h"
|
| -#include "omaha/common/goopdate_utils.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -namespace {
|
| -
|
| -HRESULT ConvertUtf8UrlEncodedString(const CString& encoded_string,
|
| - CString* unencoded_string) {
|
| - CString trimmed_val = encoded_string;
|
| - trimmed_val.Trim();
|
| - if (trimmed_val.IsEmpty()) {
|
| - return E_INVALIDARG;
|
| - }
|
| -
|
| - // The value is a utf8 encoded url escaped string that is stored as a
|
| - // unicode string, convert it into a wide string.
|
| - CString app_name;
|
| - HRESULT hr = Utf8UrlEncodedStringToWideString(trimmed_val, unencoded_string);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -HRESULT Validate(const TCHAR* extra_args) {
|
| - CString extra_args_str(extra_args);
|
| - if (extra_args_str.IsEmpty()) {
|
| - return E_INVALIDARG;
|
| - }
|
| -
|
| - if (-1 != extra_args_str.FindOneOf(kDisallowedCharsInExtraArgs)) {
|
| - // A '/' was found in the "extra" arguments or "extra" arguments were
|
| - // not specified before the next command.
|
| - return E_INVALIDARG;
|
| - }
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -// Handles tokens from the app arguments string.
|
| -HRESULT HandleAppArgsToken(const CString& token,
|
| - CommandLineExtraArgs* args,
|
| - int* cur_app_args_index) {
|
| - ASSERT1(args);
|
| - ASSERT1(cur_app_args_index);
|
| - ASSERT1(*cur_app_args_index < static_cast<int>(args->apps.size()));
|
| -
|
| - CString name;
|
| - CString value;
|
| - if (!ParseNameValuePair(token, kNameValueSeparatorChar, &name, &value)) {
|
| - return E_INVALIDARG;
|
| - }
|
| -
|
| - if (name.CompareNoCase(kExtraArgAppGuid) == 0) {
|
| - *cur_app_args_index = -1;
|
| - for (size_t i = 0; i < args->apps.size(); ++i) {
|
| - if (!value.CompareNoCase(GuidToString(args->apps[i].app_guid))) {
|
| - *cur_app_args_index = i;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (-1 == *cur_app_args_index) {
|
| - return E_INVALIDARG;
|
| - }
|
| - } else if (name.CompareNoCase(kExtraArgInstallerData) == 0) {
|
| - if (-1 == *cur_app_args_index) {
|
| - return E_INVALIDARG;
|
| - }
|
| - args->apps[*cur_app_args_index].encoded_installer_data = value;
|
| - } else {
|
| - // Unrecognized token
|
| - return E_INVALIDARG;
|
| - }
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -HRESULT ParseAppArgs(const TCHAR* app_args, CommandLineExtraArgs* args) {
|
| - if (!app_args || !*app_args) {
|
| - return S_OK;
|
| - }
|
| -
|
| - HRESULT hr = Validate(app_args);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| -
|
| - int cur_app_args_index = -1;
|
| - int pos = 0;
|
| - CString input_str = app_args;
|
| - CString token = input_str.Tokenize(kExtraArgsSeparators, pos);
|
| - while (!token.IsEmpty()) {
|
| - hr = HandleAppArgsToken(token, args, &cur_app_args_index);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| -
|
| - token = input_str.Tokenize(kExtraArgsSeparators, pos);
|
| - }
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -HRESULT StringToNeedsAdmin(const TCHAR* str, NeedsAdmin* value) {
|
| - ASSERT1(str);
|
| - ASSERT1(value);
|
| -
|
| - const TCHAR* const kFalse = _T("false");
|
| - const TCHAR* const kTrue = _T("true");
|
| - const TCHAR* const kPrefers = _T("prefers");
|
| -
|
| - if (_tcsicmp(kFalse, str) == 0) {
|
| - *value = NEEDS_ADMIN_NO;
|
| - } else if (_tcsicmp(kTrue, str) == 0) {
|
| - *value = NEEDS_ADMIN_YES;
|
| - } else if (_tcsicmp(kPrefers, str) == 0) {
|
| - *value = NEEDS_ADMIN_PREFERS;
|
| - } else {
|
| - return E_INVALIDARG;
|
| - }
|
| - return S_OK;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// If no bundle name is specified, the first app's name is used.
|
| -// TODO(omaha): There is no enforcement of required or optional values of
|
| -// the extra arguments. Come up with a way to enforce this.
|
| -// TODO(omaha): If we prefix extra_args with '/' and replace all '=' with ' '
|
| -// and all & with '/' then we should be able to use the CommandLineParser
|
| -// class to pull out the values here. We'd need to define scenarios for all
|
| -// permutations of ExtraArgs, but this shouldn't be difficult to get the right
|
| -// ones.
|
| -
|
| -HRESULT ExtraArgsParser::Parse(const TCHAR* extra_args,
|
| - const TCHAR* app_args,
|
| - CommandLineExtraArgs* args) {
|
| - HRESULT hr = ParseExtraArgs(extra_args, args);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| -
|
| - return ParseAppArgs(app_args, args);
|
| -}
|
| -
|
| -HRESULT ExtraArgsParser::ParseExtraArgs(const TCHAR* extra_args,
|
| - CommandLineExtraArgs* args) {
|
| - HRESULT hr = Validate(extra_args);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| -
|
| - first_app_ = true;
|
| - int pos = 0;
|
| - CString input_str(extra_args);
|
| - CString token = input_str.Tokenize(kExtraArgsSeparators, pos);
|
| - while (!token.IsEmpty()) {
|
| - CORE_LOG(L2, (_T("[ExtraArgsParser::Parse][token=%s]"), token));
|
| - hr = HandleToken(token, args);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| -
|
| - // Continue parsing
|
| - token = input_str.Tokenize(kExtraArgsSeparators, pos);
|
| - }
|
| -
|
| - // Save the arguments for the last application.
|
| - args->apps.push_back(cur_extra_app_args_);
|
| -
|
| - ASSERT1(!(args->runtime_only && args->apps[0].app_guid != GUID_NULL));
|
| -
|
| - if (args->bundle_name.IsEmpty()) {
|
| - ASSERT1(!args->apps.empty());
|
| - args->bundle_name = args->apps[0].app_name;
|
| - }
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -// Handles tokens from the extra arguments string.
|
| -HRESULT ExtraArgsParser::HandleToken(const CString& token,
|
| - CommandLineExtraArgs* args) {
|
| - CString name;
|
| - CString value;
|
| - if (!ParseNameValuePair(token, kNameValueSeparatorChar, &name, &value)) {
|
| - return E_INVALIDARG;
|
| - }
|
| -
|
| - // The first set of args apply to all apps. They may occur at any point, but
|
| - // only the last occurrence is recorded.
|
| - if (name.CompareNoCase(kExtraArgBundleName) == 0) {
|
| - if (value.GetLength() > kMaxNameLength) {
|
| - return E_INVALIDARG;
|
| - }
|
| - HRESULT hr = ConvertUtf8UrlEncodedString(value,
|
| - &args->bundle_name);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| - } else if (name.CompareNoCase(kExtraArgInstallationId) == 0) {
|
| - ASSERT1(!value.IsEmpty());
|
| - if (FAILED(StringToGuidSafe(value, &args->installation_id))) {
|
| - return E_INVALIDARG;
|
| - }
|
| - } else if (name.CompareNoCase(kExtraArgBrandCode) == 0) {
|
| - if (value.GetLength() > kBrandIdLength) {
|
| - return E_INVALIDARG;
|
| - }
|
| - args->brand_code = value;
|
| - } else if (name.CompareNoCase(kExtraArgClientId) == 0) {
|
| - args->client_id = value;
|
| - } else if (name.CompareNoCase(kExtraArgOmahaExperimentLabels) == 0) {
|
| - HRESULT hr = ConvertUtf8UrlEncodedString(value,
|
| - &args->experiment_labels);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| - } else if (name.CompareNoCase(kExtraArgReferralId) == 0) {
|
| - args->referral_id = value;
|
| - } else if (name.CompareNoCase(kExtraArgBrowserType) == 0) {
|
| - BrowserType type = BROWSER_UNKNOWN;
|
| - if (SUCCEEDED(goopdate_utils::ConvertStringToBrowserType(value, &type))) {
|
| - args->browser_type = type;
|
| - }
|
| - } else if (name.CompareNoCase(kExtraArgLanguage) == 0) {
|
| - if (value.GetLength() > kLangMaxLength) {
|
| - return E_INVALIDARG;
|
| - }
|
| - // Even if we don't support the language, we want to pass it to the
|
| - // installer. Omaha will pick its language later. See http://b/1336966.
|
| - args->language = value;
|
| - } else if (name.CompareNoCase(kExtraArgUsageStats) == 0) {
|
| - if (!String_StringToTristate(value, &args->usage_stats_enable)) {
|
| - return E_INVALIDARG;
|
| - }
|
| - } else if (name.CompareNoCase(kExtraArgRuntime) == 0) {
|
| - if (!args->apps.empty() || cur_extra_app_args_.app_guid != GUID_NULL) {
|
| - return E_INVALIDARG;
|
| - }
|
| - args->runtime_only = true;
|
| -
|
| - // The following args are per-app.
|
| - } else if (name.CompareNoCase(kExtraArgAdditionalParameters) == 0) {
|
| - cur_extra_app_args_.ap = value;
|
| - } else if (name.CompareNoCase(kExtraArgTTToken) == 0) {
|
| - cur_extra_app_args_.tt_token = value;
|
| - } else if (name.CompareNoCase(kExtraArgExperimentLabels) == 0) {
|
| - HRESULT hr = ConvertUtf8UrlEncodedString(
|
| - value,
|
| - &cur_extra_app_args_.experiment_labels);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| - } else if (name.CompareNoCase(kExtraArgAppGuid) == 0) {
|
| - if (!first_app_) {
|
| - // Save the arguments for the application we have been processing.
|
| - args->apps.push_back(cur_extra_app_args_);
|
| - }
|
| - cur_extra_app_args_ = CommandLineAppArgs();
|
| -
|
| - HRESULT hr = StringToGuidSafe(value, &cur_extra_app_args_.app_guid);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| - if (cur_extra_app_args_.app_guid == GUID_NULL || args->runtime_only) {
|
| - return E_INVALIDARG;
|
| - }
|
| - first_app_ = false;
|
| - } else if (name.CompareNoCase(kExtraArgAppName) == 0) {
|
| - if (value.GetLength() > kMaxNameLength) {
|
| - return E_INVALIDARG;
|
| - }
|
| - HRESULT hr = ConvertUtf8UrlEncodedString(value,
|
| - &cur_extra_app_args_.app_name);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| - } else if (name.CompareNoCase(kExtraArgNeedsAdmin) == 0) {
|
| - if (FAILED(StringToNeedsAdmin(value, &cur_extra_app_args_.needs_admin))) {
|
| - return E_INVALIDARG;
|
| - }
|
| - } else if (name.CompareNoCase(kExtraArgInstallDataIndex) == 0) {
|
| - cur_extra_app_args_.install_data_index = value;
|
| - } else {
|
| - // Unrecognized token
|
| - return E_INVALIDARG;
|
| - }
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -} // namespace omaha
|
|
|