Subversion Repositories Kolibri OS

Rev

Rev 6001 | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. enum {
  3.         STATE_NOT_STARTED,
  4.         STATE_IN_PROGRESS,
  5.         STATE_COMPLETED
  6. };
  7.  
  8. struct DOWNLOADER {
  9.         int data_downloaded_size, data_full_size;
  10.         dword bufpointer, bufsize;
  11.         byte state;
  12.         dword http_transfer;
  13.         dword Start();
  14.         void Stop();
  15.         void Completed();
  16.         int MonitorProgress();
  17. } downloader;
  18.  
  19. dword DOWNLOADER::Start(dword _url)
  20. {
  21.         state = STATE_IN_PROGRESS;
  22.         http_get stdcall (_url, 0, 0, #accept_language);
  23.         http_transfer = EAX;
  24.         return http_transfer;
  25. }
  26.  
  27. void DOWNLOADER::Stop()
  28. {
  29.         state = STATE_NOT_STARTED;
  30.         if (http_transfer!=0)
  31.         {
  32.                 EAX = http_transfer;
  33.                 EAX = EAX.http_msg.content_ptr;         // get pointer to data
  34.                 $push EAX                                                       // save it on the stack
  35.                 http_free stdcall (http_transfer);      // abort connection
  36.                 $pop  EAX                                                      
  37.                 mem_Free(EAX);                                          // free data
  38.                 http_transfer=0;
  39.                 bufsize = 0;
  40.                 bufpointer = mem_Free(bufpointer);
  41.         }
  42.         data_downloaded_size = data_full_size = 0;
  43. }
  44.  
  45. void DOWNLOADER::Completed()
  46. {
  47.         state = STATE_COMPLETED;
  48.         ESI = http_transfer;
  49.         bufpointer = ESI.http_msg.content_ptr;
  50.         bufsize = ESI.http_msg.content_received;
  51.         http_free stdcall (http_transfer);
  52.         http_transfer=0;
  53. }
  54.  
  55. int DOWNLOADER::MonitorProgress()
  56. {
  57.         dword receive_result;
  58.         if (http_transfer <= 0) return false;
  59.         http_receive stdcall (http_transfer);
  60.         receive_result = EAX;
  61.         EDI = http_transfer;
  62.         data_full_size = EDI.http_msg.content_length;
  63.         data_downloaded_size = EDI.http_msg.content_received;
  64.         if (receive_result == 0) Completed();
  65.         return true;
  66. }
  67.