You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.6 KiB
83 lines
2.6 KiB
// 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 OSP_IMPL_QUIC_QUIC_CONNECTION_H_
|
|
#define OSP_IMPL_QUIC_QUIC_CONNECTION_H_
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "platform/api/udp_socket.h"
|
|
|
|
namespace openscreen {
|
|
namespace osp {
|
|
|
|
class QuicStream {
|
|
public:
|
|
class Delegate {
|
|
public:
|
|
virtual ~Delegate() = default;
|
|
|
|
virtual void OnReceived(QuicStream* stream,
|
|
const char* data,
|
|
size_t data_size) = 0;
|
|
virtual void OnClose(uint64_t stream_id) = 0;
|
|
};
|
|
|
|
QuicStream(Delegate* delegate, uint64_t id) : delegate_(delegate), id_(id) {}
|
|
virtual ~QuicStream() = default;
|
|
|
|
uint64_t id() const { return id_; }
|
|
virtual void Write(const uint8_t* data, size_t data_size) = 0;
|
|
virtual void CloseWriteEnd() = 0;
|
|
|
|
protected:
|
|
Delegate* const delegate_;
|
|
uint64_t id_;
|
|
};
|
|
|
|
class QuicConnection : public UdpSocket::Client {
|
|
public:
|
|
class Delegate {
|
|
public:
|
|
virtual ~Delegate() = default;
|
|
|
|
// Called when the QUIC handshake has successfully completed.
|
|
virtual void OnCryptoHandshakeComplete(uint64_t connection_id) = 0;
|
|
|
|
// Called when a new stream on this connection is initiated by the other
|
|
// endpoint. |stream| will use a delegate returned by NextStreamDelegate.
|
|
virtual void OnIncomingStream(uint64_t connection_id,
|
|
std::unique_ptr<QuicStream> stream) = 0;
|
|
|
|
// Called when the QUIC connection was closed. The QuicConnection should
|
|
// not be destroyed immediately, because the QUIC implementation will still
|
|
// reference it briefly. Instead, it should be destroyed during the next
|
|
// event loop.
|
|
// TODO(btolsch): Hopefully this can be changed with future QUIC
|
|
// implementations.
|
|
virtual void OnConnectionClosed(uint64_t connection_id) = 0;
|
|
|
|
// This is used to get a QuicStream::Delegate for an incoming stream, which
|
|
// will be returned via OnIncomingStream immediately after this call.
|
|
virtual QuicStream::Delegate* NextStreamDelegate(uint64_t connection_id,
|
|
uint64_t stream_id) = 0;
|
|
};
|
|
|
|
explicit QuicConnection(Delegate* delegate) : delegate_(delegate) {}
|
|
virtual ~QuicConnection() = default;
|
|
|
|
virtual std::unique_ptr<QuicStream> MakeOutgoingStream(
|
|
QuicStream::Delegate* delegate) = 0;
|
|
virtual void Close() = 0;
|
|
|
|
protected:
|
|
Delegate* const delegate_;
|
|
};
|
|
|
|
} // namespace osp
|
|
} // namespace openscreen
|
|
|
|
#endif // OSP_IMPL_QUIC_QUIC_CONNECTION_H_
|