blob: 73695b03df6559b46ee11384424d112dcaa670f3 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0
// Copyright (C) 2020 YADRO
#include "zlib_file.hpp"
#include "zlib_exception.hpp"
ZlibFile::ZlibFile(const std::string& fileName)
{
fd = gzopen(fileName.c_str(), "w");
if (fd == Z_NULL)
{
throw ZlibException(ZlibException::create, Z_ERRNO, fd, fileName);
}
this->fileName = fileName;
}
ZlibFile::~ZlibFile()
{
if (fd != Z_NULL)
{
gzclose_w(fd);
}
}
void ZlibFile::close()
{
if (fd != Z_NULL)
{
const int rc = gzclose_w(fd);
if (rc != Z_OK)
{
throw ZlibException(ZlibException::close, rc, fd, fileName);
}
fd = Z_NULL;
fileName.clear();
}
}
void ZlibFile::write(const tm& timeStamp, const std::string& message) const
{
int rc;
// Write time stamp.
// "tm_gmtoff" is the number of seconds east of UTC, so we need to calculate
// timezone offset. For example, for U.S. Eastern Standard Time, the value
// is -18000 = -5*60*60."
rc = gzprintf(fd, "[ %i-%02i-%02iT%02i:%02i:%02i%+03ld:%02ld ] ",
timeStamp.tm_year + 1900, timeStamp.tm_mon + 1,
timeStamp.tm_mday, timeStamp.tm_hour, timeStamp.tm_min,
timeStamp.tm_sec, timeStamp.tm_gmtoff / (60 * 60),
abs(timeStamp.tm_gmtoff % (60 * 60)) / 60);
if (rc <= 0)
{
throw ZlibException(ZlibException::write, rc, fd, fileName);
}
// Write message
const size_t len = message.length();
if (len)
{
rc = gzwrite(fd, message.data(), static_cast<unsigned int>(len));
if (rc <= 0)
{
throw ZlibException(ZlibException::write, rc, fd, fileName);
}
}
// Write EOL
rc = gzputc(fd, '\n');
if (rc <= 0)
{
throw ZlibException(ZlibException::write, rc, fd, fileName);
}
}