Blame src/mw_srvc_ft.h

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