/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 *  Communicate with a peer using NFC-DEP, LLCP, SNEP.
 */
#pragma once
#include <utils/RefBase.h>
#include <utils/StrongPointer.h>
#include "SyncEvent.h"
#include "NfcJniUtil.h"
#include <string>
extern "C"
{
    #include "nfa_p2p_api.h"
    #include "nfa_snep_api.h"
}

class P2pServer;
class P2pClient;
class NfaConn;
#define MAX_NFA_CONNS_PER_SERVER    5

/*****************************************************************************
**
**  Name:           PeerToPeer
**
**  Description:    Communicate with a peer using NFC-DEP, LLCP, SNEP.
**
*****************************************************************************/
class PeerToPeer
{
public:
    typedef unsigned int tJNI_HANDLE;

    /*******************************************************************************
    **
    ** Function:        PeerToPeer
    **
    ** Description:     Initialize member variables.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    PeerToPeer ();


    /*******************************************************************************
    **
    ** Function:        ~PeerToPeer
    **
    ** Description:     Free all resources.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    ~PeerToPeer ();


    /*******************************************************************************
    **
    ** Function:        getInstance
    **
    ** Description:     Get the singleton PeerToPeer object.
    **
    ** Returns:         Singleton PeerToPeer object.
    **
    *******************************************************************************/
    static PeerToPeer& getInstance();


    /*******************************************************************************
    **
    ** Function:        initialize
    **
    ** Description:     Initialize member variables.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void initialize ();


    /*******************************************************************************
    **
    ** Function:        llcpActivatedHandler
    **
    ** Description:     Receive LLLCP-activated event from stack.
    **                  nat: JVM-related data.
    **                  activated: Event data.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void llcpActivatedHandler (nfc_jni_native_data* nativeData, tNFA_LLCP_ACTIVATED& activated);


    /*******************************************************************************
    **
    ** Function:        llcpDeactivatedHandler
    **
    ** Description:     Receive LLLCP-deactivated event from stack.
    **                  nat: JVM-related data.
    **                  deactivated: Event data.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void llcpDeactivatedHandler (nfc_jni_native_data* nativeData, tNFA_LLCP_DEACTIVATED& deactivated);


    /*******************************************************************************
    **
    ** Function:        connectionEventHandler
    **
    ** Description:     Receive events from the stack.
    **                  event: Event code.
    **                  eventData: Event data.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void connectionEventHandler (UINT8 event, tNFA_CONN_EVT_DATA* eventData);


    /*******************************************************************************
    **
    ** Function:        registerServer
    **
    ** Description:     Let a server start listening for peer's connection request.
    **                  jniHandle: Connection handle.
    **                  serviceName: Server's service name.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool registerServer (tJNI_HANDLE jniHandle, const char* serviceName);


    /*******************************************************************************
    **
    ** Function:        deregisterServer
    **
    ** Description:     Stop a P2pServer from listening for peer.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool deregisterServer (tJNI_HANDLE jniHandle);


    /*******************************************************************************
    **
    ** Function:        accept
    **
    ** Description:     Accept a peer's request to connect.
    **                  serverJniHandle: Server's handle.
    **                  connJniHandle: Connection handle.
    **                  maxInfoUnit: Maximum information unit.
    **                  recvWindow: Receive window size.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool accept (tJNI_HANDLE serverJniHandle, tJNI_HANDLE connJniHandle, int maxInfoUnit, int recvWindow);


    /*******************************************************************************
    **
    ** Function:        createClient
    **
    ** Description:     Create a P2pClient object for a new out-bound connection.
    **                  jniHandle: Connection handle.
    **                  miu: Maximum information unit.
    **                  rw: Receive window size.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool createClient (tJNI_HANDLE jniHandle, UINT16 miu, UINT8 rw);


    /*******************************************************************************
    **
    ** Function:        connectConnOriented
    **
    ** Description:     Estabish a connection-oriented connection to a peer.
    **                  jniHandle: Connection handle.
    **                  serviceName: Peer's service name.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool connectConnOriented (tJNI_HANDLE jniHandle, const char* serviceName);


    /*******************************************************************************
    **
    ** Function:        connectConnOriented
    **
    ** Description:     Estabish a connection-oriented connection to a peer.
    **                  jniHandle: Connection handle.
    **                  destinationSap: Peer's service access point.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool connectConnOriented (tJNI_HANDLE jniHandle, UINT8 destinationSap);


    /*******************************************************************************
    **
    ** Function:        send
    **
    ** Description:     Send data to peer.
    **                  jniHandle: Handle of connection.
    **                  buffer: Buffer of data.
    **                  bufferLen: Length of data.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool send (tJNI_HANDLE jniHandle, UINT8* buffer, UINT16 bufferLen);


    /*******************************************************************************
    **
    ** Function:        receive
    **
    ** Description:     Receive data from peer.
    **                  jniHandle: Handle of connection.
    **                  buffer: Buffer to store data.
    **                  bufferLen: Max length of buffer.
    **                  actualLen: Actual length received.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool receive (tJNI_HANDLE jniHandle, UINT8* buffer, UINT16 bufferLen, UINT16& actualLen);


    /*******************************************************************************
    **
    ** Function:        disconnectConnOriented
    **
    ** Description:     Disconnect a connection-oriented connection with peer.
    **                  jniHandle: Handle of connection.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool disconnectConnOriented (tJNI_HANDLE jniHandle);


    /*******************************************************************************
    **
    ** Function:        getRemoteMaxInfoUnit
    **
    ** Description:     Get peer's max information unit.
    **                  jniHandle: Handle of the connection.
    **
    ** Returns:         Peer's max information unit.
    **
    *******************************************************************************/
    UINT16 getRemoteMaxInfoUnit (tJNI_HANDLE jniHandle);


    /*******************************************************************************
    **
    ** Function:        getRemoteRecvWindow
    **
    ** Description:     Get peer's receive window size.
    **                  jniHandle: Handle of the connection.
    **
    ** Returns:         Peer's receive window size.
    **
    *******************************************************************************/
    UINT8 getRemoteRecvWindow (tJNI_HANDLE jniHandle);


    /*******************************************************************************
    **
    ** Function:        setP2pListenMask
    **
    ** Description:     Sets the p2p listen technology mask.
    **                  p2pListenMask: the p2p listen mask to be set?
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void setP2pListenMask (tNFA_TECHNOLOGY_MASK p2pListenMask);

    /*******************************************************************************
    **
    ** Function:        enableP2pListening
    **
    ** Description:     Start/stop polling/listening to peer that supports P2P.
    **                  isEnable: Is enable polling/listening?
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void enableP2pListening (bool isEnable);


    /*******************************************************************************
    **
    ** Function:        handleNfcOnOff
    **
    ** Description:     Handle events related to turning NFC on/off by the user.
    **                  isOn: Is NFC turning on?
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void handleNfcOnOff (bool isOn);


    /*******************************************************************************
    **
    ** Function:        getNextJniHandle
    **
    ** Description:     Get a new JNI handle.
    **
    ** Returns:         A new JNI handle.
    **
    *******************************************************************************/
    tJNI_HANDLE getNewJniHandle ();

    /*******************************************************************************
    **
    ** Function:        nfaServerCallback
    **
    ** Description:     Receive LLCP-related events from the stack.
    **                  p2pEvent: Event code.
    **                  eventData: Event data.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    static void nfaServerCallback  (tNFA_P2P_EVT p2pEvent, tNFA_P2P_EVT_DATA *eventData);


    /*******************************************************************************
    **
    ** Function:        nfaClientCallback
    **
    ** Description:     Receive LLCP-related events from the stack.
    **                  p2pEvent: Event code.
    **                  eventData: Event data.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    static void nfaClientCallback  (tNFA_P2P_EVT p2pEvent, tNFA_P2P_EVT_DATA *eventData);

private:
    static const int sMax = 10;
    static PeerToPeer sP2p;

    // Variables below only accessed from a single thread
    UINT16          mRemoteWKS;                 // Peer's well known services
    bool            mIsP2pListening;            // If P2P listening is enabled or not
    tNFA_TECHNOLOGY_MASK    mP2pListenTechMask; // P2P Listen mask

    // Variable below is protected by mNewJniHandleMutex
    tJNI_HANDLE     mNextJniHandle;

    // Variables below protected by mMutex
    // A note on locking order: mMutex in PeerToPeer is *ALWAYS*
    // locked before any locks / guards in P2pServer / P2pClient
    Mutex                    mMutex;
    android::sp<P2pServer>   mServers [sMax];
    android::sp<P2pClient>   mClients [sMax];

    // Synchronization variables
    SyncEvent       mSetTechEvent;              // completion event for NFA_SetP2pListenTech()
    SyncEvent       mSnepDefaultServerStartStopEvent; // completion event for NFA_SnepStartDefaultServer(), NFA_SnepStopDefaultServer()
    SyncEvent       mSnepRegisterEvent;         // completion event for NFA_SnepRegisterClient()
    Mutex           mDisconnectMutex;           // synchronize the disconnect operation
    Mutex           mNewJniHandleMutex;         // synchronize the creation of a new JNI handle

    /*******************************************************************************
    **
    ** Function:        snepClientCallback
    **
    ** Description:     Receive SNEP-related events from the stack.
    **                  snepEvent: Event code.
    **                  eventData: Event data.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    static void snepClientCallback (tNFA_SNEP_EVT snepEvent, tNFA_SNEP_EVT_DATA *eventData);


    /*******************************************************************************
    **
    ** Function:        ndefTypeCallback
    **
    ** Description:     Receive NDEF-related events from the stack.
    **                  ndefEvent: Event code.
    **                  eventData: Event data.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    static void ndefTypeCallback   (tNFA_NDEF_EVT event, tNFA_NDEF_EVT_DATA *evetnData);


    /*******************************************************************************
    **
    ** Function:        findServer
    **
    ** Description:     Find a PeerToPeer object by connection handle.
    **                  nfaP2pServerHandle: Connectin handle.
    **
    ** Returns:         PeerToPeer object.
    **
    *******************************************************************************/
    android::sp<P2pServer>   findServerLocked (tNFA_HANDLE nfaP2pServerHandle);


    /*******************************************************************************
    **
    ** Function:        findServer
    **
    ** Description:     Find a PeerToPeer object by connection handle.
    **                  serviceName: service name.
    **
    ** Returns:         PeerToPeer object.
    **
    *******************************************************************************/
    android::sp<P2pServer>   findServerLocked (tJNI_HANDLE jniHandle);


    /*******************************************************************************
    **
    ** Function:        findServer
    **
    ** Description:     Find a PeerToPeer object by service name
    **                  serviceName: service name.
    **
    ** Returns:         PeerToPeer object.
    **
    *******************************************************************************/
    android::sp<P2pServer>   findServerLocked (const char *serviceName);


    /*******************************************************************************
    **
    ** Function:        removeServer
    **
    ** Description:     Free resources related to a server.
    **                  jniHandle: Connection handle.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void        removeServer (tJNI_HANDLE jniHandle);


    /*******************************************************************************
    **
    ** Function:        removeConn
    **
    ** Description:     Free resources related to a connection.
    **                  jniHandle: Connection handle.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void        removeConn (tJNI_HANDLE jniHandle);


    /*******************************************************************************
    **
    ** Function:        createDataLinkConn
    **
    ** Description:     Establish a connection-oriented connection to a peer.
    **                  jniHandle: Connection handle.
    **                  serviceName: Peer's service name.
    **                  destinationSap: Peer's service access point.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool        createDataLinkConn (tJNI_HANDLE jniHandle, const char* serviceName, UINT8 destinationSap);


    /*******************************************************************************
    **
    ** Function:        findClient
    **
    ** Description:     Find a PeerToPeer object with a client connection handle.
    **                  nfaConnHandle: Connection handle.
    **
    ** Returns:         PeerToPeer object.
    **
    *******************************************************************************/
    android::sp<P2pClient>   findClient (tNFA_HANDLE nfaConnHandle);


    /*******************************************************************************
    **
    ** Function:        findClient
    **
    ** Description:     Find a PeerToPeer object with a client connection handle.
    **                  jniHandle: Connection handle.
    **
    ** Returns:         PeerToPeer object.
    **
    *******************************************************************************/
    android::sp<P2pClient>   findClient (tJNI_HANDLE jniHandle);


    /*******************************************************************************
    **
    ** Function:        findClientCon
    **
    ** Description:     Find a PeerToPeer object with a client connection handle.
    **                  nfaConnHandle: Connection handle.
    **
    ** Returns:         PeerToPeer object.
    **
    *******************************************************************************/
    android::sp<P2pClient>   findClientCon (tNFA_HANDLE nfaConnHandle);


    /*******************************************************************************
    **
    ** Function:        findConnection
    **
    ** Description:     Find a PeerToPeer object with a connection handle.
    **                  nfaConnHandle: Connection handle.
    **
    ** Returns:         PeerToPeer object.
    **
    *******************************************************************************/
    android::sp<NfaConn>     findConnection (tNFA_HANDLE nfaConnHandle);


    /*******************************************************************************
    **
    ** Function:        findConnection
    **
    ** Description:     Find a PeerToPeer object with a connection handle.
    **                  jniHandle: Connection handle.
    **
    ** Returns:         PeerToPeer object.
    **
    *******************************************************************************/
    android::sp<NfaConn>     findConnection (tJNI_HANDLE jniHandle);
};


/*****************************************************************************
**
**  Name:           NfaConn
**
**  Description:    Store information about a connection related to a peer.
**
*****************************************************************************/
class NfaConn : public android::RefBase
{
public:
    tNFA_HANDLE         mNfaConnHandle;         // NFA handle of the P2P connection
    PeerToPeer::tJNI_HANDLE         mJniHandle;             // JNI handle of the P2P connection
    UINT16              mMaxInfoUnit;
    UINT8               mRecvWindow;
    UINT16              mRemoteMaxInfoUnit;
    UINT8               mRemoteRecvWindow;
    SyncEvent           mReadEvent;             // event for reading
    SyncEvent           mCongEvent;             // event for congestion
    SyncEvent           mDisconnectingEvent;     // event for disconnecting


    /*******************************************************************************
    **
    ** Function:        NfaConn
    **
    ** Description:     Initialize member variables.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    NfaConn();
};


/*****************************************************************************
**
**  Name:           P2pServer
**
**  Description:    Store information about an in-bound connection from a peer.
**
*****************************************************************************/
class P2pServer : public android::RefBase
{
public:
    static const std::string sSnepServiceName;

    tNFA_HANDLE     mNfaP2pServerHandle;    // NFA p2p handle of local server
    PeerToPeer::tJNI_HANDLE     mJniHandle;     // JNI Handle
    SyncEvent       mRegServerEvent;        // for NFA_P2pRegisterServer()
    SyncEvent       mConnRequestEvent;      // for accept()
    std::string     mServiceName;

    /*******************************************************************************
    **
    ** Function:        P2pServer
    **
    ** Description:     Initialize member variables.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    P2pServer (PeerToPeer::tJNI_HANDLE jniHandle, const char* serviceName);

    /*******************************************************************************
    **
    ** Function:        registerWithStack
    **
    ** Description:     Register this server with the stack.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool registerWithStack();

    /*******************************************************************************
    **
    ** Function:        accept
    **
    ** Description:     Accept a peer's request to connect.
    **                  serverJniHandle: Server's handle.
    **                  connJniHandle: Connection handle.
    **                  maxInfoUnit: Maximum information unit.
    **                  recvWindow: Receive window size.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool accept (PeerToPeer::tJNI_HANDLE serverJniHandle, PeerToPeer::tJNI_HANDLE connJniHandle,
            int maxInfoUnit, int recvWindow);

    /*******************************************************************************
    **
    ** Function:        unblockAll
    **
    ** Description:     Unblocks all server connections
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    void unblockAll();

    /*******************************************************************************
    **
    ** Function:        findServerConnection
    **
    ** Description:     Find a P2pServer that has the handle.
    **                  nfaConnHandle: NFA connection handle.
    **
    ** Returns:         P2pServer object.
    **
    *******************************************************************************/
    android::sp<NfaConn> findServerConnection (tNFA_HANDLE nfaConnHandle);

    /*******************************************************************************
    **
    ** Function:        findServerConnection
    **
    ** Description:     Find a P2pServer that has the handle.
    **                  jniHandle: JNI connection handle.
    **
    ** Returns:         P2pServer object.
    **
    *******************************************************************************/
    android::sp<NfaConn> findServerConnection (PeerToPeer::tJNI_HANDLE jniHandle);

    /*******************************************************************************
    **
    ** Function:        removeServerConnection
    **
    ** Description:     Remove a server connection with the provided handle.
    **                  jniHandle: JNI connection handle.
    **
    ** Returns:         True if connection found and removed.
    **
    *******************************************************************************/
    bool removeServerConnection(PeerToPeer::tJNI_HANDLE jniHandle);

private:
    Mutex           mMutex;
    // mServerConn is protected by mMutex
    android::sp<NfaConn>     mServerConn[MAX_NFA_CONNS_PER_SERVER];

    /*******************************************************************************
    **
    ** Function:        allocateConnection
    **
    ** Description:     Allocate a new connection to accept on
    **                  jniHandle: JNI connection handle.
    **
    ** Returns:         Allocated connection object
    **                  NULL if the maximum number of connections was reached
    **
    *******************************************************************************/
    android::sp<NfaConn> allocateConnection (PeerToPeer::tJNI_HANDLE jniHandle);
};


/*****************************************************************************
**
**  Name:           P2pClient
**
**  Description:    Store information about an out-bound connection to a peer.
**
*****************************************************************************/
class P2pClient : public android::RefBase
{
public:
    tNFA_HANDLE           mNfaP2pClientHandle;    // NFA p2p handle of client
    bool                  mIsConnecting;          // Set true while connecting
    android::sp<NfaConn>  mClientConn;
    SyncEvent             mRegisteringEvent;      // For client registration
    SyncEvent             mConnectingEvent;       // for NFA_P2pConnectByName or Sap()
    SyncEvent             mSnepEvent;             // To wait for SNEP completion

    /*******************************************************************************
    **
    ** Function:        P2pClient
    **
    ** Description:     Initialize member variables.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    P2pClient ();


    /*******************************************************************************
    **
    ** Function:        ~P2pClient
    **
    ** Description:     Free all resources.
    **
    ** Returns:         None
    **
    *******************************************************************************/
    ~P2pClient ();


    /*******************************************************************************
    **
    ** Function:        unblock
    **
    ** Description:     Unblocks any threads that are locked on this connection
    **
    ** Returns:         None
    **
    *******************************************************************************/
    void unblock();
};

