|
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 */
|