diff --git a/pw3270.cbp b/pw3270.cbp
index 5f8c9a4..bcde968 100644
--- a/pw3270.cbp
+++ b/pw3270.cbp
@@ -214,9 +214,6 @@
-
-
-
diff --git a/src/include/lib3270.h b/src/include/lib3270.h
index a65899e..d4cf5a6 100644
--- a/src/include/lib3270.h
+++ b/src/include/lib3270.h
@@ -332,7 +332,8 @@
LIB3270_STATE_USER // Always the last one
} LIB3270_STATE;
- typedef struct _h3270 H3270;
+ typedef struct _h3270 H3270;
+ typedef struct _h3270ft H3270FT;
/**
* Get current screen size.
diff --git a/src/include/lib3270/filetransfer.h b/src/include/lib3270/filetransfer.h
index 02591ad..9b0a3ae 100644
--- a/src/include/lib3270/filetransfer.h
+++ b/src/include/lib3270/filetransfer.h
@@ -87,9 +87,24 @@
#define LIB3270_XLATE_NBUF 4
- typedef struct _h3270ft
+ struct lib3270_ft_callbacks
{
- unsigned short sz; ///< @brief Size of FT data structure
+ void (*complete)(H3270 *hSession, unsigned long length,double kbytes_sec,const char *msg, void *userdata);
+ void (*failed)(H3270 *hSession, unsigned long length,double kbytes_sec,const char *msg, void *userdata);
+ void (*message)(H3270 *hSession, const char *msg, void *userdata);
+ void (*update)(H3270 *hSession, unsigned long current, unsigned long length, double kbytes_sec, void *userdata);
+ void (*running)(H3270 *hSession, int is_cut, void *userdata);
+ void (*aborting)(H3270 *hSession, void *userdata);
+ void (*state_changed)(H3270 *hSession, LIB3270_FT_STATE state, const char *text, void *userdata);
+ };
+
+ /**
+ * @brief File transfer data.
+ *
+ */
+ struct _h3270ft
+ {
+ struct lib3270_ft_callbacks cbk; ///< @brief Callback table - Always the first one.
int ft_last_cr : 1; ///< @brief CR was last char in local file
int remap_flag : 1; ///< @brief Remap ASCII<->EBCDIC
@@ -102,7 +117,7 @@
H3270 * host;
- void * widget; ///< @brief File transfer dialog handle
+ void * user_data; ///< @brief File transfer dialog handle
FILE * local_file; ///< @brief File descriptor for local file
unsigned long length; ///< @brief File length
@@ -115,12 +130,12 @@
int secspace;
int dft;
- unsigned long ft_length; /**< Length of transfer */
+ unsigned long ft_length; ///< Length of transfer
- struct timeval starting_time; /**< Starting time */
+ struct timeval starting_time; ///< Starting time
- const char * local; /**< Local filename */
- const char * remote; /**< Remote filename */
+ const char * local; ///< Local filename
+ const char * remote; ///< Remote filename
// ft_dft.c
char * abort_string;
@@ -133,23 +148,16 @@
int quadrant;
unsigned long expanded_length;
char * saved_errmsg;
- int xlate_buffered; /**< buffer count */
- int xlate_buf_ix; /**< buffer index */
- unsigned char xlate_buf[LIB3270_XLATE_NBUF]; /**< buffer */
+ int xlate_buffered; ///< buffer count
+ int xlate_buf_ix; ///< buffer index
+ unsigned char xlate_buf[LIB3270_XLATE_NBUF]; ///< buffer
// Charset
struct lib3270_charset charset;
- // Callbacks
- void (*complete)(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *msg);
- void (*failed)(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *msg);
- void (*message)(struct _h3270ft *ft, const char *msg);
- void (*update)(struct _h3270ft *ft, unsigned long current, unsigned long length, double kbytes_sec);
- void (*running)(struct _h3270ft *ft, int is_cut);
- void (*aborting)(struct _h3270ft *ft);
- void (*state_changed)(struct _h3270ft *ft, LIB3270_FT_STATE state);
+ };
+
- } H3270FT;
/**
* Create a new file transfer session.
@@ -165,18 +173,22 @@
* @param dft
* @param msg Pointer to receive message text.
*
- * @return Filetransfer handle if ok, NULL if failed
+ * @return Filetransfer callback table
*
*/
- LIB3270_EXPORT H3270FT * lib3270_ft_new(H3270 *hSession, LIB3270_FT_OPTION flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft, const char **msg);
+ LIB3270_EXPORT H3270FT * lib3270_ft_new(H3270 *hSession, LIB3270_FT_OPTION flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft, const char **msg);
+
+ LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession);
+ LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession);
- LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession);
- LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession);
+ LIB3270_EXPORT int lib3270_ft_cancel(H3270 *hSession, int force);
- LIB3270_EXPORT int lib3270_ft_cancel(H3270 *hSession, int force);
+ LIB3270_EXPORT void lib3270_ft_set_user_data(H3270 *h, void *ptr);
+ LIB3270_EXPORT void * lib3270_ft_get_user_data(H3270 *h);
+ LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session);
- LIB3270_EXPORT LIB3270_FT_STATE lib3270_get_ft_state(H3270 *session);
+ LIB3270_EXPORT struct lib3270_ft_callbacks * lib3270_get_ft_callbacks(H3270 *session, unsigned short sz);
#endif // LIB3270_FILETRANSFER_INCLUDED
diff --git a/src/include/lib3270/session.h b/src/include/lib3270/session.h
index b8b45ed..b3652ab 100644
--- a/src/include/lib3270/session.h
+++ b/src/include/lib3270/session.h
@@ -68,6 +68,17 @@
};
+ /**
+ * Register application Handlers.
+ *
+ * @param cbk Structure with the application I/O handles to set.
+ *
+ * @return 0 if ok, error code if not.
+ *
+ */
+ int LIB3270_EXPORT lib3270_set_session_callbacks(const struct lib3270_callbacks *cbk);
+
+
LIB3270_EXPORT struct lib3270_session_callbacks * lib3270_get_session_callbacks(H3270 *session, unsigned short sz);
#endif // LIB3270_SESSION_H_INCLUDED
diff --git a/src/lib3270/ft.c b/src/lib3270/ft.c
index 8cc549e..52421e9 100644
--- a/src/lib3270/ft.c
+++ b/src/lib3270/ft.c
@@ -101,21 +101,28 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
};
int f;
+ const char *message = NULL;
if(session->state == state)
return;
- session->state = state;
- session->state_changed(session,state);
+
+ // State changed, notify
for(f = 0; f < sizeof(msg)/sizeof(msg[0]);f++)
{
if(msg[f].state == state)
{
- ft_message(session,msg[f].text);
+ message = msg[f].text;
break;
}
}
+ session->state = state;
+
+ ft_message(session,message);
+ session->cbk.state_changed(session->host,state,message,session->user_data);
+
+
}
void ft_init(H3270 *hSession)
@@ -136,7 +143,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
if (ft->state == LIB3270_FT_STATE_RUNNING)
{
set_ft_state(ft,LIB3270_FT_STATE_ABORT_WAIT);
- ft->aborting(ft);
+ ft->cbk.aborting(hSession,ft->user_data);
return 0;
}
@@ -149,37 +156,37 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
return 0;
}
- static void def_complete(H3270FT *ft,unsigned long length,double kbytes_sec,const char *msg)
+ static void def_complete(H3270 *hSession, unsigned long length,double kbytes_sec,const char *msg, void *userdata)
{
- ft->message(ft,msg);
+ hSession->ft->cbk.message(hSession,msg,hSession->ft->user_data);
}
- static void def_failed(struct _h3270ft *ft,unsigned long length,double kbytes_sec,const char *msg)
+ static void def_failed(H3270 *hSession, unsigned long length,double kbytes_sec,const char *msg, void *userdata)
{
- ft->complete(ft,ft->ft_length,kbytes_sec,msg ? msg : N_("Transfer failed"));
+ hSession->ft->cbk.complete(hSession,length,kbytes_sec,msg,userdata);
}
- static void def_message(H3270FT *ft, const char *errmsg)
+ static void def_message(H3270 *hSession, const char *msg, void *userdata)
{
- lib3270_write_log(ft->host,"ft","%s",errmsg);
+ lib3270_write_log(hSession,"ft","%s",msg);
}
- static void def_update(H3270FT *ft, unsigned long current, unsigned long length, double kbytes_sec)
+ static void def_update(H3270 *hSession, unsigned long current, unsigned long length, double kbytes_sec, void *userdata)
{
}
- static void def_running(H3270FT *ft, int is_cut)
+ static void def_running(H3270 *hSession, int is_cut, void *userdata)
{
}
- static void def_aborting(H3270FT *ft)
+ static void def_aborting(H3270 *hSession, void *userdata)
{
}
- static void def_state_changed(H3270FT *ft, LIB3270_FT_STATE state)
+ static void def_state_changed(H3270 *hSession, LIB3270_FT_STATE state, const char *text, void *userdata)
{
}
@@ -281,32 +288,33 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
// Create & Initialize ft control structure.
ftHandle = lib3270_malloc(sizeof(H3270FT)+strlen(local)+strlen(remote)+3);
- ftHandle->sz = sizeof(H3270FT);
- ftHandle->host = session;
-
- ftHandle->ft_last_cr = 0;
-
- ftHandle->ascii_flag = (flags & LIB3270_FT_OPTION_ASCII) ? 1 : 0;
- ftHandle->cr_flag = (flags & LIB3270_FT_OPTION_CRLF) ? 1 : 0;
- ftHandle->remap_flag = (flags & LIB3270_FT_OPTION_REMAP) ? 1 : 0;
- ftHandle->unix_text = (flags & LIB3270_FT_OPTION_UNIX) ? 1 : 0;
- ftHandle->ft_is_cut = 0;
- ftHandle->flags = flags;
- ftHandle->local_file = ft_local_file;
- ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK;
- ftHandle->complete = def_complete;
- ftHandle->failed = def_failed;
- ftHandle->message = def_message;
- ftHandle->update = def_update;
- ftHandle->running = def_running;
- ftHandle->aborting = def_aborting;
- ftHandle->state_changed = def_state_changed;
- ftHandle->lrecl = lrecl;
- ftHandle->blksize = blksize;
- ftHandle->primspace = primspace;
- ftHandle->secspace = secspace;
- ftHandle->dft = dft;
- ftHandle->quadrant = -1;
+ ftHandle->host = session;
+
+ ftHandle->ft_last_cr = 0;
+
+ ftHandle->ascii_flag = (flags & LIB3270_FT_OPTION_ASCII) ? 1 : 0;
+ ftHandle->cr_flag = (flags & LIB3270_FT_OPTION_CRLF) ? 1 : 0;
+ ftHandle->remap_flag = (flags & LIB3270_FT_OPTION_REMAP) ? 1 : 0;
+ ftHandle->unix_text = (flags & LIB3270_FT_OPTION_UNIX) ? 1 : 0;
+ ftHandle->ft_is_cut = 0;
+ ftHandle->flags = flags;
+ ftHandle->local_file = ft_local_file;
+ ftHandle->state = LIB3270_FT_STATE_AWAIT_ACK;
+ ftHandle->lrecl = lrecl;
+ ftHandle->blksize = blksize;
+ ftHandle->primspace = primspace;
+ ftHandle->secspace = secspace;
+ ftHandle->dft = dft;
+ ftHandle->quadrant = -1;
+
+ ftHandle->cbk.complete = def_complete;
+ ftHandle->cbk.failed = def_failed;
+ ftHandle->cbk.message = def_message;
+ ftHandle->cbk.update = def_update;
+ ftHandle->cbk.running = def_running;
+ ftHandle->cbk.aborting = def_aborting;
+ ftHandle->cbk.state_changed = def_state_changed;
+
// Setup file transfer charset.
memcpy(&ftHandle->charset,&session->charset,sizeof(struct lib3270_charset));
@@ -330,6 +338,33 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
return ftHandle;
}
+ LIB3270_EXPORT void lib3270_ft_set_user_data(H3270 *hSession, void *ptr)
+ {
+ H3270FT * ft;
+
+ CHECK_SESSION_HANDLE(hSession);
+
+ ft = get_ft_handle(hSession);
+ if(!ft)
+ return;
+
+ ft->user_data = ptr;
+
+ }
+
+ LIB3270_EXPORT void * lib3270_ft_get_user_data(H3270 *hSession)
+ {
+ H3270FT * ft;
+
+ CHECK_SESSION_HANDLE(hSession);
+
+ ft = get_ft_handle(hSession);
+ if(!ft)
+ return NULL;
+
+ return ft->user_data;
+ }
+
LIB3270_EXPORT int lib3270_ft_start(H3270 *hSession)
{
static const char * rec = "FVU";
@@ -488,7 +523,7 @@ static void set_ft_state(H3270FT *session, LIB3270_FT_STATE state);
void ft_message(H3270FT *ft, const char *msg)
{
lib3270_trace_event(ft->host,"%s\n",msg);
- ft->message(ft,msg);
+ ft->cbk.message(ft->host,msg,ft->user_data);
}
static double finish(H3270FT *ft)
@@ -518,12 +553,12 @@ static double finish(H3270FT *ft)
void ft_complete(H3270FT *ft, const char *errmsg)
{
- ft->complete(ft,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer complete"));
+ ft->cbk.complete(ft->host,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer complete"),ft->user_data);
}
void ft_failed(H3270FT *ft, const char *errmsg)
{
- ft->failed(ft,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer failed"));
+ ft->cbk.failed(ft->host,ft->ft_length,finish(ft),errmsg ? errmsg : N_("Transfer failed"),ft->user_data);
}
LIB3270_EXPORT int lib3270_ft_destroy(H3270 *hSession)
@@ -569,7 +604,7 @@ void ft_update_length(H3270FT *session)
(double)(t1.tv_usec - session->starting_time.tv_usec) / 1.0e6);
}
- session->update(session,session->ft_length,session->length,kbytes_sec);
+ session->cbk.update(session->host,session->ft_length,session->length,kbytes_sec,session->user_data);
}
@@ -587,20 +622,36 @@ void ft_running(H3270FT *ft, Boolean is_cut)
if (ft->state == FT_AWAIT_ACK)
set_ft_state(ft,FT_RUNNING);
- ft->running(ft,is_cut);
+ ft->cbk.running(ft->host,is_cut,ft->user_data);
ft_update_length(ft);
}
+LIB3270_EXPORT struct lib3270_ft_callbacks * lib3270_get_ft_callbacks(H3270 *session, unsigned short sz)
+{
+
+ CHECK_SESSION_HANDLE(session);
+
+ if(sz != sizeof(struct lib3270_ft_callbacks))
+ return NULL;
+
+ if(session->ft)
+ return &(session->ft->cbk);
+
+ return NULL;
+
+}
+
+
// Process a protocol-generated abort.
void ft_aborting(H3270FT *h)
{
if (h->state == FT_RUNNING || h->state == FT_ABORT_WAIT)
{
set_ft_state(h,FT_ABORT_SENT);
- h->message(h,N_("Aborting..."));
- h->aborting(h);
+ h->cbk.message(h->host,N_("Aborting..."),h->user_data);
+ h->cbk.aborting(h->host,h->user_data);
}
}
diff --git a/src/lib3270/private.h b/src/lib3270/private.h
index 4b05437..e054479 100644
--- a/src/lib3270/private.h
+++ b/src/lib3270/private.h
@@ -373,7 +373,7 @@ struct _h3270
unsigned short current_port;
// Misc
- void * ft; /**< Active file transfer data */
+ H3270FT * ft; /**< Active file transfer data */
// screen info
int ov_rows;
diff --git a/src/pw3270/filetransfer.c b/src/pw3270/filetransfer.c
index d1e4760..6a0fed1 100644
--- a/src/pw3270/filetransfer.c
+++ b/src/pw3270/filetransfer.c
@@ -34,7 +34,7 @@
#include
#include "globals.h"
#include "ft/v3270ft.h"
-
+#include
/*--[ Constants ]------------------------------------------------------------------------------------*/
@@ -207,39 +207,28 @@ static void ft_dialog_save(GtkWidget *widget, const gchar *name)
}
-static void ft_complete(H3270FT *ft, unsigned long length,double kbytes_sec, const char *msg)
-{
- v3270_ft_progress_complete(GTK_WIDGET(ft->widget),length,kbytes_sec);
- v3270_ft_progress_set_message(GTK_WIDGET(ft->widget),gettext(msg));
-}
-
-static void ft_message(struct _h3270ft *ft, const char *text)
-{
- v3270_ft_progress_set_message(GTK_WIDGET(ft->widget),gettext(text));
-}
-
-static void ft_update(H3270FT *ft, unsigned long current, unsigned long length, double kbytes_sec)
+static void ft_complete(H3270 *hSession, unsigned long length,double kbytes_sec, const char *msg, void *widget)
{
- v3270_ft_progress_update(GTK_WIDGET(ft->widget), current, length, kbytes_sec);
+ v3270_ft_progress_complete(GTK_WIDGET(widget),length,kbytes_sec);
+ v3270_ft_progress_set_message(GTK_WIDGET(widget),gettext(msg));
}
-static void ft_running(H3270FT *ft, int is_cut)
+static void ft_message(H3270 *hSession, const char *text, void *widget)
{
+ v3270_ft_progress_set_message(GTK_WIDGET(widget),gettext(text));
}
-static void ft_aborting(H3270FT *ft)
-{
-}
-
-static void ft_state_changed(H3270FT *ft, LIB3270_FT_STATE state)
+static void ft_update(H3270 *hSession, unsigned long current, unsigned long length, double kbytes_sec, void *widget)
{
+ v3270_ft_progress_update(GTK_WIDGET(widget), current, length, kbytes_sec);
}
gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION options, const gchar *local, const gchar *remote, int lrecl, int blksize, int primspace, int secspace, int dft)
{
g_return_val_if_fail(GTK_IS_V3270(widget),0);
- H3270FT * ft = lib3270_ft_new(v3270_get_session(widget),options,local,remote,lrecl,blksize,primspace,secspace,dft,NULL);
+ H3270 * hSession = v3270_get_session(widget);
+ H3270FT * ft = lib3270_ft_new(hSession,options,local,remote,lrecl,blksize,primspace,secspace,dft,NULL);
if(!ft)
return -1;
@@ -254,14 +243,18 @@ gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION options, const gch
// Create FT progress dialog
GtkWidget * progress = v3270_ft_progress_new();
- ft->widget = progress;
- ft->complete = ft_complete;
- ft->failed = ft_complete;
- ft->update = ft_update;
- ft->running = ft_running;
- ft->aborting = ft_aborting;
- ft->state_changed = ft_state_changed;
- ft->message = ft_message;
+ lib3270_ft_set_user_data(hSession,progress);
+
+
+ struct lib3270_ft_callbacks *cbk = lib3270_get_ft_callbacks(hSession,sizeof(struct lib3270_ft_callbacks));
+
+ cbk->complete = ft_complete;
+ cbk->failed = ft_complete;
+ cbk->update = ft_update;
+// cbk->running = ft_running;
+// cbk->aborting = ft_aborting;
+// cbk->state_changed = ft_state_changed;
+ cbk->message = ft_message;
if(options & LIB3270_FT_OPTION_RECEIVE) {
--
libgit2 0.21.2