]> pilppa.org Git - libplpdevicebus.git/blob - src_client/DeviceManagerClient.cc
fb4e62e457c0fa4cc43c35fae66be3467c960cfa
[libplpdevicebus.git] / src_client / DeviceManagerClient.cc
1 /*
2  * DeviceManagerClient.cc
3  *
4  *  Created on: Mar 4, 2011
5  *      Author: lamikr
6  */
7 #include <sstream>
8 #include <string>
9
10 #include <plp/log.h>
11 #include <plp/retval.h>
12
13 #include <plp/Data.hh>
14 #include <plp/DeviceData.hh>
15
16 #include "DeviceManagerClient.hh"
17 #include "../src/plp/devicebus/DeviceBusMessageId.hh"
18
19 using namespace std;
20 using namespace plp;
21 using namespace plpbus;
22 using namespace plpdevicebus;
23
24 DeviceManagerClient::DeviceManagerClient() {
25         _device_list    = NULL;
26 }
27
28 static void clean_device_list(list<Device *> *dev_lst) {
29         Device  *dev;
30
31         if (dev_lst != NULL) {
32                 while (dev_lst->empty() == false) {
33                         dev     = dev_lst->back();
34                         dev_lst->pop_back();
35                         delete(dev);
36                 }
37                 delete(dev_lst);
38                 dev_lst = NULL;
39         }
40 }
41
42 DeviceManagerClient::~DeviceManagerClient() {
43         clean_device_list(_device_list);
44 }
45
46 const std::list<plp::Device *> *DeviceManagerClient::get_device_list(BusClient *client_param,
47                                                 int *err_flg) {
48         //send_request__get_device_list(client_param);
49
50         BusMessage      *msg_req;
51         BusMessage      *msg_rsp;
52
53         msg_rsp = NULL;
54         msg_req = new BusMessage(MSG_TYPE_ID__GET_DEVICE_LIST);
55         client_param->send_message_and_wait_response(msg_req, &msg_rsp);
56         clean_device_list(_device_list);
57         _device_list    = parse_device_list_msg(msg_rsp, err_flg);
58         delete(msg_req);
59         delete(msg_rsp);
60
61         return _device_list;
62 }
63
64 DataRange *DeviceManagerClient::parse_device_data_msg(BusMessage *msg_param,
65                                                 int *err_flg) {
66         Data            *data;
67         string          data_str;
68         DataRange       *ret_val;
69
70         *err_flg        = PLP_ERR;
71         ret_val         = NULL;
72         if (msg_param != NULL) {
73                 data_str        = msg_param->get_string_parameter(RSP__GET_LATEST_DATA__VALUE, err_flg);
74                 data            = Data::parse_string(data_str);
75                 ret_val         = new DataRange(data);
76                 log_info("date: %s\n", data->get_date().to_string().c_str());
77                 log_debug("latest data\n");
78                 data->printout();
79
80                 data_str        = msg_param->get_string_parameter(RSP__GET_LATEST_DATA__MIN_VALUE, err_flg);
81                 data            = Data::parse_string(data_str);
82                 ret_val->add(data);
83                 log_debug("min data\n");
84                 data->printout();
85
86                 data_str        = msg_param->get_string_parameter(RSP__GET_LATEST_DATA__MAX_VALUE, err_flg);
87                 data            = Data::parse_string(data_str);
88                 ret_val->add(data);
89                 log_debug("max data\n");
90                 data->printout();
91
92                 *err_flg        = PLP_OK;
93         }
94         return ret_val;
95 }
96
97 Data *DeviceManagerClient::get_latest_data(BusClient *client_param,
98                                         string device_id_param,
99                                         int *err_flg) {
100         BusMessage      *msg_req;
101         BusMessage      *msg_rsp;
102         Data            *ret_val;
103         DataRange       *dr;
104
105         msg_rsp = NULL;
106         ret_val = NULL;
107         msg_req = new BusMessage(MSG_TYPE_ID__GET_LATEST_DATA);
108         msg_req->add_string_parameter(REQ__GET_LATEST_DATA__ID, device_id_param.c_str());
109         client_param->send_message_and_wait_response(msg_req, &msg_rsp);
110         dr      = parse_device_data_msg(msg_rsp, err_flg);
111         ret_val = dr->get_first()->clone();
112         delete(dr);
113         delete(msg_req);
114         delete(msg_rsp);
115
116         return ret_val;
117 }
118
119 list<Device *> *DeviceManagerClient::parse_device_list_msg(BusMessage *msg_param,
120                                                         int *err_flg) {
121         int                             ii;
122         long                            count;
123         ostringstream                   key;
124         string                          id;
125         string                          name;
126         string                          type;
127         string                          datastr;
128         EnumDeviceLifeCycleStatus       state;
129         int                             state_i;
130         Device                          *dev;
131         Data                            *data;
132         list<Device *>                  *ret_val;
133
134         count   = msg_param->get_long_parameter(RSP__DEVICE_LIST__DEVICE_COUNT, err_flg);
135         log_debug("device count: %ld\n", count);
136         ret_val = new list<Device *>;
137         if (*err_flg == PLP_OK) {
138                 for (ii = 0; ii < count; ii++) {
139                         key.str("");
140                         key << RSP__DEVICE_LIST__ID << ii;
141                         id      = msg_param->get_string_parameter(key.str(), err_flg);
142                         if (*err_flg != PLP_OK) {
143                                 log_error("Failed to parse device id\n");
144                                 break;
145                         }
146
147                         key.str("");
148                         key << RSP__DEVICE_LIST__NAME << ii;
149                         name    = msg_param->get_string_parameter(key.str(), err_flg);
150                         if (*err_flg != PLP_OK) {
151                                 log_error("Failed to parse device name\n");
152                                 break;
153                         }
154
155                         key.str("");
156                         key << RSP__DEVICE_LIST__TYPE << ii;
157                         type    = msg_param->get_string_parameter(key.str(), err_flg);
158                         if (*err_flg != PLP_OK) {
159                                 log_error("Failed to parse device type\n");
160                                 break;
161                         }
162
163                         key.str("");
164                         key << RSP__DEVICE_LIST__LF_STATE << ii;
165                         state_i = msg_param->get_int_parameter(key.str(), err_flg);
166                         if (*err_flg != PLP_OK) {
167                                 log_error("Failed to parse device's life cycle state\n");
168                                 break;
169                         }
170                         state   = (EnumDeviceLifeCycleStatus)state_i;
171
172                         key.str("");
173                         key << RSP__DEVICE_LIST__DATA << ii;
174                         datastr = msg_param->get_string_parameter(key.str(), err_flg);
175                         if (*err_flg != PLP_OK) {
176                                 log_error("Failed to parse device's data\n");
177                                 break;
178                         }
179
180                         data    = Data::parse_string(datastr);
181                         if (data == NULL) {
182                                 log_error("Failed to parse device's data items.\n");
183                                 *err_flg = PLP_ERR;
184                                 break;
185                         }
186                         dev     = new DeviceData(id, type, name, state, data);
187                         ret_val->push_back(dev);
188                 }
189         }
190         return ret_val;
191 }