filters

powerpoint.h

00001 /*
00002     Copyright (C) 2000, S.R.Haque <shaheedhaque@hotmail.com>.
00003     This file is part of the KDE project
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018     Boston, MA 02111-1307, USA.
00019 
00020 DESCRIPTION
00021 
00022     This is a generic parser for Microsoft Powerpoint documents. The output is
00023     a series of callbacks (a.k.a. virtual functions) which the caller can
00024     override as required.
00025 */
00026 
00027 #ifndef POWERPOINT_H
00028 #define POWERPOINT_H
00029 
00030 
00031 #include <myfile.h>
00032 #include <qdatastream.h>
00033 #include <qptrlist.h>
00034 #include <qmap.h>
00035 #include <pptSlide.h>
00036 
00037 typedef Q_INT32 sint4; // signed 4-byte integral value
00038 typedef Q_INT16 sint2; // signed 4-byte integral value
00039 typedef Q_UINT32 uint4; // unsigned 4-byte integral value
00040 typedef Q_UINT16 uint2; // 2-byte
00041 typedef Q_INT8 bool1; // 1-byte boolean
00042 typedef Q_UINT8 ubyte1; // unsigned byte value
00043 typedef uint2 psrType;
00044 typedef uint4 psrSize; // each record is preceded by
00045 // pssTypeType and pssSizeType.
00046 typedef uint2 psrInstance;
00047 typedef uint2 psrVersion;
00048 typedef uint4 psrReference; // Saved object reference
00049 //typedef QList<PptSlide> PptSlideList;
00050 
00051 class Powerpoint
00052 {
00053 public:
00054 
00055     // Construction.
00056 
00057     Powerpoint();
00058     virtual ~Powerpoint();
00059 
00060     // Called to parse the given file.
00061 
00062     bool parse(
00063         myFile &mainStream,
00064         myFile &currentUser,
00065         myFile &pictures);
00066 
00067     typedef struct
00068     {
00069         unsigned type;
00070         QString data;
00071     } SlideText;
00072 
00073     typedef struct
00074     {
00075         unsigned persistentReference;
00076         QPtrList<SlideText> text;
00077     } Slide;
00078 
00079 protected:
00080 
00081     virtual void gotDrawing(
00082         unsigned id,
00083         QString type,
00084         unsigned length,
00085         const char *data) = 0;
00086     virtual void gotSlide(
00087          PptSlide &slide) = 0;
00088 
00089 private:
00090     Powerpoint(const Powerpoint &);
00091     const Powerpoint &operator=(const Powerpoint &);
00092 
00093     // Debug support.
00094 
00095 public:
00096     static const int s_area;
00097 
00098 private:
00099     myFile m_mainStream;
00100     myFile m_pictures;
00101     unsigned m_documentRef;
00102     bool m_documentRefFound;
00103     QMap<unsigned, unsigned> m_persistentReferences;
00104     unsigned    m_editDepth;
00105     enum
00106     {
00107         PASS_GET_SLIDE_REFERENCES,
00108         PASS_GET_SLIDE_CONTENTS
00109     } m_pass;
00110     unsigned m_textType;
00111     
00112     QPtrList<PptSlide>  m_slideList;
00113     PptSlide*       m_pptSlide;
00114 
00115 struct PSR_CurrentUserAtom
00116 {
00117     uint4 size;
00118     uint4 magic; // Magic number to ensure this is a PowerPoint file.
00119     uint4 offsetToCurrentEdit; // Offset in main stream to current edit field.
00120     uint2 lenUserName;
00121     uint2 docFileVersion;
00122     ubyte1 majorVersion;
00123     ubyte1 minorVersion;
00124 };
00125 
00126 struct PSR_UserEditAtom
00127 {
00128     sint4 lastSlideID; // slideID
00129     uint4 version; // This is major/minor/build which did the edit
00130     uint4 offsetLastEdit; // File offset of last edit
00131     uint4 offsetPersistDirectory; // Offset to PersistPtrs for
00132     // this file version.
00133     uint4 documentRef;
00134     uint4 maxPersistWritten; // Addr of last persist ref written to the file (max seen so far).
00135     sint2 lastViewType; // enum view type
00136 };
00137 
00138 struct PSR_SSlideLayoutAtom
00139 {
00140     sint4 geom;
00141     ubyte1 placeholderId[8];
00142 };
00143 
00144     PSR_CurrentUserAtom mCurrentUserAtom;
00145     PSR_UserEditAtom    mUserEditAtom;
00146     PSR_UserEditAtom*   mpLastUserEditAtom;
00147     Q_UINT32            mEditOffset;
00148 
00149     // Common Header.
00150 
00151     typedef struct
00152     {
00153         union
00154         {
00155             Q_UINT16 info;
00156             struct
00157             {
00158                 Q_UINT16 version: 4;
00159                 Q_UINT16 instance: 12;
00160             } fields;
00161         } opcode;
00162         Q_UINT16 type;
00163         Q_UINT32 length;
00164     } Header;
00165 
00166     // Opcode handling and painter methods.
00167 
00168     void walk(
00169         Q_UINT32 bytes,
00170         QDataStream &operands);
00171     void walk(
00172         Q_UINT32 mainStreamOffset);
00173     void walkRecord(
00174         Q_UINT32 bytes,
00175         const unsigned char *operands);
00176     void walkRecord(
00177         Q_UINT32 mainStreamOffset);
00178     void walkReference(
00179         Q_UINT32 reference);
00180     void skip(
00181         Q_UINT32 bytes,
00182         QDataStream &operands);
00183     void invokeHandler(
00184         Header &op,
00185         Q_UINT32 bytes,
00186         QDataStream &operands);
00187     void walkDocument();
00188 
00189     void opAnimationInfo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00190     void opAnimationInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00191     void opArrayElementAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00192     void opBaseTextPropAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00193     void opBinaryTagData(Header &op, Q_UINT32 bytes, QDataStream &operands);
00194     void opBookmarkCollection(Header &op, Q_UINT32 bytes, QDataStream &operands);
00195     void opBookmarkEntityAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00196     void opBookmarkSeedAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00197     void opCharFormatAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00198     void opClientSignal1(Header &op, Q_UINT32 bytes, QDataStream &operands);
00199     void opClientSignal2(Header &op, Q_UINT32 bytes, QDataStream &operands);
00200     void opColorSchemeAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00201     void opCorePict(Header &op, Q_UINT32 bytes, QDataStream &operands);
00202     void opCorePictAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00203     void opCString(Header &op, Q_UINT32 bytes, QDataStream &operands);
00204     void opCurrentUserAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00205     void opDateTimeMCAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00206     void opDefaultRulerAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00207     void opDocRoutingSlip(Header &op, Q_UINT32 bytes, QDataStream &operands);
00208     void opDocument(Header &op, Q_UINT32 bytes, QDataStream &operands);
00209     void opDocumentAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00210     void opDocViewInfo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00211     void opEmFormatAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00212     void opEndDocument(Header &op, Q_UINT32 bytes, QDataStream &operands);
00213     void opEnvironment(Header &op, Q_UINT32 bytes, QDataStream &operands);
00214     void opExAviMovie(Header &op, Q_UINT32 bytes, QDataStream &operands);
00215     void opExCDAudio(Header &op, Q_UINT32 bytes, QDataStream &operands);
00216     void opExCDAudioAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00217     void opExControl(Header &op, Q_UINT32 bytes, QDataStream &operands);
00218     void opExControlAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00219     void opExEmbed(Header &op, Q_UINT32 bytes, QDataStream &operands);
00220     void opExEmbedAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00221     void opExHyperlink(Header &op, Q_UINT32 bytes, QDataStream &operands);
00222     void opExHyperlinkAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00223     void opExLink(Header &op, Q_UINT32 bytes, QDataStream &operands);
00224     void opExLinkAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00225     void opExLinkAtom_old(Header &op, Q_UINT32 bytes, QDataStream &operands);
00226     void opExMCIMovie(Header &op, Q_UINT32 bytes, QDataStream &operands);
00227     void opExMediaAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00228     void opExMIDIAudio(Header &op, Q_UINT32 bytes, QDataStream &operands);
00229     void opExObjList(Header &op, Q_UINT32 bytes, QDataStream &operands);
00230     void opExObjListAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00231     void opExObjRefAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00232     void opExOleObj(Header &op, Q_UINT32 bytes, QDataStream &operands);
00233     void opExOleObjAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00234     void opExOleObjStg(Header &op, Q_UINT32 bytes, QDataStream &operands);
00235     void opExPlain(Header &op, Q_UINT32 bytes, QDataStream &operands);
00236     void opExPlainAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00237     void opExPlainLink(Header &op, Q_UINT32 bytes, QDataStream &operands);
00238     void opExPlainLinkAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00239     void opExQuickTime(Header &op, Q_UINT32 bytes, QDataStream &operands);
00240     void opExQuickTimeMovie(Header &op, Q_UINT32 bytes, QDataStream &operands);
00241     void opExQuickTimeMovieData(Header &op, Q_UINT32 bytes, QDataStream &operands);
00242     void opExSubscription(Header &op, Q_UINT32 bytes, QDataStream &operands);
00243     void opExSubscriptionSection(Header &op, Q_UINT32 bytes, QDataStream &operands);
00244     void opExternalObject(Header &op, Q_UINT32 bytes, QDataStream &operands);
00245     void opExVideo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00246     void opExWAVAudioEmbedded(Header &op, Q_UINT32 bytes, QDataStream &operands);
00247     void opExWAVAudioEmbeddedAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00248     void opExWAVAudioLink(Header &op, Q_UINT32 bytes, QDataStream &operands);
00249     void opFontCollection(Header &op, Q_UINT32 bytes, QDataStream &operands);
00250     void opFontEmbedData(Header &op, Q_UINT32 bytes, QDataStream &operands);
00251     void opFontEntityAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00252     void opFooterMCAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00253     void opGenericDateMCAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00254     void opGlineAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00255     void opGLPointAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00256     void opGpointAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00257     void opGratioAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00258     void opGrColor(Header &op, Q_UINT32 bytes, QDataStream &operands);
00259     void opGrColorAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00260     void opGrectAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00261     void opGscaling(Header &op, Q_UINT32 bytes, QDataStream &operands);
00262     void opGscalingAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00263     void opGuideAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00264     void opGuideList(Header &op, Q_UINT32 bytes, QDataStream &operands);
00265     void opHandout(Header &op, Q_UINT32 bytes, QDataStream &operands);
00266     void opHeaderMCAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00267     void opHeadersFooters(Header &op, Q_UINT32 bytes, QDataStream &operands);
00268     void opHeadersFootersAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00269     void opInt4ArrayAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00270     void opInteractiveInfo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00271     void opInteractiveInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00272     void opIRRAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00273     void opList(Header &op, Q_UINT32 bytes, QDataStream &operands);
00274     void opListPlaceholder(Header &op, Q_UINT32 bytes, QDataStream &operands);
00275     void opMainMaster(Header &op, Q_UINT32 bytes, QDataStream &operands);
00276     void opMasterText(Header &op, Q_UINT32 bytes, QDataStream &operands);
00277     void opMetaFile(Header &op, Q_UINT32 bytes, QDataStream &operands);
00278     void opMsod(Header &op, Q_UINT32 bytes, QDataStream &operands);
00279     void opNamedShow(Header &op, Q_UINT32 bytes, QDataStream &operands);
00280     void opNamedShows(Header &op, Q_UINT32 bytes, QDataStream &operands);
00281     void opNamedShowSlides(Header &op, Q_UINT32 bytes, QDataStream &operands);
00282     void opNotes(Header &op, Q_UINT32 bytes, QDataStream &operands);
00283     void opNotesAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00284     void opOEPlaceholderAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00285     void opOEShape(Header &op, Q_UINT32 bytes, QDataStream &operands);
00286     void opOEShapeAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00287     void opOutlineTextRefAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00288     void opOutlineViewInfo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00289     void opParaFormatAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00290     void opPersistPtrFullBlock(Header &op, Q_UINT32 bytes, QDataStream &operands);
00291     void opPersistPtrIncrementalBlock(Header &op, Q_UINT32 bytes, QDataStream &operands);
00292     void opPersistPtrIncrementalBlock2(Header &op, Q_UINT32 bytes, QDataStream &operands);
00293     void opPowerPointStateInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00294     void opPPDrawing(Header &op, Q_UINT32 bytes, QDataStream &operands);
00295     void opPPDrawingGroup(Header &op, Q_UINT32 bytes, QDataStream &operands);
00296     void opPrintOptions(Header &op, Q_UINT32 bytes, QDataStream &operands);
00297     void opProgBinaryTag(Header &op, Q_UINT32 bytes, QDataStream &operands);
00298     void opProgStringTag(Header &op, Q_UINT32 bytes, QDataStream &operands);
00299     void opProgTags(Header &op, Q_UINT32 bytes, QDataStream &operands);
00300     void opPSS(Header &op, Q_UINT32 bytes, QDataStream &operands);
00301     void opRecolorEntryAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00302     void opRecolorInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00303     void opRTFDateTimeMCAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00304     void opRulerIndentAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00305     void opRunArray(Header &op, Q_UINT32 bytes, QDataStream &operands);
00306     void opRunArrayAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00307     void opScheme(Header &op, Q_UINT32 bytes, QDataStream &operands);
00308     void opSchemeAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00309     void opSlide(Header &op, Q_UINT32 bytes, QDataStream &operands);
00310     void opSlideAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00311     void opSlideBase(Header &op, Q_UINT32 bytes, QDataStream &operands);
00312     void opSlideBaseAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00313     void opSlideList(Header &op, Q_UINT32 bytes, QDataStream &operands);
00314     void opSlideListWithText(Header &op, Q_UINT32 bytes, QDataStream &operands);
00315     void opSlideNumberMCAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00316     void opSlidePersist(Header &op, Q_UINT32 bytes, QDataStream &operands);
00317     void opSlidePersistAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00318     void opSlideViewInfo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00319     void opSlideViewInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00320     void opSorterViewInfo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00321     void opSound(Header &op, Q_UINT32 bytes, QDataStream &operands);
00322     void opSoundCollAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00323     void opSoundCollection(Header &op, Q_UINT32 bytes, QDataStream &operands);
00324     void opSoundData(Header &op, Q_UINT32 bytes, QDataStream &operands);
00325     void opSrKinsoku(Header &op, Q_UINT32 bytes, QDataStream &operands);
00326     void opSrKinsokuAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00327     void opSSDocInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00328     void opSSSlideLayoutAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00329     void opSSSlideInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00330     void opStyleTextPropAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00331     void opSubContainerCompleted(Header &op, Q_UINT32 bytes, QDataStream &operands);
00332     void opSubContainerException(Header &op, Q_UINT32 bytes, QDataStream &operands);
00333     void opSummary(Header &op, Q_UINT32 bytes, QDataStream &operands);
00334     void opTextBookmarkAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00335     void opTextBytesAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00336     void opTextCharsAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00337     void opTextHeaderAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00338     void opTextRulerAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00339     void opTextSpecInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00340     void opTexture(Header &op, Q_UINT32 bytes, QDataStream &operands);
00341     void opTxCFStyleAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00342     void opTxInteractiveInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00343     void opTxMasterStyleAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00344     void opTxPFStyleAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00345     void opTxSIStyleAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00346     void opTypeFace(Header &op, Q_UINT32 bytes, QDataStream &operands);
00347     void opUserEditAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00348     void opVBAInfo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00349     void opVBAInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00350     void opVBASlideInfo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00351     void opVBASlideInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00352     void opViewInfo(Header &op, Q_UINT32 bytes, QDataStream &operands);
00353     void opViewInfoAtom(Header &op, Q_UINT32 bytes, QDataStream &operands);
00354 };
00355 #endif
KDE Home | KDE Accessibility Home | Description of Access Keys