javaextensions/bluetooth/bluetoothcommons/inc.s60/bluetoothclientconnection.h
branchRCL_3
changeset 19 04becd199f91
child 23 98ccebc37403
--- /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 <e32base.h>
+#include <bt_sock.h>
+#include <btsdp.h>
+
+#include "monitor.h"
+#include "bluetoothfunctionserver.h"
+#include "bluetoothconsts.h"
+
+#include <sys/time.h>
+
+//#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 -<error> 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. -<error> 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