C++程序  |  232行  |  8.21 KB

/******************************************************************************
 *
 *  Copyright 2018 The Android Open Source Project
 *
 *  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.
 *
 ******************************************************************************/
#pragma once

#include <vector>

#include <gmock/gmock.h>

#include "bt_types.h"

namespace bluetooth {
namespace rfcomm {

class RfcommCallback {
 public:
  virtual void PortManagementCallback(uint32_t code, uint16_t port_handle,
                                      uint16_t callback_index) = 0;
  virtual void PortEventCallback(uint32_t code, uint16_t port_handle,
                                 uint16_t callback_index) = 0;
  virtual ~RfcommCallback() = default;
};

class MockRfcommCallback : public RfcommCallback {
 public:
  MOCK_METHOD3(PortManagementCallback, void(uint32_t code, uint16_t port_handle,
                                            uint16_t callback_index));
  MOCK_METHOD3(PortEventCallback, void(uint32_t code, uint16_t port_handle,
                                       uint16_t callback_index));
};

/**
 * Create DLCI using direction of service channel number
 *
 * @param on_originator_side is this a channel on initiator side
 * @param scn service channel number
 * @return DLCI
 */
uint8_t GetDlci(bool on_originator_side, uint8_t scn);

/**
 * Create address field in RFCOMM packet
 *
 * @param ea end of field byte, true if field only has 1 byte, false otherwise
 * @param cr command and response bit, true if packet is from initiator,
 *           false otherwise, not actual "command" and "response"
 * @param dlci DLCI of this pcaket, RFCOMM_MX_DLCI for multiplexer control
 * @return address field
 */
uint8_t GetAddressField(bool ea, bool cr, uint8_t dlci);

/**
 * Create control field in RFCOMM packet
 *
 * @param pf Poll/Finish bit, normally 1 for multiplexer control channel
 * @param frame_type frame type
 * @return control field
 */
uint8_t GetControlField(bool pf, uint8_t frame_type);

/**
 * Create Multiplexer control channel parameter negotiation frame
 *
 * @param dlci DLCI to be configured
 * @param i_bits i bits
 * @param cl_bits cl bits
 * @param priority priority
 * @param timer_value timer value
 * @param rfcomm_mtu rfcomm mtu
 * @param max_num_retransmission maximum number of retransmission
 * @param err_recovery_window_k error recovery window k
 * @return vector of bytes of this frame
 */
std::vector<uint8_t> CreateMccPnFrame(uint8_t dlci, uint8_t i_bits,
                                      uint8_t cl_bits, uint8_t priority,
                                      uint8_t timer_value, uint16_t rfcomm_mtu,
                                      uint8_t max_num_retransmission,
                                      uint8_t err_recovery_window_k);
/**
 * Create Multiplexer Control Modem Status Configuration Frame
 *
 * @param dlci DLCI to be configured
 * @param fc flow control
 * @param rtc ready to communicate
 * @param rtr ready to receive
 * @param ic incoming call indicator
 * @param dv is data valid
 * @return vector of bytes
 */
std::vector<uint8_t> CreateMccMscFrame(uint8_t dlci, bool fc, bool rtc,
                                       bool rtr, bool ic, bool dv);

/**
 * Create Multiplexer Control Frame
 *
 * @param command_type type of command
 * @param cr command or response flag, true when this is a command, false when
 *           this is a response, regardless of connection direction
 * @param data frame data
 * @return vector of bytes
 */
std::vector<uint8_t> CreateMultiplexerControlFrame(
    uint8_t command_type, bool cr, const std::vector<uint8_t>& data);

/**
 * Create a general RFCOMM packet
 *
 * @param address address byte
 * @param control control byte
 * @param credits number of credits, <= 0 will cause this to be ignored
 * @param data frame data
 * @return vector of bytes
 */
std::vector<uint8_t> CreateRfcommPacket(uint8_t address, uint8_t control,
                                        int credits,
                                        const std::vector<uint8_t>& data);
/*
 * Various shortcut for getting frequently used packets
 */

/**
 * Create SABM packet that is used to connect to a service channel number in a
 * multiplexer
 *
 * @param dlci DLCI to be connected
 * @param l2cap_lcid L2CAP channel ID
 * @param acl_handle ACL handle
 * @return vector of bytes of unwrapped ACL packet
 */
std::vector<uint8_t> CreateQuickSabmPacket(uint8_t dlci, uint16_t l2cap_lcid,
                                           uint16_t acl_handle);

/**
 * Create UA packet that is used to acknowledge service channel connection
 *
 * @param dlci DLCI to be connected
 * @param l2cap_lcid L2CAP channel ID
 * @param acl_handle ACL handle
 * @return vector of bytes of unwrapped ACL packet
 */
std::vector<uint8_t> CreateQuickUaPacket(uint8_t dlci, uint16_t l2cap_lcid,
                                         uint16_t acl_handle);

/**
 * Create parameter negotiation packet used to setup parameters for a DLCI
 *
 * @param rfc_cr RFCOMM command/response bit, true of initiator
 * @param target_dlci DLCI to be configured
 * @param mx_cr multiplexer command or reponse, regardless of initiator
 * @param rfc_mtu RFCOMM mtu to be used for DLCI
 * @param cl CL bit
 * @param priority prirority
 * @param k error recovery window k
 * @param l2cap_lcid L2CAP channel ID
 * @param acl_handle ACL handle
 * @return vector of bytes of unwrapped ACL packet
 */
std::vector<uint8_t> CreateQuickPnPacket(bool rfc_cr, uint8_t target_dlci,
                                         bool mx_cr, uint16_t rfc_mtu,
                                         uint8_t cl, uint8_t priority,
                                         uint8_t k, uint16_t l2cap_lcid,
                                         uint16_t acl_handle);

/**
 * Create modem signal control packet
 *
 * @param rfc_cr RFCOMM command/response bit, true of initiator
 * @param dlci DLCI to be configured
 * @param l2cap_lcid L2CAP channel ID
 * @param acl_handle ACL handle
 * @param mx_cr multiplexer command or reponse, regardless of initiator
 * @param fc flow control
 * @param rtc ready to communicate
 * @param rtr ready to receive
 * @param ic incoming call indicator
 * @param dv data valid
 * @return vector of bytes of unwrapped ACL packet
 */
std::vector<uint8_t> CreateQuickMscPacket(bool rfc_cr, uint8_t dlci,
                                          uint16_t l2cap_lcid,
                                          uint16_t acl_handle, bool mx_cr,
                                          bool fc, bool rtc, bool rtr, bool ic,
                                          bool dv);

/**
 * Create a quick RFCOMM data packet
 *
 * @param dlci DLCI of this packet
 * @param cr command or control, true for initiator
 * @param l2cap_lcid L2CAP channel ID
 * @param acl_handle ACL handle
 * @param credits number of credits
 * @param data data bytes
 * @return vector of bytes of unwrapped ACL packet
 */
std::vector<uint8_t> CreateQuickDataPacket(uint8_t dlci, bool cr,
                                           uint16_t l2cap_lcid,
                                           uint16_t acl_handle, int credits,
                                           const std::vector<uint8_t>& data);

/**
 * Create a quick RFCOMM data packet
 *
 * @param dlci DLCI of this packet
 * @param cr command or control, true for initiator
 * @param l2cap_lcid L2CAP channel ID
 * @param acl_handle ACL handle
 * @param credits number of credits
 * @param str message in string format
 * @return vector of bytes of unwrapped ACL packet
 */
std::vector<uint8_t> CreateQuickDataPacket(uint8_t dlci, bool cr,
                                           uint16_t l2cap_lcid,
                                           uint16_t acl_handle, int credits,
                                           const std::string& str);

}  // namespace rfcomm
}  // namespace bluetooth