Blame src/mw_srvc_ft.h

Packit 16808d
Packit 16808d
/*
Packit 16808d
  Meanwhile - Unofficial Lotus Sametime Community Client Library
Packit 16808d
  Copyright (C) 2004  Christopher (siege) O'Brien
Packit 16808d
  
Packit 16808d
  This library is free software; you can redistribute it and/or
Packit 16808d
  modify it under the terms of the GNU Library General Public
Packit 16808d
  License as published by the Free Software Foundation; either
Packit 16808d
  version 2 of the License, or (at your option) any later version.
Packit 16808d
  
Packit 16808d
  This library is distributed in the hope that it will be useful,
Packit 16808d
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 16808d
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 16808d
  Library General Public License for more details.
Packit 16808d
  
Packit 16808d
  You should have received a copy of the GNU Library General Public
Packit 16808d
  License along with this library; if not, write to the Free
Packit 16808d
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit 16808d
*/
Packit 16808d
Packit 16808d
Packit 16808d
#ifndef _MW_SRVC_FT_H
Packit 16808d
#define _MW_SRVC_FT_H
Packit 16808d
Packit 16808d
Packit 16808d
/** @file mw_srvc_ft.h
Packit 16808d
Packit 16808d
    A file transfer is a simple way to get large chunks of binary data
Packit 16808d
    from one client to another.
Packit 16808d
*/
Packit 16808d
Packit 16808d
Packit 16808d
#include "mw_common.h"
Packit 16808d
Packit 16808d
Packit 16808d
#ifdef __cplusplus
Packit 16808d
extern "C" {
Packit 16808d
#endif
Packit 16808d
Packit 16808d
Packit 16808d
/** @struct mwServiceFileTransfer
Packit 16808d
    File transfer service
Packit 16808d
*/
Packit 16808d
struct mwServiceFileTransfer;
Packit 16808d
Packit 16808d
Packit 16808d
/** @struct mwFileTransfer
Packit 16808d
    A single file trasfer session
Packit 16808d
 */
Packit 16808d
struct mwFileTransfer;
Packit 16808d
Packit 16808d
Packit 16808d
#define mwService_FILE_TRANSFER  0x00000038
Packit 16808d
Packit 16808d
Packit 16808d
enum mwFileTransferState {
Packit 16808d
  mwFileTransfer_NEW,   /**< file transfer is not open */
Packit 16808d
  mwFileTransfer_PENDING,  /**< file transfer is opening */
Packit 16808d
  mwFileTransfer_OPEN,     /**< file transfer is open */
Packit 16808d
  mwFileTransfer_CANCEL_LOCAL,
Packit 16808d
  mwFileTransfer_CANCEL_REMOTE,
Packit 16808d
  mwFileTransfer_DONE,
Packit 16808d
  mwFileTransfer_ERROR,    /**< error in file transfer */
Packit 16808d
  mwFileTransfer_UNKNOWN,  /**< unknown state */
Packit 16808d
};
Packit 16808d
Packit 16808d
Packit 16808d
#define mwFileTransfer_isState(ft, state) \
Packit 16808d
  (mwFileTransfer_getState(ft) == (state))
Packit 16808d
Packit 16808d
#define mwFileTransfer_isNew(ft) \
Packit 16808d
  mwFileTransfer_isState((ft), mwFileTransfer_NEW)
Packit 16808d
Packit 16808d
#define mwFileTransfer_isPending(ft) \
Packit 16808d
  mwFileTransfer_isState((ft), mwFileTransfer_PENDING)
Packit 16808d
Packit 16808d
#define mwFileTransfer_isOpen(ft) \
Packit 16808d
  mwFileTransfer_isState((ft), mwFileTransfer_OPEN)
Packit 16808d
Packit 16808d
#define mwFileTransfer_isDone(ft) \
Packit 16808d
  mwFileTransfer_isState((ft), mwFileTransfer_DONE)
Packit 16808d
Packit 16808d
#define mwFileTransfer_isCancelLocal(ft) \
Packit 16808d
  mwFileTransfer_isState((ft), mwFileTransfer_CANCEL_LOCAL)
Packit 16808d
Packit 16808d
#define mwFileTransfer_isCancelRemote(ft) \
Packit 16808d
  mwFileTransfer_isState((ft), mwFileTransfer_CANCEL_REMOTE)
Packit 16808d
Packit 16808d
Packit 16808d
enum mwFileTranferCode {
Packit 16808d
  mwFileTransfer_SUCCESS   = 0x00000000,
Packit 16808d
  mwFileTransfer_REJECTED  = 0x08000606,
Packit 16808d
};
Packit 16808d
Packit 16808d
Packit 16808d
struct mwFileTransferHandler {
Packit 16808d
Packit 16808d
  /** an incoming file transfer has been offered */
Packit 16808d
  void (*ft_offered)(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
  /** a file transfer has been fully initiated */
Packit 16808d
  void (*ft_opened)(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
  /** a file transfer has been closed. Check the status of the file
Packit 16808d
      transfer to determine if the transfer was complete or if it had
Packit 16808d
      been interrupted */
Packit 16808d
  void (*ft_closed)(struct mwFileTransfer *ft, guint32 code);
Packit 16808d
Packit 16808d
  /** receive a chunk of a file from an inbound file transfer. */
Packit 16808d
  void (*ft_recv)(struct mwFileTransfer *ft, struct mwOpaque *data);
Packit 16808d
Packit 16808d
  /** received an ack for a sent chunk on an outbound file transfer.
Packit 16808d
      this indicates that a previous call to mwFileTransfer_send has
Packit 16808d
      reached the target and that the target has responded. */
Packit 16808d
  void (*ft_ack)(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
  /** optional. called from mwService_free */
Packit 16808d
  void (*clear)(struct mwServiceFileTransfer *srvc);
Packit 16808d
};
Packit 16808d
Packit 16808d
Packit 16808d
struct mwServiceFileTransfer *
Packit 16808d
mwServiceFileTransfer_new(struct mwSession *session,
Packit 16808d
			  struct mwFileTransferHandler *handler);
Packit 16808d
Packit 16808d
Packit 16808d
struct mwFileTransferHandler *
Packit 16808d
mwServiceFileTransfer_getHandler(struct mwServiceFileTransfer *srvc);
Packit 16808d
Packit 16808d
Packit 16808d
const GList *
Packit 16808d
mwServiceFileTransfer_getTransfers(struct mwServiceFileTransfer *srvc);
Packit 16808d
Packit 16808d
Packit 16808d
struct mwFileTransfer *
Packit 16808d
mwFileTransfer_new(struct mwServiceFileTransfer *srvc,
Packit 16808d
		   const struct mwIdBlock *who, const char *msg,
Packit 16808d
		   const char *filename, guint32 filesize);
Packit 16808d
Packit 16808d
Packit 16808d
/** deallocate a file transfer. will call mwFileTransfer_close if
Packit 16808d
    necessary */
Packit 16808d
void
Packit 16808d
mwFileTransfer_free(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
/** the status of this file transfer */
Packit 16808d
enum mwFileTransferState
Packit 16808d
mwFileTransfer_getState(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
struct mwServiceFileTransfer *
Packit 16808d
mwFileTransfer_getService(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
/** the user on the other end of the file transfer */
Packit 16808d
const struct mwIdBlock *
Packit 16808d
mwFileTransfer_getUser(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
/** the message sent along with an offered file transfer */
Packit 16808d
const char *
Packit 16808d
mwFileTransfer_getMessage(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
/** the publicized file name. Not necessarily related to any actual
Packit 16808d
    file on either system */
Packit 16808d
const char *
Packit 16808d
mwFileTransfer_getFileName(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
/** total bytes intended to be sent/received */
Packit 16808d
guint32 mwFileTransfer_getFileSize(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
/** bytes remaining to be received/send */
Packit 16808d
guint32 mwFileTransfer_getRemaining(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
/** count of bytes sent/received over this file transfer so far */
Packit 16808d
#define mwFileTransfer_getSent(ft) \
Packit 16808d
  (mwFileTransfer_getFileSize(ft) - mwFileTransfer_getRemaining(ft))
Packit 16808d
Packit 16808d
Packit 16808d
/** initiate an outgoing file transfer */
Packit 16808d
int mwFileTransfer_offer(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
/** accept an incoming file transfer */
Packit 16808d
int mwFileTransfer_accept(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
/** reject an incoming file transfer */
Packit 16808d
#define mwFileTransfer_reject(ft) \
Packit 16808d
  mwFileTransfer_close((ft), mwFileTransfer_REJECTED)
Packit 16808d
Packit 16808d
Packit 16808d
/** cancel an open file transfer */
Packit 16808d
#define mwFileTransfer_cancel(ft) \
Packit 16808d
  mwFileTransfer_close((ft), mwFileTransfer_SUCCESS);
Packit 16808d
Packit 16808d
Packit 16808d
/** Close a file transfer. This will trigger the ft_close function of the
Packit 16808d
    session's handler.
Packit 16808d
Packit 16808d
    @see mwFileTransfer_reject
Packit 16808d
    @see mwFileTransfer_cancel
Packit 16808d
*/
Packit 16808d
int mwFileTransfer_close(struct mwFileTransfer *ft, guint32 code);
Packit 16808d
Packit 16808d
Packit 16808d
/** send a chunk of data over an outbound file transfer. The client at
Packit 16808d
    the other end of the transfer should respond with an acknowledgement
Packit 16808d
    message, which can be caught in the service's handler.
Packit 16808d
Packit 16808d
    @see mwFileTransferHandler::ft_ack
Packit 16808d
*/
Packit 16808d
int mwFileTransfer_send(struct mwFileTransfer *ft,
Packit 16808d
			struct mwOpaque *data);
Packit 16808d
Packit 16808d
Packit 16808d
/** acknowledge the receipt of a chunk of data from an inbound file
Packit 16808d
    transfer.  This should be done after every received chunk, or the
Packit 16808d
    transfer will stall. However, not all clients will wait for an ack
Packit 16808d
    after sending a chunk before sending the next chunk, so it is
Packit 16808d
    possible to have the handler's ft_recv function triggered again
Packit 16808d
    even if no ack was sent.
Packit 16808d
Packit 16808d
    @see mwFileTransferHandler::ft_recv
Packit 16808d
*/
Packit 16808d
int mwFileTransfer_ack(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
void mwFileTransfer_setClientData(struct mwFileTransfer *ft,
Packit 16808d
				  gpointer data, GDestroyNotify clean);
Packit 16808d
Packit 16808d
Packit 16808d
gpointer mwFileTransfer_getClientData(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
void mwFileTransfer_removeClientData(struct mwFileTransfer *ft);
Packit 16808d
Packit 16808d
Packit 16808d
#ifdef __cplusplus
Packit 16808d
}
Packit 16808d
#endif
Packit 16808d
Packit 16808d
Packit 16808d
#endif /* _MW_SRVC_FT_H */