blob: b0f3294899376cc93281cf6c63b05faa6e2ca7a5 [file] [log] [blame]
/*
* This file is part of Wireless Display Software for Linux OS
*
* Copyright (C) 2014 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifndef MIRAC_BROKER_HPP
#define MIRAC_BROKER_HPP
#include <glib.h>
#include <memory>
#include <map>
#include <vector>
#include "libwds/public/peer.h"
#include "mirac-network.hpp"
class MiracBroker : public wds::Peer::Delegate
{
public:
MiracBroker (const std::string& listen_port);
MiracBroker(const std::string& peer_address, const std::string& peer_port, uint timeout = 3000);
virtual ~MiracBroker ();
unsigned short get_host_port() const;
std::string get_peer_address() const;
virtual wds::Peer* Peer() const = 0;
void OnTimeout(uint timer_id);
protected:
enum ConnectionFailure {
CONNECTION_TIMEOUT,
CONNECTION_LOST,
};
// wds::Peer::Delegate
void SendRTSPData(const std::string& data) override;
std::string GetLocalIPAddress() const override;
uint CreateTimer(int seconds) override;
void ReleaseTimer(uint timer_id) override;
int GetNextCSeq(int* initial_peer_cseq = nullptr) const override;
virtual void got_message(const std::string& data) {}
virtual void on_connected() {};
virtual void on_connection_failure(ConnectionFailure failure) {};
private:
static gboolean send_cb (gint fd, GIOCondition condition, gpointer data_ptr);
static gboolean receive_cb (gint fd, GIOCondition condition, gpointer data_ptr);
static gboolean listen_cb (gint fd, GIOCondition condition, gpointer data_ptr);
static gboolean connect_cb (gint fd, GIOCondition condition, gpointer data_ptr);
static gboolean try_connect(gpointer data_ptr);
static void on_timeout_remove(gpointer user_data);
gboolean send_cb (gint fd, GIOCondition condition);
gboolean receive_cb (gint fd, GIOCondition condition);
gboolean listen_cb (gint fd, GIOCondition condition);
gboolean connect_cb (gint fd, GIOCondition condition);
void try_connect();
void handle_body(const std::string msg);
void handle_header(const std::string msg);
void network(MiracNetwork* connection);
std::unique_ptr<MiracNetwork> network_;
MiracBroker *network_source_ptr_;
void connection(MiracNetwork* connection);
std::unique_ptr<MiracNetwork> connection_;
MiracBroker *connection_source_ptr_;
std::vector<uint> timers_;
std::string peer_address_;
std::string peer_port_;
GTimer *connect_timer_;
uint connect_wait_id_;
uint connect_timeout_;
static const uint connect_wait_ = 200;
};
#endif /* MIRAC_BROKER_HPP */