dl-fldigi/src/misc/xmlrpc.cxx

2823 wiersze
68 KiB
C++

// ----------------------------------------------------------------------------
// xmlrpc.cxx
//
// Copyright (C) 2008-2010
// Stelios Bounanos, M0GLD
// Copyright (C) 2008-2010
// Dave Freese, W1HKJ
//
// See EOF for a list of method names. Run "fldigi --xmlrpc-list"
// to see a list of method names, signatures and descriptions.
//
//
// This file is part of fldigi.
//
// fldigi is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// fldigi is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// ----------------------------------------------------------------------------
#include <config.h>
#include "xmlrpc.h"
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <exception>
#include <cstdlib>
#include <signal.h>
#include <xmlrpc-c/base.hpp>
#include <xmlrpc-c/girerr.hpp>
#include <xmlrpc-c/registry.hpp>
#include <xmlrpc-c/server_abyss.hpp>
#include "globals.h"
#include "socket.h"
#include "threads.h"
#include "modem.h"
#include "trx.h"
#include "fl_digi.h"
#include "configuration.h"
#include "main.h"
#include "waterfall.h"
#include "macros.h"
#include "qrunner.h"
#include "wefax.h"
#include "wefax-pic.h"
#if USE_HAMLIB
#include "hamlib.h"
#endif
#include "rigMEM.h"
#include "rigio.h"
#include "debug.h"
#include "re.h"
#include "pskrep.h"
// required for flrig support
#include "fl_digi.h"
#include "rigsupport.h"
#include "confdialog.h"
LOG_FILE_SOURCE(debug::LOG_RPC);
using namespace std;
struct rpc_method
{
rpc_method(const xmlrpc_c::methodPtr& m, const char* n)
: method(m), name(n) { }
xmlrpc_c::methodPtr method;
const char* name;
};
typedef list<rpc_method> methods_t;
static methods_t* methods = 0;
static pthread_t* server_thread;
static pthread_mutex_t* server_mutex;
XML_RPC_Server* XML_RPC_Server::inst = 0;
XML_RPC_Server::XML_RPC_Server()
{
server_socket = new Socket;
add_methods();
server_thread = new pthread_t;
server_mutex = new pthread_mutex_t;
pthread_mutex_init(server_mutex, NULL);
run = true;
}
XML_RPC_Server::~XML_RPC_Server()
{
run = false;
if (server_thread) {
CANCEL_THREAD(*server_thread);
pthread_join(*server_thread, NULL);
delete server_thread;
server_thread = 0;
}
delete methods;
delete server_socket;
methods = 0;
}
void XML_RPC_Server::start(const char* node, const char* service)
{
if (inst)
return;
inst = new XML_RPC_Server;
try {
inst->server_socket->open(Address(node, service));
inst->server_socket->bind();
if (pthread_create(server_thread, NULL, thread_func, NULL) != 0)
throw runtime_error(strerror(errno));
}
catch (const exception& e) {
LOG_ERROR("Could not start XML-RPC server (%s)", e.what());
delete server_thread;
server_thread = 0;
delete inst;
inst = 0;
return;
}
}
void XML_RPC_Server::stop(void)
{
// FIXME: uncomment when we have an xmlrpc server that can be interrupted
// if (!inst)
// return;
// inst->server_socket->close();
// delete inst;
// inst = 0;
}
void* XML_RPC_Server::thread_func(void*)
{
SET_THREAD_ID(XMLRPC_TID);
xmlrpc_c::registry reg;
for (methods_t::iterator i = methods->begin(); i != methods->end(); ++i)
reg.addMethod(i->name, i->method);
save_signals();
xmlrpc_c::serverAbyss server(xmlrpc_c::serverAbyss::constrOpt()
.registryP(&reg)
.keepaliveMaxConn(INT_MAX)
.socketFd(inst->server_socket->fd())
#ifndef NDEBUG
.logFileName(HomeDir + "xmlrpc.log")
#endif
);
restore_signals();
SET_THREAD_CANCEL();
server.run();
return NULL;
}
ostream& XML_RPC_Server::list_methods(ostream& out)
{
add_methods();
ios_base::fmtflags f = out.flags(ios::left);
for (methods_t::const_iterator i = methods->begin(); i != methods->end(); ++i)
out << setw(32) << i->name << setw(8) << i->method->signature()
<< i->method->help() << '\n';
return out << setiosflags(f);
}
// =============================================================================
// Methods that change the server state must call XMLRPC_LOCK
// guard_lock (include/threads.h) ensures that mutex are always unlocked.
#define XMLRPC_LOCK SET_THREAD_ID(XMLRPC_TID); guard_lock autolock_(server_mutex)
// =============================================================================
// generic helper functions
static void set_button(Fl_Button* button, bool value)
{
button->value(value);
button->do_callback();
}
static void set_valuator(Fl_Valuator* valuator, double value)
{
valuator->value(value);
valuator->do_callback();
}
static void set_text(Fl_Input* textw, string& value)
{
textw->value(value.c_str());
textw->do_callback();
}
static void set_combo_contents(Fl_ComboBox* box, const vector<string>* items)
{
box->clear();
if (items->empty()) {
box->add("");
box->index(0);
box->deactivate();
return;
}
for (vector<string>::const_iterator i = items->begin(); i != items->end(); ++i) {
box->add(i->c_str());
}
box->index(0);
box->activate();
}
static void set_combo_value(Fl_ComboBox* box, const string& s)
{
box->value(s.c_str());
box->do_callback();
}
static void get_combo_contents(Fl_ComboBox* box, vector<xmlrpc_c::value>* items)
{
int n = box->size(), p = box->index();
items->reserve(n);
for (int i = 0; i < n; i++) {
box->index(i);
items->push_back(xmlrpc_c::value_string(box->value()));
}
box->index(p);
}
// =============================================================================
// XML-RPC interface definition
// =============================================================================
class Fldigi_list : public xmlrpc_c::method
{
public:
Fldigi_list()
{
_signature = "A:n";
_help = "Returns the list of methods.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
vector<xmlrpc_c::value> help;
for (methods_t::const_iterator i = methods->begin(); i != methods->end(); ++i) {
map<string, xmlrpc_c::value> item;
item["name"] = xmlrpc_c::value_string(i->name);
item["signature"] = xmlrpc_c::value_string(i->method->signature());
item["help"] = xmlrpc_c::value_string(i->method->help());
help.push_back(xmlrpc_c::value_struct(item));
}
*retval = xmlrpc_c::value_array(help);
}
};
class Fldigi_name : public xmlrpc_c::method
{
public:
Fldigi_name()
{
_signature = "s:n";
_help = "Returns the program name.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(PACKAGE_TARNAME);
}
};
class Fldigi_version_struct : public xmlrpc_c::method
{
public:
Fldigi_version_struct()
{
_signature = "S:n";
_help = "Returns the program version as a struct.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
map<string, xmlrpc_c::value> vstruct;
vstruct["major"] = xmlrpc_c::value_int(FLDIGI_VERSION_MAJOR);
vstruct["minor"] = xmlrpc_c::value_int(FLDIGI_VERSION_MINOR);
vstruct["patch"] = xmlrpc_c::value_string(FLDIGI_VERSION_PATCH);
*retval = xmlrpc_c::value_struct(vstruct);
}
};
class Fldigi_version_string : public xmlrpc_c::method
{
public:
Fldigi_version_string()
{
_signature = "s:n";
_help = "Returns the program version as a string.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(PACKAGE_VERSION);
}
};
class Fldigi_name_version : public xmlrpc_c::method
{
public:
Fldigi_name_version()
{
_signature = "s:n";
_help = "Returns the program name and version.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(PACKAGE_STRING);
}
};
class Fldigi_config_dir : public xmlrpc_c::method
{
public:
Fldigi_config_dir()
{
_signature = "s:n";
_help = "Returns the name of the configuration directory.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(HomeDir);
}
};
class Fldigi_terminate : public xmlrpc_c::method
{
public:
Fldigi_terminate()
{
_signature = "n:i";
_help = "Terminates fldigi. ``i'' is bitmask specifying data to save: 0=options; 1=log; 2=macros.";
}
enum {
TERM_SAVE_OPTIONS = 1 << 0,
TERM_SAVE_LOG = 1 << 1,
TERM_SAVE_MACROS = 1 << 2
};
static void terminate(int how)
{
if (how & TERM_SAVE_OPTIONS)
progdefaults.saveDefaults();
progdefaults.changed = false;
extern bool oktoclear;
if (how & TERM_SAVE_LOG && !oktoclear)
qsoSave->do_callback();
oktoclear = true;
progdefaults.NagMe = false;
if (how & TERM_SAVE_MACROS && macros.changed)
macros.saveMacroFile();
macros.changed = false;
fl_digi_main->do_callback();
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(terminate, params.getInt(0));
*retval = xmlrpc_c::value_nil();
}
};
// =============================================================================
class Modem_get_name : public xmlrpc_c::method
{
public:
Modem_get_name()
{
_signature = "s:n";
_help = "Returns the name of the current modem.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(mode_info[active_modem->get_mode()].sname);
}
};
class Modem_get_names : public xmlrpc_c::method
{
public:
Modem_get_names()
{
_signature = "A:n";
_help = "Returns all modem names.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
vector<xmlrpc_c::value> names;
names.reserve(NUM_MODES);
for (size_t i = 0; i < NUM_MODES; i++)
names.push_back(xmlrpc_c::value_string(mode_info[i].sname));
*retval = xmlrpc_c::value_array(names);
}
};
class Modem_get_id : public xmlrpc_c::method
{
public:
Modem_get_id()
{
_signature = "i:n";
_help = "Returns the ID of the current modem.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_int(active_modem->get_mode());
}
};
class Modem_get_max_id : public xmlrpc_c::method
{
public:
Modem_get_max_id()
{
_signature = "i:n";
_help = "Returns the maximum modem ID number.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_int(NUM_MODES - 1);
}
};
class Modem_set_by_name : public xmlrpc_c::method
{
public:
Modem_set_by_name()
{
_signature = "s:s";
_help = "Sets the current modem. Returns old name.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
const char* cur = mode_info[active_modem->get_mode()].sname;
string s = params.getString(0);
for (size_t i = 0; i < NUM_MODES; i++) {
if (s == mode_info[i].sname) {
REQ_SYNC(init_modem_sync, i, 0);
*retval = xmlrpc_c::value_string(cur);
return;
}
}
throw xmlrpc_c::fault("No such modem");
}
};
class Modem_set_by_id : public xmlrpc_c::method
{
public:
Modem_set_by_id()
{
_signature = "i:i";
_help = "Sets the current modem. Returns old ID.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
int cur = active_modem->get_mode();
int i = params.getInt(0, 0, NUM_MODES-1);
REQ_SYNC(init_modem_sync, i, 0);
*retval = xmlrpc_c::value_int(cur);
}
};
// =============================================================================
class Modem_set_carrier : public xmlrpc_c::method
{
public:
Modem_set_carrier()
{
_signature = "i:i";
_help = "Sets modem carrier. Returns old carrier.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
int cur = active_modem->get_freq();
active_modem->set_freq(params.getInt(0, 1));
*retval = xmlrpc_c::value_int(cur);
}
};
class Modem_inc_carrier : public xmlrpc_c::method
{
public:
Modem_inc_carrier()
{
_signature = "i:i";
_help = "Increments the modem carrier frequency. Returns the new carrier.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
int cur = active_modem->get_freq();
active_modem->set_freq(cur + params.getInt(0));
*retval = xmlrpc_c::value_int(active_modem->get_freq());
}
};
class Modem_get_carrier : public xmlrpc_c::method
{
public:
Modem_get_carrier()
{
_signature = "i:n";
_help = "Returns the modem carrier frequency.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_int(active_modem->get_freq());
}
};
// =============================================================================
class Modem_get_afc_sr : public xmlrpc_c::method
{
public:
Modem_get_afc_sr()
{
_signature = "i:n";
_help = "Returns the modem AFC search range.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
if (!(active_modem->get_cap() & modem::CAP_AFC_SR))
throw xmlrpc_c::fault("Operation not supported by modem");
*retval = xmlrpc_c::value_int((int)cntSearchRange->value());
}
};
class Modem_set_afc_sr : public xmlrpc_c::method
{
public:
Modem_set_afc_sr()
{
_signature = "n:i";
_help = "Sets the modem AFC search range. Returns the old value.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
if (!(active_modem->get_cap() & modem::CAP_AFC_SR))
throw xmlrpc_c::fault("Operation not supported by modem");
int v = (int)(cntSearchRange->value());
REQ(set_valuator, cntSearchRange, params.getInt(0, (int)cntSearchRange->minimum(), (int)cntSearchRange->maximum()));
*retval = xmlrpc_c::value_int(v);
}
};
class Modem_inc_afc_sr : public xmlrpc_c::method
{
public:
Modem_inc_afc_sr()
{
_signature = "n:i";
_help = "Increments the modem AFC search range. Returns the new value.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
if (!(active_modem->get_cap() & modem::CAP_AFC_SR))
throw xmlrpc_c::fault("Operation not supported by modem");
int v = (int)(cntSearchRange->value() + params.getInt(0));
REQ(set_valuator, cntSearchRange, v);
*retval = xmlrpc_c::value_int(v);
}
};
// =============================================================================
static Fl_Valuator* get_bw_val(void)
{
if (!(active_modem->get_cap() & modem::CAP_BW))
throw xmlrpc_c::fault("Operation not supported by modem");
trx_mode m = active_modem->get_mode();
if (m >= MODE_HELL_FIRST && m <= MODE_HELL_LAST)
return sldrHellBW;
else if (m == MODE_CW)
return sldrCWbandwidth;
throw xmlrpc_c::fault("Unknown CAP_BW modem");
}
class Modem_get_bw : public xmlrpc_c::method
{
public:
Modem_get_bw()
{
_signature = "i:n";
_help = "Returns the modem bandwidth.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_int((int)get_bw_val()->value());
}
};
class Modem_set_bw : public xmlrpc_c::method
{
public:
Modem_set_bw()
{
_signature = "n:i";
_help = "Sets the modem bandwidth. Returns the old value.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
Fl_Valuator* val = get_bw_val();
int v = (int)(val->value());
REQ(set_valuator, val, params.getInt(0, (int)val->minimum(), (int)val->maximum()));
*retval = xmlrpc_c::value_int(v);
}
};
class Modem_inc_bw : public xmlrpc_c::method
{
public:
Modem_inc_bw()
{
_signature = "n:i";
_help = "Increments the modem bandwidth. Returns the new value.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
Fl_Valuator* val = get_bw_val();
int v = (int)(val->value() + params.getInt(0));
REQ(set_valuator, val, v);
*retval = xmlrpc_c::value_int(v);
}
};
// =============================================================================
class Modem_get_quality : public xmlrpc_c::method
{
public:
Modem_get_quality()
{
_signature = "d:n";
_help = "Returns the modem signal quality in the range [0:100].";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_double(pgrsSquelch->value());
}
};
class Modem_search_up : public xmlrpc_c::method
{
public:
Modem_search_up()
{
_signature = "n:n";
_help = "Searches upward in frequency.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(&modem::searchUp, active_modem);
*retval = xmlrpc_c::value_nil();
}
};
class Modem_search_down : public xmlrpc_c::method
{
public:
Modem_search_down()
{
_signature = "n:n";
_help = "Searches downward in frequency.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(&modem::searchDown, active_modem);
*retval = xmlrpc_c::value_nil();
}
};
class Modem_olivia_set_bandwidth : public xmlrpc_c::method
{
public:
Modem_olivia_set_bandwidth()
{
_signature = "n:i";
_help = "Sets the Olivia bandwidth.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
int bw;
switch (bw = params.getInt(0)) {
case 125: case 250: case 500: case 1000: case 2000:
{
XMLRPC_LOCK;
REQ_SYNC(set_olivia_bw, bw);
*retval = xmlrpc_c::value_nil();
}
break;
default:
throw xmlrpc_c::fault("Invalid Olivia bandwidth");
}
}
};
class Modem_olivia_get_bandwidth : public xmlrpc_c::method
{
public:
Modem_olivia_get_bandwidth()
{
_signature = "i:n";
_help = "Returns the Olivia bandwidth.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
int bw, v = mnuOlivia_Bandwidth->value();
if (v == 0)
bw = 125;
else if (v == 1)
bw = 250;
else if (v == 2)
bw = 500;
else if (v == 3)
bw = 1000;
else
bw = 2000;
*retval = xmlrpc_c::value_int(bw);
}
};
class Modem_olivia_set_tones : public xmlrpc_c::method
{
public:
Modem_olivia_set_tones()
{
_signature = "n:i";
_help = "Sets the Olivia tones.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
int tones = params.getInt(0, 2, 256);
if (powerof2(tones)) {
XMLRPC_LOCK;
REQ_SYNC(set_olivia_tones, tones);
*retval = xmlrpc_c::value_nil();
}
else
throw xmlrpc_c::fault("Invalid Olivia tones");
}
};
class Modem_olivia_get_tones : public xmlrpc_c::method
{
public:
Modem_olivia_get_tones()
{
_signature = "i:n";
_help = "Returns the Olivia tones.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_int(1 << (mnuOlivia_Tones->value() + 1));
}
};
// =============================================================================
class Main_get_status1 : public xmlrpc_c::method
{
public:
Main_get_status1()
{
_signature = "s:n";
_help = "Returns the contents of the first status field (typically s/n).";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(Status1->label());
}
};
class Main_get_status2 : public xmlrpc_c::method
{
public:
Main_get_status2()
{
_signature = "s:n";
_help = "Returns the contents of the second status field.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(Status2->label());
}
};
class Main_get_sb : public xmlrpc_c::method
{
public:
Main_get_sb()
{
_signature = "s:n";
_help = "[DEPRECATED; use main.get_wf_sideband and/or rig.get_mode]";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(wf->USB() ? "USB" : "LSB");
}
};
class Main_set_sb : public xmlrpc_c::method
{
public:
Main_set_sb()
{
_signature = "n:s";
_help = "[DEPRECATED; use main.set_wf_sideband and/or rig.set_mode]";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
string s = params.getString(0);
if (s != "LSB" && s != "USB")
throw xmlrpc_c::fault("Invalid argument");
if (progdefaults.chkUSERIGCATis)
rigCAT_setmode(s);
#if USE_HAMLIB
else if (progdefaults.chkUSEHAMLIBis)
hamlib_setmode(s == "LSB" ? RIG_MODE_LSB : RIG_MODE_USB);
#endif
else if (progdefaults.chkUSEXMLRPCis)
REQ(static_cast<void (waterfall::*)(bool)>(&waterfall::USB), wf, s == "USB");
*retval = xmlrpc_c::value_nil();
}
};
class Main_get_wf_sideband : public xmlrpc_c::method
{
public:
Main_get_wf_sideband()
{
_signature = "s:n";
_help = "Returns the current waterfall sideband.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(wf->USB() ? "USB" : "LSB");
}
};
class Main_set_wf_sideband : public xmlrpc_c::method
{
public:
Main_set_wf_sideband()
{
_signature = "n:s";
_help = "Sets the waterfall sideband to USB or LSB.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
string s = params.getString(0);
if (s != "USB" && s != "LSB")
throw xmlrpc_c::fault("Invalid argument");
REQ(static_cast<void (waterfall::*)(bool)>(&waterfall::USB), wf, s == "USB");
*retval = xmlrpc_c::value_nil();
}
};
class Main_get_freq : public xmlrpc_c::method
{
public:
Main_get_freq()
{
_signature = "d:n";
_help = "Returns the RF carrier frequency.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_double(wf->rfcarrier());
}
};
void xmlrpc_set_qsy(long long rfc)
{
wf->rfcarrier(rfc);
wf->movetocenter();
show_frequency(rfc);
}
class Main_set_freq : public xmlrpc_c::method
{
public:
Main_set_freq()
{
_signature = "d:d";
_help = "Sets the RF carrier frequency. Returns the old value.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
double rfc = wf->rfcarrier();
qsy((long long int)params.getDouble(0, 0.0));
*retval = xmlrpc_c::value_double(rfc);
}
};
class Main_inc_freq : public xmlrpc_c::method
{
public:
Main_inc_freq()
{
_signature = "d:d";
_help = "Increments the RF carrier frequency. Returns the new value.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
double rfc = wf->rfcarrier() + params.getDouble(0);
qsy((long long int)rfc);
*retval = xmlrpc_c::value_double(rfc);
}
};
// =============================================================================
class Main_get_afc : public xmlrpc_c::method
{
public:
Main_get_afc()
{
_signature = "b:n";
_help = "Returns the AFC state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_boolean(btnAFC->value());
}
};
class Main_set_afc : public xmlrpc_c::method
{
public:
Main_set_afc()
{
_signature = "b:b";
_help = "Sets the AFC state. Returns the old state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = btnAFC->value();
REQ(set_button, btnAFC, params.getBoolean(0));
*retval = xmlrpc_c::value_boolean(v);
}
};
class Main_toggle_afc : public xmlrpc_c::method
{
public:
Main_toggle_afc()
{
_signature = "b:n";
_help = "Toggles the AFC state. Returns the new state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = !btnAFC->value();
REQ(set_button, btnAFC, v);
*retval = xmlrpc_c::value_boolean(v);
}
};
// =============================================================================
class Main_get_sql : public xmlrpc_c::method
{
public:
Main_get_sql()
{
_signature = "b:n";
_help = "Returns the squelch state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_boolean(btnSQL->value());
}
};
class Main_set_sql : public xmlrpc_c::method
{
public:
Main_set_sql()
{
_signature = "b:b";
_help = "Sets the squelch state. Returns the old state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = btnSQL->value();
REQ(set_button, btnSQL, params.getBoolean(0));
*retval = xmlrpc_c::value_boolean(v);
}
};
class Main_toggle_sql : public xmlrpc_c::method
{
public:
Main_toggle_sql()
{
_signature = "b:n";
_help = "Toggles the squelch state. Returns the new state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = !btnSQL->value();
REQ(set_button, btnSQL, v);
*retval = xmlrpc_c::value_boolean(v);
}
};
// =============================================================================
class Main_get_sql_level : public xmlrpc_c::method
{
public:
Main_get_sql_level()
{
_signature = "d:n";
_help = "Returns the squelch level.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_double(sldrSquelch->value());
}
};
class Main_set_sql_level : public xmlrpc_c::method
{
public:
Main_set_sql_level()
{
_signature = "d:d";
_help = "Sets the squelch level. Returns the old level.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
double v = sldrSquelch->value();
REQ(set_valuator, sldrSquelch, params.getDouble(0, sldrSquelch->maximum(), sldrSquelch->minimum()));
*retval = xmlrpc_c::value_double(v);
}
};
class Main_inc_sql_level : public xmlrpc_c::method
{
public:
Main_inc_sql_level()
{
_signature = "d:d";
_help = "Increments the squelch level. Returns the new level.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
double v = sldrSquelch->value();
REQ(set_valuator, sldrSquelch, v + params.getDouble(0)); // FIXME: check range
*retval = xmlrpc_c::value_double(sldrSquelch->value());
}
};
// =============================================================================
class Main_get_rev : public xmlrpc_c::method
{
public:
Main_get_rev()
{
_signature = "b:n";
_help = "Returns the Reverse Sideband state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_boolean(wf->btnRev->value());
}
};
class Main_set_rev : public xmlrpc_c::method
{
public:
Main_set_rev()
{
_signature = "b:b";
_help = "Sets the Reverse Sideband state. Returns the old state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = wf->btnRev->value();
REQ(set_button, wf->btnRev, params.getBoolean(0));
*retval = xmlrpc_c::value_boolean(v);
}
};
class Main_toggle_rev : public xmlrpc_c::method
{
public:
Main_toggle_rev()
{
_signature = "b:n";
_help = "Toggles the Reverse Sideband state. Returns the new state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = !wf->btnRev->value();
REQ(set_button, wf->btnRev, v);
*retval = xmlrpc_c::value_boolean(v);
}
};
// =============================================================================
class Main_get_lock : public xmlrpc_c::method
{
public:
Main_get_lock()
{
_signature = "b:n";
_help = "Returns the Transmit Lock state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_boolean(wf->xmtlock->value());
}
};
class Main_set_lock : public xmlrpc_c::method
{
public:
Main_set_lock()
{
_signature = "b:b";
_help = "Sets the Transmit Lock state. Returns the old state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = wf->xmtlock->value();
REQ(set_button, wf->xmtlock, params.getBoolean(0));
*retval = xmlrpc_c::value_boolean(v);
}
};
class Main_toggle_lock : public xmlrpc_c::method
{
public:
Main_toggle_lock()
{
_signature = "b:n";
_help = "Toggles the Transmit Lock state. Returns the new state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = !wf->xmtlock->value();
REQ(set_button, wf->xmtlock, v);
*retval = xmlrpc_c::value_boolean(v);
}
};
// =============================================================================
class Main_get_rsid : public xmlrpc_c::method
{
public:
Main_get_rsid()
{
_signature = "b:n";
_help = "Returns the RSID state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_boolean(btnRSID->value());
}
};
class Main_set_rsid : public xmlrpc_c::method
{
public:
Main_set_rsid()
{
_signature = "b:b";
_help = "Sets the RSID state. Returns the old state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = btnRSID->value();
REQ(set_button, btnRSID, params.getBoolean(0));
*retval = xmlrpc_c::value_boolean(v);
}
};
class Main_toggle_rsid : public xmlrpc_c::method
{
public:
Main_toggle_rsid()
{
_signature = "b:n";
_help = "Toggles the RSID state. Returns the new state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = !btnRSID->value();
REQ(set_button, btnRSID, v);
*retval = xmlrpc_c::value_boolean(v);
}
};
// =============================================================================
class Main_get_trx_status : public xmlrpc_c::method
{
public:
Main_get_trx_status()
{
_signature = "s:n";
_help = "Returns transmit/tune/receive status.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
if (btnTune->value())
*retval = xmlrpc_c::value_string("tune");
else if (wf->xmtrcv->value())
*retval = xmlrpc_c::value_string("tx");
else
*retval = xmlrpc_c::value_string("rx");
}
};
class Main_tx : public xmlrpc_c::method
{
public:
Main_tx()
{
_signature = "n:n";
_help = "Transmits.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
if (!wf->xmtrcv->value())
REQ(set_button, wf->xmtrcv, true);
*retval = xmlrpc_c::value_nil();
}
};
class Main_tune : public xmlrpc_c::method
{
public:
Main_tune()
{
_signature = "n:n";
_help = "Tunes.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
if (!btnTune->value())
REQ(set_button, btnTune, !btnTune->value());
*retval = xmlrpc_c::value_nil();
}
};
class Main_rx : public xmlrpc_c::method
{
public:
Main_rx()
{
_signature = "n:n";
_help = "Receives.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
if (wf->xmtrcv->value())
REQ(set_button, wf->xmtrcv, false);
*retval = xmlrpc_c::value_nil();
}
};
class Main_abort : public xmlrpc_c::method
{
public:
Main_abort()
{
_signature = "n:n";
_help = "Aborts a transmit or tune.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
if (trx_state == STATE_TX || trx_state == STATE_TUNE)
REQ(abort_tx);
*retval = xmlrpc_c::value_nil();
}
};
class Main_run_macro : public xmlrpc_c::method
{
public:
Main_run_macro()
{
_signature = "n:i";
_help = "Runs a macro.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(&Main_run_macro::run_macro, params.getInt(0, 0, MAXMACROS-1));
*retval = xmlrpc_c::value_nil();
}
static void run_macro(int i) { macros.execute(i); }
};
class Main_get_max_macro_id : public xmlrpc_c::method
{
public:
Main_get_max_macro_id()
{
_signature = "i:n";
_help = "Returns the maximum macro ID number.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_int(MAXMACROS - 1);
}
};
class Main_rsid : public xmlrpc_c::method
{
public:
Main_rsid()
{
_signature = "n:n";
_help = "[DEPRECATED; use main.{get,set,toggle}_rsid]";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
if (!(wf->xmtrcv->value() || btnTune->value() || btnRSID->value()))
REQ(set_button, btnRSID, true);
*retval = xmlrpc_c::value_nil();
}
};
// =============================================================================
// classes added to support flrig
//
// dhf 6/23/09
class Main_get_trx_state : public xmlrpc_c::method
{
public:
Main_get_trx_state()
{
_signature = "s:n";
_help = "Returns T/R state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
if (trx_state == STATE_TX || trx_state == STATE_TUNE)
*retval = xmlrpc_c::value_string("TX");
else
*retval = xmlrpc_c::value_string("RX");
}
};
class Rig_set_name : public xmlrpc_c::method
{
public:
Rig_set_name()
{
_signature = "n:s";
_help = "Sets the rig name for xmlrpc rig";
}
static void set_rig_name(const string& name)
{
windowTitle = name;
setTitle();
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(set_rig_name, params.getString(0));
*retval = xmlrpc_c::value_nil();
}
};
class Rig_get_name : public xmlrpc_c::method
{
public:
Rig_get_name()
{
_signature = "s:n";
_help = "Returns the rig name previously set via rig.set_name";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(windowTitle);
}
};
class Rig_set_frequency : public xmlrpc_c::method
{
public:
Rig_set_frequency()
{
_signature = "d:d";
_help = "Sets the RF carrier frequency. Returns the old value.";
}
static void set_frequency(long long rfc)
{
wf->rfcarrier(rfc);
show_frequency(rfc);
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
double rfc = wf->rfcarrier();
REQ(set_frequency, (long long int)params.getDouble(0, 0.0));
*retval = xmlrpc_c::value_double(rfc);
}
};
class Rig_set_modes : public xmlrpc_c::method
{
public:
Rig_set_modes()
{
_signature = "n:A";
_help = "Sets the list of available rig modes";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
vector<xmlrpc_c::value> v = params.getArray(0);
vector<string> modes;
modes.reserve(v.size());
// copy
for (vector<xmlrpc_c::value>::const_iterator i = v.begin(); i != v.end(); ++i)
modes.push_back(static_cast<string>(xmlrpc_c::value_string(*i)));
REQ_SYNC(set_combo_contents, qso_opMODE, &modes);
*retval = xmlrpc_c::value_nil();
}
};
class Rig_set_mode : public xmlrpc_c::method
{
public:
Rig_set_mode()
{
_signature = "n:s";
_help = "Selects a mode previously added by rig.set_modes";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(set_combo_value, qso_opMODE, params.getString(0));
*retval = xmlrpc_c::value_nil();
}
};
class Rig_get_modes : public xmlrpc_c::method
{
public:
Rig_get_modes()
{
_signature = "A:n";
_help = "Returns the list of available rig modes";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
vector<xmlrpc_c::value> modes;
REQ_SYNC(get_combo_contents, qso_opMODE, &modes);
*retval = xmlrpc_c::value_array(modes);
}
};
class Rig_get_mode : public xmlrpc_c::method
{
public:
Rig_get_mode()
{
_signature = "s:n";
_help = "Returns the name of the current transceiver mode";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(qso_opMODE->value());
}
};
class Rig_set_bandwidths : public xmlrpc_c::method
{
public:
Rig_set_bandwidths()
{
_signature = "n:A";
_help = "Sets the list of available rig bandwidths";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
vector<xmlrpc_c::value> v = params.getArray(0);
vector<string> bws;
bws.reserve(v.size());
for (vector<xmlrpc_c::value>::const_iterator i = v.begin(); i != v.end(); ++i)
bws.push_back(static_cast<string>(xmlrpc_c::value_string(*i)));
REQ_SYNC(set_combo_contents, qso_opBW, &bws);
*retval = xmlrpc_c::value_nil();
}
};
class Rig_set_bandwidth : public xmlrpc_c::method
{
public:
Rig_set_bandwidth()
{
_signature = "n:s";
_help = "Selects a bandwidth previously added by rig.set_bandwidths";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(set_combo_value, qso_opBW, params.getString(0));
*retval = xmlrpc_c::value_nil();
}
};
class Rig_get_bandwidths : public xmlrpc_c::method
{
public:
Rig_get_bandwidths()
{
_signature = "A:n";
_help = "Returns the list of available rig bandwidths";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
vector<xmlrpc_c::value> bws;
REQ_SYNC(get_combo_contents, qso_opBW, &bws);
*retval = xmlrpc_c::value_array(bws);
}
};
class Rig_get_bandwidth : public xmlrpc_c::method
{
public:
Rig_get_bandwidth()
{
_signature = "s:n";
_help = "Returns the name of the current transceiver bandwidth";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(qso_opBW->value());
}
};
static int rig_control_counter;
static void set_rig_control(bool xmlrpc)
{
struct rcb_t {
Fl_Button *toggle, *init;
};
static struct rcb_t prev_rigcontrol;
if (xmlrpc) {
rcb_t b[] = {
{ chkUSERIGCAT, btnInitRIGCAT }, { chkUSEHAMLIB, btnInitHAMLIB },
{ chkUSEMEMMAP, btnInitMEMMAP }, { chkUSEXMLRPC, btnInitXMLRPC }
};
for (size_t i = 0; i < sizeof(b)/sizeof(*b); i++) {
if (b[i].toggle->value()) {
prev_rigcontrol = b[i];
break;
}
}
if (!prev_rigcontrol.toggle) {
prev_rigcontrol.toggle = chkUSEXMLRPC;
prev_rigcontrol.init = btnInitXMLRPC;
}
bool changed = progdefaults.changed;
chkUSEXMLRPC->value(1);
chkUSEXMLRPC->do_callback();
btnInitXMLRPC->do_callback();
wf->setQSY(true);
progdefaults.changed = changed;
}
else {
bool changed = progdefaults.changed;
prev_rigcontrol.toggle->value(1);
prev_rigcontrol.toggle->do_callback();
prev_rigcontrol.init->do_callback();
progdefaults.changed = changed;
}
}
class Rig_take_control : public xmlrpc_c::method
{
public:
Rig_take_control()
{
_signature = "n:n";
_help = "Switches rig control to XML-RPC";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
if (++rig_control_counter == 1)
REQ_SYNC(set_rig_control, true);
*retval = xmlrpc_c::value_nil();
}
};
class Rig_release_control : public xmlrpc_c::method
{
public:
Rig_release_control()
{
_signature = "n:n";
_help = "Switches rig control to previous setting";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
if (rig_control_counter && !--rig_control_counter)
REQ_SYNC(set_rig_control, false);
*retval = xmlrpc_c::value_nil();
}
};
// =============================================================================
class Main_set_rig_name : public Rig_set_name
{
public:
Main_set_rig_name() { _help = "[DEPRECATED; use rig.set_name]"; }
};
class Main_set_rig_frequency : public Rig_set_frequency
{
public:
Main_set_rig_frequency() { _help = "[DEPRECATED; use rig.set_frequency]"; }
};
class Main_set_rig_modes : public Rig_set_modes
{
public:
Main_set_rig_modes() { _help = "[DEPRECATED; use rig.set_modes"; }
};
class Main_set_rig_mode : public Rig_set_mode
{
public:
Main_set_rig_mode() { _help = "[DEPRECATED; use rig.set_mode"; }
};
class Main_get_rig_modes : public Rig_get_modes
{
public:
Main_get_rig_modes() { _help = "[DEPRECATED; use rig.get_modes]"; }
};
class Main_get_rig_mode : public Rig_get_mode
{
public:
Main_get_rig_mode() { _help = "[DEPRECATED; use rig.get_mode]"; }
};
class Main_set_rig_bandwidths : public Rig_set_bandwidths
{
public:
Main_set_rig_bandwidths() { _help = "[DEPRECATED; use rig.set_bandwidths]"; }
};
class Main_set_rig_bandwidth : public Rig_set_bandwidth
{
public:
Main_set_rig_bandwidth() { _help = "[DEPRECATED; use rig.set_bandwidth]"; }
};
class Main_get_rig_bandwidths : public Rig_set_bandwidths
{
public:
Main_get_rig_bandwidths() { _help = "[DEPRECATED; use rig.get_bandwidths]"; }
};
class Main_get_rig_bandwidth : public Rig_get_bandwidth
{
public:
Main_get_rig_bandwidth() { _help = "[DEPRECATED; use rig.get_bandwidth]"; }
};
// =============================================================================
class Log_get_freq : public xmlrpc_c::method
{
public:
Log_get_freq()
{
_signature = "s:n";
_help = "Returns the Frequency field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpFreq->value());
}
};
class Log_get_time_on : public xmlrpc_c::method
{
public:
Log_get_time_on()
{
_signature = "s:n";
_help = "Returns the Time-On field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpTimeOn->value());
}
};
class Log_get_time_off : public xmlrpc_c::method
{
public:
Log_get_time_off()
{
_signature = "s:n";
_help = "Returns the Time-Off field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpTimeOff->value());
}
};
class Log_get_call : public xmlrpc_c::method
{
public:
Log_get_call()
{
_signature = "s:n";
_help = "Returns the Call field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpCall->value());
}
};
class Log_set_call : public xmlrpc_c::method
{
public:
Log_set_call()
{
_signature = "n:s";
_help = "Sets the Call field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(set_text, inpCall, params.getString(0));
*retval = xmlrpc_c::value_nil();
}
};
class Log_get_name : public xmlrpc_c::method
{
public:
Log_get_name()
{
_signature = "s:n";
_help = "Returns the Name field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpName->value());
}
};
class Log_set_name : public xmlrpc_c::method
{
public:
Log_set_name()
{
_signature = "n:s";
_help = "Sets the Name field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(set_text, inpName, params.getString(0));
*retval = xmlrpc_c::value_nil();
}
};
class Log_set_qth : public xmlrpc_c::method
{
public:
Log_set_qth()
{
_signature = "n:s";
_help = "Sets the QTH field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(set_text, inpQth, params.getString(0));
*retval = xmlrpc_c::value_nil();
}
};
class Log_set_locator : public xmlrpc_c::method
{
public:
Log_set_locator()
{
_signature = "n:s";
_help = "Sets the Locator field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(set_text, inpLoc, params.getString(0));
*retval = xmlrpc_c::value_nil();
}
};
class Log_get_rst_in : public xmlrpc_c::method
{
public:
Log_get_rst_in()
{
_signature = "s:n";
_help = "Returns the RST(r) field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpRstIn->value());
}
};
class Log_get_rst_out : public xmlrpc_c::method
{
public:
Log_get_rst_out()
{
_signature = "s:n";
_help = "Returns the RST(s) field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpRstOut->value());
}
};
class Log_get_serial_number : public xmlrpc_c::method
{
public:
Log_get_serial_number()
{
_signature = "s:n";
_help = "Returns the serial number field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpSerNo->value());
}
};
class Log_set_serial_number : public xmlrpc_c::method
{
public:
Log_set_serial_number()
{
_signature = "n:s";
_help = "Sets the serial number field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(set_text, inpSerNo, params.getString(0));
*retval = xmlrpc_c::value_nil();
}
};
class Log_get_serial_number_sent : public xmlrpc_c::method
{
public:
Log_get_serial_number_sent()
{
_signature = "s:n";
_help = "Returns the serial number (sent) field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(outSerNo->value());
}
};
class Log_get_exchange : public xmlrpc_c::method
{
public:
Log_get_exchange()
{
_signature = "s:n";
_help = "Returns the contest exchange field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpXchgIn->value());
}
};
class Log_set_exchange : public xmlrpc_c::method
{
public:
Log_set_exchange()
{
_signature = "n:s";
_help = "Sets the contest exchange field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(set_text, inpXchgIn, params.getString(0));
*retval = xmlrpc_c::value_nil();
}
};
class Log_get_state : public xmlrpc_c::method
{
public:
Log_get_state()
{
_signature = "s:n";
_help = "Returns the State field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpState->value());
}
};
class Log_get_province : public xmlrpc_c::method
{
public:
Log_get_province()
{
_signature = "s:n";
_help = "Returns the Province field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpVEprov->value());
}
};
class Log_get_country : public xmlrpc_c::method
{
public:
Log_get_country()
{
_signature = "s:n";
_help = "Returns the Country field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpCountry->value());
}
};
class Log_get_qth : public xmlrpc_c::method
{
public:
Log_get_qth()
{
_signature = "s:n";
_help = "Returns the QTH field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpQth->value());
}
};
class Log_get_band : public xmlrpc_c::method
{
public:
Log_get_band()
{
_signature = "s:n";
_help = "Returns the current band name.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(band_name(band(wf->rfcarrier())));
}
};
class Log_get_sb : public Main_get_wf_sideband
{
public:
Log_get_sb() { _help = "[DEPRECATED; use main.get_wf_sideband]"; }
};
class Log_get_notes : public xmlrpc_c::method
{
public:
Log_get_notes()
{
_signature = "s:n";
_help = "Returns the Notes field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpNotes->value());
}
};
class Log_get_locator : public xmlrpc_c::method
{
public:
Log_get_locator()
{
_signature = "s:n";
_help = "Returns the Locator field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpLoc->value());
}
};
class Log_get_az : public xmlrpc_c::method
{
public:
Log_get_az()
{
_signature = "s:n";
_help = "Returns the AZ field contents.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_string(inpAZ->value());
}
};
class Log_clear : public xmlrpc_c::method
{
public:
Log_clear()
{
_signature = "n:n";
_help = "Clears the contents of the log fields.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(clearQSO);
*retval = xmlrpc_c::value_nil();
}
};
// =============================================================================
class Text_get_rx_length : public xmlrpc_c::method
{
public:
Text_get_rx_length()
{
_signature = "i:n";
_help = "Returns the number of characters in the RX widget.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_int(ReceiveText->buffer()->length());
}
};
class Text_get_rx : public xmlrpc_c::method
{
public:
Text_get_rx()
{
_signature = "6:ii";
_help = "Returns a range of characters (start, length) from the RX text widget.";
}
static void get_rx_text_range(const xmlrpc_c::paramList* params, xmlrpc_c::fault** err,
char** text, int* size)
{
// the get* methods may throw but this function is not allowed to do so
try {
params->verifyEnd(2);
Fl_Text_Buffer_mod* tbuf = ReceiveText->buffer();
int len = tbuf->length();
int start = params->getInt(0, 0, len - 1);
int n = params->getInt(1, -1, len - start);
if (n == -1)
n = len; // we can request more text than is available
*text = tbuf->text_range(start, start + n);
*size = n;
}
catch (const xmlrpc_c::fault& f) {
*err = new xmlrpc_c::fault(f);
}
catch (const exception& e) {
*err = new xmlrpc_c::fault(e.what(), xmlrpc_c::fault::CODE_INTERNAL);
}
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
xmlrpc_c::fault* err = NULL;
char* text;
int size;
REQ_SYNC(get_rx_text_range, &params, &err, &text, &size);
if (unlikely(err)) {
xmlrpc_c::fault f(*err);
delete err;
throw f;
}
vector<unsigned char> bytes(size);
memcpy(&bytes[0], text, size);
*retval = xmlrpc_c::value_bytestring(bytes);
free(text);
}
};
class Text_clear_rx : public xmlrpc_c::method
{
public:
Text_clear_rx()
{
_signature = "n:n";
_help = "Clears the RX text widget.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(&FTextBase::clear, ReceiveText);
*retval = xmlrpc_c::value_nil();
}
};
class Text_add_tx : public xmlrpc_c::method
{
public:
Text_add_tx()
{
_signature = "n:s";
_help = "Adds a string to the TX text widget.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ_SYNC(&FTextTX::add_text, TransmitText, params.getString(0).c_str());
*retval = xmlrpc_c::value_nil();
}
};
class Text_add_tx_bytes : public xmlrpc_c::method
{
public:
Text_add_tx_bytes()
{
_signature = "n:6";
_help = "Adds a byte string to the TX text widget.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
vector<unsigned char> bytes = params.getBytestring(0);
bytes.push_back(0);
REQ_SYNC(&FTextTX::add_text, TransmitText, (const char*)&bytes[0]);
*retval = xmlrpc_c::value_nil();
}
};
class Text_clear_tx : public xmlrpc_c::method
{
public:
Text_clear_tx()
{
_signature = "n:n";
_help = "Clears the TX text widget.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
REQ(&FTextBase::clear, TransmitText);
*retval = xmlrpc_c::value_nil();
}
};
// =============================================================================
class RXTX_get_data : public xmlrpc_c::method
{
public:
RXTX_get_data()
{
_signature = "6:n";
_help = "Returns all RXTX combined data since last query.";
}
static void get_rxtx(char **text, int *size)
{
// the get* methods may throw but this function is not allowed to do so
*text = get_rxtx_data();
*size = strlen(*text);
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
char *text;
int size;
REQ_SYNC(get_rxtx, &text, &size);
vector<unsigned char> bytes(size);
memcpy(&bytes[0], text, size);
*retval = xmlrpc_c::value_bytestring(bytes);
}
};
// =============================================================================
class RX_get_data : public xmlrpc_c::method
{
public:
RX_get_data()
{
_signature = "6:n";
_help = "Returns all RX data received since last query.";
}
static void get_rx(char **text, int *size)
{
// the get* methods may throw but this function is not allowed to do so
*text = get_rx_data();
*size = strlen(*text);
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
char *text;
int size;
REQ_SYNC(get_rx, &text, &size);
vector<unsigned char> bytes(size);
memcpy(&bytes[0], text, size);
*retval = xmlrpc_c::value_bytestring(bytes);
}
};
// =============================================================================
class TX_get_data : public xmlrpc_c::method
{
public:
TX_get_data()
{
_signature = "6:n";
_help = "Returns all TX data transmitted since last query.";
}
static void get_tx(char **text, int *size)
{
// the get* methods may throw but this function is not allowed to do so
*text = get_tx_data();
*size = strlen(*text);
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
char *text;
int size;
REQ_SYNC(get_tx, &text, &size);
vector<unsigned char> bytes(size);
memcpy(&bytes[0], text, size);
*retval = xmlrpc_c::value_bytestring(bytes);
}
};
// =============================================================================
extern Fl_Button* btnAutoSpot; // FIXME: export in fl_digi.h
class Spot_get_auto : public xmlrpc_c::method
{
public:
Spot_get_auto()
{
_signature = "b:n";
_help = "Returns the autospotter state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_boolean(btnAutoSpot->value());
}
};
class Spot_set_auto : public xmlrpc_c::method
{
public:
Spot_set_auto()
{
_signature = "n:b";
_help = "Sets the autospotter state. Returns the old state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = btnAutoSpot->value();
REQ(set_button, btnAutoSpot, params.getBoolean(0));
*retval = xmlrpc_c::value_boolean(v);
}
};
class Spot_toggle_auto : public xmlrpc_c::method
{
public:
Spot_toggle_auto()
{
_signature = "n:b";
_help = "Toggles the autospotter state. Returns the new state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
bool v = !btnAutoSpot->value();
REQ(set_button, btnAutoSpot, v);
*retval = xmlrpc_c::value_boolean(v);
}
};
class Spot_pskrep_get_count : public xmlrpc_c::method
{
public:
Spot_pskrep_get_count()
{
_signature = "i:n";
_help = "Returns the number of callsigns spotted in the current session.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_int(static_cast<unsigned>(pskrep_count()));
}
};
// =============================================================================
// Returns the current wefax modem pointer.
static wefax * get_wefax(void)
{
if( ( active_modem->get_mode() >= MODE_WEFAX_FIRST )
&& ( active_modem->get_mode() <= MODE_WEFAX_LAST ) )
{
wefax * ptr = dynamic_cast<wefax *>( active_modem );
if( ptr == NULL ) throw runtime_error("Inconsistent wefax object");
return ptr ;
}
throw runtime_error("Not in wefax mode");
}
struct Wefax_state_string : public xmlrpc_c::method
{
Wefax_state_string() {
_signature = "s:n";
_help = "Returns Wefax engine state (tx and rx) for information."; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
*retval = xmlrpc_c::value_string( get_wefax()->state_string() );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what());
}
};
struct Wefax_skip_apt : public xmlrpc_c::method
{
Wefax_skip_apt() {
_signature = "s:n";
_help = "Skip APT during Wefax reception"; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
get_wefax()->skip_apt();
*retval = xmlrpc_c::value_string( "" );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what() );
}
};
/// TODO: Refresh the screen with the new value.
struct Wefax_skip_phasing : public xmlrpc_c::method
{
Wefax_skip_phasing() {
_signature = "s:n";
_help = "Skip phasing during Wefax reception"; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
get_wefax()->skip_phasing(true);
*retval = xmlrpc_c::value_string( "" );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what() );
}
};
// TODO: The image should be reloaded just like cancelling from the GUI.
struct Wefax_set_tx_abort_flag : public xmlrpc_c::method
{
Wefax_set_tx_abort_flag() {
_signature = "s:n";
_help = "Cancels Wefax image transmission"; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
get_wefax()->set_tx_abort_flag();
*retval = xmlrpc_c::value_string( "" );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what() );
}
};
struct Wefax_end_reception : public xmlrpc_c::method
{
Wefax_end_reception() {
_signature = "s:n";
_help = "End Wefax image reception"; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
get_wefax()->end_reception();
*retval = xmlrpc_c::value_string( "" );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what() );
}
};
struct Wefax_start_manual_reception : public xmlrpc_c::method
{
Wefax_start_manual_reception() {
_signature = "s:n";
_help = "Starts fax image reception in manual mode"; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
get_wefax()->set_rx_manual_mode(true);
get_wefax()->skip_apt();
get_wefax()->skip_phasing(true);
*retval = xmlrpc_c::value_string( "" );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what() );
}
};
struct Wefax_set_adif_log : public xmlrpc_c::method
{
Wefax_set_adif_log() {
_signature = "s:b";
_help = "Set/reset logging to received/transmit images to ADIF log file"; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
get_wefax()->set_adif_log( params.getBoolean(0));
*retval = xmlrpc_c::value_string( "" );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what() );
}
};
struct Wefax_set_max_lines : public xmlrpc_c::method
{
Wefax_set_max_lines() {
_signature = "s:i";
_help = "Set maximum lines for fax image reception"; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
get_wefax()->set_max_lines( params.getInt(0));
/// This updates the GUI.
REQ( wefax_pic::restore_max_lines );
*retval = xmlrpc_c::value_string( "" );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what() );
}
};
struct Wefax_get_received_file : public xmlrpc_c::method
{
Wefax_get_received_file() {
_signature = "s:i";
_help = "Waits for next received fax file, returns its name with a delay. Empty string if timeout."; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
std::string filename = get_wefax()->get_received_file( params.getInt(0));
*retval = xmlrpc_c::value_string( filename );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what() );
}
};
struct Wefax_send_file : public xmlrpc_c::method
{
Wefax_send_file() {
_signature = "s:si";
_help = "Send file. returns an empty string if OK otherwise an error message."; }
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
try
{
std::string status = get_wefax()->send_file( params.getString(0), params.getInt(1) );
*retval = xmlrpc_c::value_string( status );
}
catch( const exception & e )
{
*retval = xmlrpc_c::value_string( e.what() );
}
};
// =============================================================================
// End XML-RPC interface
// method list: ELEM_(class_name, "method_name")
#undef ELEM_
#define METHOD_LIST \
ELEM_(Fldigi_list, "fldigi.list") \
ELEM_(Fldigi_name, "fldigi.name") \
ELEM_(Fldigi_version_struct, "fldigi.version_struct") \
ELEM_(Fldigi_version_string, "fldigi.version") \
ELEM_(Fldigi_name_version, "fldigi.name_version") \
ELEM_(Fldigi_config_dir, "fldigi.config_dir") \
ELEM_(Fldigi_terminate, "fldigi.terminate") \
\
ELEM_(Modem_get_name, "modem.get_name") \
ELEM_(Modem_get_names, "modem.get_names") \
ELEM_(Modem_get_id, "modem.get_id") \
ELEM_(Modem_get_max_id, "modem.get_max_id") \
ELEM_(Modem_set_by_name, "modem.set_by_name") \
ELEM_(Modem_set_by_id, "modem.set_by_id") \
\
ELEM_(Modem_set_carrier, "modem.set_carrier") \
ELEM_(Modem_inc_carrier, "modem.inc_carrier") \
ELEM_(Modem_get_carrier, "modem.get_carrier") \
\
ELEM_(Modem_get_afc_sr, "modem.get_afc_search_range") \
ELEM_(Modem_set_afc_sr, "modem.set_afc_search_range") \
ELEM_(Modem_inc_afc_sr, "modem.inc_afc_search_range") \
\
ELEM_(Modem_get_bw, "modem.get_bandwidth") \
ELEM_(Modem_set_bw, "modem.set_bandwidth") \
ELEM_(Modem_inc_bw, "modem.inc_bandwidth") \
\
ELEM_(Modem_get_quality, "modem.get_quality") \
ELEM_(Modem_search_up, "modem.search_up") \
ELEM_(Modem_search_down, "modem.search_down") \
\
ELEM_(Modem_olivia_set_bandwidth, "modem.olivia.set_bandwidth") \
ELEM_(Modem_olivia_get_bandwidth, "modem.olivia.get_bandwidth") \
ELEM_(Modem_olivia_set_tones, "modem.olivia.set_tones") \
ELEM_(Modem_olivia_get_tones, "modem.olivia.get_tones") \
\
ELEM_(Main_get_status1, "main.get_status1") \
ELEM_(Main_get_status2, "main.get_status2") \
\
ELEM_(Main_get_sb, "main.get_sideband") \
ELEM_(Main_set_sb, "main.set_sideband") \
ELEM_(Main_get_wf_sideband, "main.get_wf_sideband") \
ELEM_(Main_set_wf_sideband, "main.set_wf_sideband") \
ELEM_(Main_get_freq, "main.get_frequency") \
ELEM_(Main_set_freq, "main.set_frequency") \
ELEM_(Main_inc_freq, "main.inc_frequency") \
\
ELEM_(Main_get_afc, "main.get_afc") \
ELEM_(Main_set_afc, "main.set_afc") \
ELEM_(Main_toggle_afc, "main.toggle_afc") \
\
ELEM_(Main_get_sql, "main.get_squelch") \
ELEM_(Main_set_sql, "main.set_squelch") \
ELEM_(Main_toggle_sql, "main.toggle_squelch") \
\
ELEM_(Main_get_sql_level, "main.get_squelch_level") \
ELEM_(Main_set_sql_level, "main.set_squelch_level") \
ELEM_(Main_inc_sql_level, "main.inc_squelch_level") \
\
ELEM_(Main_get_rev, "main.get_reverse") \
ELEM_(Main_set_rev, "main.set_reverse") \
ELEM_(Main_toggle_rev, "main.toggle_reverse") \
\
ELEM_(Main_get_lock, "main.get_lock") \
ELEM_(Main_set_lock, "main.set_lock") \
ELEM_(Main_toggle_lock, "main.toggle_lock") \
\
ELEM_(Main_get_rsid, "main.get_rsid") \
ELEM_(Main_set_rsid, "main.set_rsid") \
ELEM_(Main_toggle_rsid, "main.toggle_rsid") \
\
ELEM_(Main_get_trx_status, "main.get_trx_status") \
ELEM_(Main_tx, "main.tx") \
ELEM_(Main_tune, "main.tune") \
ELEM_(Main_rsid, "main.rsid") \
ELEM_(Main_rx, "main.rx") \
ELEM_(Main_abort, "main.abort") \
\
ELEM_(Main_get_trx_state, "main.get_trx_state") \
ELEM_(Main_set_rig_name, "main.set_rig_name") \
ELEM_(Main_set_rig_frequency, "main.set_rig_frequency") \
ELEM_(Main_set_rig_modes, "main.set_rig_modes") \
ELEM_(Main_set_rig_mode, "main.set_rig_mode") \
ELEM_(Main_get_rig_modes, "main.get_rig_modes") \
ELEM_(Main_get_rig_mode, "main.get_rig_mode") \
ELEM_(Main_set_rig_bandwidths, "main.set_rig_bandwidths") \
ELEM_(Main_set_rig_bandwidth, "main.set_rig_bandwidth") \
ELEM_(Main_get_rig_bandwidth, "main.get_rig_bandwidth") \
ELEM_(Main_get_rig_bandwidths, "main.get_rig_bandwidths") \
\
ELEM_(Main_run_macro, "main.run_macro") \
ELEM_(Main_get_max_macro_id, "main.get_max_macro_id") \
\
ELEM_(Rig_set_name, "rig.set_name") \
ELEM_(Rig_get_name, "rig.get_name") \
ELEM_(Rig_set_frequency, "rig.set_frequency") \
ELEM_(Rig_set_modes, "rig.set_modes") \
ELEM_(Rig_set_mode, "rig.set_mode") \
ELEM_(Rig_get_modes, "rig.get_modes") \
ELEM_(Rig_get_mode, "rig.get_mode") \
ELEM_(Rig_set_bandwidths, "rig.set_bandwidths") \
ELEM_(Rig_set_bandwidth, "rig.set_bandwidth") \
ELEM_(Rig_get_bandwidth, "rig.get_bandwidth") \
ELEM_(Rig_get_bandwidths, "rig.get_bandwidths") \
ELEM_(Rig_take_control, "rig.take_control") \
ELEM_(Rig_release_control, "rig.release_control") \
\
ELEM_(Log_get_freq, "log.get_frequency") \
ELEM_(Log_get_time_on, "log.get_time_on") \
ELEM_(Log_get_time_off, "log.get_time_off") \
ELEM_(Log_get_call, "log.get_call") \
ELEM_(Log_get_name, "log.get_name") \
ELEM_(Log_get_rst_in, "log.get_rst_in") \
ELEM_(Log_get_rst_out, "log.get_rst_out") \
ELEM_(Log_get_serial_number, "log.get_serial_number") \
ELEM_(Log_set_serial_number, "log.set_serial_number") \
ELEM_(Log_get_serial_number_sent, "log.get_serial_number_sent") \
ELEM_(Log_get_exchange, "log.get_exchange") \
ELEM_(Log_set_exchange, "log.set_exchange") \
ELEM_(Log_get_state, "log.get_state") \
ELEM_(Log_get_province, "log.get_province") \
ELEM_(Log_get_country, "log.get_country") \
ELEM_(Log_get_qth, "log.get_qth") \
ELEM_(Log_get_band, "log.get_band") \
ELEM_(Log_get_sb, "log.get_sideband") \
ELEM_(Log_get_notes, "log.get_notes") \
ELEM_(Log_get_locator, "log.get_locator") \
ELEM_(Log_get_az, "log.get_az") \
ELEM_(Log_clear, "log.clear") \
ELEM_(Log_set_call, "log.set_call") \
ELEM_(Log_set_name, "log.set_name") \
ELEM_(Log_set_qth, "log.set_qth") \
ELEM_(Log_set_locator, "log.set_locator") \
\
ELEM_(Text_get_rx_length, "text.get_rx_length") \
ELEM_(Text_get_rx, "text.get_rx") \
ELEM_(Text_clear_rx, "text.clear_rx") \
ELEM_(Text_add_tx, "text.add_tx") \
ELEM_(Text_add_tx_bytes, "text.add_tx_bytes") \
ELEM_(Text_clear_tx, "text.clear_tx") \
\
ELEM_(RXTX_get_data, "rxtx.get_data") \
ELEM_(RX_get_data, "rx.get_data") \
ELEM_(TX_get_data, "tx.get_data") \
\
ELEM_(Spot_get_auto, "spot.get_auto") \
ELEM_(Spot_set_auto, "spot.set_auto") \
ELEM_(Spot_toggle_auto, "spot.toggle_auto") \
ELEM_(Spot_pskrep_get_count, "spot.pskrep.get_count") \
\
ELEM_(Wefax_state_string, "wefax.state_string") \
ELEM_(Wefax_skip_apt, "wefax.skip_apt") \
ELEM_(Wefax_skip_phasing, "wefax.skip_phasing") \
ELEM_(Wefax_set_tx_abort_flag, "wefax.set_tx_abort_flag") \
ELEM_(Wefax_end_reception, "wefax.end_reception") \
ELEM_(Wefax_start_manual_reception, "wefax.start_manual_reception") \
ELEM_(Wefax_set_adif_log, "wefax.set_adif_log") \
ELEM_(Wefax_set_max_lines, "wefax.set_max_lines") \
ELEM_(Wefax_get_received_file, "wefax.get_received_file") \
ELEM_(Wefax_send_file, "wefax.send_file") \
struct rm_pred
{
re_t filter;
bool allow;
rm_pred(const char* re, bool allow_)
: filter(re, REG_EXTENDED | REG_NOSUB), allow(allow_) { }
bool operator()(const methods_t::value_type& v)
{
return filter.match(v.name) ^ allow && !strstr(v.name, "fldigi.");
}
};
void XML_RPC_Server::add_methods(void)
{
if (methods)
return;
#undef ELEM_
#define ELEM_(class_, name_) rpc_method(new class_, name_),
rpc_method m[] = { METHOD_LIST };
methods = new methods_t(m, m + sizeof(m)/sizeof(*m));
if (!progdefaults.xmlrpc_deny.empty())
methods->remove_if(rm_pred(progdefaults.xmlrpc_deny.c_str(), false));
else if (!progdefaults.xmlrpc_allow.empty())
methods->remove_if(rm_pred(progdefaults.xmlrpc_allow.c_str(), true));
}