Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

915 lines
20 KiB

/* File: C:\WACKER\xfer\hpr_sd.c (Created: 25-Jan-1994)
* created from HAWIN source file
* hpr_sd.c -- System dependent routines to support HyperProtocol
*
* Copyright 1989,1994 by Hilgraeve Inc. -- Monroe, MI
* All rights reserved
*
* $Revision: 1 $
* $Date: 10/05/98 1:16p $
*/
// #define DEBUGSTR
#include <windows.h>
#include <setjmp.h>
#include <time.h>
#include <term\res.h>
#include <sys\types.h>
#include <sys\utime.h>
#include <tdll\stdtyp.h>
#include <tdll\mc.h>
#include <tdll\com.h>
#include <tdll\assert.h>
#include <tdll\session.h>
#include <tdll\load_res.h>
#include <tdll\xfer_msc.h>
#include <tdll\globals.h>
#include <tdll\file_io.h>
#if !defined(BYTE)
#define BYTE unsigned char
#endif
#include "cmprs.h"
#include "xfr_dsp.h"
#include "xfr_todo.h"
#include "xfr_srvc.h"
#include "xfer.h"
#include "xfer.hh"
#include "xfer_tsc.h"
#include "hpr.h"
#include "hpr.hh"
#include "hpr_sd.hh"
// struct s_hprsd FAR *hsd;
/* RECEIVING */
#define DRR_RCV_FILE 1
#define DRR_STORING 2
// int suspend_for_disk = 0;
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hr_setup
*
* DESCRIPTION:
* Called as a HyperProtocol receive session is beginning. This routine
* must allocate memory for control structures hc and hrc. It may also
* initiate a screen display to use during the transfer and do any other
* necessary setup.
* Values for the user-settable globals, h_useattr, h_trycompress, h_chkt
* and h_suspenddsk, should also be set here if they have not already been
* set through the use of program options or menu settings.
*
* ARGUMENTS:
* none
*
* RETURNS:
* TRUE if transfer can continue.
* FALSE if a memory allocation or other type of error occurred.
*/
int hr_setup(struct s_hc *hc)
{
unsigned int uiOldOptions;
XFR_PARAMS *pX;
XFR_HP_PARAMS *pH;
pX = (XFR_PARAMS *)0;
xfrQueryParameters(hc->hSession, (VOID **)&pX);
if (pX != (XFR_PARAMS *)0)
hc->h_useattr = pX->fUseDateTime;
pH = (XFR_HP_PARAMS *)xfer_get_params(hc->hSession, XF_HYPERP);
hc->blocksize = pH->nBlockSize;
hc->h_chkt = (pH->nCheckType == HP_CT_CRC) ? H_CRC : H_CHECKSUM;
hc->h_resynctime = pH->nResyncTimeout;
hc->h_trycompress = pH->nTryCompression;
if (xfer_set_comport(hc->hSession, FALSE, &uiOldOptions) != TRUE)
{
/* TODO: put in an error message of some sort */
return FALSE;
}
hc->sd.hld_options = uiOldOptions;
hrdsp_compress(hc, compress_status() == COMPRESS_ACTIVE);
hc->sd.k_received = 0;
return TRUE;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hr_wrapup
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
int hr_wrapup(struct s_hc *hc, int attended, int status)
{
xfer_restore_comport(hc->hSession, hc->sd.hld_options);
/* TODO: decide if anything can be done if we get an error */
if (hc->fhdl || status == H_FILEERR) /* abnormal exit */
{
xfer_log_xfer(hc->hSession, FALSE,
hc->rc.rmtfname, NULL,
hr_result_codes[hc->rc.cancel_reason]);
fio_close(hc->fhdl);
hc->fhdl = NULL;
DeleteFile(hc->rc.ourfname);
}
if (hc->fhdl)
{
fio_close(hc->fhdl);
hc->fhdl = NULL;
}
if (attended)
{
#if FALSE
menu_bottom_line(BL_ESC, 0L);
#if defined(OS2)
if (os2_cfg_popup)
popup_replybox(-1, ENTER_RESP, T_POPUP_WAIT, TM_POPUP_COMPLETE);
#endif
DosBeep(beepfreq, beeplen);
menu_replybox(hc->sd.msgrow, ENTER_RESP, 0,
(int)transfer_status_msg((USHORT)hr_result_codes[hc->rc.cancel_reason]));
#endif
}
xferMsgClose(hc->hSession);
return status;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hrdsp_progress
*
* DESCRIPTION:
* Displays the progress of a filetransfer on screen by showing the number of
* bytes transferred and updating the vu meters if they have been initialized.
*
* ARGUMENTS:
* final -- If TRUE, indicates that the transfer is finished and the final
* progress display is needed. Durning a transfer the number of
* bytes is rounded off to the next lower 'k'. After a transfer
* is completed, the final display is rounded UP.
*
* RETURNS:
*
*/
void hrdsp_progress(struct s_hc *hc, int status)
{
long ttime, stime;
long bytes_rcvd;
long cps;
long new_elapsed = -1;
long new_remaining = -1;
long new_cps = -1;
long new_file = -1;
long new_total = -1;
if (hc->xfertimer == -1L)
return;
ttime = bittest(status, TRANSFER_DONE) ?
hc->xfertime : interval(hc->xfertimer);
if ((stime = ttime / 10L) != hc->displayed_time ||
bittest(status, FILE_DONE | TRANSFER_DONE))
{
/* Display elapsed time */
new_elapsed = (hc->displayed_time = stime);
/* Display amount received */
bytes_rcvd = hc->total_dsp + hc->h_filebytes;
/* if an error occurs at the end of an interrupt data block, it
* can temporarily appear that we've received more data than is
* actually available -- make sure we don't show more received than
* is coming.
*/
if (hc->rc.bytes_expected > 0L && bytes_rcvd > hc->rc.bytes_expected)
bytes_rcvd = hc->rc.bytes_expected;
new_file = hc->h_filebytes;
new_total = bytes_rcvd;
/* Display current compression status */
if (!bittest(status, FILE_DONE | TRANSFER_DONE))
hrdsp_compress(hc, compress_status() == COMPRESS_ACTIVE);
/* Display throughput and time remaining */
if (stime > 0 &&
(cps = ((hc->total_thru + hc->h_filebytes) * 10L) / ttime) > 0)
{
new_cps = cps;
/* calculate time to completion */
if (hc->rc.bytes_expected > 0L)
{
ttime = (hc->rc.bytes_expected - bytes_rcvd) / cps;
if (hc->rc.files_expected > 1)
ttime += (hc->rc.files_expected - hc->current_filen);
new_remaining = ttime;
}
else if (hc->rc.filesize > 0L)
{
ttime = (hc->rc.filesize - hc->h_filebytes) / cps;
new_remaining = ttime;
}
}
}
DbgOutStr("elapsed=%ld, remaining=%ld, cps=%ld\r\n",
new_elapsed, new_remaining, new_cps, 0, 0);
xferMsgProgress(hc->hSession,
new_elapsed,
new_remaining,
new_cps,
new_file,
new_total);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hrdsp_status
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hrdsp_status(struct s_hc *hc, int status)
{
xferMsgStatus(hc->hSession, status);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hrdsp_event
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hrdsp_event(struct s_hc *hc, int event)
{
xferMsgEvent(hc->hSession, event);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hrdsp_filecnt
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hrdsp_filecnt(struct s_hc *hc, int cnt)
{
xferMsgFilecnt(hc->hSession, cnt);
}
void hrdsp_errorcnt(struct s_hc *hc, int cnt)
{
xferMsgErrorcnt(hc->hSession, cnt);
}
void hrdsp_compress(struct s_hc *hc, int cnt)
{
xferMsgCompression(hc->hSession, cnt);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hrdsp_totalsize
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hrdsp_totalsize(struct s_hc *hc, long bytes)
{
xferMsgTotalsize(hc->hSession, bytes);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hrdsp_newfile
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hrdsp_newfile(struct s_hc *hc,
int filen,
BYTE *theirname,
TCHAR *ourname)
{
xferMsgNewfile(hc->hSession, filen, theirname, ourname);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hrdsp_filesize
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hrdsp_filesize(struct s_hc *hc, long fsize)
{
xferMsgFilesize(hc->hSession, fsize);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
*
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
#if FALSE
void NEARF hpr_idle(HSESSION hS)
{
/* update elapsed time */
// task_exec();
DoYield(mGetCLoopHdl(hS));
}
#endif
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SENDING *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hs_setup
*
* DESCRIPTION:
* Handles transfer initialization and intial screen display.
*
* ARGUMENTS:
* nfiles -- The number of files that will be sent
* nbytes -- The total number of bytes to be sent.
*
* RETURNS:
* TRUE if no errors were encountered and its ok for transfer to proceed.
* FALSE if lack of memory prevents start of transfer.
*/
int hs_setup(struct s_hc *hc, int nfiles, long nbytes)
{
unsigned int uiOldOptions;
int enough_memory = TRUE;
XFR_PARAMS *pX;
XFR_HP_PARAMS *pH;
pX = (XFR_PARAMS *)0;
xfrQueryParameters(hc->hSession, (VOID **)&pX);
if (pX != (XFR_PARAMS *)0)
hc->h_useattr = pX->fUseDateTime;
pH = (XFR_HP_PARAMS *)xfer_get_params(hc->hSession, XF_HYPERP);
hc->blocksize = pH->nBlockSize;
hc->h_chkt = (pH->nCheckType == HP_CT_CRC) ? H_CRC : H_CHECKSUM;
hc->h_resynctime = pH->nResyncTimeout;
hc->h_trycompress = pH->nTryCompression;
hc->dptr = hc->msgdata;
hc->rmcnt = 0;
if (xfer_set_comport(hc->hSession, TRUE, &uiOldOptions) != TRUE)
{
/* TODO: decide of we need an error message or something */
return FALSE;
}
hc->hsxb.bufrsize = HSXB_SIZE;
hc->hsxb.cnt = HSXB_CYCLE;
hc->hsxb.total = hc->hsxb.bufrsize - hc->hsxb.cnt;
hc->hsxb.bptr = hc->hsxb.curbufr;
hc->hsxb.curbufr = NULL;
hc->hsxb.altbufr = NULL;
if (enough_memory)
hc->hsxb.curbufr = malloc(hc->hsxb.bufrsize);
if (hc->hsxb.curbufr == NULL)
enough_memory = FALSE;
if (enough_memory)
hc->hsxb.altbufr = malloc(hc->hsxb.bufrsize);
if (hc->hsxb.altbufr == NULL)
enough_memory = FALSE;
/* allocate as much memory as is available for the file table */
if (enough_memory)
{
hc->sc.ft_limit = 32; /* just for now */
hc->sc.hs_ftbl = malloc((size_t)(hc->sc.ft_limit + 1) * sizeof(struct s_ftbl));
if (hc->sc.hs_ftbl == NULL)
enough_memory = FALSE;
}
/* if we couldn't get enough memory, report it and leave */
if (!enough_memory)
{
if (hc->hsxb.curbufr != NULL)
free(hc->hsxb.curbufr);
if (hc->hsxb.altbufr != NULL)
free(hc->hsxb.altbufr);
if (hc->sc.hs_ftbl != NULL)
free(hc->sc.hs_ftbl);
/* TODO: add reperror call, or something like it */
assert(enough_memory);
return(FALSE);
}
hc->sd.hld_options = uiOldOptions;
hsdsp_compress(hc, compress_status() == COMPRESS_ACTIVE);
xferMsgFilecnt(hc->hSession, nfiles);
xferMsgTotalsize(hc->hSession, nbytes);
return TRUE;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hs_wrapup
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hs_wrapup(struct s_hc *hc, int attended, int bailout_status)
{
// bxmit_clear(); /* make sure no dregs are left in xmitter buffer */
ComSndBufrClear(sessQueryComHdl(hc->hSession));
xfer_restore_comport(hc->hSession, hc->sd.hld_options);
/* TODO: decide if it is useful to actually check for an error */
if (bailout_status == TSC_OK)
{
// hp_report_xtime((unsigned)hc->xfertime);
}
/* free all the memory we used */
xferMsgClose(hc->hSession);
free(hc->hsxb.curbufr);
free(hc->hsxb.altbufr);
free(hc->sc.hs_ftbl);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hs_fxmit
*
* DESCRIPTION:
* Sends a single character using HyperProtocol's dual buffering system.
* This functions does exactly what the macro hs_xmit_ does, but is in
* function form so it can be passed as a pointer.
*
* ARGUMENTS:
* c -- The character to be transmitted.
*
* RETURNS:
* nothing
*/
void hs_fxmit(struct s_hc *hc, BYTE c)
{
hs_xmit_(hc, c);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hs_xmit_switch
*
* DESCRIPTION:
* Sends a character using HyperProtocol's dual buffering system and checks
* whether it is time to switch buffers. Normally, one buffer will be in the
* process of being transmitted while the other is being filled. If the
* transmission is completed before the next buffer has been filled, some
* idle time could be wasted waiting for the second buffer to fill. This
* routine checks whether the transmitter is idle. If it is, it sets up the
* current buffer to start transmitting and begins filling the other buffer.
* If the transmitter is still busy, it continues on filling the current
* buffer.
*
* ARGUMENTS:
* c -- The character to be transmitted.
*
* RETURNS:
* Returns the argument as a convenience.
*/
BYTE hs_xmit_switch(struct s_hc *hc, BYTE c)
{
*hc->hsxb.bptr++ = c; /* place the character in the current buffer */
if (!ComSndBufrBusy(sessQueryComHdl(hc->hSession)) || (hc->hsxb.total == 0))
{
/* start xmitting this buffer and filling the other */
hs_xbswitch(hc);
}
else
{
/* keep going with same buffer by starting a new fill cycle */
#if defined(FINETUNE)
hc->hsxb.cnt = min(usr_hsxb_cycle, hc->hsxb.total);
#else
hc->hsxb.cnt = min(HSXB_CYCLE, hc->hsxb.total);
#endif
hc->hsxb.total -= hc->hsxb.cnt;
}
xfer_idle(hc->hSession);
return(c);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hs_xbswitch
*
* DESCRIPTION:
* Switches the currently filling buffer with the transmitting buffer.
* This function performs the actual switch described in the header for the
* function hs_xmit_switch(). The current buffer is set up be transmitted
* and the other buffer is setup to be filled. If the transmitter is busy
* This function will wait for a defined period of time for it to complete.
* If the function has to wait longer than a certain minimum time, the
* event and status messages will be updated to inform the user of the delay.
*
* ARGUMENTS:
* none
*
* RETURNS:
* nothing
*/
void hs_xbswitch(struct s_hc *hc)
{
HCOM hCom;
register int displayed = FALSE;
long timer;
long time;
unsigned bsize;
hCom = sessQueryComHdl(hc->hSession);
if (hc->hsxb.bptr > hc->hsxb.curbufr)/* if there is anything to transmit */
{
bsize = (unsigned)(hc->hsxb.bptr - hc->hsxb.curbufr);
if (ComSndBufrSend(hCom, hc->hsxb.curbufr, bsize, 10))
{
timer = startinterval();
while (ComSndBufrSend(hCom, hc->hsxb.curbufr, bsize, 10))
{
// hs_background(hSession);
/* keep elapsed time display accurate */
if ((time = (interval(hc->xfertimer) / 10L)) != hc->displayed_time)
xferMsgProgress(hc->hSession,
(hc->displayed_time = time),
-1, -1, -1, -1);
if (!displayed && interval(timer) > 40L)
{
hsdsp_event(hc, HSE_FULL);
hsdsp_status(hc, HSS_WAITRESUME);
displayed = TRUE;
}
}
if (displayed)
{
hsdsp_event(hc, HSE_GOTRESUME);
hsdsp_status(hc, HSS_SENDING);
}
}
/* hc->sc.bytes_sent is used in the throughput and time remaining
* calculations. It is always ahead of the number of characters
* actually transmitted because of buffering. To keep it from
* being too far ahead, we add in only half of the buffer about
* to be queued for transmission. Since a buffer-full may span
* more than one file, don't let value go negative
*/
if ((hc->sc.bytes_sent = hc->h_filebytes - (bsize / 2)) < 0)
hc->sc.bytes_sent = 0;
hc->hsxb.bptr = hc->hsxb.altbufr;
hc->hsxb.altbufr = hc->hsxb.curbufr;
hc->hsxb.curbufr = hc->hsxb.bptr;
#if defined(FINETUNE)
hc->hsxb.cnt = usr_hsxb_cycle;
#else
hc->hsxb.cnt = HSXB_CYCLE;
#endif
hc->hsxb.total = hc->hsxb.bufrsize - hc->hsxb.cnt;
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hs_xbclear
*
* DESCRIPTION:
* Clears the dual buffering system used in HyperProtocol. Any buffer being
* transitted is cut off and the current fill buffer is emptied.
*
* ARGUMENTS:
* none
*
* RETURNS:
* nothing
*/
void hs_xbclear(struct s_hc *hc)
{
hc->hsxb.bptr = hc->hsxb.curbufr;
#if defined(FINETUNE)
hc->hsxb.cnt = usr_hsxb_cycle;
#else
hc->hsxb.cnt = HSXB_CYCLE;
#endif
hc->hsxb.total = hc->hsxb.bufrsize - hc->hsxb.cnt;
// xmit_count = 0;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hsdsp_progress
*
* DESCRIPTION:
* Updates display fields on screen to indicate the progress of the transfer.
*
* ARGUMENTS:
* none
*
* RETURNS:
* nothing
*/
void hsdsp_progress(struct s_hc *hc, int status)
{
long new_stime = -1;
long new_ttime = -1;
long new_cps = -1;
long file_so_far = -1;
long total_so_far = -1;
long ttime, stime;
long bytes_sent;
long cps;
// int k_sent;
if (hc->xfertimer == -1L)
return;
ttime = bittest(status, TRANSFER_DONE) ?
hc->xfertime : interval(hc->xfertimer);
if ((stime = ttime / 10L) != hc->displayed_time ||
bittest(status, FILE_DONE | TRANSFER_DONE))
{
new_stime = stime;
/* Display amount transferred */
bytes_sent = hc->total_dsp + hc->sc.bytes_sent;
if (!bittest(status, TRANSFER_DONE))
file_so_far = hc->sc.bytes_sent;
total_so_far = bytes_sent;
/* Display throughput and time remaining */
if ((stime > 2 ||
ttime > 0 && bittest(status, FILE_DONE | TRANSFER_DONE)) &&
(cps = ((hc->total_thru + hc->sc.bytes_sent) * 10L) / ttime) > 0)
{
new_cps = cps;
ttime = ((hc->sc.nbytes - bytes_sent) / cps) +
hc->sc.nfiles - hc->current_filen;
new_ttime = ttime;
}
hc->displayed_time = stime;
}
xferMsgProgress(hc->hSession,
new_stime,
new_ttime,
new_cps,
file_so_far,
total_so_far);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hsdsp_newfile
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hsdsp_newfile(struct s_hc *hc, int filen, TCHAR *fname, long flength)
{
xferMsgNewfile(hc->hSession,
filen,
NULL,
fname);
xferMsgFilesize(hc->hSession, flength);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hsdsp_compress
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hsdsp_compress(struct s_hc *hc, int tf)
{
xferMsgCompression(hc->hSession, tf);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hsdsp_retries
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hsdsp_retries(struct s_hc *hc, int t)
{
xferMsgErrorcnt(hc->hSession, t);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hsdsp_status
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hsdsp_status(struct s_hc *hc, int s)
{
xferMsgStatus(hc->hSession, s);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hsdsp_event
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hsdsp_event(struct s_hc *hc, int e)
{
xferMsgEvent(hc->hSession, e);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hpr_id_get
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
void hpr_id_get(struct s_hc *hc, BYTE *dst)
{
wsprintf(dst, "V%u,%s", 100, (BYTE *)"HyperTerm by Hilgraeve, Inc.");
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* hpr_id_check
*
* DESCRIPTION:
*
*
* ARGUMENTS:
*
*
* RETURNS:
*
*/
int hpr_id_check(struct s_hc *hc, int rev, BYTE *name)
{
/* no restrictions on who we'll talk to */
rev = rev; /* keep compiler and lint from complaining */
name = name;
return TRUE;
}