

#include "LZItem.h"

#include "minilzo.h"



LZItem::LZItem() {

    m_cprbuf = 0;
    m_cprsize = 0;
    m_cprdel = false;

    m_dcprbuf = 0;
    m_dcprsize = 0;
    m_dcprdel = false;
}

LZItem::~LZItem() {

    destroy();
}



void LZItem::cCreate(u8 *cprbuf, u32 cprsize, u32 dcprsize, bool todel) {

    m_cprbuf = cprbuf;
    m_cprsize = cprsize;
    m_cprdel = todel;

    // conosco a priori la lunghezza una volta decompresso...
    m_dcprsize = dcprsize;
}

void LZItem::dCreate(u8 *dcprbuf, u32 dcprsize, u32 cprsize, bool todel) {

    m_dcprbuf = dcprbuf;
    m_dcprsize = dcprsize;
    m_dcprdel = todel;

    // conosco a priori la lunghezza una volta compresso...
    m_cprsize = cprsize;
}

void LZItem::destroy() {

    if ((m_cprdel) && (m_cprbuf)) {
        delete [] m_cprbuf;
        m_cprbuf = 0;
        m_cprsize = 0;
        m_cprdel = false;
    }

    if ((m_dcprdel) && (m_dcprbuf)) {
        delete [] m_dcprbuf;
        m_dcprbuf = 0;
        m_dcprsize = 0;
        m_dcprdel = false;
    }
}


bool LZItem::decompress() {

    // già decompresso...
    if (m_dcprbuf)
        return true;

    // non ho nulla da decomprimere!
    if ((m_cprbuf == 0)  || (m_cprsize == 0))
        return false;

    // non conosco la grandezza una volta decompresso, per ora esco...
    // dovrei mettere una grandezza enorme che non posso supportare nel nokia...
    if (m_dcprsize == 0)
        return false;
        // m_dcprsize = (valore nell'ordine dei mbyte);

    m_dcprbuf = new u8[m_dcprsize];
    if (m_dcprbuf == 0)
        return false;

    u32 length;
    s32 ret = lzo1x_decompress((unsigned char *)m_cprbuf, m_cprsize, (unsigned char *)m_dcprbuf, (unsigned int *)&length, 0);

    if (ret == LZO_E_OK) {
        m_dcprsize = length;
        m_dcprdel = true;
        return true;
    }

    // errore, dealloco tutto...
    delete [] m_dcprbuf;
    m_dcprbuf = 0;
    m_dcprsize = 0;

    return false;
}

bool LZItem::compress() {

    // già compresso...
    if (m_cprbuf)
        return true;

    // non ho nulla da comprimere!
    if ((m_dcprbuf == 0) || (m_dcprsize == 0))
        return false;

    // non conosco la grandezza una volta compresso, calcolo minima compressione...
    if (m_cprsize == 0)
        m_cprsize = m_dcprsize + m_dcprsize/64 + 16 + 3;

    m_cprbuf = new u8[m_cprsize];
    if (m_cprbuf == 0)
        return false;

    // alloco workmem
    u8 *workmem = new u8[LZO1X_MEM_COMPRESS];
    if (workmem == 0) {
        delete [] m_cprbuf;
        return false;
    }

    u32 length;
    s32 ret = lzo1x_1_compress((unsigned char *)m_dcprbuf, m_dcprsize, (unsigned char *)m_cprbuf, (unsigned int *)&length, workmem);

    if (ret == LZO_E_OK) {
        delete [] workmem;
        m_cprsize = length;
        m_cprdel = true;
        return true;
    }

    // errore, dealloco tutto...
    delete [] workmem;
    delete [] m_cprbuf;
    m_cprbuf = 0;
    m_cprsize = 0;

    return false;
}



u8 *LZItem::cBuffer() {

    return m_cprbuf;
}

u32 LZItem::cSize() {

    return m_cprsize;
}



u8 *LZItem::dBuffer() {

    return m_dcprbuf;
}

u32 LZItem::dSize() {

    return m_dcprsize;
}
