#pragma once #include "cJSON.h" #include #include // Forward declaration class MTRNextTrainHandler; struct ArrivalInfo { public: // Caller transfers ownership of arrival_time to ArrivalInfo ArrivalInfo( const std::string& arrival_time, const std::string& destination_name ) : _arrival_time(arrival_time) , _destination_name(destination_name) { } const char* arrival_time() const { return _arrival_time.c_str(); } const char* destination() const { return _destination_name.c_str(); } private: const std::string _arrival_time; const std::string _destination_name; // not the code of the station }; enum StatusEnum { SUCCESSFUL_WITHOUT_DELAY = 0, SUCCESSFUL_WITH_DELAY = 1, FAILED_WITH_MESSAGE = 2, UNKNOWN_STATUS = 3 }; struct StationArrivalInfo { public: friend class MTRNextTrainHandler; // Public accessors StatusEnum status() const { return _status; } const char* message() const { return _message.c_str(); } const char* train_line() const { return _train_line.c_str(); } const char* train_station() const { return _train_station.c_str(); } const std::vector* up_arrivals() const { return &_up_arrivals; } const std::vector* down_arrivals() const { return &_down_arrivals; } private: StationArrivalInfo( cJSON* mtr_line_station_json, cJSON* arrival_json, const std::string& train_line_code, const std::string& train_station_code ); StatusEnum _status; std::string _message; // only valid if status == FAILED_WITH_MESSAGE std::string _train_line; std::string _train_station; std::vector _up_arrivals; std::vector _down_arrivals; };