/*
 * Xailer source code:
 *
 * TAsyncDownload.prg
 * Clase TAsyncDownload
 *
 * Copyright 2008 Jose F. Gimenez
 * Copyright 2003, 2008 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"

#pragma BEGINDUMP
#include "windows.h"
#include "xailer.h"
#pragma ENDDUMP

//------------------------------------------------------------------------------

CLASS XAsyncDownload FROM TMTObject

PUBLISHED:
   PROPERTY cURL

   EVENT OnConnect( oSender ) // --> Nil
   EVENT OnDisconnect( oSender ) // --> Nil
   EVENT OnTotalLengthInfo( oSender, nTotal ) // --> Nil
   EVENT OnTotalDnLoadInfo( oSender, nProgress ) // --> Nil
   EVENT OnError( oSender, cError ) // --> Nil

PUBLIC:
   PROPERTY cBuffer     INIT ""  READONLY
   PROPERTY cError      INIT ""  READONLY
   PROPERTY nStatus     INIT 0   READONLY
   PROPERTY lSuccess    INIT .F. READONLY
   PROPERTY lConnected  INIT .F. READONLY

   METHOD Run() // --> Nil
   METHOD Cancel() INLINE ::Close() // --> Nil
   METHOD Close() // --> Nil

RESERVED:
   METHOD Free()    INLINE ::Close(), ::Super:Free()

PROTECTED:
   DATA hThread

   METHOD Download()
   METHOD Notify( nCode, nInfo )
   METHOD CleanUp()

ENDCLASS

//--------------------------------------------------------------------------

METHOD Run() CLASS XAsyncDownload

   IF !::lCreated
      ::Create()
   ENDIF

   ::cError     := ""
   ::lSuccess   := .F.
   ::nStatus    := 0
   ::lConnected := .T.
   ::OnConnect()
   ::Download()

RETURN Nil

//------------------------------------------------------------------------------

METHOD Close() CLASS XAsyncDownload

   IF ::lConnected
      ::lConnected := .F.
      ::CleanUp()
      ::OnDisconnect()
   endif

RETURN Nil

//------------------------------------------------------------------------------

METHOD Notify( nWParam, nInfo ) CLASS XAsyncDownload

   LOCAL nCode := LoWord( nWParam )

   IF nCode == 0
      IF ::nStatus == 200
         ::lSuccess := .T.
      ENDIF
      ::Close()

   ELSEIF nCode == 1  // Establecer el total de la PB
      ::OnTotalLengthInfo( nInfo )

   ELSEIF nCode == 2  // Establecer el valor actual de la PB
      ::cBuffer += HB_Inline( nWParam, nInfo ) {
         LPSTR cBuffer = (LPSTR) hb_parnl( 2 );
         hb_retclen( cBuffer, HIWORD( hb_parnl( 1 ) ) );
         LocalFree( cBuffer );
      }
      ::OnTotalDnLoadInfo( Len( ::cBuffer ) )

   ELSEIF nCode == 3  // Indicar el 'status code'
      ::nStatus := nInfo

   ELSEIF nCode == -1  // Error
      IF nInfo == 0
         ::cError := "Unknown error"
      ELSE
         ::cError := "Error HTTP:" + LTrim( Str( nInfo ) )
      ENDIF
      ::OnError( ::cError )

   ENDIF

RETURN Nil

//------------------------------------------------------------------------------
