#ifndef REMOTING_BASE_TELEMETRY_LOG_WRITER_H_
#define REMOTING_BASE_TELEMETRY_LOG_WRITER_H_
#include <string>
#include "base/containers/circular_deque.h"
#include "base/functional/callback.h"
#include "base/memory/scoped_refptr.h"
#include "base/threading/thread_checker.h"
#include "base/timer/timer.h"
#include "net/base/backoff_entry.h"
#include "remoting/base/chromoting_event.h"
#include "remoting/base/chromoting_event_log_writer.h"
#include "remoting/base/oauth_token_getter.h"
#include "remoting/base/url_request.h"
namespace network {
class SharedURLLoaderFactory;
}
namespace remoting {
namespace apis {
namespace v1 {
class CreateEventRequest;
class CreateEventResponse;
}
}
class ProtobufHttpClient;
class ProtobufHttpStatus;
class TelemetryLogWriter : public ChromotingEventLogWriter {
public:
explicit TelemetryLogWriter(std::unique_ptr<OAuthTokenGetter> token_getter);
TelemetryLogWriter(const TelemetryLogWriter&) = delete;
TelemetryLogWriter& operator=(const TelemetryLogWriter&) = delete;
~TelemetryLogWriter() override;
void Init(scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
void Log(const ChromotingEvent& entry) override;
private:
void SendPendingEntries();
void DoSend(const apis::v1::CreateEventRequest& request);
void OnSendLogResult(const ProtobufHttpStatus& status,
std::unique_ptr<apis::v1::CreateEventResponse> response);
bool IsIdleForTesting();
THREAD_CHECKER(thread_checker_);
std::unique_ptr<OAuthTokenGetter> token_getter_;
std::unique_ptr<ProtobufHttpClient> http_client_;
net::BackoffEntry backoff_;
base::OneShotTimer backoff_timer_;
base::circular_deque<ChromotingEvent> pending_entries_;
base::circular_deque<ChromotingEvent> sending_entries_;
friend class TelemetryLogWriterTest;
};
}
#endif