dom/bluetooth/bluez/BluetoothHfpManager.h

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:1f899b36a8aa
1 /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #ifndef mozilla_dom_bluetooth_bluetoothhfpmanager_h__
8 #define mozilla_dom_bluetooth_bluetoothhfpmanager_h__
9
10 #include "BluetoothCommon.h"
11 #include "BluetoothHfpManagerBase.h"
12 #ifdef MOZ_B2G_RIL
13 #include "BluetoothRilListener.h"
14 #endif
15 #include "BluetoothSocketObserver.h"
16 #include "mozilla/ipc/UnixSocket.h"
17 #include "mozilla/Hal.h"
18
19 BEGIN_BLUETOOTH_NAMESPACE
20
21 class BluetoothReplyRunnable;
22 class BluetoothSocket;
23
24 #ifdef MOZ_B2G_RIL
25 class Call;
26
27 /**
28 * These costants are defined in 4.33.2 "AT Capabilities Re-Used from GSM 07.07
29 * and 3GPP 27.007" in Bluetooth hands-free profile 1.6
30 */
31 enum BluetoothCmeError {
32 AG_FAILURE = 0,
33 NO_CONNECTION_TO_PHONE = 1,
34 OPERATION_NOT_ALLOWED = 3,
35 OPERATION_NOT_SUPPORTED = 4,
36 PIN_REQUIRED = 5,
37 SIM_NOT_INSERTED = 10,
38 SIM_PIN_REQUIRED = 11,
39 SIM_PUK_REQUIRED = 12,
40 SIM_FAILURE = 13,
41 SIM_BUSY = 14,
42 INCORRECT_PASSWORD = 16,
43 SIM_PIN2_REQUIRED = 17,
44 SIM_PUK2_REQUIRED = 18,
45 MEMORY_FULL = 20,
46 INVALID_INDEX = 21,
47 MEMORY_FAILURE = 23,
48 TEXT_STRING_TOO_LONG = 24,
49 INVALID_CHARACTERS_IN_TEXT_STRING = 25,
50 DIAL_STRING_TOO_LONG = 26,
51 INVALID_CHARACTERS_IN_DIAL_STRING = 27,
52 NO_NETWORK_SERVICE = 30,
53 NETWORK_TIMEOUT = 31,
54 NETWORK_NOT_ALLOWED = 32
55 };
56
57 enum PhoneType {
58 NONE, // no connection
59 GSM,
60 CDMA
61 };
62
63 class Call {
64 public:
65 Call();
66 void Reset();
67 bool IsActive();
68
69 uint16_t mState;
70 bool mDirection; // true: incoming call; false: outgoing call
71 bool mIsConference;
72 nsString mNumber;
73 int mType;
74 };
75 #endif // MOZ_B2G_RIL
76
77 class BluetoothHfpManager : public BluetoothSocketObserver
78 , public BluetoothHfpManagerBase
79 , public BatteryObserver
80 {
81 public:
82 BT_DECL_HFP_MGR_BASE
83 virtual void GetName(nsACString& aName)
84 {
85 aName.AssignLiteral("HFP/HSP");
86 }
87
88 static BluetoothHfpManager* Get();
89 ~BluetoothHfpManager();
90
91 // The following functions are inherited from BluetoothSocketObserver
92 virtual void ReceiveSocketData(
93 BluetoothSocket* aSocket,
94 nsAutoPtr<mozilla::ipc::UnixSocketRawData>& aMessage) MOZ_OVERRIDE;
95 virtual void OnSocketConnectSuccess(BluetoothSocket* aSocket) MOZ_OVERRIDE;
96 virtual void OnSocketConnectError(BluetoothSocket* aSocket) MOZ_OVERRIDE;
97 virtual void OnSocketDisconnect(BluetoothSocket* aSocket) MOZ_OVERRIDE;
98
99 bool Listen();
100 /**
101 * This function set up a Synchronous Connection (SCO) link for HFP.
102 * Service Level Connection (SLC) should be established before SCO setup
103 * process.
104 * If SLC haven't been established, this function will return false and
105 * send a request to set up SCO ater HfpManager receive AT+CMER, unless we are
106 * connecting HSP socket rather than HFP socket.
107 *
108 * @param aRunnable Indicate a BluetoothReplyRunnable to execute this
109 * function. The default value is nullpter
110 * @return <code>true</code> if SCO established successfully
111 */
112 bool ConnectSco(BluetoothReplyRunnable* aRunnable = nullptr);
113 bool DisconnectSco();
114 bool ListenSco();
115
116 #ifdef MOZ_B2G_RIL
117 /**
118 * @param aSend A boolean indicates whether we need to notify headset or not
119 */
120 void HandleCallStateChanged(uint32_t aCallIndex, uint16_t aCallState,
121 const nsAString& aError, const nsAString& aNumber,
122 const bool aIsOutgoing, const bool aIsConference,
123 bool aSend);
124 void HandleIccInfoChanged(uint32_t aClientId);
125 void HandleVoiceConnectionChanged(uint32_t aClientId);
126
127 // CDMA-specific functions
128 void UpdateSecondNumber(const nsAString& aNumber);
129 void AnswerWaitingCall();
130 void IgnoreWaitingCall();
131 void ToggleCalls();
132 #endif
133
134 private:
135 class CloseScoTask;
136 class GetVolumeTask;
137 #ifdef MOZ_B2G_RIL
138 class RespondToBLDNTask;
139 class SendRingIndicatorTask;
140 #endif
141
142 friend class CloseScoTask;
143 friend class GetVolumeTask;
144 #ifdef MOZ_B2G_RIL
145 friend class RespondToBLDNTask;
146 friend class SendRingIndicatorTask;
147 #endif
148 friend class BluetoothHfpManagerObserver;
149
150 BluetoothHfpManager();
151 void HandleShutdown();
152 void HandleVolumeChanged(const nsAString& aData);
153
154 bool Init();
155 void Notify(const hal::BatteryInformation& aBatteryInfo);
156 #ifdef MOZ_B2G_RIL
157 void ResetCallArray();
158 uint32_t FindFirstCall(uint16_t aState);
159 uint32_t GetNumberOfCalls(uint16_t aState);
160 uint32_t GetNumberOfConCalls();
161 uint32_t GetNumberOfConCalls(uint16_t aState);
162 PhoneType GetPhoneType(const nsAString& aType);
163 #endif
164
165 void NotifyConnectionStatusChanged(const nsAString& aType);
166 void NotifyDialer(const nsAString& aCommand);
167
168 #ifdef MOZ_B2G_RIL
169 void SendCCWA(const nsAString& aNumber, int aType);
170 bool SendCLCC(const Call& aCall, int aIndex);
171 #endif
172 bool SendCommand(const char* aCommand, uint32_t aValue = 0);
173 bool SendLine(const char* aMessage);
174 #ifdef MOZ_B2G_RIL
175 void UpdateCIND(uint8_t aType, uint8_t aValue, bool aSend = true);
176 #endif
177 void OnScoConnectSuccess();
178 void OnScoConnectError();
179 void OnScoDisconnect();
180
181 int mCurrentVgs;
182 int mCurrentVgm;
183 #ifdef MOZ_B2G_RIL
184 bool mBSIR;
185 bool mCCWA;
186 bool mCLIP;
187 #endif
188 bool mCMEE;
189 bool mCMER;
190 bool mConnectScoRequest;
191 bool mSlcConnected;
192 bool mIsHsp;
193 #ifdef MOZ_B2G_RIL
194 bool mFirstCKPD;
195 int mNetworkSelectionMode;
196 PhoneType mPhoneType;
197 #endif
198 bool mReceiveVgsFlag;
199 #ifdef MOZ_B2G_RIL
200 bool mDialingRequestProcessed;
201 #endif
202 nsString mDeviceAddress;
203 #ifdef MOZ_B2G_RIL
204 nsString mMsisdn;
205 nsString mOperatorName;
206
207 nsTArray<Call> mCurrentCallArray;
208 nsAutoPtr<BluetoothRilListener> mListener;
209 #endif
210 nsRefPtr<BluetoothProfileController> mController;
211 nsRefPtr<BluetoothReplyRunnable> mScoRunnable;
212
213 // If a connection has been established, mSocket will be the socket
214 // communicating with the remote socket. We maintain the invariant that if
215 // mSocket is non-null, mHandsfreeSocket and mHeadsetSocket must be null (and
216 // vice versa).
217 nsRefPtr<BluetoothSocket> mSocket;
218
219 // Server sockets. Once an inbound connection is established, it will hand
220 // over the ownership to mSocket, and get a new server socket while Listen()
221 // is called.
222 nsRefPtr<BluetoothSocket> mHandsfreeSocket;
223 nsRefPtr<BluetoothSocket> mHeadsetSocket;
224 nsRefPtr<BluetoothSocket> mScoSocket;
225 mozilla::ipc::SocketConnectionStatus mScoSocketStatus;
226
227 #ifdef MOZ_B2G_RIL
228 // CDMA-specific variable
229 Call mCdmaSecondCall;
230 #endif
231 };
232
233 END_BLUETOOTH_NAMESPACE
234
235 #endif

mercurial