Bug 1050299: Wrap BlutoothInterface array initializaton in preprocessor macro, r=shuang

This patch fixes array initialization in the |Convert| functions of
|BluetoothInterface|. Designated initializers are not supported by
all compilers, so we wrap them into a macro and only used them when
possible.
This commit is contained in:
Thomas Zimmermann 2014-08-07 16:51:14 +02:00
parent 8b90044343
commit 7a7fa414f1

View File

@ -13,6 +13,16 @@
#include "nsThreadUtils.h"
#include "nsXULAppAPI.h"
#if MOZ_IS_GCC && MOZ_GCC_VERSION_AT_LEAST(4, 7, 0)
/* use designated array initializers if supported */
#define CONVERT(in_, out_) \
[in_] = out_
#else
/* otherwise init array element by position */
#define CONVERT(in_, out_) \
out_
#endif
BEGIN_BLUETOOTH_NAMESPACE
template<class T>
@ -27,17 +37,17 @@ static nsresult
Convert(bt_status_t aIn, BluetoothStatus& aOut)
{
static const BluetoothStatus sStatus[] = {
[BT_STATUS_SUCCESS] = STATUS_SUCCESS,
[BT_STATUS_FAIL] = STATUS_FAIL,
[BT_STATUS_NOT_READY] = STATUS_NOT_READY,
[BT_STATUS_NOMEM] = STATUS_NOMEM,
[BT_STATUS_BUSY] = STATUS_BUSY,
[BT_STATUS_DONE] = STATUS_DONE,
[BT_STATUS_UNSUPPORTED] = STATUS_UNSUPPORTED,
[BT_STATUS_PARM_INVALID] = STATUS_PARM_INVALID,
[BT_STATUS_UNHANDLED] = STATUS_UNHANDLED,
[BT_STATUS_AUTH_FAILURE] = STATUS_AUTH_FAILURE,
[BT_STATUS_RMT_DEV_DOWN] = STATUS_RMT_DEV_DOWN
CONVERT(BT_STATUS_SUCCESS, STATUS_SUCCESS),
CONVERT(BT_STATUS_FAIL, STATUS_FAIL),
CONVERT(BT_STATUS_NOT_READY, STATUS_NOT_READY),
CONVERT(BT_STATUS_NOMEM, STATUS_NOMEM),
CONVERT(BT_STATUS_BUSY, STATUS_BUSY),
CONVERT(BT_STATUS_DONE, STATUS_DONE),
CONVERT(BT_STATUS_UNSUPPORTED, STATUS_UNSUPPORTED),
CONVERT(BT_STATUS_PARM_INVALID, STATUS_PARM_INVALID),
CONVERT(BT_STATUS_UNHANDLED, STATUS_UNHANDLED),
CONVERT(BT_STATUS_AUTH_FAILURE, STATUS_AUTH_FAILURE),
CONVERT(BT_STATUS_RMT_DEV_DOWN, STATUS_RMT_DEV_DOWN)
};
if (aIn >= MOZ_ARRAY_LENGTH(sStatus)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -72,8 +82,8 @@ static nsresult
Convert(bool aIn, bt_scan_mode_t& aOut)
{
static const bt_scan_mode_t sScanMode[] = {
[false] = BT_SCAN_MODE_CONNECTABLE,
[true] = BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE
CONVERT(false, BT_SCAN_MODE_CONNECTABLE),
CONVERT(true, BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE)
};
if (aIn >= MOZ_ARRAY_LENGTH(sScanMode)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -238,10 +248,10 @@ Convert(BluetoothSocketType aIn, btsock_type_t& aOut)
// by gcc. Start values in |BluetoothSocketType| at index
// 0 to fix this problem.
static const btsock_type_t sSocketType[] = {
[0] = static_cast<btsock_type_t>(0), // invalid, [0] required by gcc
[BluetoothSocketType::RFCOMM] = BTSOCK_RFCOMM,
[BluetoothSocketType::SCO] = BTSOCK_SCO,
[BluetoothSocketType::L2CAP] = BTSOCK_L2CAP,
CONVERT(0, static_cast<btsock_type_t>(0)), // invalid, [0] required by gcc
CONVERT(BluetoothSocketType::RFCOMM, BTSOCK_RFCOMM),
CONVERT(BluetoothSocketType::SCO, BTSOCK_SCO),
CONVERT(BluetoothSocketType::L2CAP, BTSOCK_L2CAP),
// EL2CAP is not supported by Bluedroid
};
if (aIn == BluetoothSocketType::EL2CAP ||
@ -256,8 +266,8 @@ static nsresult
Convert(BluetoothHandsfreeAtResponse aIn, bthf_at_response_t& aOut)
{
static const bthf_at_response_t sAtResponse[] = {
[HFP_AT_RESPONSE_ERROR] = BTHF_AT_RESPONSE_ERROR,
[HFP_AT_RESPONSE_OK] = BTHF_AT_RESPONSE_OK
CONVERT(HFP_AT_RESPONSE_ERROR, BTHF_AT_RESPONSE_ERROR),
CONVERT(HFP_AT_RESPONSE_OK, BTHF_AT_RESPONSE_OK)
};
if (aIn >= MOZ_ARRAY_LENGTH(sAtResponse)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -270,8 +280,9 @@ static nsresult
Convert(BluetoothHandsfreeCallAddressType aIn, bthf_call_addrtype_t& aOut)
{
static const bthf_call_addrtype_t sCallAddressType[] = {
[HFP_CALL_ADDRESS_TYPE_UNKNOWN] = BTHF_CALL_ADDRTYPE_UNKNOWN,
[HFP_CALL_ADDRESS_TYPE_INTERNATIONAL] = BTHF_CALL_ADDRTYPE_INTERNATIONAL
CONVERT(HFP_CALL_ADDRESS_TYPE_UNKNOWN, BTHF_CALL_ADDRTYPE_UNKNOWN),
CONVERT(HFP_CALL_ADDRESS_TYPE_INTERNATIONAL,
BTHF_CALL_ADDRTYPE_INTERNATIONAL)
};
if (aIn >= MOZ_ARRAY_LENGTH(sCallAddressType)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -284,8 +295,8 @@ static nsresult
Convert(BluetoothHandsfreeCallDirection aIn, bthf_call_direction_t& aOut)
{
static const bthf_call_direction_t sCallDirection[] = {
[HFP_CALL_DIRECTION_OUTGOING] = BTHF_CALL_DIRECTION_OUTGOING,
[HFP_CALL_DIRECTION_INCOMING] = BTHF_CALL_DIRECTION_INCOMING
CONVERT(HFP_CALL_DIRECTION_OUTGOING, BTHF_CALL_DIRECTION_OUTGOING),
CONVERT(HFP_CALL_DIRECTION_INCOMING, BTHF_CALL_DIRECTION_INCOMING)
};
if (aIn >= MOZ_ARRAY_LENGTH(sCallDirection)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -298,9 +309,9 @@ static nsresult
Convert(BluetoothHandsfreeCallMode aIn, bthf_call_mode_t& aOut)
{
static const bthf_call_mode_t sCallMode[] = {
[HFP_CALL_MODE_VOICE] = BTHF_CALL_TYPE_VOICE,
[HFP_CALL_MODE_DATA] = BTHF_CALL_TYPE_DATA,
[HFP_CALL_MODE_FAX] = BTHF_CALL_TYPE_FAX
CONVERT(HFP_CALL_MODE_VOICE, BTHF_CALL_TYPE_VOICE),
CONVERT(HFP_CALL_MODE_DATA, BTHF_CALL_TYPE_DATA),
CONVERT(HFP_CALL_MODE_FAX, BTHF_CALL_TYPE_FAX)
};
if (aIn >= MOZ_ARRAY_LENGTH(sCallMode)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -313,8 +324,8 @@ static nsresult
Convert(BluetoothHandsfreeCallMptyType aIn, bthf_call_mpty_type_t& aOut)
{
static const bthf_call_mpty_type_t sCallMptyType[] = {
[HFP_CALL_MPTY_TYPE_SINGLE] = BTHF_CALL_MPTY_TYPE_SINGLE,
[HFP_CALL_MPTY_TYPE_MULTI] = BTHF_CALL_MPTY_TYPE_MULTI
CONVERT(HFP_CALL_MPTY_TYPE_SINGLE, BTHF_CALL_MPTY_TYPE_SINGLE),
CONVERT(HFP_CALL_MPTY_TYPE_MULTI, BTHF_CALL_MPTY_TYPE_MULTI)
};
if (aIn >= MOZ_ARRAY_LENGTH(sCallMptyType)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -327,13 +338,13 @@ static nsresult
Convert(BluetoothHandsfreeCallState aIn, bthf_call_state_t& aOut)
{
static const bthf_call_state_t sCallState[] = {
[HFP_CALL_STATE_ACTIVE] = BTHF_CALL_STATE_ACTIVE,
[HFP_CALL_STATE_HELD] = BTHF_CALL_STATE_HELD,
[HFP_CALL_STATE_DIALING] = BTHF_CALL_STATE_DIALING,
[HFP_CALL_STATE_ALERTING] = BTHF_CALL_STATE_ALERTING,
[HFP_CALL_STATE_INCOMING] = BTHF_CALL_STATE_INCOMING,
[HFP_CALL_STATE_WAITING] = BTHF_CALL_STATE_WAITING,
[HFP_CALL_STATE_IDLE] = BTHF_CALL_STATE_IDLE
CONVERT(HFP_CALL_STATE_ACTIVE, BTHF_CALL_STATE_ACTIVE),
CONVERT(HFP_CALL_STATE_HELD, BTHF_CALL_STATE_HELD),
CONVERT(HFP_CALL_STATE_DIALING, BTHF_CALL_STATE_DIALING),
CONVERT(HFP_CALL_STATE_ALERTING, BTHF_CALL_STATE_ALERTING),
CONVERT(HFP_CALL_STATE_INCOMING, BTHF_CALL_STATE_INCOMING),
CONVERT(HFP_CALL_STATE_WAITING, BTHF_CALL_STATE_WAITING),
CONVERT(HFP_CALL_STATE_IDLE, BTHF_CALL_STATE_IDLE)
};
if (aIn >= MOZ_ARRAY_LENGTH(sCallState)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -346,8 +357,8 @@ static nsresult
Convert(BluetoothHandsfreeNetworkState aIn, bthf_network_state_t& aOut)
{
static const bthf_network_state_t sNetworkState[] = {
[HFP_NETWORK_STATE_NOT_AVAILABLE] = BTHF_NETWORK_STATE_NOT_AVAILABLE,
[HFP_NETWORK_STATE_AVAILABLE] = BTHF_NETWORK_STATE_AVAILABLE
CONVERT(HFP_NETWORK_STATE_NOT_AVAILABLE, BTHF_NETWORK_STATE_NOT_AVAILABLE),
CONVERT(HFP_NETWORK_STATE_AVAILABLE, BTHF_NETWORK_STATE_AVAILABLE)
};
if (aIn >= MOZ_ARRAY_LENGTH(sNetworkState)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -360,8 +371,8 @@ static nsresult
Convert(BluetoothHandsfreeServiceType aIn, bthf_service_type_t& aOut)
{
static const bthf_service_type_t sServiceType[] = {
[HFP_SERVICE_TYPE_HOME] = BTHF_SERVICE_TYPE_HOME,
[HFP_SERVICE_TYPE_ROAMING] = BTHF_SERVICE_TYPE_ROAMING
CONVERT(HFP_SERVICE_TYPE_HOME, BTHF_SERVICE_TYPE_HOME),
CONVERT(HFP_SERVICE_TYPE_ROAMING, BTHF_SERVICE_TYPE_ROAMING)
};
if (aIn >= MOZ_ARRAY_LENGTH(sServiceType)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -374,8 +385,8 @@ static nsresult
Convert(BluetoothHandsfreeVolumeType aIn, bthf_volume_type_t& aOut)
{
static const bthf_volume_type_t sVolumeType[] = {
[HFP_VOLUME_TYPE_SPEAKER] = BTHF_VOLUME_TYPE_SPK,
[HFP_VOLUME_TYPE_MICROPHONE] = BTHF_VOLUME_TYPE_MIC
CONVERT(HFP_VOLUME_TYPE_SPEAKER, BTHF_VOLUME_TYPE_SPK),
CONVERT(HFP_VOLUME_TYPE_MICROPHONE, BTHF_VOLUME_TYPE_MIC)
};
if (aIn >= MOZ_ARRAY_LENGTH(sVolumeType)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -389,11 +400,11 @@ static nsresult
Convert(ControlPlayStatus aIn, btrc_play_status_t& aOut)
{
static const btrc_play_status_t sPlayStatus[] = {
[PLAYSTATUS_STOPPED] = BTRC_PLAYSTATE_STOPPED,
[PLAYSTATUS_PLAYING] = BTRC_PLAYSTATE_PLAYING,
[PLAYSTATUS_PAUSED] = BTRC_PLAYSTATE_PAUSED,
[PLAYSTATUS_FWD_SEEK] = BTRC_PLAYSTATE_FWD_SEEK,
[PLAYSTATUS_REV_SEEK] = BTRC_PLAYSTATE_REV_SEEK
CONVERT(PLAYSTATUS_STOPPED, BTRC_PLAYSTATE_STOPPED),
CONVERT(PLAYSTATUS_PLAYING, BTRC_PLAYSTATE_PLAYING),
CONVERT(PLAYSTATUS_PAUSED, BTRC_PLAYSTATE_PAUSED),
CONVERT(PLAYSTATUS_FWD_SEEK, BTRC_PLAYSTATE_FWD_SEEK),
CONVERT(PLAYSTATUS_REV_SEEK, BTRC_PLAYSTATE_REV_SEEK)
};
if (aIn >= MOZ_ARRAY_LENGTH(sPlayStatus)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -406,10 +417,10 @@ static nsresult
Convert(enum BluetoothAvrcpPlayerAttribute aIn, btrc_player_attr_t& aOut)
{
static const btrc_player_attr_t sPlayerAttr[] = {
[AVRCP_PLAYER_ATTRIBUTE_EQUALIZER] = BTRC_PLAYER_ATTR_EQUALIZER,
[AVRCP_PLAYER_ATTRIBUTE_REPEAT] = BTRC_PLAYER_ATTR_REPEAT,
[AVRCP_PLAYER_ATTRIBUTE_SHUFFLE] = BTRC_PLAYER_ATTR_SHUFFLE,
[AVRCP_PLAYER_ATTRIBUTE_SCAN] = BTRC_PLAYER_ATTR_SCAN
CONVERT(AVRCP_PLAYER_ATTRIBUTE_EQUALIZER, BTRC_PLAYER_ATTR_EQUALIZER),
CONVERT(AVRCP_PLAYER_ATTRIBUTE_REPEAT, BTRC_PLAYER_ATTR_REPEAT),
CONVERT(AVRCP_PLAYER_ATTRIBUTE_SHUFFLE, BTRC_PLAYER_ATTR_SHUFFLE),
CONVERT(AVRCP_PLAYER_ATTRIBUTE_SCAN, BTRC_PLAYER_ATTR_SCAN)
};
if (aIn >= MOZ_ARRAY_LENGTH(sPlayerAttr)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -422,11 +433,11 @@ static nsresult
Convert(enum BluetoothAvrcpStatus aIn, btrc_status_t& aOut)
{
static const btrc_status_t sStatus[] = {
[AVRCP_STATUS_BAD_COMMAND] = BTRC_STS_BAD_CMD,
[AVRCP_STATUS_BAD_PARAMETER] = BTRC_STS_BAD_PARAM,
[AVRCP_STATUS_NOT_FOUND] = BTRC_STS_NOT_FOUND,
[AVRCP_STATUS_INTERNAL_ERROR] = BTRC_STS_INTERNAL_ERR,
[AVRCP_STATUS_SUCCESS] = BTRC_STS_NO_ERROR
CONVERT(AVRCP_STATUS_BAD_COMMAND, BTRC_STS_BAD_CMD),
CONVERT(AVRCP_STATUS_BAD_PARAMETER, BTRC_STS_BAD_PARAM),
CONVERT(AVRCP_STATUS_NOT_FOUND, BTRC_STS_NOT_FOUND),
CONVERT(AVRCP_STATUS_INTERNAL_ERROR, BTRC_STS_INTERNAL_ERR),
CONVERT(AVRCP_STATUS_SUCCESS, BTRC_STS_NO_ERROR)
};
if (aIn >= MOZ_ARRAY_LENGTH(sStatus)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -439,12 +450,12 @@ static nsresult
Convert(enum BluetoothAvrcpEvent aIn, btrc_event_id_t& aOut)
{
static const btrc_event_id_t sEventId[] = {
[AVRCP_EVENT_PLAY_STATUS_CHANGED] = BTRC_EVT_PLAY_STATUS_CHANGED,
[AVRCP_EVENT_TRACK_CHANGE] = BTRC_EVT_TRACK_CHANGE,
[AVRCP_EVENT_TRACK_REACHED_END] = BTRC_EVT_TRACK_REACHED_END,
[AVRCP_EVENT_TRACK_REACHED_START] = BTRC_EVT_TRACK_REACHED_START,
[AVRCP_EVENT_PLAY_POS_CHANGED] = BTRC_EVT_PLAY_POS_CHANGED,
[AVRCP_EVENT_APP_SETTINGS_CHANGED] = BTRC_EVT_APP_SETTINGS_CHANGED
CONVERT(AVRCP_EVENT_PLAY_STATUS_CHANGED, BTRC_EVT_PLAY_STATUS_CHANGED),
CONVERT(AVRCP_EVENT_TRACK_CHANGE, BTRC_EVT_TRACK_CHANGE),
CONVERT(AVRCP_EVENT_TRACK_REACHED_END, BTRC_EVT_TRACK_REACHED_END),
CONVERT(AVRCP_EVENT_TRACK_REACHED_START, BTRC_EVT_TRACK_REACHED_START),
CONVERT(AVRCP_EVENT_PLAY_POS_CHANGED, BTRC_EVT_PLAY_POS_CHANGED),
CONVERT(AVRCP_EVENT_APP_SETTINGS_CHANGED, BTRC_EVT_APP_SETTINGS_CHANGED)
};
if (aIn >= MOZ_ARRAY_LENGTH(sEventId)) {
return NS_ERROR_ILLEGAL_VALUE;
@ -457,8 +468,8 @@ static nsresult
Convert(enum BluetoothAvrcpNotification aIn, btrc_notification_type_t& aOut)
{
static const btrc_notification_type_t sNotificationType[] = {
[AVRCP_NTF_INTERIM] = BTRC_NOTIFICATION_TYPE_INTERIM,
[AVRCP_NTF_CHANGED] = BTRC_NOTIFICATION_TYPE_CHANGED
CONVERT(AVRCP_NTF_INTERIM, BTRC_NOTIFICATION_TYPE_INTERIM),
CONVERT(AVRCP_NTF_CHANGED, BTRC_NOTIFICATION_TYPE_CHANGED)
};
if (aIn >= MOZ_ARRAY_LENGTH(sNotificationType)) {
return NS_ERROR_ILLEGAL_VALUE;