2018-02-07 10:37:15 +00:00
|
|
|
#include "OctoPrint.hpp"
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
#include <boost/format.hpp>
|
|
|
|
|
|
|
|
#include <wx/frame.h>
|
|
|
|
#include <wx/event.h>
|
|
|
|
|
|
|
|
#include "libslic3r/PrintConfig.hpp"
|
|
|
|
#include "slic3r/GUI/GUI.hpp"
|
|
|
|
#include "Http.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
namespace Slic3r {
|
|
|
|
|
|
|
|
|
|
|
|
OctoPrint::OctoPrint(DynamicPrintConfig *config) :
|
2018-02-20 14:37:26 +00:00
|
|
|
host(config->opt_string("octoprint_host")),
|
|
|
|
apikey(config->opt_string("octoprint_apikey")),
|
|
|
|
cafile(config->opt_string("octoprint_cafile"))
|
2018-02-07 10:37:15 +00:00
|
|
|
{}
|
|
|
|
|
2018-03-15 17:06:26 +00:00
|
|
|
bool OctoPrint::test(wxString &msg) const
|
2018-02-07 10:37:15 +00:00
|
|
|
{
|
2018-02-20 14:37:26 +00:00
|
|
|
// Since the request is performed synchronously here,
|
2018-03-15 17:06:26 +00:00
|
|
|
// it is ok to refer to `msg` from within the closure
|
2018-02-20 14:37:26 +00:00
|
|
|
|
2018-03-15 17:06:26 +00:00
|
|
|
bool res = true;
|
|
|
|
|
|
|
|
auto url = std::move(make_url("api/version"));
|
|
|
|
auto http = Http::get(std::move(url));
|
2018-02-20 14:37:26 +00:00
|
|
|
set_auth(http);
|
|
|
|
http.on_error([&](std::string, std::string error, unsigned status) {
|
2018-03-15 17:06:26 +00:00
|
|
|
res = false;
|
|
|
|
msg = format_error(error, status);
|
2018-02-20 14:37:26 +00:00
|
|
|
})
|
|
|
|
.perform_sync();
|
|
|
|
|
|
|
|
return res;
|
2018-02-07 10:37:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void OctoPrint::send_gcode(int windowId, int completeEvt, int errorEvt, const std::string &filename, bool print) const
|
|
|
|
{
|
2018-02-20 14:37:26 +00:00
|
|
|
auto http = Http::post(std::move(make_url("api/files/local")));
|
|
|
|
set_auth(http);
|
|
|
|
http.form_add("print", print ? "true" : "false")
|
|
|
|
.form_add_file("file", filename)
|
|
|
|
.on_complete([=](std::string body, unsigned status) {
|
2018-03-15 17:06:26 +00:00
|
|
|
wxWindow *window = wxWindow::FindWindowById(windowId);
|
|
|
|
if (window == nullptr) { return; }
|
|
|
|
|
2018-02-20 14:37:26 +00:00
|
|
|
wxCommandEvent* evt = new wxCommandEvent(completeEvt);
|
2018-03-15 17:06:26 +00:00
|
|
|
evt->SetString(_(L("G-code file successfully uploaded to the OctoPrint server")));
|
2018-02-20 14:37:26 +00:00
|
|
|
evt->SetInt(100);
|
|
|
|
wxQueueEvent(window, evt);
|
|
|
|
})
|
|
|
|
.on_error([=](std::string body, std::string error, unsigned status) {
|
2018-03-15 17:06:26 +00:00
|
|
|
wxWindow *window = wxWindow::FindWindowById(windowId);
|
|
|
|
if (window == nullptr) { return; }
|
2018-02-20 14:37:26 +00:00
|
|
|
|
|
|
|
wxCommandEvent* evt_complete = new wxCommandEvent(completeEvt);
|
|
|
|
evt_complete->SetInt(100);
|
|
|
|
wxQueueEvent(window, evt_complete);
|
|
|
|
|
|
|
|
wxCommandEvent* evt_error = new wxCommandEvent(errorEvt);
|
2018-03-15 17:06:26 +00:00
|
|
|
evt_error->SetString(wxString::Format("%s: %s",
|
|
|
|
_(L("Error while uploading to the OctoPrint server")),
|
|
|
|
format_error(error, status)));
|
2018-02-20 14:37:26 +00:00
|
|
|
wxQueueEvent(window, evt_error);
|
|
|
|
})
|
|
|
|
.perform();
|
2018-02-07 10:37:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void OctoPrint::set_auth(Http &http) const
|
|
|
|
{
|
2018-02-20 14:37:26 +00:00
|
|
|
http.header("X-Api-Key", apikey);
|
2018-02-07 10:37:15 +00:00
|
|
|
|
2018-02-20 14:37:26 +00:00
|
|
|
if (! cafile.empty()) {
|
|
|
|
http.ca_file(cafile);
|
|
|
|
}
|
2018-02-07 10:37:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string OctoPrint::make_url(const std::string &path) const
|
|
|
|
{
|
2018-02-20 14:37:26 +00:00
|
|
|
if (host.find("http://") == 0 || host.find("https://") == 0) {
|
|
|
|
if (host.back() == '/') {
|
|
|
|
return std::move((boost::format("%1%%2%") % host % path).str());
|
|
|
|
} else {
|
|
|
|
return std::move((boost::format("%1%/%2%") % host % path).str());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return std::move((boost::format("http://%1%/%2%") % host % path).str());
|
|
|
|
}
|
2018-02-07 10:37:15 +00:00
|
|
|
}
|
|
|
|
|
2018-03-15 17:06:26 +00:00
|
|
|
wxString OctoPrint::format_error(std::string error, unsigned status)
|
2018-02-07 10:37:15 +00:00
|
|
|
{
|
2018-03-15 17:06:26 +00:00
|
|
|
const wxString wxerror = error;
|
2018-02-20 14:37:26 +00:00
|
|
|
|
2018-03-15 17:06:26 +00:00
|
|
|
if (status != 0) {
|
|
|
|
return wxString::Format("HTTP %u: %s", status,
|
|
|
|
(status == 401 ? _(L("Invalid API key")) : wxerror));
|
2018-02-20 14:37:26 +00:00
|
|
|
} else {
|
2018-03-15 17:06:26 +00:00
|
|
|
return std::move(wxerror);
|
2018-02-20 14:37:26 +00:00
|
|
|
}
|
2018-02-07 10:37:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|