/* Copyright 2010, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 **
 **     http://www.apache.org/licenses/LICENSE-2.0
 **
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 */

package com.android.exchange.utility;

import java.io.CharArrayWriter;
import java.io.IOException;

public class SimpleIcsWriter extends CharArrayWriter {
    public static final int MAX_LINE_LENGTH = 75;
    public static final int LINE_BREAK_LENGTH = 3;
    public static final String LINE_BREAK = "\r\n\t";
    int mColumnCount = 0;

    public SimpleIcsWriter() {
        super();
    }

    private void newLine() {
        write('\r');
        write('\n');
        mColumnCount = 0;
    }

    @Override
    public void write(String str) throws IOException {
        int len = str.length();
        for (int i = 0; i < len; i++, mColumnCount++) {
            if (mColumnCount == MAX_LINE_LENGTH) {
                write('\r');
                write('\n');
                write('\t');
                // Line count will get immediately incremented to one (the tab)
                mColumnCount = 0;
            }
            char c = str.charAt(i);
            if (c == '\r') {
                // Ignore CR
                mColumnCount--;
                continue;
            } else if (c == '\n') {
                // On LF, set to -1, which will immediately get incremented to zero
                write("\\");
                write("n");
                mColumnCount = -1;
                continue;
            }
            write(c);
        }
    }

    public void writeTag(String name, String value) throws IOException {
        // Belt and suspenders here; don't crash on null value.  Use something innocuous
        if (value == null) value = "0";
        write(name);
        write(":");
        write(value);
        newLine();
    }
}
