/* Copyright (C) 2019 * * This file is part of the osdev components suite * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2, or (at your option) any * later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #include "commondefs.h" // std #include #include namespace osdev { namespace components { namespace mqtt { std::ostream& operator<<(std::ostream& os, const StdTimeMs& rhs) { const std::time_t rhsTimeT = std::chrono::system_clock::to_time_t(rhs); struct tm tms { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nullptr }; if (nullptr == gmtime_r(&rhsTimeT, &tms)) { os << "unknown"; } else { char str[26] = { 0 }; if (std::strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S.", &tms) > 0) { std::ostringstream oss; oss << str << std::setfill('0') << std::setw(3) << std::chrono::duration_cast(rhs.timePoint - std::chrono::system_clock::from_time_t(rhsTimeT)).count() << ' '; if (std::strftime(str, sizeof(str), "%z", &tms) == 0) { return os; } oss << str; os << oss.str(); } } return os; } } // End namespace mqtt } // End namespace components } // End namespace osdev namespace std { std::ostream& operator<<(std::ostream& os, const osdev::components::mqtt::StdTime& rhs) { /// @todo: Use put_time when it's implemented in gcc (5.0) // auto rhsTimeT = std::chrono::system_clock::to_time_t(rhs); // os << std::put_time(std::localtime(&rhsTimeT), "%F %T"); const std::time_t rhsTimeT = std::chrono::system_clock::to_time_t(rhs); struct tm tms { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nullptr }; if (nullptr == gmtime_r(&rhsTimeT, &tms)) { os << "unknown"; } else { char str[26]; if (std::strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S %z", &tms) > 0) { os << str; } } return os; } } // End namespace std