#include "inputlogcsv.hh" #include "posexcept.hh" #include "mobile.hh" #include "calibrationrequest.hh" #include "referencepoint.hh" #include using namespace std ; using std::tr1::unordered_map ; /* *** Constructors *** */ /** * Prepares the InputLogCSV to write to a CSV file. * @param filename The name of the file to open. * @throw error_opening_input_file if the file cannot be opened. */ InputLogCSV::InputLogCSV(const string &filename): log_file_name(filename) { log_file.open(log_file_name.c_str()) ; if (! log_file) throw error_opening_input_file(log_file_name) ; } InputLogCSV::~InputLogCSV() { log_file.close() ; } /* *** Operations *** */ /** * @return true if the request has been logged successfuly, or false * if not. */ bool InputLogCSV::log_request(const Request &request) { if (! log_file) return false ; log_file << request_to_csv(request).c_str() ; return true ; } const string InputLogCSV::request_to_csv(const Request &request) const { ostringstream csv_line ; if (request.get_mobile() != NULL) csv_line << request.get_mobile()->get_mac_addr() ; csv_line << ';' << request.get_timestamp() << ';' ; const CalibrationRequest *calibration_request = dynamic_cast(&request) ; if (calibration_request == NULL) csv_line << "0;0;0;0" ; else { csv_line << calibration_request->get_reference_point()->get_x() << ';' << calibration_request->get_reference_point()->get_y() << ';' << calibration_request->get_reference_point()->get_z() << ';' << static_cast(calibration_request->get_direction()) ; } const unordered_map &measurements = request.get_measurements() ; for (unordered_map::const_iterator i = measurements.begin() ; i != measurements.end() ; ++i) { const vector &ss_list = i->second.get_ss_list() ; const string &ap_mac = i->second.get_ap() != NULL ? i->second.get_ap()->get_mac_addr() : "" ; for (vector::const_iterator i = ss_list.begin() ; i != ss_list.end() ; ++i) { csv_line << ';' << ap_mac ; csv_line << ';' << *i ; } } csv_line << '\n' ; return csv_line.str() ; }