view mde/file/mergetag/MTTagWriter.d @ 151:e785e98d3b78

Updated for compatibility with tango 0.99.8.
author Diggory Hardy <diggory.hardy@gmail.com>
date Sat, 04 Apr 2009 17:32:18 +0200
parents 9f035cd139c6
children 1cbde9807293
line wrap: on
line source

/* LICENSE BLOCK
Part of mde: a Modular D game-oriented Engine
Copyright © 2007-2008 Diggory Hardy

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, see <http://www.gnu.org/licenses/>. */

/******************************************************************************
 * This module contains a simpler, easier to use, mergetag writer.
 *****************************************************************************/
module mde.file.mergetag.MTTagWriter;

import mde.file.mergetag.internal;
import mde.file.mergetag.exception;

import tango.io.device.File;
import tango.io.stream.Buffered;
import tango.util.log.Log : Log, Logger;

private Logger logger;
static this() {
    logger = Log.getLogger ("mde.file.mergetag.MTTagWriter");
}

MTTagWriter getMTTagWriter (char[] path) {
    if (path.length > 4 && path[$-4..$] == ".mtt")
        return new MTTTagWriter (path);
    else if (path.length > 4 && path[$-4..$] == ".mtb")
        return new MTBTagWriter (path);
    else {
        logger.error ("Unable to determine writing format: text or binary");
        throw new MTFileFormatException;
    }
}

abstract class MTTagWriter
{
    /// Set the current section
    void sectionTag (char[] section);
    
    /// Write a data tag
    void dataTag (char[] type, char[] id, char[] data);
    
    /// Change the section if necessary and write a data tag
    void writeTag (char[] section, char[] type, char[] id, char[] data) {
        if (section != sec)
            sectionTag (section);
        dataTag (type, id, data);
    }
    
    /// Close the file
    void close ();
    
protected:
    char[] sec;		// current section
}

class MTTTagWriter : MTTagWriter
{
    /** Opens the file path for writing. Call close() when done! */
    this (char[] path) {
        buffer = new BufferedOutput (new File (path, File.WriteCreate));
        
        buffer.append ("{" ~ CurrentVersionString ~ "}" ~ Eol);
    }
    
    void sectionTag (char[] section) {
        sec = section;
        buffer.append ("{" ~ section ~ "}" ~ Eol);
    }
    
    void dataTag (char[] type, char[] id, char[] data) {
        buffer.append ("<" ~ type ~ "|" ~ id ~"=" ~ data ~ ">" ~ Eol);
    }
    
    void close () {
        buffer.flush;
        buffer.close;
    }
    
private:
    scope BufferedOutput buffer;
}

class MTBTagWriter : MTTagWriter
{
    this (char[] path) {
        throw new MTNotImplementedException;
    }
    
    void sectionTag (char[] section) {}
    void dataTag (char[] type, char[] id, char[] data) {}
    void close () {}
}