/**
* @file drupal.cpp
* @brief A brief description
*
* A longer description.
*
* @author sgerbino
*/
#include "drupal.h"
namespace nodelink {
drupal::drupal(std::string s) {
set_url(s);
init();
}
drupal::~drupal() {
}
void drupal::set_url(std::string s) {
url = s;
}
std::string drupal::get_url() {
return url;
}
void drupal::set_sessid(std::string s) {
sessid = s;
}
std::string drupal::get_sessid() {
return sessid;
}
void drupal::init() {
system_connect();
}
bool drupal::user_login(std::string u, std::string p) {
try {
std::cout << "calling: user.login" << std::endl;
std::string const method("user.login");
xmlrpc_c::value result;
xmlrpc_c::paramList pl;
pl.add(xmlrpc_c::value_string(u));
pl.add(xmlrpc_c::value_string(p));
conn.call(url, method, pl, &result);
xmlrpc_c::value_struct b = xmlrpc_c::value_struct(result);
std::map<std::string, xmlrpc_c::value> m(
static_cast<std::map<std::string, xmlrpc_c::value> >(b));
print_r(m, 0);
}
catch (std::exception &e) {
std::cout << "Error: " << e.what() << std::endl;
}
catch (...) {
std::cout << "Error" << std::endl;
}
return false;
}
void drupal::system_connect() {
xmlrpc_c::value result;
try {
std::cout << "calling: system.connect" << std::endl;
std::string method("system.connect");
conn.call(url, method, "ii", &result);
xmlrpc_c::value_struct b = xmlrpc_c::value_struct(result);
std::map<std::string, xmlrpc_c::value> m(
static_cast<std::map<std::string, xmlrpc_c::value> >(b));
print_r(m, 0);
std::map<std::string, xmlrpc_c::value>::iterator iter = m.find("sessid");
xmlrpc_c::value_string str_val = xmlrpc_c::value_string(iter->second);
set_sessid(str_val);
}
catch (std::exception const& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
catch (...) {
std::cerr << "Error: " << std::endl;
}
}
void drupal::print_ar(std::vector<xmlrpc_c::value> vector, int depth) {
for (unsigned int i = 0; i < vector.size(); i++) {
for (int index = 0; index < depth; index++) {
std::cout << " ";
}
switch (vector[i].type()) {
case xmlrpc_c::value::TYPE_STRING: {
xmlrpc_c::value_string str_val = xmlrpc_c::value_string(vector[i]);
std::string s = str_val;
std::cout << i << " => (string) \"" << s << "\","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_STRUCT: {
std::cout << i << " => struct( " << std::endl;
xmlrpc_c::value_struct struct_val = xmlrpc_c::value_struct(
vector[i]);
std::map<std::string, xmlrpc_c::value> struct_map =
static_cast<std::map<std::string, xmlrpc_c::value> >(struct_val);
// Recursion.
print_r(struct_map, depth + 1);
for (int i = 0; i < depth; i++) {
std::cout << " ";
}
std::cout << ")," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_DOUBLE: {
xmlrpc_c::value_double d = xmlrpc_c::value_string(vector[i]);
double dub = d;
std::cout << i << " => (double) " << dub << ","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_BOOLEAN: {
xmlrpc_c::value_boolean boolean_val = xmlrpc_c::value_boolean(
vector[i]);
std::string boole = boolean_val ? "true" : "false";
std::cout << i << " => (bool) " << boole << ","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_ARRAY: {
std::cout << i << " => array( " << std::endl;
xmlrpc_c::value_array array_val = xmlrpc_c::value_array(vector[i]);
std::vector<xmlrpc_c::value> v = array_val.vectorValueValue();
print_ar(v, depth + 1);
for (int i = 0; i < depth; i++) {
std::cout << " ";
}
std::cout << ")," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_DATETIME: {
xmlrpc_c::value_array date_val = xmlrpc_c::value_datetime(
vector[i]);
std::cout << i << " => (datetime) " << date_val.cValue()
<< "," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_INT: {
xmlrpc_c::value_int int_val = xmlrpc_c::value_int(vector[i]);
int z = int_val;
std::cout << i << " => (int) " << z << "," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_C_PTR: {
std::cout << i << " => " << "?" << "," << std::endl;
// What the hell do I do with this?
}
break;
case xmlrpc_c::value::TYPE_BYTESTRING: {
xmlrpc_c::value_bytestring byte_val = xmlrpc_c::value_bytestring(
vector[i]);
std::cout << i << " => (bytestring) ?" << "," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_I8: {
xmlrpc_c::value_i8 i8_val = xmlrpc_c::value_i8(vector[i]);
std::cout << i << " => " << i8_val.cValue() << ","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_NIL: {
xmlrpc_c::value_nil nil_val = xmlrpc_c::value_nil(vector[i]);
std::cout << i << " => " << nil_val.cValue() << ","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_DEAD: {
std::cout << i << " => (dead) ?" << "," << std::endl;
// What the hell do I do with this?
}
break;
}
}
}
void drupal::print_r(std::map<std::string, xmlrpc_c::value> m , int depth) {
for (std::map<std::string, xmlrpc_c::value>::iterator iter = m.begin();
iter != m.end(); ++iter) {
for (int i = 0; i < depth; i++) {
std::cout << " ";
}
switch (iter->second.type()) {
case xmlrpc_c::value::TYPE_STRING: {
xmlrpc_c::value_string str_val = xmlrpc_c::value_string(iter->second);
std::string s = str_val;
std::cout << iter->first << " => (string) \"" << s << "\","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_STRUCT: {
std::cout << iter->first << " => struct( " << std::endl;
xmlrpc_c::value_struct struct_val = xmlrpc_c::value_struct(
iter->second);
std::map<std::string, xmlrpc_c::value> struct_map =
static_cast<std::map<std::string, xmlrpc_c::value> >(struct_val);
// Recursion.
print_r(struct_map, depth + 1);
for (int i = 0; i < depth; i++) {
std::cout << " ";
}
std::cout << ")," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_DOUBLE: {
xmlrpc_c::value_double d = xmlrpc_c::value_string(iter->second);
double dub = d;
std::cout << iter->first << " => (double) " << dub << ","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_BOOLEAN: {
xmlrpc_c::value_boolean boolean_val = xmlrpc_c::value_boolean(
iter->second);
std::string boole = boolean_val ? "true" : "false";
std::cout << iter->first << " => (bool) " << boole << ","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_ARRAY: {
std::cout << iter->first << " => array( " << std::endl;
xmlrpc_c::value_array array_val = xmlrpc_c::value_array(iter->second);
std::vector<xmlrpc_c::value> v = array_val.vectorValueValue();
print_ar(v, depth + 1);
for (int i = 0; i < depth; i++) {
std::cout << " ";
}
std::cout << ")," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_DATETIME: {
xmlrpc_c::value_array date_val = xmlrpc_c::value_datetime(
iter->second);
std::cout << iter->first << " => (datetime) " << date_val.cValue()
<< "," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_INT: {
xmlrpc_c::value_int int_val = xmlrpc_c::value_int(iter->second);
int z = int_val;
std::cout << iter->first << " => (int) " << z << "," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_C_PTR: {
std::cout << iter->first << " => " << "?" << "," << std::endl;
// What the hell do I do with this?
}
break;
case xmlrpc_c::value::TYPE_BYTESTRING: {
xmlrpc_c::value_bytestring byte_val = xmlrpc_c::value_bytestring(
iter->second);
std::cout << iter->first << " => (bytestring) ?" << "," << std::endl;
}
break;
case xmlrpc_c::value::TYPE_I8: {
xmlrpc_c::value_i8 i8_val = xmlrpc_c::value_i8(iter->second);
std::cout << iter->first << " => " << i8_val.cValue() << ","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_NIL: {
xmlrpc_c::value_nil nil_val = xmlrpc_c::value_nil(iter->second);
std::cout << iter->first << " => " << nil_val.cValue() << ","
<< std::endl;
}
break;
case xmlrpc_c::value::TYPE_DEAD: {
std::cout << iter->first << " => (dead) ?" << "," << std::endl;
// What the hell do I do with this?
}
break;
}
}
}
} /* namespace nodelink */