home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / ncftp-2.3.0-base.tgz / ncftp-2.3.0-base.tar / contrib / ncftp / Xfer.h < prev   
C/C++ Source or Header  |  1995-05-29  |  3KB  |  125 lines

  1. /* Xfer.h */
  2.  
  3. #ifndef _xfer_h_
  4. #define _xfer_h_    1
  5.  
  6. #ifndef _ftp_h_
  7. #include "FTP.h"
  8. #endif
  9.  
  10. #ifndef _rcmd_h_
  11. #include "RCmd.h"
  12. #endif
  13.  
  14. #define kXferBufSize 32768
  15.  
  16. /* These coincide with the definitions of kAcceptForWriting, etc., in FTP.h. */
  17. #define kNetWriting kAcceptForWriting
  18. #define kNetReading kAcceptForReading
  19.  
  20. #define NETREADING(xp) ((xp)->netMode == kNetReading)
  21. #define NETWRITING(xp) ((xp)->netMode == kNetWriting)
  22.  
  23. /* More stuff for XferSpec setup.
  24.  * Typically, all of these are used at once when
  25.  * you don't want progress reports.
  26.  */
  27. #define kNoReports 0
  28. #define kFileSizeDontCare 0L
  29. #define kLocalFileIsStdout    "-"
  30.  
  31. /* Some BlockProcs will timeout after the defined interval, and they
  32.  * return this instead of just -1 for a regular error.
  33.  */
  34. #define kTimeoutErr (-2)
  35.  
  36. /* If we got kMaxConsecTimeOuts of these increments in a row, we conclude
  37.  * that the host isn't responding anymore and abort the transfer.
  38.  */
  39. #define kMaxConsecTimeOuts 10
  40.  
  41. /* typedef struct XferSpec *XferSpecPtr;  done in RCmd.h.  */
  42.  
  43. #define kNoTransfer ((XferSpecPtr) 0)
  44.  
  45. typedef long (*GetBlockProc)(char *, size_t, XferSpecPtr);
  46. typedef long (*PutBlockProc)(char *, size_t, XferSpecPtr);
  47.  
  48. /* Each progress meter function follows this calling format. */
  49. typedef int (*ProgressMeterProc)(XferSpecPtr, int);
  50.  
  51. typedef struct XferSpec {
  52.     /* These must be filled in by you. */
  53.     int                    netMode;        /* Reading or writing Net I/O? */
  54.     GetBlockProc        getBlock;
  55.     PutBlockProc        putBlock;
  56.     int                    inStream;
  57.     int                 outStream;
  58.     
  59.     /* You can use this to point to another structure if you like. */
  60.     void                *miscPtr;
  61.     
  62.     /* Filled in by you if you want progress reports. */
  63.     int                    doReports;
  64.     char                *localFileName;
  65.     char                *remoteFileName;
  66.     long                expectedSize;
  67.     long                startPoint;
  68.     
  69.     /* These are filled in by RDataCmd. */
  70.     ResponsePtr            cmdResp;
  71.     ResponsePtr            xferResp;
  72.     
  73.     /* These are filled in by Progress routines. */
  74.     int                    progMeterInUse;
  75.     ProgressMeterProc    prProc;
  76.     long                bytesTransferred;
  77.     long                bytesLeft;
  78.     double                frac;
  79.     double                bytesPerSec;
  80.     double                secsElap;
  81.     struct timeval        startTime;
  82.     struct timeval        endTime;
  83.     long                timeOfNextUpdate;
  84.  
  85.     /* Needed to guarantee that the file times get set. */
  86.     int                    doUTime;
  87.     time_t                remoteModTime;
  88. } XferSpec;
  89.  
  90. #define CLEARXFERSPEC(R)    PTRZERO(R, sizeof(XferSpec))
  91.  
  92. #ifndef _xfer_c_
  93. extern XferSpecPtr gCurXp;
  94. #endif
  95.  
  96. /* Instead of blocking forever on an I/O operation over the network, we
  97.  * can have the program give up after a period of time to update the progress
  98.  * meters and retry.  Since that's the only reason we need to interrupt a
  99.  * long network I/O operation, that's not a very compelling reason to do it.
  100.  *
  101.  * You can use the timeout facility by using the actual functions.  If not,
  102.  * just define them to the real read/write system calls.
  103.  */
  104. #define ReadOrTimeout read
  105. #define WriteOrTimeout write
  106.  
  107. void InitXferBuffer(void);
  108. int BufferGets(char *, size_t, XferSpecPtr);
  109. void XferSigHandler(int);
  110. XferSpecPtr InitXferSpec(void);
  111. void DoneWithXferSpec(XferSpecPtr);
  112. void AbortDataTransfer(XferSpecPtr);
  113. int DataTransfer(XferSpecPtr);
  114. void ResetBlockTimeout(void);
  115.  
  116. #ifndef ReadOrTimeout
  117. int ReadOrTimeout(const int, char *, const size_t);
  118. #endif
  119.  
  120. #ifndef WriteOrTimeout
  121. int WriteOrTimeout(const int, char *, const size_t);
  122. #endif    /* WriteOrTimeout */
  123.  
  124. #endif    /* _xfer_h_ */
  125.