blob: a8909a2b0d2c73ce5be18a21345f3fee673e71c1 [file] [log] [blame]
// Copyright 2019 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 CUPS_PROXY_MOJO_HANDLER_H_
#define CUPS_PROXY_MOJO_HANDLER_H_
#include <string>
#include <vector>
#include <base/files/file_util.h>
#include <base/memory/ref_counted.h>
#include <base/threading/thread.h>
#include <mojo/public/cpp/system/invitation.h>
#include "cups_proxy/mhd_http_request.h"
#include "cups_proxy/mojom/proxy.mojom.h"
namespace cups_proxy {
using IppHeaders = std::vector<mojom::HttpHeaderPtr>;
using IppBody = std::vector<uint8_t>;
struct IppResponse {
int http_status_code;
IppHeaders headers;
IppBody body;
};
// MojoHandler handles the mojo connection between the cups_proxy and Chrome.
class MojoHandler {
public:
MojoHandler();
~MojoHandler();
// Starts the mojo thread.
bool StartThread();
// Setup the mojo pipe using the fd, and set error handler.
void SetupMojoPipe(base::ScopedFD fd, base::OnceClosure error_handler);
// Returns whether the mojo interface is bounded.
bool IsInitialized();
// Sends the request to the mojo pipe, and returns the response
// synchronously.
//
// This calls method ProxyRequest@0 on the mojo interface. If called before
// the mojo pipe is bound, the request would be queued and send after pipe is
// bound.
IppResponse ProxyRequestSync(const MHDHttpRequest& request);
private:
// Setup the mojo pipe. This is always called on the mojo thread.
void SetupMojoPipeOnThread(base::OnceClosure error_handler,
mojo::IncomingInvitation invitation);
// Sends the request to the mojo pipe. This is always called on the mojo
// thread.
void ProxyRequestOnThread(const std::string& method,
const std::string& url,
const std::string& version,
IppHeaders headers,
const IppBody& body,
mojom::CupsProxier::ProxyRequestCallback callback);
base::Thread mojo_thread_;
scoped_refptr<base::SingleThreadTaskRunner> mojo_task_runner_;
// The top-level interface. Empty until it is created & bound to a pipe by
// BootstrapMojoConnection.
mojom::CupsProxierPtr chrome_proxy_;
// Queued requests that come before |chrome_proxy_| is ready.
std::vector<base::OnceClosure> queued_requests_;
};
} // namespace cups_proxy
#endif // CUPS_PROXY_MOJO_HANDLER_H_