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