Home | History | Annotate | Download | only in jni
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*
     18  *  Communicate with a peer using NFC-DEP, LLCP, SNEP.
     19  */
     20 #pragma once
     21 #include <utils/RefBase.h>
     22 #include <utils/StrongPointer.h>
     23 #include "SyncEvent.h"
     24 #include "NfcJniUtil.h"
     25 #include <string>
     26 extern "C"
     27 {
     28     #include "nfa_p2p_api.h"
     29     #include "nfa_snep_api.h"
     30 }
     31 
     32 class P2pServer;
     33 class P2pClient;
     34 class NfaConn;
     35 #define MAX_NFA_CONNS_PER_SERVER    5
     36 
     37 /*****************************************************************************
     38 **
     39 **  Name:           PeerToPeer
     40 **
     41 **  Description:    Communicate with a peer using NFC-DEP, LLCP, SNEP.
     42 **
     43 *****************************************************************************/
     44 class PeerToPeer
     45 {
     46 public:
     47     typedef unsigned int tJNI_HANDLE;
     48 
     49     /*******************************************************************************
     50     **
     51     ** Function:        PeerToPeer
     52     **
     53     ** Description:     Initialize member variables.
     54     **
     55     ** Returns:         None
     56     **
     57     *******************************************************************************/
     58     PeerToPeer ();
     59 
     60 
     61     /*******************************************************************************
     62     **
     63     ** Function:        ~PeerToPeer
     64     **
     65     ** Description:     Free all resources.
     66     **
     67     ** Returns:         None
     68     **
     69     *******************************************************************************/
     70     ~PeerToPeer ();
     71 
     72 
     73     /*******************************************************************************
     74     **
     75     ** Function:        getInstance
     76     **
     77     ** Description:     Get the singleton PeerToPeer object.
     78     **
     79     ** Returns:         Singleton PeerToPeer object.
     80     **
     81     *******************************************************************************/
     82     static PeerToPeer& getInstance();
     83 
     84 
     85     /*******************************************************************************
     86     **
     87     ** Function:        initialize
     88     **
     89     ** Description:     Initialize member variables.
     90     **
     91     ** Returns:         None
     92     **
     93     *******************************************************************************/
     94     void initialize ();
     95 
     96 
     97     /*******************************************************************************
     98     **
     99     ** Function:        llcpActivatedHandler
    100     **
    101     ** Description:     Receive LLLCP-activated event from stack.
    102     **                  nat: JVM-related data.
    103     **                  activated: Event data.
    104     **
    105     ** Returns:         None
    106     **
    107     *******************************************************************************/
    108     void llcpActivatedHandler (nfc_jni_native_data* nativeData, tNFA_LLCP_ACTIVATED& activated);
    109 
    110 
    111     /*******************************************************************************
    112     **
    113     ** Function:        llcpDeactivatedHandler
    114     **
    115     ** Description:     Receive LLLCP-deactivated event from stack.
    116     **                  nat: JVM-related data.
    117     **                  deactivated: Event data.
    118     **
    119     ** Returns:         None
    120     **
    121     *******************************************************************************/
    122     void llcpDeactivatedHandler (nfc_jni_native_data* nativeData, tNFA_LLCP_DEACTIVATED& deactivated);
    123 
    124 
    125     /*******************************************************************************
    126     **
    127     ** Function:        connectionEventHandler
    128     **
    129     ** Description:     Receive events from the stack.
    130     **                  event: Event code.
    131     **                  eventData: Event data.
    132     **
    133     ** Returns:         None
    134     **
    135     *******************************************************************************/
    136     void connectionEventHandler (UINT8 event, tNFA_CONN_EVT_DATA* eventData);
    137 
    138 
    139     /*******************************************************************************
    140     **
    141     ** Function:        registerServer
    142     **
    143     ** Description:     Let a server start listening for peer's connection request.
    144     **                  jniHandle: Connection handle.
    145     **                  serviceName: Server's service name.
    146     **
    147     ** Returns:         True if ok.
    148     **
    149     *******************************************************************************/
    150     bool registerServer (tJNI_HANDLE jniHandle, const char* serviceName);
    151 
    152 
    153     /*******************************************************************************
    154     **
    155     ** Function:        deregisterServer
    156     **
    157     ** Description:     Stop a P2pServer from listening for peer.
    158     **
    159     ** Returns:         True if ok.
    160     **
    161     *******************************************************************************/
    162     bool deregisterServer (tJNI_HANDLE jniHandle);
    163 
    164 
    165     /*******************************************************************************
    166     **
    167     ** Function:        accept
    168     **
    169     ** Description:     Accept a peer's request to connect.
    170     **                  serverJniHandle: Server's handle.
    171     **                  connJniHandle: Connection handle.
    172     **                  maxInfoUnit: Maximum information unit.
    173     **                  recvWindow: Receive window size.
    174     **
    175     ** Returns:         True if ok.
    176     **
    177     *******************************************************************************/
    178     bool accept (tJNI_HANDLE serverJniHandle, tJNI_HANDLE connJniHandle, int maxInfoUnit, int recvWindow);
    179 
    180 
    181     /*******************************************************************************
    182     **
    183     ** Function:        createClient
    184     **
    185     ** Description:     Create a P2pClient object for a new out-bound connection.
    186     **                  jniHandle: Connection handle.
    187     **                  miu: Maximum information unit.
    188     **                  rw: Receive window size.
    189     **
    190     ** Returns:         True if ok.
    191     **
    192     *******************************************************************************/
    193     bool createClient (tJNI_HANDLE jniHandle, UINT16 miu, UINT8 rw);
    194 
    195 
    196     /*******************************************************************************
    197     **
    198     ** Function:        connectConnOriented
    199     **
    200     ** Description:     Estabish a connection-oriented connection to a peer.
    201     **                  jniHandle: Connection handle.
    202     **                  serviceName: Peer's service name.
    203     **
    204     ** Returns:         True if ok.
    205     **
    206     *******************************************************************************/
    207     bool connectConnOriented (tJNI_HANDLE jniHandle, const char* serviceName);
    208 
    209 
    210     /*******************************************************************************
    211     **
    212     ** Function:        connectConnOriented
    213     **
    214     ** Description:     Estabish a connection-oriented connection to a peer.
    215     **                  jniHandle: Connection handle.
    216     **                  destinationSap: Peer's service access point.
    217     **
    218     ** Returns:         True if ok.
    219     **
    220     *******************************************************************************/
    221     bool connectConnOriented (tJNI_HANDLE jniHandle, UINT8 destinationSap);
    222 
    223 
    224     /*******************************************************************************
    225     **
    226     ** Function:        send
    227     **
    228     ** Description:     Send data to peer.
    229     **                  jniHandle: Handle of connection.
    230     **                  buffer: Buffer of data.
    231     **                  bufferLen: Length of data.
    232     **
    233     ** Returns:         True if ok.
    234     **
    235     *******************************************************************************/
    236     bool send (tJNI_HANDLE jniHandle, UINT8* buffer, UINT16 bufferLen);
    237 
    238 
    239     /*******************************************************************************
    240     **
    241     ** Function:        receive
    242     **
    243     ** Description:     Receive data from peer.
    244     **                  jniHandle: Handle of connection.
    245     **                  buffer: Buffer to store data.
    246     **                  bufferLen: Max length of buffer.
    247     **                  actualLen: Actual length received.
    248     **
    249     ** Returns:         True if ok.
    250     **
    251     *******************************************************************************/
    252     bool receive (tJNI_HANDLE jniHandle, UINT8* buffer, UINT16 bufferLen, UINT16& actualLen);
    253 
    254 
    255     /*******************************************************************************
    256     **
    257     ** Function:        disconnectConnOriented
    258     **
    259     ** Description:     Disconnect a connection-oriented connection with peer.
    260     **                  jniHandle: Handle of connection.
    261     **
    262     ** Returns:         True if ok.
    263     **
    264     *******************************************************************************/
    265     bool disconnectConnOriented (tJNI_HANDLE jniHandle);
    266 
    267 
    268     /*******************************************************************************
    269     **
    270     ** Function:        getRemoteMaxInfoUnit
    271     **
    272     ** Description:     Get peer's max information unit.
    273     **                  jniHandle: Handle of the connection.
    274     **
    275     ** Returns:         Peer's max information unit.
    276     **
    277     *******************************************************************************/
    278     UINT16 getRemoteMaxInfoUnit (tJNI_HANDLE jniHandle);
    279 
    280 
    281     /*******************************************************************************
    282     **
    283     ** Function:        getRemoteRecvWindow
    284     **
    285     ** Description:     Get peer's receive window size.
    286     **                  jniHandle: Handle of the connection.
    287     **
    288     ** Returns:         Peer's receive window size.
    289     **
    290     *******************************************************************************/
    291     UINT8 getRemoteRecvWindow (tJNI_HANDLE jniHandle);
    292 
    293 
    294     /*******************************************************************************
    295     **
    296     ** Function:        setP2pListenMask
    297     **
    298     ** Description:     Sets the p2p listen technology mask.
    299     **                  p2pListenMask: the p2p listen mask to be set?
    300     **
    301     ** Returns:         None
    302     **
    303     *******************************************************************************/
    304     void setP2pListenMask (tNFA_TECHNOLOGY_MASK p2pListenMask);
    305 
    306     /*******************************************************************************
    307     **
    308     ** Function:        enableP2pListening
    309     **
    310     ** Description:     Start/stop polling/listening to peer that supports P2P.
    311     **                  isEnable: Is enable polling/listening?
    312     **
    313     ** Returns:         None
    314     **
    315     *******************************************************************************/
    316     void enableP2pListening (bool isEnable);
    317 
    318 
    319     /*******************************************************************************
    320     **
    321     ** Function:        handleNfcOnOff
    322     **
    323     ** Description:     Handle events related to turning NFC on/off by the user.
    324     **                  isOn: Is NFC turning on?
    325     **
    326     ** Returns:         None
    327     **
    328     *******************************************************************************/
    329     void handleNfcOnOff (bool isOn);
    330 
    331 
    332     /*******************************************************************************
    333     **
    334     ** Function:        getNextJniHandle
    335     **
    336     ** Description:     Get a new JNI handle.
    337     **
    338     ** Returns:         A new JNI handle.
    339     **
    340     *******************************************************************************/
    341     tJNI_HANDLE getNewJniHandle ();
    342 
    343     /*******************************************************************************
    344     **
    345     ** Function:        nfaServerCallback
    346     **
    347     ** Description:     Receive LLCP-related events from the stack.
    348     **                  p2pEvent: Event code.
    349     **                  eventData: Event data.
    350     **
    351     ** Returns:         None
    352     **
    353     *******************************************************************************/
    354     static void nfaServerCallback  (tNFA_P2P_EVT p2pEvent, tNFA_P2P_EVT_DATA *eventData);
    355 
    356 
    357     /*******************************************************************************
    358     **
    359     ** Function:        nfaClientCallback
    360     **
    361     ** Description:     Receive LLCP-related events from the stack.
    362     **                  p2pEvent: Event code.
    363     **                  eventData: Event data.
    364     **
    365     ** Returns:         None
    366     **
    367     *******************************************************************************/
    368     static void nfaClientCallback  (tNFA_P2P_EVT p2pEvent, tNFA_P2P_EVT_DATA *eventData);
    369 
    370 private:
    371     static const int sMax = 10;
    372     static PeerToPeer sP2p;
    373 
    374     // Variables below only accessed from a single thread
    375     UINT16          mRemoteWKS;                 // Peer's well known services
    376     bool            mIsP2pListening;            // If P2P listening is enabled or not
    377     tNFA_TECHNOLOGY_MASK    mP2pListenTechMask; // P2P Listen mask
    378 
    379     // Variable below is protected by mNewJniHandleMutex
    380     tJNI_HANDLE     mNextJniHandle;
    381 
    382     // Variables below protected by mMutex
    383     // A note on locking order: mMutex in PeerToPeer is *ALWAYS*
    384     // locked before any locks / guards in P2pServer / P2pClient
    385     Mutex                    mMutex;
    386     android::sp<P2pServer>   mServers [sMax];
    387     android::sp<P2pClient>   mClients [sMax];
    388 
    389     // Synchronization variables
    390     SyncEvent       mSetTechEvent;              // completion event for NFA_SetP2pListenTech()
    391     SyncEvent       mSnepDefaultServerStartStopEvent; // completion event for NFA_SnepStartDefaultServer(), NFA_SnepStopDefaultServer()
    392     SyncEvent       mSnepRegisterEvent;         // completion event for NFA_SnepRegisterClient()
    393     Mutex           mDisconnectMutex;           // synchronize the disconnect operation
    394     Mutex           mNewJniHandleMutex;         // synchronize the creation of a new JNI handle
    395 
    396     /*******************************************************************************
    397     **
    398     ** Function:        snepClientCallback
    399     **
    400     ** Description:     Receive SNEP-related events from the stack.
    401     **                  snepEvent: Event code.
    402     **                  eventData: Event data.
    403     **
    404     ** Returns:         None
    405     **
    406     *******************************************************************************/
    407     static void snepClientCallback (tNFA_SNEP_EVT snepEvent, tNFA_SNEP_EVT_DATA *eventData);
    408 
    409 
    410     /*******************************************************************************
    411     **
    412     ** Function:        ndefTypeCallback
    413     **
    414     ** Description:     Receive NDEF-related events from the stack.
    415     **                  ndefEvent: Event code.
    416     **                  eventData: Event data.
    417     **
    418     ** Returns:         None
    419     **
    420     *******************************************************************************/
    421     static void ndefTypeCallback   (tNFA_NDEF_EVT event, tNFA_NDEF_EVT_DATA *evetnData);
    422 
    423 
    424     /*******************************************************************************
    425     **
    426     ** Function:        findServer
    427     **
    428     ** Description:     Find a PeerToPeer object by connection handle.
    429     **                  nfaP2pServerHandle: Connectin handle.
    430     **
    431     ** Returns:         PeerToPeer object.
    432     **
    433     *******************************************************************************/
    434     android::sp<P2pServer>   findServerLocked (tNFA_HANDLE nfaP2pServerHandle);
    435 
    436 
    437     /*******************************************************************************
    438     **
    439     ** Function:        findServer
    440     **
    441     ** Description:     Find a PeerToPeer object by connection handle.
    442     **                  serviceName: service name.
    443     **
    444     ** Returns:         PeerToPeer object.
    445     **
    446     *******************************************************************************/
    447     android::sp<P2pServer>   findServerLocked (tJNI_HANDLE jniHandle);
    448 
    449 
    450     /*******************************************************************************
    451     **
    452     ** Function:        findServer
    453     **
    454     ** Description:     Find a PeerToPeer object by service name
    455     **                  serviceName: service name.
    456     **
    457     ** Returns:         PeerToPeer object.
    458     **
    459     *******************************************************************************/
    460     android::sp<P2pServer>   findServerLocked (const char *serviceName);
    461 
    462 
    463     /*******************************************************************************
    464     **
    465     ** Function:        removeServer
    466     **
    467     ** Description:     Free resources related to a server.
    468     **                  jniHandle: Connection handle.
    469     **
    470     ** Returns:         None
    471     **
    472     *******************************************************************************/
    473     void        removeServer (tJNI_HANDLE jniHandle);
    474 
    475 
    476     /*******************************************************************************
    477     **
    478     ** Function:        removeConn
    479     **
    480     ** Description:     Free resources related to a connection.
    481     **                  jniHandle: Connection handle.
    482     **
    483     ** Returns:         None
    484     **
    485     *******************************************************************************/
    486     void        removeConn (tJNI_HANDLE jniHandle);
    487 
    488 
    489     /*******************************************************************************
    490     **
    491     ** Function:        createDataLinkConn
    492     **
    493     ** Description:     Establish a connection-oriented connection to a peer.
    494     **                  jniHandle: Connection handle.
    495     **                  serviceName: Peer's service name.
    496     **                  destinationSap: Peer's service access point.
    497     **
    498     ** Returns:         True if ok.
    499     **
    500     *******************************************************************************/
    501     bool        createDataLinkConn (tJNI_HANDLE jniHandle, const char* serviceName, UINT8 destinationSap);
    502 
    503 
    504     /*******************************************************************************
    505     **
    506     ** Function:        findClient
    507     **
    508     ** Description:     Find a PeerToPeer object with a client connection handle.
    509     **                  nfaConnHandle: Connection handle.
    510     **
    511     ** Returns:         PeerToPeer object.
    512     **
    513     *******************************************************************************/
    514     android::sp<P2pClient>   findClient (tNFA_HANDLE nfaConnHandle);
    515 
    516 
    517     /*******************************************************************************
    518     **
    519     ** Function:        findClient
    520     **
    521     ** Description:     Find a PeerToPeer object with a client connection handle.
    522     **                  jniHandle: Connection handle.
    523     **
    524     ** Returns:         PeerToPeer object.
    525     **
    526     *******************************************************************************/
    527     android::sp<P2pClient>   findClient (tJNI_HANDLE jniHandle);
    528 
    529 
    530     /*******************************************************************************
    531     **
    532     ** Function:        findClientCon
    533     **
    534     ** Description:     Find a PeerToPeer object with a client connection handle.
    535     **                  nfaConnHandle: Connection handle.
    536     **
    537     ** Returns:         PeerToPeer object.
    538     **
    539     *******************************************************************************/
    540     android::sp<P2pClient>   findClientCon (tNFA_HANDLE nfaConnHandle);
    541 
    542 
    543     /*******************************************************************************
    544     **
    545     ** Function:        findConnection
    546     **
    547     ** Description:     Find a PeerToPeer object with a connection handle.
    548     **                  nfaConnHandle: Connection handle.
    549     **
    550     ** Returns:         PeerToPeer object.
    551     **
    552     *******************************************************************************/
    553     android::sp<NfaConn>     findConnection (tNFA_HANDLE nfaConnHandle);
    554 
    555 
    556     /*******************************************************************************
    557     **
    558     ** Function:        findConnection
    559     **
    560     ** Description:     Find a PeerToPeer object with a connection handle.
    561     **                  jniHandle: Connection handle.
    562     **
    563     ** Returns:         PeerToPeer object.
    564     **
    565     *******************************************************************************/
    566     android::sp<NfaConn>     findConnection (tJNI_HANDLE jniHandle);
    567 };
    568 
    569 
    570 /*****************************************************************************
    571 **
    572 **  Name:           NfaConn
    573 **
    574 **  Description:    Store information about a connection related to a peer.
    575 **
    576 *****************************************************************************/
    577 class NfaConn : public android::RefBase
    578 {
    579 public:
    580     tNFA_HANDLE         mNfaConnHandle;         // NFA handle of the P2P connection
    581     PeerToPeer::tJNI_HANDLE         mJniHandle;             // JNI handle of the P2P connection
    582     UINT16              mMaxInfoUnit;
    583     UINT8               mRecvWindow;
    584     UINT16              mRemoteMaxInfoUnit;
    585     UINT8               mRemoteRecvWindow;
    586     SyncEvent           mReadEvent;             // event for reading
    587     SyncEvent           mCongEvent;             // event for congestion
    588     SyncEvent           mDisconnectingEvent;     // event for disconnecting
    589 
    590 
    591     /*******************************************************************************
    592     **
    593     ** Function:        NfaConn
    594     **
    595     ** Description:     Initialize member variables.
    596     **
    597     ** Returns:         None
    598     **
    599     *******************************************************************************/
    600     NfaConn();
    601 };
    602 
    603 
    604 /*****************************************************************************
    605 **
    606 **  Name:           P2pServer
    607 **
    608 **  Description:    Store information about an in-bound connection from a peer.
    609 **
    610 *****************************************************************************/
    611 class P2pServer : public android::RefBase
    612 {
    613 public:
    614     static const std::string sSnepServiceName;
    615 
    616     tNFA_HANDLE     mNfaP2pServerHandle;    // NFA p2p handle of local server
    617     PeerToPeer::tJNI_HANDLE     mJniHandle;     // JNI Handle
    618     SyncEvent       mRegServerEvent;        // for NFA_P2pRegisterServer()
    619     SyncEvent       mConnRequestEvent;      // for accept()
    620     std::string     mServiceName;
    621 
    622     /*******************************************************************************
    623     **
    624     ** Function:        P2pServer
    625     **
    626     ** Description:     Initialize member variables.
    627     **
    628     ** Returns:         None
    629     **
    630     *******************************************************************************/
    631     P2pServer (PeerToPeer::tJNI_HANDLE jniHandle, const char* serviceName);
    632 
    633     /*******************************************************************************
    634     **
    635     ** Function:        registerWithStack
    636     **
    637     ** Description:     Register this server with the stack.
    638     **
    639     ** Returns:         True if ok.
    640     **
    641     *******************************************************************************/
    642     bool registerWithStack();
    643 
    644     /*******************************************************************************
    645     **
    646     ** Function:        accept
    647     **
    648     ** Description:     Accept a peer's request to connect.
    649     **                  serverJniHandle: Server's handle.
    650     **                  connJniHandle: Connection handle.
    651     **                  maxInfoUnit: Maximum information unit.
    652     **                  recvWindow: Receive window size.
    653     **
    654     ** Returns:         True if ok.
    655     **
    656     *******************************************************************************/
    657     bool accept (PeerToPeer::tJNI_HANDLE serverJniHandle, PeerToPeer::tJNI_HANDLE connJniHandle,
    658             int maxInfoUnit, int recvWindow);
    659 
    660     /*******************************************************************************
    661     **
    662     ** Function:        unblockAll
    663     **
    664     ** Description:     Unblocks all server connections
    665     **
    666     ** Returns:         True if ok.
    667     **
    668     *******************************************************************************/
    669     void unblockAll();
    670 
    671     /*******************************************************************************
    672     **
    673     ** Function:        findServerConnection
    674     **
    675     ** Description:     Find a P2pServer that has the handle.
    676     **                  nfaConnHandle: NFA connection handle.
    677     **
    678     ** Returns:         P2pServer object.
    679     **
    680     *******************************************************************************/
    681     android::sp<NfaConn> findServerConnection (tNFA_HANDLE nfaConnHandle);
    682 
    683     /*******************************************************************************
    684     **
    685     ** Function:        findServerConnection
    686     **
    687     ** Description:     Find a P2pServer that has the handle.
    688     **                  jniHandle: JNI connection handle.
    689     **
    690     ** Returns:         P2pServer object.
    691     **
    692     *******************************************************************************/
    693     android::sp<NfaConn> findServerConnection (PeerToPeer::tJNI_HANDLE jniHandle);
    694 
    695     /*******************************************************************************
    696     **
    697     ** Function:        removeServerConnection
    698     **
    699     ** Description:     Remove a server connection with the provided handle.
    700     **                  jniHandle: JNI connection handle.
    701     **
    702     ** Returns:         True if connection found and removed.
    703     **
    704     *******************************************************************************/
    705     bool removeServerConnection(PeerToPeer::tJNI_HANDLE jniHandle);
    706 
    707 private:
    708     Mutex           mMutex;
    709     // mServerConn is protected by mMutex
    710     android::sp<NfaConn>     mServerConn[MAX_NFA_CONNS_PER_SERVER];
    711 
    712     /*******************************************************************************
    713     **
    714     ** Function:        allocateConnection
    715     **
    716     ** Description:     Allocate a new connection to accept on
    717     **                  jniHandle: JNI connection handle.
    718     **
    719     ** Returns:         Allocated connection object
    720     **                  NULL if the maximum number of connections was reached
    721     **
    722     *******************************************************************************/
    723     android::sp<NfaConn> allocateConnection (PeerToPeer::tJNI_HANDLE jniHandle);
    724 };
    725 
    726 
    727 /*****************************************************************************
    728 **
    729 **  Name:           P2pClient
    730 **
    731 **  Description:    Store information about an out-bound connection to a peer.
    732 **
    733 *****************************************************************************/
    734 class P2pClient : public android::RefBase
    735 {
    736 public:
    737     tNFA_HANDLE           mNfaP2pClientHandle;    // NFA p2p handle of client
    738     bool                  mIsConnecting;          // Set true while connecting
    739     android::sp<NfaConn>  mClientConn;
    740     SyncEvent             mRegisteringEvent;      // For client registration
    741     SyncEvent             mConnectingEvent;       // for NFA_P2pConnectByName or Sap()
    742     SyncEvent             mSnepEvent;             // To wait for SNEP completion
    743 
    744     /*******************************************************************************
    745     **
    746     ** Function:        P2pClient
    747     **
    748     ** Description:     Initialize member variables.
    749     **
    750     ** Returns:         None
    751     **
    752     *******************************************************************************/
    753     P2pClient ();
    754 
    755 
    756     /*******************************************************************************
    757     **
    758     ** Function:        ~P2pClient
    759     **
    760     ** Description:     Free all resources.
    761     **
    762     ** Returns:         None
    763     **
    764     *******************************************************************************/
    765     ~P2pClient ();
    766 
    767 
    768     /*******************************************************************************
    769     **
    770     ** Function:        unblock
    771     **
    772     ** Description:     Unblocks any threads that are locked on this connection
    773     **
    774     ** Returns:         None
    775     **
    776     *******************************************************************************/
    777     void unblock();
    778 };
    779 
    780