/*
 * Copyright 2023 Yunseong Hwang
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef INBOUND_CHANNEL_H
#define INBOUND_CHANNEL_H

#include <QMutex>
#include <QQueue>
#include <QSharedPointer>
#include <QWeakPointer>

class InboundItem;

class InboundReceiver {
public:
  virtual void notifyInbound() = 0;
};

class InboundChannel {
private:
  QWeakPointer<InboundReceiver> m_receiver;
  QQueue<QSharedPointer<InboundItem>> m_queue;
  QMutex m_mutex;

public:
  InboundChannel();
  InboundChannel(const QWeakPointer<InboundReceiver> &receiver);

  void subscribe(const QWeakPointer<InboundReceiver> &receiver);
  void send(const QSharedPointer<InboundItem> &inbound);
  QQueue<QSharedPointer<InboundItem>> receive();
};

#endif // INBOUND_CHANNEL_H
