Joel Grunbaum
2022-01-12 ae7d00edf2f02912ec9c04919ea7535c93d2d1e0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "bom.hpp"
 
#include "book.hpp"
#include "rapidxml/rapidxml.hpp"
#include <cstddef>
#include <cstdio>
#include <curl/curl.h>
#include <fstream>
#include <iterator>
#include <stdio.h>
#include <string>
#include <unordered_map>
#include <vector>
 
namespace bom
{
CURL* curl{NULL};
std::string result;
 
static size_t my_write(void* buffer, std::size_t size, std::size_t nmemb,
                       void* stream)
{
    std::string& text = *static_cast<std::string*>(stream);
    std::size_t totalsize = size * nmemb;
    text.append(static_cast<char*>(buffer), totalsize);
    return totalsize;
}
 
void initialise()
{
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL,
                         "ftp://ftp.bom.gov.au/anon/gen/fwo/IDN60920.xml");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    }
}
 
void destroy() { curl_global_cleanup(); }
 
void updateBom(std::unordered_map<std::string, book::Book>& bs)
{
    CURLcode res;
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    if (CURLE_OK != res) {
        fprintf(stderr, "Curl failed: %d\n", res);
    }
    rapidxml::xml_document<> d;
    d.parse<0>(&result[0]);
    rapidxml::xml_node<>* n = d.first_node();
    for (rapidxml::xml_attribute<>* a = n->first_attribute(); a;
         a = a->next_attribute()) {
        std::cout << a->name() << ": " << a->value() << std::endl;
    }
}
} // namespace bom