Revision control
Copy as Markdown
// Copyright (C) 2022 The Qt Company Ltd.
// Copyright (C) 2019 Alexey Edelev <semlanik@gmail.com>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtGrpc/private/qabstractgrpcchannel_p.h>
#include <QtGrpc/qgrpccalloptions.h>
#include <QtGrpc/qgrpccallreply.h>
#include <QtGrpc/qgrpcoperationcontext.h>
#include <QtGrpc/qgrpcstream.h>
#include <QtCore/qbytearrayview.h>
#include <QtCore/qlatin1stringview.h>
QT_BEGIN_NAMESPACE
/*!
\class QAbstractGrpcChannel
\inmodule QtGrpc
\brief The QAbstractGrpcChannel class provides an interface for
implementing the transport layer of \gRPC operations.
Implement this interface to create a custom channel for \gRPC
transportation. The QGrpcHttp2Channel class is provided as a fully featured
implementation of QAbstractGrpcChannel for HTTP/2 communication.
\sa QGrpcChannelOptions, QGrpcHttp2Channel
*/
/*!
\fn virtual std::shared_ptr<QAbstractProtobufSerializer> QAbstractGrpcChannel::serializer() const = 0
This pure virtual function retrieves the QAbstractProtobufSerializer used
for the serialization and deserialization of messages.
*/
/*!
\fn virtual void QAbstractGrpcChannel::call(QGrpcOperationContext *operationContext, QByteArray &&messageData) = 0
\since 6.7
//! [abstract-rpc-desc]
This pure virtual function is called when a user starts a new RPC through
the generated client interface. The \a operationContext should be used to
communicate with the corresponding RPC handler, which is a derived type of
the QGrpcOperation object.
This function should start the corresponding RPC on the channel side with
the serialized \a messageData. The implementation must be asynchronous and
must not block the calling thread.
\note It is the channel's responsibility to support and restrict the subset
of features that its RPC type allows.
//! [abstract-rpc-desc]
*/
/*!
\fn virtual void QAbstractGrpcChannel::serverStream(QGrpcOperationContext *operationContext, QByteArray &&messageData) = 0
\since 6.7
\include qabstractgrpcchannel.cpp abstract-rpc-desc
*/
/*!
\fn virtual void QAbstractGrpcChannel::clientStream(QGrpcOperationContext *operationContext, QByteArray &&messageData) = 0
\since 6.7
\include qabstractgrpcchannel.cpp abstract-rpc-desc
*/
/*!
\fn virtual void QAbstractGrpcChannel::bidiStream(QGrpcOperationContext *operationContext, QByteArray &&messageData) = 0
\since 6.7
\include qabstractgrpcchannel.cpp abstract-rpc-desc
*/
/*!
Default-constructs the QAbstractGrpcChannel.
*/
QAbstractGrpcChannel::QAbstractGrpcChannel()
: d_ptr(std::make_unique<QAbstractGrpcChannelPrivate>(QGrpcChannelOptions{}, this))
{
}
/*!
\since 6.8
\internal
Constructs the QAbstractGrpcChannel using the Private implementation to
reuse the d_ptr.
*/
QAbstractGrpcChannel::QAbstractGrpcChannel(QAbstractGrpcChannelPrivate &dd) : d_ptr(&dd)
{
}
/*!
Constructs the QAbstractGrpcChannel using the specified \a options.
*/
QAbstractGrpcChannel::QAbstractGrpcChannel(const QGrpcChannelOptions &options)
: d_ptr(std::make_unique<QAbstractGrpcChannelPrivate>(options, this))
{
}
QAbstractGrpcChannel::QAbstractGrpcChannel(QGrpcInterceptorChain interceptorChain)
: QAbstractGrpcChannel()
{
Q_D(QAbstractGrpcChannel);
d->interceptorEngine.setInterceptorChain(std::move(interceptorChain));
}
QAbstractGrpcChannel::QAbstractGrpcChannel(const QGrpcChannelOptions &options,
QGrpcInterceptorChain interceptorChain)
: QAbstractGrpcChannel(options)
{
Q_D(QAbstractGrpcChannel);
d->interceptorEngine.setInterceptorChain(std::move(interceptorChain));
}
/*!
Destroys the QAbstractGrpcChannel.
*/
QAbstractGrpcChannel::~QAbstractGrpcChannel() = default;
/*!
Returns the options utilized by the channel.
\sa setChannelOptions
*/
const QGrpcChannelOptions &QAbstractGrpcChannel::channelOptions() const & noexcept
{
Q_D(const QAbstractGrpcChannel);
return d->channelOptions;
}
/*!
\fn void QAbstractGrpcChannel::setChannelOptions(const QGrpcChannelOptions &options) noexcept
\fn void QAbstractGrpcChannel::setChannelOptions(QGrpcChannelOptions &&options) noexcept
\since 6.8
Sets the channel \a options.
\note The updated channel options do not affect currently active calls or streams.
The revised options will apply only to new RPCs made through this channel.
\sa channelOptions
*/
void QAbstractGrpcChannel::setChannelOptions(const QGrpcChannelOptions &options)
{
Q_D(QAbstractGrpcChannel);
d->channelOptions = options;
}
void QAbstractGrpcChannel::setChannelOptions(QGrpcChannelOptions &&options)
{
Q_D(QAbstractGrpcChannel);
d->channelOptions = std::move(options);
}
const QGrpcInterceptorChain &QAbstractGrpcChannel::interceptorChain() const & noexcept
{
Q_D(const QAbstractGrpcChannel);
return d->interceptorEngine.interceptorChain();
}
QT_END_NAMESPACE