/*
* 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 */