home *** CD-ROM | disk | FTP | other *** search
/ BUG 14 / BUGCD1998_05.ISO / internet / tcp4u / tcp4u330.exe / tcp4u.330 / src / tcp4u_ex.c < prev    next >
C/C++ Source or Header  |  1998-03-05  |  5KB  |  138 lines

  1. /*
  2.  * Tcp4u v 3.30        Last Revision 27/06/1997  3.10
  3.  *
  4.  *===========================================================================
  5.  *
  6.  * Project: Tcp4u,      Library for tcp protocol
  7.  * File:    tcp4u_ex.c
  8.  * Purpose: Add-on to Tcp4u library
  9.  *
  10.  *===========================================================================
  11.  *
  12.  * This software is Copyright (c) 1996-1998 by Philippe Jounin
  13.  *
  14.  * This library is free software; you can redistribute it and/or
  15.  * modify it under the terms of the GNU Library General Public
  16.  * License as published by the Free Software Foundation; either
  17.  * version 2 of the License, or (at your option) any later version.
  18.  * 
  19.  * This library is distributed in the hope that it will be useful,
  20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  22.  * Library General Public License for more details.
  23.  * 
  24.  * You should have received a copy of the GNU Library General Public
  25.  * License along with this library; if not, write to the
  26.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  27.  * Boston, MA  02111-1307, USA.
  28.  *
  29.  *
  30.  *  If you make modifications to this software that you feel
  31.  *  increases it usefulness for the rest of the community, please
  32.  *  email the changes, enhancements, bug fixes as well as any and
  33.  *  all ideas to me. This software is going to be maintained and
  34.  *  enhanced as deemed necessary by the community.
  35.  *
  36.  *
  37.  *             Philippe Jounin (ph.jounin@computer.org)
  38.  */
  39.  
  40.  
  41.  
  42. #include "build.h"
  43.  
  44.  
  45. #ifndef trace
  46. #define trace 1
  47. #endif
  48.  
  49. /*######################################################################
  50.  *##
  51.  *## NAME:   TCPRecvUntilClosedEx
  52.  *##
  53.  *## PURPOSE: Receive Tcp data until socket connection closed by server
  54.  *##
  55.  *####################################################################*/
  56. int API4U TcpRecvUntilClosedEx 
  57.            (SOCKET   far  *pCSock,          /* socket comm.*/
  58.             LPCSTR         szLocalFile,     /* local file transfer */
  59.             TRANSFER_CBK  CbkTransmit,      /* callback transfer */
  60.             unsigned      uTimeout,              /* timeout */
  61.             unsigned int  uBufSize,              /* buffer transfer size */
  62.             long          lUserValue,            /* user value */
  63.             long          lTotalBytes)           /* */
  64. {
  65. int     Rc;
  66. long    lBytesTransferred = 0;
  67. HFILE   hFile = HFILE_ERROR;
  68. LPSTR   sBufRead = NULL;
  69.  
  70. #define XX_RETURN(a)   {\
  71.                        if (hFile != HFILE_ERROR)  Close(hFile);\
  72.                        if (sBufRead != NULL) Free(sBufRead);\
  73.                        Tcp4uLog (LOG4U_EXIT, "TcpRecvUntilClosedEx, return code %d", a);  \
  74.                        return a;\
  75.                        }
  76.  
  77.    Tcp4uLog (LOG4U_PROC, "TcpRecvUntilClosedEx");
  78.  
  79.  /* open user local file */
  80.  if (szLocalFile!=NULL  &&  (hFile=Open(szLocalFile, WRITE_CR)) == HFILE_ERROR) 
  81.  {
  82.     /* open failed */
  83.     XX_RETURN (TCP4U_FILE_ERROR);
  84.  }
  85.  
  86.   /* allocate buffer */
  87.   if ( (sBufRead = Calloc(uBufSize<128 ? 128 : uBufSize,1)) == NULL) 
  88.   {
  89.     XX_RETURN(TCP4U_INSMEMORY);
  90.   }
  91.  
  92.   /* first call to user callback */
  93.   if (CbkTransmit != NULL && (*CbkTransmit)(lBytesTransferred,
  94.                                          lTotalBytes,
  95.                                          lUserValue,
  96.                                          sBufRead,
  97.                                          0) == FALSE) 
  98.   {
  99.      /* user stop order */
  100.      XX_RETURN (TCP4U_CANCELLED);
  101.   }
  102.  
  103.   /* read data from http server */
  104.   do 
  105.   {
  106.      /* read one data frame */
  107.      Rc=TcpRecv(*pCSock,
  108.                 sBufRead, /* adress */
  109.                 uBufSize,
  110.                 uTimeout,
  111.                 HFILE_ERROR);
  112.      if (Rc >= TCP4U_SUCCESS) 
  113.      {
  114.         /* write to the user local file --> Warning signed/unsigned mismatch */
  115.         if (hFile != HFILE_ERROR  && Write(hFile, sBufRead, Rc) != Rc) 
  116.         {
  117.           XX_RETURN(TCP4U_FILE_ERROR);
  118.         }
  119.  
  120.         lBytesTransferred += (long) Rc;
  121.  
  122.         /* appel du callback */
  123.         if (CbkTransmit != NULL && (*CbkTransmit)(lBytesTransferred,
  124.                                                lTotalBytes,
  125.                                                lUserValue,
  126.                                                sBufRead,
  127.                                                Rc) == FALSE) {
  128.           XX_RETURN (TCP4U_CANCELLED);
  129.         }
  130.      }
  131.   } while (Rc >= TCP4U_SUCCESS); /* END do while */
  132.  
  133.   /* close all files and free allocated buffers */
  134.   XX_RETURN(Rc == TCP4U_SOCKETCLOSED ? TCP4U_SUCCESS : Rc);
  135.  
  136. #undef XX_RETURN
  137. } /* END TcpRecvUntilClosedEx */
  138.