/** \file
 *
 *  Contains the DecimationLogManager class definition.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#ifndef DECIMATIONLOGMANAGER_H_
#define DECIMATIONLOGMANAGER_H_

#include "logger/DecimationLogWriter.h"
#include "logger/LogEngine.h"
#include "utils/FastMap.h"
#include "utils/FlexArray.h"

class DataValue;
class DirectoryManagingLogWriter;
class MultiLogWriter;
class SplitFileLogWriter;

class DecimationLogManager
{
public:

    DecimationLogManager( LogEngine& logEngine, Str& dataDir );

    virtual ~DecimationLogManager();

    void configLog( Service::ServiceType serviceType,
                    DecimationLogWriter::DecimationType decimationType,
                    const Str& name, DataValue* parameter, Logger& logger );

    SplitFileLogWriter* getFileWriter( Service::ServiceType serviceType );

    void lockWrites();

    void unlockWrites();

    void splits();

    void writeHeaders();

    void writeFooters();

    void resetFileBases();

    void resetDirectoryEntries();

    void flush();

    unsigned int forceWrite( DataEntry* dataEntry, Service::ServiceType serviceType );

    unsigned int writeSyslog( const SyslogEntry* syslogEntry, Service::ServiceType serviceType );

private:
    LogEngine& logEngine_;
    Str& dataDir_;
    FastMap<const Str, LogAssociation*> logAssocationMap_;
    FlexArray<SplitFileLogWriter*> fileWriters_;
    FlexArray<DirectoryManagingLogWriter*> otherWriters_;
    int fileNum_;
};

#endif /*DECIMATIONLOGMANAGER_H_*/
