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

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 OBEXINETTRANSPORT_H
#define OBEXINETTRANSPORT_H


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

#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 iobxInetConnectionBlock ObxInetConnectionBlock;
struct iobxInetConnectionBlock {
   int                  fd;               /* Socket FD (client)  */
   short                connected;        /* Do we have a peer?  */
   struct sockaddr_in   peer;             /* Destination         */
};


/*
** Server block
*/
typedef struct iobxInetServerBlock ObxInetServerBlock;
struct iobxInetServerBlock {
   int                  fd;               /* Server socket.             */
   struct sockaddr_in   self;             /* Destination                */
   short                active;           /* Indicates an active server.*/
};


/*
** Meta block
*/
typedef struct iobxInetMetaBlock ObxInetMetaBlock;
struct iobxInetMetaBlock {
   unsigned short    port;                // Assigned port
   char              *host;               // Host
   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 iobxInetTransportInitialize( const char *meta );

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

/*
** Create a connection
*/
ObxRc iobxInetTransportOpen( 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 iobxInetTransportListen( 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 iobxInetTransportAccept( 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 iobxInetTransportConnect( 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 iobxInetTransportSend( 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 iobxInetTransportRecv( 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 iobxInetTransportClose( void **connectionid );

#ifdef __cplusplus
}
#endif


#endif
