/* * RomRaider Open-Source Tuning, Logging and Reflashing * Copyright (C) 2006-2013 RomRaider.com * * 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 of the License, 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.romraider.logger.ecu.ui.handler.file; import static com.romraider.util.ParamChecker.checkNotNull; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import com.romraider.Settings; import com.romraider.logger.ecu.exception.FileLoggerException; import com.romraider.logger.ecu.ui.MessageListener; import com.romraider.util.FormatFilename; import com.romraider.util.SettingsManager; public final class FileLoggerImpl implements FileLogger { private static final String NEW_LINE = System.getProperty("line.separator"); private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); private final SimpleDateFormat timestampFormat = new SimpleDateFormat("HH:mm:ss.SSS"); private final MessageListener messageListener; private boolean started; private OutputStream os; private long startTimestamp; private boolean zero; public FileLoggerImpl(MessageListener messageListener) { checkNotNull(messageListener); this.messageListener = messageListener; } @Override public void start() { if (!started) { stop(); try { String filePath = buildFilePath(); os = new BufferedOutputStream(new FileOutputStream(filePath)); messageListener.reportMessageInTitleBar( "Started logging to file: " + FormatFilename.getShortName(filePath)); zero = true; } catch (Exception e) { stop(); throw new FileLoggerException(e); } started = true; } } @Override public void stop() { if (os != null) { try { os.close(); messageListener.reportMessageInTitleBar("Stopped logging to file."); } catch (Exception e) { throw new FileLoggerException(e); } } started = false; } @Override public boolean isStarted() { return started; } @Override public void writeHeaders(String headers) { String timeHeader = "Time"; if (!SettingsManager.getSettings().isFileLoggingAbsoluteTimestamp()) { timeHeader = timeHeader + " (msec)"; } writeText(timeHeader + headers); } @Override public void writeLine(String line, long timestamp) { writeText(prependTimestamp(line, timestamp)); } private void writeText(String text) { try { os.write(text.getBytes()); if (!text.endsWith(NEW_LINE)) { os.write(NEW_LINE.getBytes()); } } catch (Exception e) { stop(); throw new FileLoggerException(e); } } private String prependTimestamp(String line, long timestamp) { String formattedTimestamp; if (SettingsManager.getSettings().isFileLoggingAbsoluteTimestamp()) { formattedTimestamp = timestampFormat.format(new Date(timestamp)); } else { if (zero) { formattedTimestamp = "0"; startTimestamp = System.currentTimeMillis(); zero = false; } else { formattedTimestamp = String.valueOf(System.currentTimeMillis() - startTimestamp); } } return new StringBuilder(formattedTimestamp).append(line).toString(); } private String buildFilePath() { String logDir = SettingsManager.getSettings().getLoggerOutputDirPath(); if (!logDir.endsWith(File.separator)) { logDir += File.separator; } logDir += "romraiderlog_"; Settings settings = SettingsManager.getSettings(); if (settings.getLogfileNameText() != null && !settings.getLogfileNameText().isEmpty()) { logDir += settings.getLogfileNameText() + "_"; } logDir += dateFormat.format(new Date()) + ".csv"; return logDir; } }