Advertisement
Guest User

Updater.c

a guest
Jan 18th, 2015
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.63 KB | None | 0 0
  1. #include <stdio>
  2. #include <stdlib>
  3. #include <string.h>
  4.  
  5. #include <curl/curl.h>
  6.  
  7. //Asjade salvestamiseks ja edasiseks kasutamiseks loodud structure.
  8. struct MemoryStructure {
  9.     char* mem;
  10.     size_t size;
  11. }
  12.  
  13. //See jätab compilerile märke, et selline funktsioon on olemas.
  14. static size_t WriteMemoryCallback(void* contents, size_t size, size_t nmemb, char* userp);
  15.  
  16. int main(int argc, char[] *argv)
  17. {
  18.     CURL *c_handle;                 // Vastutab http requesti eest.
  19.     CURLcode res;                  
  20.  
  21.     struct MemoryStructure chunk;   // \
  22.                                     // |- Edasiseks kasutuseks vajalikud lisad.
  23.     chunk.memory = malloc(1);       // |        Nendesse salvestatakse lehe sisu edasiseks kasutamiseks vajalikud andmed.
  24.     chunk.size = 0;                 // /
  25.  
  26.     curl_global_init(CURL_GLOBAL_ALL);
  27.  
  28.     c_handle = curl_easy_init();
  29.  
  30.     //argv[0] on see osa, mis tuleb esimesena pärast .exe.
  31.     curl_easy_setopt(c_handle, CURLOPT_URL, "http://foo.bar/latest?" + argv[0]);
  32.     //Lisab meie CURL handlele ülesande, kasutada salvestamiseks meie WriteMemortCallback(void*, size_t, size_t, char*) funktsiooni.
  33.     //See on vajalik, et mitte saada Windows süsteemidel crashi. Muidu põhjustaks CURLOPT_WRITEDATA crashi.
  34.     curl_easy_setopt(c_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  35.     //Paneb salvestama infot meie mälustruktuuri.
  36.     curl_easy_setopt(c_handle, CURLOPT_WRITEDATA, (void *)&chunk);
  37.     res = curl_easy_perform(c_handle);
  38.     if(res != CURLE_OK)
  39.     {
  40.         printf("Viga requestis, ei tulnud eriti v2lja...\n");
  41.     }
  42.     else
  43.     {
  44.         /*
  45.          * Niisiis, nüüd oleme jõudnud kohta, kus meil on olemas chunk.mem sisuga
  46.          * ja chunk.size selle suurusega byte arvestuses. Mis me teeme?
  47.          * Kontrollime, kas on tühi, ehk on '\0' või teisisõnu 'null terminator'.
  48.          * Seda võib ka hiljem muuta mingiks kombinatsiooniks või sõnaks.
  49.          */
  50.          if(!chunk.memory) // Võrdub if(chunk.memory != '\0'), C-s on null või tühjus tõlgendatav eiks.
  51.          {
  52.             //On olemas uuem versioon! Saab hakata sellega tegelema.
  53.             //Vat siin pani mõistus kokku...
  54.          }
  55.     }
  56.  
  57.     curl_easy_cleanup(c_handle); //Puhastab ja eemaldab kõik mälu kasututsed. Vajalik, et mitte saada erroreid.
  58.     return 0;
  59. }
  60.  
  61. static size_t WriteMemoryCallback(void* contents, size_t size, size_t nmemb, char* userp)
  62. {
  63.     size_t realsize = size * nmemb;
  64.     struct MemoryStruct *mem = (struct MemoryStruct *)userp;
  65.  
  66.     mem->memory = realloc(mem->memory, mem->size + realsize + 1);
  67.     if(mem->memory == NULL)
  68.     {
  69.         /*
  70.          * Pole mälu!
  71.          * Anname error koodi 5.
  72.          */
  73.         return 5;
  74.     }
  75.  
  76.     memcpy(&(mem->memory[mem->size]), contents, realsize);
  77.     mem->size += realsize;
  78.     mem->memory[mem->size] = 0;
  79.  
  80.     return realsize;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement