Joel Grunbaum
2022-01-12 611ad7b12fcc6b34229316099ae66bccbcf24ad9
bom.cpp
@@ -1,60 +1,55 @@
#include "bom.hpp"
#include "book.hpp"
#include "ftplibpp/ftplib.h"
#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;
}
ftplib* ftp;
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);
   }
   ftp = new ftplib();
   ftp->Connect("ftp.bom.gov.au:21");
   ftp->Login("anonymous", "");
}
void destroy() { curl_global_cleanup(); }
void destroy()
{
   ftp->Quit();
   delete ftp;
}
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);
   }
   ftp->Get("bom_data.xml", "/anon/gen/fwo/IDN60920.xml",
            ftplib::transfermode::ascii);
   std::ifstream fs("bom_data.xml");
   std::vector<char> buffer{std::istreambuf_iterator<char>(fs),
                            istreambuf_iterator<char>()};
    buffer.push_back('\0');
   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;
   d.parse<0>(&buffer[0]);
    // Walk stations
   for (rapidxml::xml_node<>* n = d.first_node()->last_node()->first_node(); n;
        n = n->next_sibling()) {
        int bom_id = std::stoi(n->first_attribute()->next_attribute()->value());
        for (auto &i : bs) {
            if (i.second.stationId == bom_id) {
                // Should be apparent temp
                i.second.bomPrice = std::stod(n->first_node()->first_node()->first_node()->first_node()->value());
                std::cout << i.second.product << ", " << i.second.stationId << ", " << i.second.bomPrice << std::endl;
                break;
            }
        }
   }
}
} // namespace bom