added ofd scene, working http server
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include "utils.h"
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <codecvt>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
@@ -7,6 +8,37 @@
|
||||
#include <regex>
|
||||
#include <string>
|
||||
#include "../exceptions/ofdrequestexception.h"
|
||||
#include "settings/settings.h"
|
||||
#include <QWidget>
|
||||
#include <fstream>
|
||||
#include <ifaddrs.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
std::string get_local_ip_address() {
|
||||
struct ifaddrs * ifAddrStruct=NULL;
|
||||
struct ifaddrs * ifa=NULL;
|
||||
void * tmpAddrPtr=NULL;
|
||||
|
||||
getifaddrs(&ifAddrStruct);
|
||||
|
||||
for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
|
||||
if (ifa->ifa_addr == nullptr) continue;
|
||||
if (ifa->ifa_addr->sa_family==AF_INET) {
|
||||
tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
|
||||
char addressBuffer[128];
|
||||
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
|
||||
|
||||
std::string value(addressBuffer);
|
||||
if (!strncmp(value.c_str(), "192.168", 7)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ifAddrStruct!=NULL)
|
||||
freeifaddrs(ifAddrStruct);
|
||||
|
||||
throw std::runtime_error(QWidget::tr("Could not find any usable local IP address. If you beleive that this is problem with the program, please, contact the developer.").toStdString());
|
||||
}
|
||||
|
||||
std::string to_utf8(std::wstring wide_string) {
|
||||
static std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_conv;
|
||||
@@ -94,8 +126,9 @@ std::vector<std::wstring> find_in_html(std::string& html, std::string regex, std
|
||||
it != end; it++) {
|
||||
|
||||
std::wstring found_entry = from_utf8(it->str());
|
||||
std::wcout << "Found: " << found_entry << std::endl;
|
||||
std::wstring extracted = substring_from_to(found_entry, from_utf8(html_start), from_utf8(html_end));
|
||||
|
||||
std::wcout << "Extracted: " << extracted << std::endl;
|
||||
parsed.push_back(extracted);
|
||||
}
|
||||
return parsed;
|
||||
@@ -106,11 +139,42 @@ std::vector<std::wstring> find_products_in_html(std::string html) {
|
||||
}
|
||||
|
||||
std::vector<std::wstring> find_amounts_in_html(std::string html) {
|
||||
return find_in_html(html, "<span>\\d+<\\/span>", "<span>", "<\\/span>");
|
||||
std::vector<std::wstring> founds = find_in_html(html, "<div><span>\\d+(\\.|\\,)?\\d{0,3}<\\/span>", "<span>", "<\\/span>");
|
||||
for (auto &found : founds) {
|
||||
std::replace(found.begin(), found.end(), ',', '.');
|
||||
}
|
||||
|
||||
return founds;
|
||||
}
|
||||
|
||||
std::vector<std::wstring> find_prices_in_html(std::string html) {
|
||||
return find_in_html(html, "X <\\/span><span>\\d+\\.\\d{2}<\\/span>", "X <\\/span><span>", "<\\/span>");
|
||||
std::vector<std::wstring> founds = find_in_html(html, "X <\\/span><span>\\d+(\\.|,)\\d{2}<\\/span>", "X <\\/span><span>", "<\\/span>");
|
||||
for (auto &found : founds) {
|
||||
std::replace(found.begin(), found.end(), ',', '.');
|
||||
}
|
||||
|
||||
return founds;
|
||||
}
|
||||
|
||||
void dumpVectorsToStderr(std::vector<std::wstring> &products, std::vector<std::wstring> &amounts, std::vector<std::wstring> &prices) {
|
||||
std::cerr << "Products: ";
|
||||
for (auto &product : products) {
|
||||
std::cerr << to_utf8(product) << "|[]|";
|
||||
}
|
||||
std::cerr << std::endl;
|
||||
|
||||
std::cerr << "Amounts: ";
|
||||
for (auto &amount : amounts) {
|
||||
std::wcerr << amount << " ";
|
||||
}
|
||||
std::cerr << std::endl;
|
||||
|
||||
std::cerr << "Prices: ";
|
||||
for (auto &price : prices) {
|
||||
std::wcerr << price << " ";
|
||||
}
|
||||
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
|
||||
Check parseOfdRuAnswer(std::string html) {
|
||||
@@ -133,6 +197,10 @@ Check parseOfdRuAnswer(std::string html) {
|
||||
}
|
||||
|
||||
if ((products.size() + amounts.size() + prices.size())/products.size() != 3) {
|
||||
dumpVectorsToStderr(products, amounts, prices);
|
||||
//TOOD: make new setting "app_home" and get all path using it.
|
||||
std::ofstream error_log(get_path_relative_to_home(".local/share/checks_parser/error_log.txt"), std::ios_base::app);
|
||||
error_log << trimmed << std::endl;
|
||||
std::cerr << "An error has occured during the parsing of html. Please, contact the developer." << std::endl;
|
||||
std::exit(-1);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <vector>
|
||||
#include "../check/check.h"
|
||||
|
||||
std::string get_local_ip_address();
|
||||
std::string to_utf8(std::wstring wide_string);
|
||||
std::wstring from_utf8(std::string string);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user