blob: e0e51f78e4afd606317cc8c345fc97937645e89e [file] [log] [blame]
// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DATA_PLAN_PROVIDER_H_
#define SRC_DATA_PLAN_PROVIDER_H_
#include <string>
#include <vector>
#include <base/basictypes.h> // NOLINT
#include <base/scoped_ptr.h> // NOLINT
#include "src/http_fetcher.h"
#include "src/values.h"
namespace cashew {
class DataPlanProviderDelegate;
// carrier usage API proxy
class DataPlanProvider: public HttpFetcherDelegate {
public:
explicit DataPlanProvider(const std::string& carrier);
virtual ~DataPlanProvider();
// get cellular carrier for which this proxy is configured
virtual const std::string& GetCarrier() const;
// get usage API URL for which this proxy is configured
virtual const std::string& GetUsageUrl() const;
// set usage API URL for which this proxy is configured
virtual void SetUsageUrl(const std::string& usage_url);
// set delegate interface that will receive callbacks from this proxy
// it's ok to clear this by setting it to NULL
virtual void SetDelegate(DataPlanProviderDelegate *delegate);
// request that proxy obtain updated info from carrier API
// NOTES:
// - the request is asynchronous
// - the result will be returned via a callback to the delegate
// that has been set via SetDelegate
// - returns true on success and false on failure
// - success indicates only that a request to the API was initiated
// successfully, but it does not guarantee that the request will
// ultimately succeed
// - this call will fail if no valid url has been set via SetUsageUrl
// - this call will fail if no delegate has been set via SetDelegate
// - this call will return success and do nothing if an earlier
// request is already in progress
virtual bool RequestUsageUpdate();
// HttpFetcherDelegate methods
// transfer is progressing, we've received more bytes
virtual void ReceivedBytes(HttpFetcher *fetcher, const char *bytes,
int length);
// transfer has ended (either complete or aborted)
virtual void TransferComplete(HttpFetcher *fetcher, bool successful);
// cancel any pending requests that are in progress
void CancelPendingRequests();
private:
// cellular carrier
const std::string carrier_;
// usage API URL
std::string usage_url_;
// delegate
DataPlanProviderDelegate *delegate_;
// http fetcher
scoped_ptr<HttpFetcher> fetcher_;
// do we have an http request in progress?
bool request_in_progress_;
// stores response that we receive from usage API
std::vector<char> response_buffer_;
DISALLOW_COPY_AND_ASSIGN(DataPlanProvider);
};
// interface for delegates
class DataPlanProviderDelegate {
public:
virtual ~DataPlanProviderDelegate() {}
// Called when request has either completed successfully or failed.
// |parsed_usage_update| will be NULL if |successful| is false.
// Caller owns |parsed_usage_update| and will delete it after this
// callback returns, so delegate should copy anything it needs.
virtual void OnRequestComplete(const DataPlanProvider *provider,
bool successful,
const Value *parsed_usage_update) = 0;
};
} // namespace cashew
#endif // SRC_DATA_PLAN_PROVIDER_H_