| Index: rlz/lib/financial_ping.cc
|
| diff --git a/rlz/lib/financial_ping.cc b/rlz/lib/financial_ping.cc
|
| deleted file mode 100644
|
| index aad3db33b8ca0b6ff104abc00b8c9171231b7bad..0000000000000000000000000000000000000000
|
| --- a/rlz/lib/financial_ping.cc
|
| +++ /dev/null
|
| @@ -1,354 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -//
|
| -// Library functions related to the Financial Server ping.
|
| -
|
| -#include "rlz/lib/financial_ping.h"
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/string_util.h"
|
| -#include "base/stringprintf.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "rlz/lib/assert.h"
|
| -#include "rlz/lib/lib_values.h"
|
| -#include "rlz/lib/machine_id.h"
|
| -#include "rlz/lib/rlz_lib.h"
|
| -#include "rlz/lib/rlz_value_store.h"
|
| -#include "rlz/lib/string_utils.h"
|
| -
|
| -#if !defined(OS_WIN)
|
| -#include "base/time.h"
|
| -#endif
|
| -
|
| -#if defined(RLZ_NETWORK_IMPLEMENTATION_WIN_INET)
|
| -
|
| -#include <windows.h>
|
| -#include <wininet.h>
|
| -
|
| -namespace {
|
| -
|
| -class InternetHandle {
|
| - public:
|
| - InternetHandle(HINTERNET handle) { handle_ = handle; }
|
| - ~InternetHandle() { if (handle_) InternetCloseHandle(handle_); }
|
| - operator HINTERNET() const { return handle_; }
|
| - bool operator!() const { return (handle_ == NULL); }
|
| -
|
| - private:
|
| - HINTERNET handle_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -#else
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/time.h"
|
| -#include "googleurl/src/gurl.h"
|
| -#include "net/base/load_flags.h"
|
| -#include "net/url_request/url_fetcher.h"
|
| -#include "net/url_request/url_fetcher_delegate.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| -
|
| -#endif
|
| -
|
| -namespace {
|
| -
|
| -// Returns the time relative to a fixed point in the past in multiples of
|
| -// 100 ns stepts. The point in the past is arbitrary but can't change, as the
|
| -// result of this value is stored on disk.
|
| -int64 GetSystemTimeAsInt64() {
|
| -#if defined(OS_WIN)
|
| - FILETIME now_as_file_time;
|
| - // Relative to Jan 1, 1601 (UTC).
|
| - GetSystemTimeAsFileTime(&now_as_file_time);
|
| -
|
| - LARGE_INTEGER integer;
|
| - integer.HighPart = now_as_file_time.dwHighDateTime;
|
| - integer.LowPart = now_as_file_time.dwLowDateTime;
|
| - return integer.QuadPart;
|
| -#else
|
| - // Seconds since epoch (Jan 1, 1970).
|
| - double now_seconds = base::Time::Now().ToDoubleT();
|
| - return static_cast<int64>(now_seconds * 1000 * 1000 * 10);
|
| -#endif
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -
|
| -namespace rlz_lib {
|
| -
|
| -bool FinancialPing::FormRequest(Product product,
|
| - const AccessPoint* access_points, const char* product_signature,
|
| - const char* product_brand, const char* product_id,
|
| - const char* product_lang, bool exclude_machine_id,
|
| - std::string* request) {
|
| - if (!request) {
|
| - ASSERT_STRING("FinancialPing::FormRequest: request is NULL");
|
| - return false;
|
| - }
|
| -
|
| - request->clear();
|
| -
|
| - ScopedRlzValueStoreLock lock;
|
| - RlzValueStore* store = lock.GetStore();
|
| - if (!store || !store->HasAccess(RlzValueStore::kReadAccess))
|
| - return false;
|
| -
|
| - if (!access_points) {
|
| - ASSERT_STRING("FinancialPing::FormRequest: access_points is NULL");
|
| - return false;
|
| - }
|
| -
|
| - if (!product_signature) {
|
| - ASSERT_STRING("FinancialPing::FormRequest: product_signature is NULL");
|
| - return false;
|
| - }
|
| -
|
| - if (!SupplementaryBranding::GetBrand().empty()) {
|
| - if (SupplementaryBranding::GetBrand() != product_brand) {
|
| - ASSERT_STRING("FinancialPing::FormRequest: supplementary branding bad");
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - base::StringAppendF(request, "%s?", kFinancialPingPath);
|
| -
|
| - // Add the signature, brand, product id and language.
|
| - base::StringAppendF(request, "%s=%s", kProductSignatureCgiVariable,
|
| - product_signature);
|
| - if (product_brand)
|
| - base::StringAppendF(request, "&%s=%s", kProductBrandCgiVariable,
|
| - product_brand);
|
| -
|
| - if (product_id)
|
| - base::StringAppendF(request, "&%s=%s", kProductIdCgiVariable, product_id);
|
| -
|
| - if (product_lang)
|
| - base::StringAppendF(request, "&%s=%s", kProductLanguageCgiVariable,
|
| - product_lang);
|
| -
|
| - // Add the product events.
|
| - char cgi[kMaxCgiLength + 1];
|
| - cgi[0] = 0;
|
| - bool has_events = GetProductEventsAsCgi(product, cgi, arraysize(cgi));
|
| - if (has_events)
|
| - base::StringAppendF(request, "&%s", cgi);
|
| -
|
| - // If we don't have any events, we should ping all the AP's on the system
|
| - // that we know about and have a current RLZ value, even if they are not
|
| - // used by this product.
|
| - AccessPoint all_points[LAST_ACCESS_POINT];
|
| - if (!has_events) {
|
| - char rlz[kMaxRlzLength + 1];
|
| - int idx = 0;
|
| - for (int ap = NO_ACCESS_POINT + 1; ap < LAST_ACCESS_POINT; ap++) {
|
| - rlz[0] = 0;
|
| - AccessPoint point = static_cast<AccessPoint>(ap);
|
| - if (GetAccessPointRlz(point, rlz, arraysize(rlz)) &&
|
| - rlz[0] != '\0')
|
| - all_points[idx++] = point;
|
| - }
|
| - all_points[idx] = NO_ACCESS_POINT;
|
| - }
|
| -
|
| - // Add the RLZ's and the DCC if needed. This is the same as get PingParams.
|
| - // This will also include the RLZ Exchange Protocol CGI Argument.
|
| - cgi[0] = 0;
|
| - if (GetPingParams(product, has_events ? access_points : all_points,
|
| - cgi, arraysize(cgi)))
|
| - base::StringAppendF(request, "&%s", cgi);
|
| -
|
| - if (has_events && !exclude_machine_id) {
|
| - std::string machine_id;
|
| - if (GetMachineId(&machine_id)) {
|
| - base::StringAppendF(request, "&%s=%s", kMachineIdCgiVariable,
|
| - machine_id.c_str());
|
| - }
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -#if defined(RLZ_NETWORK_IMPLEMENTATION_CHROME_NET)
|
| -// The URLRequestContextGetter used by FinancialPing::PingServer().
|
| -net::URLRequestContextGetter* g_context;
|
| -
|
| -bool FinancialPing::SetURLRequestContext(
|
| - net::URLRequestContextGetter* context) {
|
| - ScopedRlzValueStoreLock lock;
|
| - RlzValueStore* store = lock.GetStore();
|
| - if (!store)
|
| - return false;
|
| -
|
| - g_context = context;
|
| - return true;
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -class FinancialPingUrlFetcherDelegate : public net::URLFetcherDelegate {
|
| - public:
|
| - FinancialPingUrlFetcherDelegate(MessageLoop* loop) : loop_(loop) { }
|
| - virtual void OnURLFetchComplete(const net::URLFetcher* source);
|
| - private:
|
| - MessageLoop* loop_;
|
| -};
|
| -
|
| -void FinancialPingUrlFetcherDelegate::OnURLFetchComplete(
|
| - const net::URLFetcher* source) {
|
| - loop_->Quit();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -#endif
|
| -
|
| -bool FinancialPing::PingServer(const char* request, std::string* response) {
|
| - if (!response)
|
| - return false;
|
| -
|
| - response->clear();
|
| -
|
| -#if defined(RLZ_NETWORK_IMPLEMENTATION_WIN_INET)
|
| - // Initialize WinInet.
|
| - InternetHandle inet_handle = InternetOpenA(kFinancialPingUserAgent,
|
| - INTERNET_OPEN_TYPE_PRECONFIG,
|
| - NULL, NULL, 0);
|
| - if (!inet_handle)
|
| - return false;
|
| -
|
| - // Open network connection.
|
| - InternetHandle connection_handle = InternetConnectA(inet_handle,
|
| - kFinancialServer, kFinancialPort, "", "", INTERNET_SERVICE_HTTP,
|
| - INTERNET_FLAG_NO_CACHE_WRITE, 0);
|
| - if (!connection_handle)
|
| - return false;
|
| -
|
| - // Prepare the HTTP request.
|
| - InternetHandle http_handle = HttpOpenRequestA(connection_handle,
|
| - "GET", request, NULL, NULL, kFinancialPingResponseObjects,
|
| - INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES, NULL);
|
| - if (!http_handle)
|
| - return false;
|
| -
|
| - // Timeouts are probably:
|
| - // INTERNET_OPTION_SEND_TIMEOUT, INTERNET_OPTION_RECEIVE_TIMEOUT
|
| -
|
| - // Send the HTTP request. Note: Fails if user is working in off-line mode.
|
| - if (!HttpSendRequest(http_handle, NULL, 0, NULL, 0))
|
| - return false;
|
| -
|
| - // Check the response status.
|
| - DWORD status;
|
| - DWORD status_size = sizeof(status);
|
| - if (!HttpQueryInfo(http_handle, HTTP_QUERY_STATUS_CODE |
|
| - HTTP_QUERY_FLAG_NUMBER, &status, &status_size, NULL) ||
|
| - 200 != status)
|
| - return false;
|
| -
|
| - // Get the response text.
|
| - scoped_array<char> buffer(new char[kMaxPingResponseLength]);
|
| - if (buffer.get() == NULL)
|
| - return false;
|
| -
|
| - DWORD bytes_read = 0;
|
| - while (InternetReadFile(http_handle, buffer.get(), kMaxPingResponseLength,
|
| - &bytes_read) && bytes_read > 0) {
|
| - response->append(buffer.get(), bytes_read);
|
| - bytes_read = 0;
|
| - };
|
| -
|
| - return true;
|
| -#else
|
| - // Run a blocking event loop to match the win inet implementation.
|
| - MessageLoop loop;
|
| - FinancialPingUrlFetcherDelegate delegate(&loop);
|
| -
|
| - std::string url = base::StringPrintf("http://%s:%d%s",
|
| - kFinancialServer, kFinancialPort,
|
| - request);
|
| -
|
| - scoped_ptr<net::URLFetcher> fetcher(net::URLFetcher::Create(
|
| - GURL(url), net::URLFetcher::GET, &delegate));
|
| -
|
| - fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE |
|
| - net::LOAD_DO_NOT_SEND_AUTH_DATA |
|
| - net::LOAD_DO_NOT_PROMPT_FOR_LOGIN |
|
| - net::LOAD_DO_NOT_SEND_COOKIES |
|
| - net::LOAD_DO_NOT_SAVE_COOKIES);
|
| -
|
| - // Ensure rlz_lib::SetURLRequestContext() has been called before sending
|
| - // pings.
|
| - CHECK(g_context);
|
| - fetcher->SetRequestContext(g_context);
|
| -
|
| - const base::TimeDelta kTimeout = base::TimeDelta::FromMinutes(5);
|
| - loop.PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&net::URLFetcher::Start, base::Unretained(fetcher.get())));
|
| - loop.PostNonNestableDelayedTask(
|
| - FROM_HERE, MessageLoop::QuitClosure(), kTimeout);
|
| -
|
| - loop.Run();
|
| -
|
| - if (fetcher->GetResponseCode() != 200)
|
| - return false;
|
| -
|
| - return fetcher->GetResponseAsString(response);
|
| -#endif
|
| -}
|
| -
|
| -bool FinancialPing::IsPingTime(Product product, bool no_delay) {
|
| - ScopedRlzValueStoreLock lock;
|
| - RlzValueStore* store = lock.GetStore();
|
| - if (!store || !store->HasAccess(RlzValueStore::kReadAccess))
|
| - return false;
|
| -
|
| - int64 last_ping = 0;
|
| - if (!store->ReadPingTime(product, &last_ping))
|
| - return true;
|
| -
|
| - uint64 now = GetSystemTimeAsInt64();
|
| - int64 interval = now - last_ping;
|
| -
|
| - // If interval is negative, clock was probably reset. So ping.
|
| - if (interval < 0)
|
| - return true;
|
| -
|
| - // Check if this product has any unreported events.
|
| - char cgi[kMaxCgiLength + 1];
|
| - cgi[0] = 0;
|
| - bool has_events = GetProductEventsAsCgi(product, cgi, arraysize(cgi));
|
| - if (no_delay && has_events)
|
| - return true;
|
| -
|
| - return interval >= (has_events ? kEventsPingInterval : kNoEventsPingInterval);
|
| -}
|
| -
|
| -
|
| -bool FinancialPing::UpdateLastPingTime(Product product) {
|
| - ScopedRlzValueStoreLock lock;
|
| - RlzValueStore* store = lock.GetStore();
|
| - if (!store || !store->HasAccess(RlzValueStore::kWriteAccess))
|
| - return false;
|
| -
|
| - uint64 now = GetSystemTimeAsInt64();
|
| - return store->WritePingTime(product, now);
|
| -}
|
| -
|
| -
|
| -bool FinancialPing::ClearLastPingTime(Product product) {
|
| - ScopedRlzValueStoreLock lock;
|
| - RlzValueStore* store = lock.GetStore();
|
| - if (!store || !store->HasAccess(RlzValueStore::kWriteAccess))
|
| - return false;
|
| - return store->ClearPingTime(product);
|
| -}
|
| -
|
| -} // namespace
|
|
|