Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * properties.c
 * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL
 *
 * Description:
 * Read the properties information from a MS Word file
 */

#include <stdlib.h>
#include <string.h>
#include "antiword.h"


/*
 * Build the lists with Property Information
 */
void
vGetPropertyInfo(FILE *pFile, const pps_info_type *pPPS,
        const ULONG *aulBBD, size_t tBBDLen,
        const ULONG *aulSBD, size_t tSBDLen,
        const UCHAR *aucHeader, int iWordVersion)
{
        options_type    tOptions;

        TRACE_MSG("vGetPropertyInfo");

        fail(pFile == NULL);
        fail(pPPS == NULL && iWordVersion >= 6);
        fail(aulBBD == NULL && tBBDLen != 0);
        fail(aulSBD == NULL && tSBDLen != 0);
        fail(aucHeader == NULL);

        /* Get the options */
        vGetOptions(&tOptions);

        /* Get the property information per Word version */
        switch (iWordVersion) {
        case 0:
                vGet0DopInfo(pFile, aucHeader);
                vGet0SepInfo(pFile, aucHeader);
                vGet0PapInfo(pFile, aucHeader);
                if (tOptions.eConversionType == conversion_draw ||
                    tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_xml ||
                    tOptions.eConversionType == conversion_fmt_text ||
                    tOptions.eConversionType == conversion_pdf) {
                        vGet0ChrInfo(pFile, aucHeader);
                }
                if (tOptions.eConversionType == conversion_draw ||
                    tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_pdf) {
                        vCreate0FontTable();
                }
                vSet0SummaryInfo(pFile, aucHeader);
                break;
        case 1:
        case 2:
                vGet2Stylesheet(pFile, iWordVersion, aucHeader);
                vGet2DopInfo(pFile, aucHeader);
                vGet2SepInfo(pFile, aucHeader);
                vGet2PapInfo(pFile, aucHeader);
                if (tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_pdf) {
                        vGet2HdrFtrInfo(pFile, aucHeader);
                }
                if (tOptions.eConversionType == conversion_draw ||
                    tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_xml ||
                    tOptions.eConversionType == conversion_fmt_text ||
                    tOptions.eConversionType == conversion_pdf) {
                        vGet2ChrInfo(pFile, iWordVersion, aucHeader);
                }
                if (tOptions.eConversionType == conversion_draw ||
                    tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_pdf) {
                        vCreate2FontTable(pFile, iWordVersion, aucHeader);
                }
                vSet2SummaryInfo(pFile, iWordVersion, aucHeader);
                break;
        case 4:
        case 5:
                break;
        case 6:
        case 7:
                vGet6Stylesheet(pFile, pPPS->tWordDocument.ulSB,
                        aulBBD, tBBDLen, aucHeader);
                vGet6DopInfo(pFile, pPPS->tWordDocument.ulSB,
                        aulBBD, tBBDLen, aucHeader);
                vGet6SepInfo(pFile, pPPS->tWordDocument.ulSB,
                        aulBBD, tBBDLen, aucHeader);
                vGet6PapInfo(pFile, pPPS->tWordDocument.ulSB,
                        aulBBD, tBBDLen, aucHeader);
                if (tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_pdf) {
                        vGet6HdrFtrInfo(pFile, pPPS->tWordDocument.ulSB,
                                aulBBD, tBBDLen, aucHeader);
                }
                if (tOptions.eConversionType == conversion_draw ||
                    tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_xml ||
                    tOptions.eConversionType == conversion_fmt_text ||
                    tOptions.eConversionType == conversion_pdf) {
                        vGet6ChrInfo(pFile, pPPS->tWordDocument.ulSB,
                                aulBBD, tBBDLen, aucHeader);
                }
                if (tOptions.eConversionType == conversion_draw ||
                    tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_pdf) {
                        vCreate6FontTable(pFile, pPPS->tWordDocument.ulSB,
                                aulBBD, tBBDLen, aucHeader);
                }
                vSet6SummaryInfo(pFile, pPPS,
                        aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                break;
        case 8:
                vGet8LstInfo(pFile, pPPS,
                        aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                vGet8Stylesheet(pFile, pPPS,
                        aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                vGet8DopInfo(pFile, &pPPS->tTable,
                        aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                vGet8SepInfo(pFile, pPPS,
                        aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                vGet8PapInfo(pFile, pPPS,
                        aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                if (tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_pdf) {
                        vGet8HdrFtrInfo(pFile, &pPPS->tTable,
                                aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                }
                if (tOptions.eConversionType == conversion_draw ||
                    tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_xml ||
                    tOptions.eConversionType == conversion_fmt_text ||
                    tOptions.eConversionType == conversion_pdf) {
                        vGet8ChrInfo(pFile, pPPS,
                                aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                }
                if (tOptions.eConversionType == conversion_draw ||
                    tOptions.eConversionType == conversion_ps ||
                    tOptions.eConversionType == conversion_pdf) {
                        vCreate8FontTable(pFile, pPPS,
                                aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                }
                vSet8SummaryInfo(pFile, pPPS,
                        aulBBD, tBBDLen, aulSBD, tSBDLen, aucHeader);
                break;
        default:
                DBG_DEC(iWordVersion);
                DBG_FIXME();
                werr(0, "Sorry, no property information");
                break;
        }

        /* Temporarily: Correct the font table */
        vCorrectFontTable(tOptions.eConversionType, tOptions.eEncoding);
} /* end of vGetPropertyInfo */

/*
 * ePropMod2RowInfo - Turn the Property Modifier into row information
 *
 * Returns: the row information
 */
row_info_enum
ePropMod2RowInfo(USHORT usPropMod, int iWordVersion)
{
        row_block_type  tRow;
        const UCHAR     *aucPropMod;
        int     iLen;

        TRACE_MSG("ePropMod2RowInfo");

        aucPropMod = aucReadPropModListItem(usPropMod);
        if (aucPropMod == NULL) {
                return found_nothing;
        }
        iLen = (int)usGetWord(0, aucPropMod);

        switch (iWordVersion) {
        case 0:
                return found_nothing;
        case 1:
        case 2:
                return eGet2RowInfo(0, aucPropMod + 2, iLen, &tRow);
        case 4:
        case 5:
                return found_nothing;
        case 6:
        case 7:
                return eGet6RowInfo(0, aucPropMod + 2, iLen, &tRow);
        case 8:
                return eGet8RowInfo(0, aucPropMod + 2, iLen, &tRow);
        default:
                DBG_DEC(iWordVersion);
                DBG_FIXME();
                return found_nothing;
        }
} /* end of ePropMod2RowInfo */