first list command

master
Steffen Pohle 4 years ago
parent e272276cf8
commit 3fb7a0b0cc

@ -49,8 +49,22 @@ void connect() {
void list(int argpos, int argc, char **argv) {
void getlist(int argpos, int argc, char **argv) {
std::list<FBSmartHomeDevice> *devlist;
std::list<FBSmartHomeDevice>::iterator iter;
connect ();
devlist = fbsh.GetDevices();
if (devlist == NULL) {
fprintf (stderr, "Error Retrieving Devices: %s\n", strerror(errno));
return;
}
for (iter = devlist->begin(); iter != devlist->end(); iter++) {
printf ("%s,%s,%s,%s,%d,%s\n", iter->id.c_str(), iter->name.c_str(), iter->product.c_str(),
iter->vendor.c_str(), iter->present, iter->attributes.c_str());
}
delete devlist;
}
@ -73,7 +87,7 @@ int main(int argc, char** argv) {
break;
}
else if (strcmp(argv[i], "list") == 0) {
list(i, argc, argv);
getlist(i, argc, argv);
break;
}
else if (strcmp(argv[i], "saveconfig") == 0) {

@ -262,3 +262,95 @@ int FBSmartHome::CloseSIDFile() {
}
return 0;
}
/*
* retrieve the device list from the fritzbox
*/
std::list<FBSmartHomeDevice> *FBSmartHome::GetDevices() {
std::list<FBSmartHomeDevice> *devlist = NULL;
FBSmartHomeDevice smd;
xmlDocPtr xmldoc;
xmlNodePtr xmlnode;
xmlAttr *xmlattr;
int len;
// retrieve data
len = tcp.WebGetFile(hostname+"/webservices/homeautoswitch.lua?sid="+SID+"&switchcmd=getdevicelistinfos", inbuffer, FB_BUFFER, NULL);
if (len > FB_BUFFER) len = FB_BUFFER;
else if (len < 0) {
fprintf (stderr, "%s:%d Error getting challenge from Fritzbox\n", __FILE__, __LINE__);
errno = EAI_FAIL;
return NULL;
}
inbuffer[len] = '\0';
XMLPrepare(inbuffer, len, &xmldoc, &xmlnode);
printf ("*********************************************\n%s\n*********************************\n", inbuffer);
//
// parse for SID and Challange
while (xmlnode) {
if ((!xmlStrcmp(xmlnode->name, (const xmlChar *)"devicelist"))){
xmlNodePtr xmlchild = xmlnode->xmlChildrenNode;
//
// read each device details
//
while (xmlchild) {
printf ("Name:%s\n", xmlchild->name);
//
// read attributes
xmlattr = xmlchild->properties;
while (xmlattr) {
printf (" %s:%s ", xmlattr->name, xmlNodeListGetString(xmldoc, xmlattr->children, 1));
xmlattr = xmlattr->next;
}
printf ("\n");
// go thought all the subchildreen
xmlNodePtr xmlsubchild = xmlchild->children;
while (xmlsubchild) {
printf (" %s,%s ", xmlsubchild->name,
(char *)xmlNodeListGetString(xmldoc, xmlsubchild->children, 1));
xmlattr = xmlsubchild->properties;
while (xmlattr) {
printf (" %s:%s ", xmlattr->name, xmlNodeListGetString(xmldoc, xmlattr->children, 1));
xmlattr = xmlattr->next;
}
printf ("\n");
xmlNodePtr xmlsubchild2 = xmlsubchild->children;
while (xmlsubchild2) {
printf (" %s,%s ", xmlsubchild2->name,
(char *)xmlNodeListGetString(xmldoc, xmlsubchild2->children, 1));
xmlattr = xmlsubchild2->properties;
while (xmlattr) {
printf (" %s:%s ", xmlattr->name, xmlNodeListGetString(xmldoc, xmlattr->children, 1));
xmlattr = xmlattr->next;
}
printf ("\n");
xmlsubchild2 = xmlsubchild2->next;
}
xmlsubchild = xmlsubchild->next;
}
printf ("\n");
xmlchild = xmlchild->next;
}
}
xmlnode = xmlnode->next;
}
xmlFreeDoc(xmldoc);
if (SID.compare("0000000000000000") == 0) {
hostname = "";
errno = ENOTCONN;
return NULL;
}
return devlist;
}

@ -6,6 +6,7 @@
#define _FBSH_H_
#include <string>
#include <list>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
@ -15,6 +16,16 @@ std::string generateMD5 (char* input, int size);
#define FB_BUFFER (4*1024*1024)
struct {
std::string id;
std::string name;
std::string product;
std::string vendor;
int present;
std::string attributes;
} typedef FBSmartHomeDevice;
class FBSmartHome {
private:
char inbuffer[FB_BUFFER];
@ -37,6 +48,8 @@ public:
int Connect(std::string host); // return 0 on success
int Connect(std::string host, std::string username, std::string password);
std::list<FBSmartHomeDevice> *GetDevices();
};
#endif

Loading…
Cancel
Save