// CVBuffer.mm: CocoaVanilla implementation of OVBuffer
//
// Copyright (c) 2004-2006 The OpenVanilla Project (http://openvanilla.org)
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. Neither the name of OpenVanilla nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

#include "CVBuffer.h"
#include "CVWrappers.h"

CVBuffer::CVBuffer(TSComposingBuffer *cb, NSArray *ofa, OVService *s) {
    cbuf=cb;
    ofarray=ofa;
    srv=s;
}

OVBuffer* CVBuffer::clear() {
    if (cbuf) cbuf->clear();
    return this;
}

OVBuffer* CVBuffer::append(const char *s) {
    if (!s) return this;
    if (!strlen(s)) return this;
    NSString *u8s=[NSString stringWithUTF8String:s];
    if (cbuf && u8s) cbuf->append(u8s);
    return this;
}

OVBuffer* CVBuffer::send() {
    if (!cbuf) return this;
    
    if (![ofarray count]) {
        cbuf->send();
        return this;
    }
    
    NSString *src=cbuf->getContent();
    const char *u8=[src UTF8String];
    NSEnumerator *e=[ofarray objectEnumerator];
    id o;
    while (o=[e nextObject]) {
        OVOutputFilter *filter=(OVOutputFilter*)[o module];
        if (!filter) continue;
        const char *result=filter->process(u8, srv);
        if (!result) {
            src=@"";
            break;
        }
        // if (result==u8) continue;
        src=[NSString stringWithUTF8String:result];
        u8=[src UTF8String];
    }
    
    if (![src length]) {
        cbuf->clear()->update();
    }
    else {
        cbuf->clear()->append(src);
        cbuf->send();
    }
    return this;
}

OVBuffer* CVBuffer::update() {
    if (cbuf) cbuf->update();
    return this;
}

OVBuffer* CVBuffer::update(int cursorPos, int markFrom, int markTo) {
    if (cbuf) cbuf->update(FALSE, cursorPos, markFrom, markTo);
    return this;
}

int CVBuffer::isEmpty() {
    return cbuf ? cbuf->isEmpty() : 0;
}

Point CVBuffer::getAppCursorPosition() {
    return cbuf->getAppCursorPosition();
}

CVBuffer *CVBuffer::setComposingBuffer(TSComposingBuffer *cb) {
    cbuf=cb;
    return this;
}
