diff -r f5050f1da672 -r 04becd199f91 javaextensions/bluetooth/bluetoothcommons/inc.s60/bluetoothclientconnection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/bluetooth/bluetoothcommons/inc.s60/bluetoothclientconnection.h Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,260 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef BLUETOOTHCLIENTCONNECTION_H +#define BLUETOOTHCLIENTCONNECTION_H + +#include +#include +#include + +#include "monitor.h" +#include "bluetoothfunctionserver.h" +#include "bluetoothconsts.h" + +#include + +//#define LAUNCH_TYPE_PUSH 3 +//#define LAUNCH_TYPE_JSR 4 + +#define DEFAULT_MTU 672 +namespace java +{ +namespace bluetooth +{ + +const TInt KReceivedBufferSize = 512; + +/** + * BluetoothClientConnection manages all Bluetooth Client operations. + * Responsible for send/receive data. + * + * + */ +class BluetoothClientConnection: public MBluetoothSocketNotifier +{ +public: + OS_IMPORT BluetoothClientConnection(BluetoothFunctionServer* server); + + /** + * Constructor to be used by Server Side connections. + * @param[in] aSocket: Socket got as a result of acceptAndOpen call. + * @param[in] aServer: Handle to the Function Server in the context of which + * aSocket has to be used. Since RObjects are not sharable + * across threads, we need to do this. + * @param[in] aProtocol: Protocol to which the Socket belongs to. + * PROTOCOL_L2CAP or PROTOCOL_RFCOMM + * + * @see Call void init() after construction of the object. + */ + OS_IMPORT BluetoothClientConnection(CBluetoothSocket* aSocket, + BluetoothFunctionServer* aServer); + + OS_IMPORT ~BluetoothClientConnection(); + + /** + * To be used after creating a ClientConnection object from the Server + * implementation. Since the RSocket passed is already initialized during + * connection open, all we do here is to add the object to Active Scheduler. + */ + OS_IMPORT + void BluetoothClientConnection::initialize(int protocol, + TInt64 aRemoteAddr, int aReceiveMtu, int aTransmitMtu); + + /** + * Used to Initialize the protocol specific options of the Bluetooth Socket. + * This needs to be called before a call to Connect is made. + * @param[in] integer value representing the Protocol. + * Defined in BluetoothConsts: PROTOCOL_L2CAP and PROTOCOL_RFCOMM + * @return error code. + */ + OS_IMPORT int init(int protocol); + + /** + * Used to Connect to a remote Bluetooth device. + * The same call serves for both L2CAP and RFCOMM. Just need to make sure we + * call init before making call to connect. With protocol specified. + * + * @param[in] btAddress: Address of the remote device to connect to. + * @param[in] channel: The port at which the remote device is waiting. + * @param[in] authenticate: Indicates if authenticate has to be switched on. + * @param[in] encrypt: Indicates if encryption has to be enabled on socket. + * @param[in] receiveMTU: In case of L2CAP connections, indicates the + * Receive MTU value to be set. For RFCOMM Connections, + * nothing needs to be passed. + * @param[in] transmitMTU: In case of L2CAP connections, indicates the + * Transmit MTU value to be set. For RFCOMM Connections, + * nothing needs to be passed. + * + * @return error code. + */ + OS_IMPORT + int connect(long long btAddress, int channel, bool authenticate, + bool encrypt, int receiveMTU = 0, int transmitMTU = 0); + + + /** + * Receive is used to read data from Bluetooth Socket + * Returns immediately when some data is available in the socket. + * @param[out] inBuf: Pointer to a byte array containing data received from + * the socket. Memory needed will be allocated within + * receive based on the amount of data received. + * @return Number of bytes received. 0 if EOF and - in case of error. + */ + OS_IMPORT int receive(char* &inBuf); + + /** + * Send data to Bluetooth Socket + * Returns immediately when data is sent through the socket. + * @param[in] data: Data that has to be sent through the socket. + * @param[in] length: Length of data that needs to be sent over. + * @return Number of bytes successfully sent. - in case of error. + */ + OS_IMPORT int send(const char* data, int length); + + /** + * Closes the current connection with remote device. + */ + OS_IMPORT void close(); + /** + * Retrieves the remote address of the device the currently connected to. + * @return address of the remote device. + */ + OS_IMPORT long long getRemoteAddress(); + + /** + * Retreives the Transmit MTU of the Connection. This is valid only in case + * of L2CAP Connections. + * @return transmit MTU value. + */ + OS_IMPORT int getTransmitMTU(); + + /** + * Retreives the Receive MTU of the Connection. This is valid only in case + * of L2CAP Connections. + * @return Receive MTU value. + */ + OS_IMPORT int getReceiveMTU(); + + /** + * returns available data. + */ + + OS_IMPORT long available(); + + OS_IMPORT void registerCallback(JNIEnv* ajni, jobject peer); + +public: + // Methods from MBluetoothSocketNotifier + //Notification of an accept complete event + void HandleAcceptCompleteL(TInt err); + + // Notification of a baseband event + void HandleActivateBasebandEventNotifierCompleteL(TInt aErr, + TBTBasebandEventNotification &aEventNotification); + + //Notification of a connection complete event + void HandleConnectCompleteL(TInt err); + + //Notification of a ioctl complete event + void HandleIoctlCompleteL(TInt err); + + //Notification of a receive complete event + void HandleReceiveCompleteL(TInt err); + + //Notification of a send complete event + void HandleSendCompleteL(TInt err); + + //Notification of a shutdown complete event + void HandleShutdownCompleteL(TInt err); + +private: + BluetoothClientConnection(); + + //Used in case of L2CAP Connection + TInt Connect(TInt64 btAddress, TInt channel, TInt authenticate, + TInt encrypt, TInt receiveMTU, TInt transmitMTU); + + TInt ReceiveData(); + TInt SendData(const TDesC8& aData); + void InitL(TInt protocol); + void CloseFs(); + + void makeReadCompleteCallback(); + +private: + // Function Server handle within which the Socket operations have to be + // performed. + BluetoothFunctionServer* mServer; + + // Client socket + CBluetoothSocket *mSocket; + + // Monitor used to Notify on completion of Shutdown. + java::util::Monitor* mShutdownNotifyMonitor; + + // Monitor used to Notify on completion of read. + java::util::Monitor* mReadNotifyMonitor; + + //Holds the read status value. Needed in case of errors + int mReadStatus; + + // Buffer holding received data. + TPtr8 mBuffer; + + // Monitor used to Notify on completion of send. + java::util::Monitor* mSendNotifyMonitor; + + TInt mRequestedRMtu; + TInt mRequestedTMtu; + //Holds the read status value + int mWriteStatus; + + // Knows which protocol the object relates to + int mProtocol; + +private: + int mNegotiatedReceiveMtu; + + int mNegotiatedTransmitMtu; + + TInt64 mRemoteBTAddr; + + // Length of received data + TSockXfrLength mLen; + + // Socket server handle. + RSocketServ mSocketServ; + + TSockXfrLength mSockXfrLength; + + // Monitor used to notify completion of async operations to BlueCoveS60. + java::util::Monitor* mConnectNotifyMonitor; + + TInt mConnectError; + TBool mMakeJavaCallbackOnRead; + + TBool mReadPending; + + TBool mBufferInitialized; + jmethodID mReadCompleteCallback; +}; + +} //end namespace bluetooth +} //end namespace java +#endif // BLUETOOTHCLIENTCONNECTION_H