00001 #include "ariba/config.h"
00002
00003 #ifdef HAVE_LIBBLUETOOTH
00004
00005 #ifndef RFCOMM_HPP_
00006 #define RFCOMM_HPP_
00007
00008 #include "ariba/utility/transport/transport.hpp"
00009 #include "ariba/utility/transport/asio/asio_io_service.h"
00010 #include "ariba/utility/transport/asio/bluetooth_endpoint.hpp"
00011 #include "ariba/utility/transport/asio/rfcomm.hpp"
00012
00013 #include <boost/thread.hpp>
00014 #include <boost/system/system_error.hpp>
00015 #include <boost/asio/io_service.hpp>
00016
00017 #include "ariba/utility/logging/Logging.h"
00018
00019 namespace ariba {
00020 namespace transport {
00021
00022 using boost::system::error_code;
00023 using namespace boost::asio;
00024
00025 class link_info;
00026 class link_data;
00027
00033 class rfcomm : public transport_protocol {
00034 use_logging_h(rfcomm)
00035 public:
00036 rfcomm( uint16_t channel );
00037 virtual ~rfcomm();
00038 virtual void start();
00039 virtual void stop();
00040 virtual void send( const address_v* remote, const uint8_t* data, size_t size );
00041 virtual void send( const endpoint_set& endpoints, const uint8_t* data, size_t size );
00042 virtual void terminate( const address_v* remote );
00043 virtual void register_listener( transport_listener* listener );
00044
00045 private:
00046 uint16_t channel;
00047 boost::mutex links_mutex;
00048 vector<link_info*> links;
00049 io_service& io;
00050 transport_listener* listener;
00051 bluetooth::rfcomm::acceptor* acceptor;
00052 int accept_retries;
00053 link_data* send_data;
00054
00055 void start_accept();
00056
00057 void handle_accept( const error_code& error, link_info* info );
00058
00059 void start_read( link_info* info );
00060
00061 void handle_read_header( const error_code& error, size_t bytes, link_info* info );
00062
00063 void handle_read_data( const error_code& error, size_t bytes, link_info* info );
00064
00065 void handle_connect( const error_code& error, link_info* info );
00066
00067 void start_write( link_info* info );
00068
00069 void handle_write_data(const error_code& error, size_t bytes,
00070 link_info* info, size_t size, uint8_t* buffer );
00071
00072 void shutdown(link_info* info);
00073 };
00074
00075 }}
00076
00077 #endif
00078 #endif