/*
 * Xailer source code:
 *
 * AsynFileDownload.prg
 * Clase XAsynFileDownload
 *
 * Copyright 2003, 2004 Ignacio Ortiz de Zúñiga
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"


//------------------------------------------------------------------------------

CLASS XAsynFileDownload FROM TMTObject

PUBLISHED:
   PROPERTY cRemoteFile
   PROPERTY cLocalFile
   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

   EVENT OnConnect( oSender ) // --> Nil
   EVENT OnDisconnect( oSender ) // --> Nil
   EVENT OnTotalLengthInfo( oSender, nTotal ) // --> Nil
   EVENT OnTotalDnLoadInfo( oSender, nProgress ) // --> Nil
   EVENT OnError( oSender, cError ) // --> Nil

RESERVED:
   METHOD Free()    INLINE ::Close(), ::Super:Free()

PROTECTED:
   DATA hThread

   METHOD Download()
   METHOD Notify( nCode, nInfo )
   METHOD CleanUp()

ENDCLASS

//--------------------------------------------------------------------------

METHOD Run() CLASS XAsynFileDownload

   IF !::lCreated
      ::Create()
   ENDIF

   ::cError     := ""
   ::lSuccess   := .F.
   ::nStatus    := 0
   ::lConnected := .T.
   ::OnConnect()
   ::Download()

RETURN Nil

//------------------------------------------------------------------------------

METHOD Close() CLASS XAsynFileDownload

   IF ::lConnected
      ::lConnected := .F.
      ::CleanUp()
      ::OnDisconnect()
   ENDIF

RETURN Nil

//------------------------------------------------------------------------------

METHOD Notify( nCode, nInfo ) CLASS XAsynFileDownload

   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
      ::OnTotalDnLoadInfo( nInfo )

   ELSEIF nCode == 3  // Indicar el 'status code'
      ::nStatus := nInfo

   ELSEIF nCode == -1  // Error
      SWITCH nInfo
      CASE 1
         ::cError := "File creation error"
         EXIT
      CASE 2
         ::cError := "File save error"
         EXIT
      CASE 3
         ::cError := "Unknown error"
      OTHERWISE
         ::cError := "Error HTTP:" + LTrim( Str( nInfo ) )
      END
      ::OnError( ::cError )

   ENDIF

RETURN Nil

//------------------------------------------------------------------------------
