author | Gina Yeh <gyeh@mozilla.com> |
Fri, 18 Jan 2013 18:53:00 +0800 | |
changeset 119247 | 3657968244936545c96954dda2046219d99f6d30 |
parent 119246 | aa20a6097d0b4e274fd1999bedd13e18f2a513fc |
child 119248 | 3702b7ead05e6ab153f9c63cf6ecc802ed15cf47 |
push id | 24195 |
push user | Ms2ger@gmail.com |
push date | Sat, 19 Jan 2013 16:10:11 +0000 |
treeherder | mozilla-central@02e12a80aef9 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | echou |
bugs | 828175 |
milestone | 21.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/bluetooth/BluetoothHfpManager.cpp +++ b/dom/bluetooth/BluetoothHfpManager.cpp @@ -719,41 +719,52 @@ BluetoothHfpManager::ReceiveSocketData(U NS_ASSERTION(vgm >= 0 && vgm <= 15, "Received invalid VGM value"); mCurrentVgm = vgm; } else if (msg.Find("AT+CHLD=?") != -1) { SendLine("+CHLD: (1,2)"); } else if (msg.Find("AT+CHLD=") != -1) { ParseAtCommand(msg, 8, atCommandValues); if (atCommandValues.IsEmpty()) { - NS_WARNING("Could't get the value of command [AT+VGS=]"); - goto respond_with_ok; - } - - nsresult rv; - int chld = atCommandValues[0].ToInteger(&rv); - if (NS_FAILED(rv)) { - NS_WARNING("Failed to extract volume value from bluetooth headset!"); + NS_WARNING("Could't get the value of command [AT+CHLD=]"); goto respond_with_ok; } - switch(chld) { - case 1: - // Releases active calls and accepts the other (held or waiting) call - NotifyDialer(NS_LITERAL_STRING("CHUP+ATA")); - break; - case 2: - // Places active calls on hold and accepts the other (held or waiting) call - NotifyDialer(NS_LITERAL_STRING("CHLD+ATA")); - break; - default: -#ifdef DEBUG - NS_WARNING("Not handling chld value"); -#endif - break; + char chld = atCommandValues[0][0]; + if (chld < '0' || chld > '4') { + NS_WARNING("Wrong value of command [AT+CHLD]"); + SendLine("ERROR"); + return; + } + + /** + * The following two cases are supported: + * AT+CHLD=1 - Releases active calls and accepts the other (held or + * waiting) call + * AT+CHLD=2 - Places active calls on hold and accepts the other (held + * or waiting) call + * + * The following cases are NOT supported yet: + * AT+CHLD=0, AT+CHLD=1<idx>, AT+CHLD=2<idx>, AT+CHLD=3, AT+CHLD=4 + * Please see 4.33.2 in Bluetooth hands-free profile 1.6 for more + * information. + */ + + // No idx shall be included + if (atCommandValues[0].Length() > 1) { + SendLine("ERROR"); + return; + } + + if (chld == '1') { + NotifyDialer(NS_LITERAL_STRING("CHUP+ATA")); + } else if (chld == '2') { + NotifyDialer(NS_LITERAL_STRING("CHLD+ATA")); + } else { + NS_WARNING("Not handling chld value"); } } else if (msg.Find("AT+VGS=") != -1) { // Adjust volume by headset mReceiveVgsFlag = true; ParseAtCommand(msg, 7, atCommandValues); if (atCommandValues.IsEmpty()) { NS_WARNING("Could't get the value of command [AT+VGS=]"); @@ -766,34 +777,34 @@ BluetoothHfpManager::ReceiveSocketData(U NS_WARNING("Failed to extract volume value from bluetooth headset!"); goto respond_with_ok; } if (newVgs == mCurrentVgs) { goto respond_with_ok; } -#ifdef DEBUG NS_ASSERTION(newVgs >= 0 && newVgs <= 15, "Received invalid VGS value"); -#endif nsString data; nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService(); data.AppendInt(newVgs); os->NotifyObservers(nullptr, "bluetooth-volume-change", data.get()); } else if (msg.Find("AT+BLDN") != -1) { NotifyDialer(NS_LITERAL_STRING("BLDN")); } else if (msg.Find("ATA") != -1) { NotifyDialer(NS_LITERAL_STRING("ATA")); } else if (msg.Find("AT+CHUP") != -1) { NotifyDialer(NS_LITERAL_STRING("CHUP")); } else if (msg.Find("ATD>") != -1) { // Currently, we don't support memory dialing in Dialer app SendLine("ERROR"); return; + } else if (msg.Find("AT+CLCC") != -1) { + SendCommand("+CLCC: "); } else if (msg.Find("ATD") != -1) { nsAutoCString message(msg), newMsg; int end = message.FindChar(';'); if (end < 0) { NS_WARNING("Could't get the value of command [ATD]"); goto respond_with_ok; }