gecko/dom/bluetooth2/bluedroid/BluetoothOppManager.h
Jocelyn Liu bbaef4908c Bug 1009347 - Patch 1/4: Make copy of dom/bluetooth for API refinement, f=btian, r=echou
--HG--
rename : dom/bluetooth/BluetoothAdapter.cpp => dom/bluetooth2/BluetoothAdapter.cpp
rename : dom/bluetooth/BluetoothAdapter.h => dom/bluetooth2/BluetoothAdapter.h
rename : dom/bluetooth/BluetoothCommon.h => dom/bluetooth2/BluetoothCommon.h
rename : dom/bluetooth/BluetoothDevice.cpp => dom/bluetooth2/BluetoothDevice.cpp
rename : dom/bluetooth/BluetoothDevice.h => dom/bluetooth2/BluetoothDevice.h
rename : dom/bluetooth/BluetoothHfpManagerBase.h => dom/bluetooth2/BluetoothHfpManagerBase.h
rename : dom/bluetooth/BluetoothHidManager.cpp => dom/bluetooth2/BluetoothHidManager.cpp
rename : dom/bluetooth/BluetoothHidManager.h => dom/bluetooth2/BluetoothHidManager.h
rename : dom/bluetooth/BluetoothManager.cpp => dom/bluetooth2/BluetoothManager.cpp
rename : dom/bluetooth/BluetoothManager.h => dom/bluetooth2/BluetoothManager.h
rename : dom/bluetooth/BluetoothProfileController.cpp => dom/bluetooth2/BluetoothProfileController.cpp
rename : dom/bluetooth/BluetoothProfileController.h => dom/bluetooth2/BluetoothProfileController.h
rename : dom/bluetooth/BluetoothProfileManagerBase.h => dom/bluetooth2/BluetoothProfileManagerBase.h
rename : dom/bluetooth/BluetoothPropertyContainer.cpp => dom/bluetooth2/BluetoothPropertyContainer.cpp
rename : dom/bluetooth/BluetoothPropertyContainer.h => dom/bluetooth2/BluetoothPropertyContainer.h
rename : dom/bluetooth/BluetoothReplyRunnable.cpp => dom/bluetooth2/BluetoothReplyRunnable.cpp
rename : dom/bluetooth/BluetoothReplyRunnable.h => dom/bluetooth2/BluetoothReplyRunnable.h
rename : dom/bluetooth/BluetoothRilListener.cpp => dom/bluetooth2/BluetoothRilListener.cpp
rename : dom/bluetooth/BluetoothRilListener.h => dom/bluetooth2/BluetoothRilListener.h
rename : dom/bluetooth/BluetoothService.cpp => dom/bluetooth2/BluetoothService.cpp
rename : dom/bluetooth/BluetoothService.h => dom/bluetooth2/BluetoothService.h
rename : dom/bluetooth/BluetoothSocketObserver.h => dom/bluetooth2/BluetoothSocketObserver.h
rename : dom/bluetooth/BluetoothUuid.cpp => dom/bluetooth2/BluetoothUuid.cpp
rename : dom/bluetooth/BluetoothUuid.h => dom/bluetooth2/BluetoothUuid.h
rename : dom/bluetooth/Makefile.in => dom/bluetooth2/Makefile.in
rename : dom/bluetooth/ObexBase.cpp => dom/bluetooth2/ObexBase.cpp
rename : dom/bluetooth/ObexBase.h => dom/bluetooth2/ObexBase.h
rename : dom/bluetooth/bluedroid/BluetoothA2dpManager.cpp => dom/bluetooth2/bluedroid/BluetoothA2dpManager.cpp
rename : dom/bluetooth/bluedroid/BluetoothA2dpManager.h => dom/bluetooth2/bluedroid/BluetoothA2dpManager.h
rename : dom/bluetooth/bluedroid/BluetoothOppManager.cpp => dom/bluetooth2/bluedroid/BluetoothOppManager.cpp
rename : dom/bluetooth/bluedroid/BluetoothOppManager.h => dom/bluetooth2/bluedroid/BluetoothOppManager.h
rename : dom/bluetooth/bluedroid/BluetoothServiceBluedroid.cpp => dom/bluetooth2/bluedroid/BluetoothServiceBluedroid.cpp
rename : dom/bluetooth/bluedroid/BluetoothServiceBluedroid.h => dom/bluetooth2/bluedroid/BluetoothServiceBluedroid.h
rename : dom/bluetooth/bluedroid/BluetoothSocket.cpp => dom/bluetooth2/bluedroid/BluetoothSocket.cpp
rename : dom/bluetooth/bluedroid/BluetoothSocket.h => dom/bluetooth2/bluedroid/BluetoothSocket.h
rename : dom/bluetooth/bluedroid/BluetoothUtils.cpp => dom/bluetooth2/bluedroid/BluetoothUtils.cpp
rename : dom/bluetooth/bluedroid/BluetoothUtils.h => dom/bluetooth2/bluedroid/BluetoothUtils.h
rename : dom/bluetooth/bluedroid/b2g_bdroid_buildcfg.h => dom/bluetooth2/bluedroid/b2g_bdroid_buildcfg.h
rename : dom/bluetooth/bluedroid/hfp-fallback/BluetoothHfpManager.cpp => dom/bluetooth2/bluedroid/hfp-fallback/BluetoothHfpManager.cpp
rename : dom/bluetooth/bluedroid/hfp-fallback/BluetoothHfpManager.h => dom/bluetooth2/bluedroid/hfp-fallback/BluetoothHfpManager.h
rename : dom/bluetooth/bluedroid/hfp/BluetoothHfpManager.cpp => dom/bluetooth2/bluedroid/hfp/BluetoothHfpManager.cpp
rename : dom/bluetooth/bluedroid/hfp/BluetoothHfpManager.h => dom/bluetooth2/bluedroid/hfp/BluetoothHfpManager.h
rename : dom/bluetooth/bluez/BluetoothA2dpManager.cpp => dom/bluetooth2/bluez/BluetoothA2dpManager.cpp
rename : dom/bluetooth/bluez/BluetoothA2dpManager.h => dom/bluetooth2/bluez/BluetoothA2dpManager.h
rename : dom/bluetooth/bluez/BluetoothDBusService.cpp => dom/bluetooth2/bluez/BluetoothDBusService.cpp
rename : dom/bluetooth/bluez/BluetoothDBusService.h => dom/bluetooth2/bluez/BluetoothDBusService.h
rename : dom/bluetooth/bluez/BluetoothHfpManager.cpp => dom/bluetooth2/bluez/BluetoothHfpManager.cpp
rename : dom/bluetooth/bluez/BluetoothHfpManager.h => dom/bluetooth2/bluez/BluetoothHfpManager.h
rename : dom/bluetooth/bluez/BluetoothOppManager.cpp => dom/bluetooth2/bluez/BluetoothOppManager.cpp
rename : dom/bluetooth/bluez/BluetoothOppManager.h => dom/bluetooth2/bluez/BluetoothOppManager.h
rename : dom/bluetooth/bluez/BluetoothSocket.cpp => dom/bluetooth2/bluez/BluetoothSocket.cpp
rename : dom/bluetooth/bluez/BluetoothSocket.h => dom/bluetooth2/bluez/BluetoothSocket.h
rename : dom/bluetooth/bluez/BluetoothUnixSocketConnector.cpp => dom/bluetooth2/bluez/BluetoothUnixSocketConnector.cpp
rename : dom/bluetooth/bluez/BluetoothUnixSocketConnector.h => dom/bluetooth2/bluez/BluetoothUnixSocketConnector.h
rename : dom/bluetooth/bluez/BluetoothUtils.cpp => dom/bluetooth2/bluez/BluetoothUtils.cpp
rename : dom/bluetooth/bluez/BluetoothUtils.h => dom/bluetooth2/bluez/BluetoothUtils.h
rename : dom/bluetooth/ipc/BluetoothChild.cpp => dom/bluetooth2/ipc/BluetoothChild.cpp
rename : dom/bluetooth/ipc/BluetoothChild.h => dom/bluetooth2/ipc/BluetoothChild.h
rename : dom/bluetooth/ipc/BluetoothMessageUtils.h => dom/bluetooth2/ipc/BluetoothMessageUtils.h
rename : dom/bluetooth/ipc/BluetoothParent.cpp => dom/bluetooth2/ipc/BluetoothParent.cpp
rename : dom/bluetooth/ipc/BluetoothParent.h => dom/bluetooth2/ipc/BluetoothParent.h
rename : dom/bluetooth/ipc/BluetoothServiceChildProcess.cpp => dom/bluetooth2/ipc/BluetoothServiceChildProcess.cpp
rename : dom/bluetooth/ipc/BluetoothServiceChildProcess.h => dom/bluetooth2/ipc/BluetoothServiceChildProcess.h
rename : dom/bluetooth/ipc/BluetoothTypes.ipdlh => dom/bluetooth2/ipc/BluetoothTypes.ipdlh
rename : dom/bluetooth/ipc/PBluetooth.ipdl => dom/bluetooth2/ipc/PBluetooth.ipdl
rename : dom/bluetooth/ipc/PBluetoothRequest.ipdl => dom/bluetooth2/ipc/PBluetoothRequest.ipdl
rename : dom/bluetooth/moz.build => dom/bluetooth2/moz.build
rename : dom/bluetooth/tests/marionette/head.js => dom/bluetooth2/tests/marionette/head.js
rename : dom/bluetooth/tests/marionette/manifest.ini => dom/bluetooth2/tests/marionette/manifest.ini
rename : dom/bluetooth/tests/marionette/test_dom_BluetoothAdapter_discovery.js => dom/bluetooth2/tests/marionette/test_dom_BluetoothAdapter_discovery.js
rename : dom/bluetooth/tests/marionette/test_dom_BluetoothAdapter_getters.js => dom/bluetooth2/tests/marionette/test_dom_BluetoothAdapter_getters.js
rename : dom/bluetooth/tests/marionette/test_dom_BluetoothAdapter_setters.js => dom/bluetooth2/tests/marionette/test_dom_BluetoothAdapter_setters.js
rename : dom/bluetooth/tests/marionette/test_dom_BluetoothManager_adapteradded.js => dom/bluetooth2/tests/marionette/test_dom_BluetoothManager_adapteradded.js
rename : dom/bluetooth/tests/marionette/test_dom_BluetoothManager_enabled.js => dom/bluetooth2/tests/marionette/test_dom_BluetoothManager_enabled.js
2014-05-21 14:11:31 +08:00

221 lines
6.3 KiB
C++

/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_bluetooth_bluetoothoppmanager_h__
#define mozilla_dom_bluetooth_bluetoothoppmanager_h__
#include "BluetoothCommon.h"
#include "BluetoothProfileManagerBase.h"
#include "BluetoothSocketObserver.h"
#include "DeviceStorage.h"
#include "mozilla/dom/ipc/Blob.h"
#include "mozilla/ipc/UnixSocket.h"
#include "nsCOMArray.h"
class nsIOutputStream;
class nsIInputStream;
class nsIVolumeMountLock;
BEGIN_BLUETOOTH_NAMESPACE
class BluetoothSocket;
class ObexHeaderSet;
class SendFileBatch;
class BluetoothOppManager : public BluetoothSocketObserver
, public BluetoothProfileManagerBase
{
public:
BT_DECL_PROFILE_MGR_BASE
virtual void GetName(nsACString& aName)
{
aName.AssignLiteral("OPP");
}
static const int MAX_PACKET_LENGTH = 0xFFFE;
virtual ~BluetoothOppManager();
static BluetoothOppManager* Get();
void ClientDataHandler(mozilla::ipc::UnixSocketRawData* aMessage);
void ServerDataHandler(mozilla::ipc::UnixSocketRawData* aMessage);
bool Listen();
bool SendFile(const nsAString& aDeviceAddress, BlobParent* aActor);
bool SendFile(const nsAString& aDeviceAddress, nsIDOMBlob* aBlob);
bool StopSendingFile();
bool ConfirmReceivingFile(bool aConfirm);
void SendConnectRequest();
void SendPutHeaderRequest(const nsAString& aFileName, int aFileSize);
void SendPutRequest(uint8_t* aFileBody, int aFileBodyLength);
void SendPutFinalRequest();
void SendDisconnectRequest();
void ExtractPacketHeaders(const ObexHeaderSet& aHeader);
bool ExtractBlobHeaders();
void CheckPutFinal(uint32_t aNumRead);
// The following functions are inherited from BluetoothSocketObserver
void ReceiveSocketData(
BluetoothSocket* aSocket,
nsAutoPtr<mozilla::ipc::UnixSocketRawData>& aMessage) MOZ_OVERRIDE;
virtual void OnSocketConnectSuccess(BluetoothSocket* aSocket) MOZ_OVERRIDE;
virtual void OnSocketConnectError(BluetoothSocket* aSocket) MOZ_OVERRIDE;
virtual void OnSocketDisconnect(BluetoothSocket* aSocket) MOZ_OVERRIDE;
private:
BluetoothOppManager();
bool Init();
void HandleShutdown();
void StartFileTransfer();
void StartSendingNextFile();
void FileTransferComplete();
void UpdateProgress();
void ReceivingFileConfirmation();
bool CreateFile();
bool WriteToFile(const uint8_t* aData, int aDataLength);
void DeleteReceivedFile();
void ReplyToConnect();
void ReplyToDisconnectOrAbort();
void ReplyToPut(bool aFinal, bool aContinue);
void ReplyError(uint8_t aError);
void AfterOppConnected();
void AfterFirstPut();
void AfterOppDisconnected();
void ValidateFileName();
bool IsReservedChar(char16_t c);
void ClearQueue();
void RetrieveSentFileName();
void NotifyAboutFileChange();
bool AcquireSdcardMountLock();
void SendObexData(uint8_t* aData, uint8_t aOpcode, int aSize);
void AppendBlobToSend(const nsAString& aDeviceAddress, nsIDOMBlob* aBlob);
void DiscardBlobsToSend();
bool ProcessNextBatch();
void ConnectInternal(const nsAString& aDeviceAddress);
/**
* Usually we won't get a full PUT packet in one operation, which means that
* a packet may be devided into several parts and BluetoothOppManager should
* be in charge of assembling.
*
* @return true if a packet has been fully received.
* false if the received length exceeds/not reaches the expected
* length.
*/
bool ComposePacket(uint8_t aOpCode,
mozilla::ipc::UnixSocketRawData* aMessage);
/**
* OBEX session status.
* Set when OBEX session is established.
*/
bool mConnected;
nsString mDeviceAddress;
/**
* Remote information
*/
uint8_t mRemoteObexVersion;
uint8_t mRemoteConnectionFlags;
int mRemoteMaxPacketLength;
/**
* For sending files, we decide our next action based on current command and
* previous one.
* For receiving files, we don't need previous command and it is set to 0
* as a default value.
*/
int mLastCommand;
int mPacketLength;
int mPutPacketReceivedLength;
int mBodySegmentLength;
int mUpdateProgressCounter;
/**
* When it is true and the target service on target device couldn't be found,
* refreshing SDP records is necessary.
*/
bool mNeedsUpdatingSdpRecords;
/**
* Set when StopSendingFile() is called.
*/
bool mAbortFlag;
/**
* Set when receiving the first PUT packet of a new file
*/
bool mNewFileFlag;
/**
* Set when receiving a PutFinal packet
*/
bool mPutFinalFlag;
/**
* Set when FileTransferComplete() is called
*/
bool mSendTransferCompleteFlag;
/**
* Set when a transfer is successfully completed.
*/
bool mSuccessFlag;
/**
* True: Receive file (Server)
* False: Send file (Client)
*/
bool mIsServer;
/**
* Set when receiving the first PUT packet and wait for
* ConfirmReceivingFile() to be called.
*/
bool mWaitingForConfirmationFlag;
nsString mFileName;
nsString mContentType;
uint32_t mFileLength;
uint32_t mSentFileLength;
bool mWaitingToSendPutFinal;
nsAutoArrayPtr<uint8_t> mBodySegment;
nsAutoArrayPtr<uint8_t> mReceivedDataBuffer;
int mCurrentBlobIndex;
nsCOMPtr<nsIDOMBlob> mBlob;
nsTArray<SendFileBatch> mBatches;
/**
* A seperate member thread is required because our read calls can block
* execution, which is not allowed to happen on the IOThread.
*/
nsCOMPtr<nsIThread> mReadFileThread;
nsCOMPtr<nsIOutputStream> mOutputStream;
nsCOMPtr<nsIInputStream> mInputStream;
nsCOMPtr<nsIVolumeMountLock> mMountLock;
nsRefPtr<DeviceStorageFile> mDsFile;
// If a connection has been established, mSocket will be the socket
// communicating with the remote socket. We maintain the invariant that if
// mSocket is non-null, mServerSocket must be null (and vice versa).
nsRefPtr<BluetoothSocket> mSocket;
// Server sockets. Once an inbound connection is established, it will hand
// over the ownership to mSocket, and get a new server socket while Listen()
// is called.
nsRefPtr<BluetoothSocket> mServerSocket;
};
END_BLUETOOTH_NAMESPACE
#endif