/* -*- c++ -*- */
/*
 * Copyright 2013 Free Software Foundation, Inc.
 *
 * This file is part of GNU Radio
 *
 * GNU Radio is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3, or (at your option)
 * any later version.
 *
 * GNU Radio 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with GNU Radio; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street,
 * Boston, MA 02110-1301, USA.
 */

#ifndef INCLUDED_GRGSM_TRX_UDP_SOCKET_H
#define INCLUDED_GRGSM_TRX_UDP_SOCKET_H

#include <gnuradio/thread/thread.h>

#include <boost/function.hpp>
#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <pmt/pmt.h>

namespace gr {
  namespace grgsm {

    class udp_socket
    {
    private:
      boost::asio::io_service d_io_service;
      std::vector<char> d_rxbuf;
      gr::thread::thread d_thread;
      bool d_started;
      bool d_finished;

      boost::asio::ip::udp::endpoint d_udp_endpoint_rx;
      boost::asio::ip::udp::endpoint d_udp_endpoint_tx;
      boost::shared_ptr<boost::asio::ip::udp::socket> d_udp_socket;

      void handle_udp_read(const boost::system::error_code& error,
        size_t bytes_transferred);
      void run_io_service(void);

    public:
      udp_socket(
        const std::string &remote_addr,
        const std::string &src_port,
        const std::string &dst_port,
        size_t mtu);
      ~udp_socket();

      void udp_send(uint8_t *data, size_t len);
      boost::function<void (uint8_t *, size_t)> udp_rx_handler;
    };

  } /* namespace blocks */
} /* namespace gr */

#endif /* INCLUDED_GRGSM_TRX_UDP_SOCKET_H */
