// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/common/child_process_logging.h" #import #include "base/string_util.h" #include "chrome/installer/util/google_update_settings.h" #include "googleurl/src/gurl.h" namespace child_process_logging { const int kMaxNumCrashURLChunks = 8; const int kMaxNumURLChunkValueLength = 255; const char *kUrlChunkFormatStr = "url-chunk-%d"; const char *kGuidParamName = "guid"; static SetCrashKeyValueFuncPtr g_set_key_func; static ClearCrashKeyValueFuncPtr g_clear_key_func; void SetCrashKeyFunctions(SetCrashKeyValueFuncPtr set_key_func, ClearCrashKeyValueFuncPtr clear_key_func) { g_set_key_func = set_key_func; g_clear_key_func = clear_key_func; } void SetActiveURLImpl(const GURL& url, SetCrashKeyValueFuncPtr set_key_func, ClearCrashKeyValueFuncPtr clear_key_func) { NSString *kUrlChunkFormatStr_utf8 = [NSString stringWithUTF8String:kUrlChunkFormatStr]; // First remove any old url chunks we might have lying around. for (int i = 0; i < kMaxNumCrashURLChunks; i++) { // On Windows the url-chunk items are 1-based, so match that. NSString *key = [NSString stringWithFormat:kUrlChunkFormatStr_utf8, i+1]; clear_key_func(key); } const std::string& raw_url_utf8 = url.possibly_invalid_spec(); NSString *raw_url = [NSString stringWithUTF8String:raw_url_utf8.c_str()]; size_t raw_url_length = [raw_url length]; // Bail on zero-length URLs. if (raw_url_length == 0) { return; } // Parcel the URL up into up to 8, 255 byte segments. size_t start_ofs = 0; for (int i = 0; i < kMaxNumCrashURLChunks && start_ofs < raw_url_length; ++i) { // On Windows the url-chunk items are 1-based, so match that. NSString *key = [NSString stringWithFormat:kUrlChunkFormatStr_utf8, i+1]; NSRange range; range.location = start_ofs; range.length = std::min((size_t)kMaxNumURLChunkValueLength, raw_url_length - start_ofs); NSString *value = [raw_url substringWithRange:range]; set_key_func(key, value); // Next chunk. start_ofs += kMaxNumURLChunkValueLength; } } void SetClientIdImpl(const std::string& client_id, SetCrashKeyValueFuncPtr set_key_func) { NSString *key = [NSString stringWithUTF8String:kGuidParamName]; NSString *value = [NSString stringWithUTF8String:client_id.c_str()]; set_key_func(key, value); } void SetActiveURL(const GURL& url) { if (g_set_key_func && g_clear_key_func) SetActiveURLImpl(url, g_set_key_func, g_clear_key_func); } void SetClientId(const std::string& client_id) { std::string str(client_id); ReplaceSubstringsAfterOffset(&str, 0, "-", ""); if (g_set_key_func) SetClientIdImpl(str, g_set_key_func); std::wstring wstr = ASCIIToWide(str); GoogleUpdateSettings::SetMetricsId(wstr); } void SetActiveExtensions(const std::set& extension_ids) { // TODO(port) } } // namespace child_process_logging