blob: a430a283177d01aaf470c14da4a7847f63677f52 [file] [log] [blame]
// Copyright 2018 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.
#ifndef COMPONENTS_CRONET_NATIVE_SAMPLE_SAMPLE_URL_REQUEST_CALLBACK_H_
#define COMPONENTS_CRONET_NATIVE_SAMPLE_SAMPLE_URL_REQUEST_CALLBACK_H_
// Cronet sample is expected to be used outside of Chromium infrastructure,
// and as such has to rely on STL directly instead of //base alternatives.
#include <future>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "cronet_c.h"
// Sample implementation of Cronet_UrlRequestCallback interface using static
// methods to map C API into instance of C++ class.
class SampleUrlRequestCallback {
public:
SampleUrlRequestCallback();
~SampleUrlRequestCallback();
// Gets Cronet_UrlRequestCallbackPtr implemented by |this|.
Cronet_UrlRequestCallbackPtr GetUrlRequestCallback();
// Waits until request is done.
void WaitForDone() { is_done_.wait(); }
// Returns error message if OnFailed callback is invoked.
std::string last_error_message() const { return last_error_message_; }
// Returns string representation of the received response.
std::string response_as_string() const { return response_as_string_; }
protected:
void OnRedirectReceived(Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info,
Cronet_String newLocationUrl);
void OnResponseStarted(Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info);
void OnReadCompleted(Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info,
Cronet_BufferPtr buffer,
uint64_t bytes_read);
void OnSucceeded(Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info);
void OnFailed(Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info,
Cronet_ErrorPtr error);
void OnCanceled(Cronet_UrlRequestPtr request, Cronet_UrlResponseInfoPtr info);
void SignalDone(bool success) { done_with_success_.set_value(success); }
static SampleUrlRequestCallback* GetThis(Cronet_UrlRequestCallbackPtr self);
// Implementation of Cronet_UrlRequestCallback methods.
static void OnRedirectReceived(Cronet_UrlRequestCallbackPtr self,
Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info,
Cronet_String newLocationUrl);
static void OnResponseStarted(Cronet_UrlRequestCallbackPtr self,
Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info);
static void OnReadCompleted(Cronet_UrlRequestCallbackPtr self,
Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info,
Cronet_BufferPtr buffer,
uint64_t bytesRead);
static void OnSucceeded(Cronet_UrlRequestCallbackPtr self,
Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info);
static void OnFailed(Cronet_UrlRequestCallbackPtr self,
Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info,
Cronet_ErrorPtr error);
static void OnCanceled(Cronet_UrlRequestCallbackPtr self,
Cronet_UrlRequestPtr request,
Cronet_UrlResponseInfoPtr info);
// Error message copied from |error| if OnFailed callback is invoked.
std::string last_error_message_;
// Accumulated string representation of the received response.
std::string response_as_string_;
// Promise that is set when request is done.
std::promise<bool> done_with_success_;
// Future that is signalled when request is done.
std::future<bool> is_done_ = done_with_success_.get_future();
Cronet_UrlRequestCallbackPtr const callback_;
};
#endif // COMPONENTS_CRONET_NATIVE_SAMPLE_SAMPLE_URL_REQUEST_CALLBACK_H_