/*******************************************************************

Copyright (c) 2004 Open Mobile Alliance, Ltd.  All Rights Reserved.

This software is made available under the usage and distribution terms 
covered by the Common Public License 1.0 and by using this software you
are bound by the terms and conditions of the same.

EXCEPT AS EXPRESSLY SET FORTH IN THE COMMON PUBLIC LICENSE,
THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS, 
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, 
ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, 
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
   
Each recipient is solely responsible for determining the 
appropriateness of using and distributing this program and assumes 
all risks associated with its exercise of rights under the Common 
Public License, including but not limited to the risks and 
costs of program errors, compliance with applicable laws, 
damage to or loss of data, programs or equipment, and 
unavailability or interruption of operations.

********************************************************************/
#ifndef OBEXIRTRANSPORT_H
#define OBEXIRTRANSPORT_H


/*
**************************************************************************
** Ir Transport
**************************************************************************
*/
#include <iConstants.h>

#ifdef _WIN32
 #ifndef _WIN32_WINNT
  #define _WIN32_WINNT   /* Affects expansion of af_irda.h header file      */
 #endif
 #include <af_irda.h>
 #define sockaddr_irda _SOCKADDR_IRDA
 #define sir_family  irdaAddressFamily
 #define sir_name    irdaServiceName
 #define sir_addr    irdaDeviceID
#else
 #include <linux/irda.h>
 #define    MAX_DEVICES    10
#endif
#ifdef __cplusplus
extern "C" {
#endif


/*
** Defines a connection.
** This block is created by an open() call and is set as the 'connectionid' in
** the callers arg list.  It's returned on subsuquent calls to functions.
*/
typedef struct iobxIrConnectionBlock ObxIrConnectionBlock;
struct iobxIrConnectionBlock {
   int                  fd;               /* Socket FD (client)   */
   short                connected;        /* Do we have a peer?   */
   struct sockaddr_irda peer;             /* 'the other side'     */

};


/*
** Server block
*/
typedef struct iobxIrServerBlock ObxIrServerBlock;
struct iobxIrServerBlock {
   int                  fd;               /* Server socket.             */
   struct sockaddr_irda self;             /* ourselves                  */
   short                active;           /* Indicates an active server.*/
};


/*
** Meta block
*/
typedef struct iobxIrMetaBlock ObxIrMetaBlock;
struct iobxIrMetaBlock {
   char              *service;            // Ir Service name (i.e 'OBEX')
   short             valid;               // Was meta data valid?
};


/*
** Initialize the transport.  The inbound meta data will differ for each
** transport type.  Should be called once, prior to any other calls.
*/
ObxRc iobxIrTransportInitialize( const char *meta );

/*
** Clean up all internals
*/
ObxRc iobxIrTransportTerminate( void );

/*
** Create a connection
*/
ObxRc iobxIrTransportOpen( void **connectionid );

/* ************************************** */
/* When transport is acting as server     */
/* ************************************** */

/*
** Do any preperation for accepting inbound connections (i.e. acting as a server).
** For the INET transport this would include a bind() and listen().  Other transports
** may have other needs.
*/
ObxRc iobxIrTransportListen( void **connectionid );

/*
** Accept an inbound connection from a peer transport.  This call should block until
** a connection has been established.
** When a connection has been accepted, the passed 'connectionid' is set.  This will be
** provided by the caller on all subsuquent calls made against the active connection.
*/
ObxRc iobxIrTransportAccept( void **connectionid );

/* ************************************** */
/* When transport is acting as client     */
/* ************************************** */

/*
** Initiate a connection to a remote peer transport.
** When a connection has been created, the passed 'connectionid' is set.  This will be
** provided by the caller on all subsuquent calls made against the active connection.
*/
ObxRc iobxIrTransportConnect( void **connectionid );

/* ************************************** */
/* Functions used on connected transports */
/* ************************************** */

/*
** Send 'length' bytes of data from 'buf', set the actual number
** written in 'wrote'.
** Note that the inbound 'connectionid' was created by either a connect() or accept() call.
*/
ObxRc iobxIrTransportSend( void **connectionid, const void *buf, int length, int *wrote, short allowShort );

/*
** Receive 'length' bytes of data and place into 'buf', set the actual
** number of bytes read in 'actual'.
** Note that the inbound 'connectionid' was created by either a connect() or accept() call.
*/
ObxRc iobxIrTransportRecv( void **connectionid, void *buf, int length, int *actual, short allowShort );

/*
** Clean up all internals, subsuquent use of this 'connectionid' should result in an error.
** Note that the inbound 'connectionid' was created by either a connect() or accept() call.
*/
ObxRc iobxIrTransportClose( void **connectionid );

/*
** Reach out and discover devices when connecting.
*/
ObxRc iobxIrDiscoverDevices( ObxIrConnectionBlock *conblk );


#ifdef __cplusplus
}
#endif


#endif
