summaryrefslogtreecommitdiff
path: root/writerfilter/source/doctok/DffImpl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/doctok/DffImpl.cxx')
-rw-r--r--writerfilter/source/doctok/DffImpl.cxx518
1 files changed, 518 insertions, 0 deletions
diff --git a/writerfilter/source/doctok/DffImpl.cxx b/writerfilter/source/doctok/DffImpl.cxx
new file mode 100644
index 000000000000..fcb2fe6267be
--- /dev/null
+++ b/writerfilter/source/doctok/DffImpl.cxx
@@ -0,0 +1,518 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "resources.hxx"
+#include "WW8DocumentImpl.hxx"
+
+namespace writerfilter {
+namespace doctok
+{
+
+class ShapeTypeToString
+{
+ typedef boost::shared_ptr<ShapeTypeToString> Pointer_t;
+
+ static Pointer_t pInstance;
+
+ typedef map<sal_uInt32, string> Map_t;
+ Map_t mMap;
+
+protected:
+ ShapeTypeToString();
+
+public:
+ static Pointer_t Instance()
+ {
+ if (pInstance == NULL)
+ pInstance = Pointer_t(new ShapeTypeToString());
+
+ return pInstance;
+ }
+
+ string operator()(sal_uInt32 nShapeType)
+ {
+ return mMap[nShapeType];
+ }
+};
+
+ShapeTypeToString::Pointer_t ShapeTypeToString::pInstance;
+
+ShapeTypeToString::ShapeTypeToString()
+{
+ mMap[0]="NotPrimitive";
+ mMap[1]="Rectangle";
+ mMap[2]="RoundRectangle";
+ mMap[3]="Ellipse";
+ mMap[4]="Diamond";
+ mMap[5]="IsocelesTriangle";
+ mMap[6]="RightTriangle";
+ mMap[7]="Parallelogram";
+ mMap[8]="Trapezoid";
+ mMap[9]="Hexagon";
+ mMap[10]="Octagon";
+ mMap[11]="Plus";
+ mMap[12]="Star";
+ mMap[13]="Arrow";
+ mMap[14]="ThickArrow";
+ mMap[15]="HomePlate";
+ mMap[16]="Cube";
+ mMap[17]="Balloon";
+ mMap[18]="Seal";
+ mMap[19]="Arc";
+ mMap[20]="Line";
+ mMap[21]="Plaque";
+ mMap[22]="Can";
+ mMap[23]="Donut";
+ mMap[24]="TextSimple";
+ mMap[25]="TextOctagon";
+ mMap[26]="TextHexagon";
+ mMap[27]="TextCurve";
+ mMap[28]="TextWave";
+ mMap[29]="TextRing";
+ mMap[30]="TextOnCurve";
+ mMap[31]="TextOnRing";
+ mMap[32]="StraightConnector1";
+ mMap[33]="BentConnector2";
+ mMap[34]="BentConnector3";
+ mMap[35]="BentConnector4";
+ mMap[36]="BentConnector5";
+ mMap[37]="CurvedConnector2";
+ mMap[38]="CurvedConnector3";
+ mMap[39]="CurvedConnector4";
+ mMap[40]="CurvedConnector5";
+ mMap[41]="Callout1";
+ mMap[42]="Callout2";
+ mMap[43]="Callout3";
+ mMap[44]="AccentCallout1";
+ mMap[45]="AccentCallout2";
+ mMap[46]="AccentCallout3";
+ mMap[47]="BorderCallout1";
+ mMap[48]="BorderCallout2";
+ mMap[49]="BorderCallout3";
+ mMap[50]="AccentBorderCallout1";
+ mMap[51]="AccentBorderCallout2";
+ mMap[52]="AccentBorderCallout3";
+ mMap[53]="Ribbon";
+ mMap[54]="Ribbon2";
+ mMap[55]="Chevron";
+ mMap[56]="Pentagon";
+ mMap[57]="NoSmoking";
+ mMap[58]="Seal8";
+ mMap[59]="Seal16";
+ mMap[60]="Seal32";
+ mMap[61]="WedgeRectCallout";
+ mMap[62]="WedgeRRectCallout";
+ mMap[63]="WedgeEllipseCallout";
+ mMap[64]="Wave";
+ mMap[65]="FoldedCorner";
+ mMap[66]="LeftArrow";
+ mMap[67]="DownArrow";
+ mMap[68]="UpArrow";
+ mMap[69]="LeftRightArrow";
+ mMap[70]="UpDownArrow";
+ mMap[71]="IrregularSeal1";
+ mMap[72]="IrregularSeal2";
+ mMap[73]="LightningBolt";
+ mMap[74]="Heart";
+ mMap[75]="PictureFrame";
+ mMap[76]="QuadArrow";
+ mMap[77]="LeftArrowCallout";
+ mMap[78]="RightArrowCallout";
+ mMap[79]="UpArrowCallout";
+ mMap[80]="DownArrowCallout";
+ mMap[81]="LeftRightArrowCallout";
+ mMap[82]="UpDownArrowCallout";
+ mMap[83]="QuadArrowCallout";
+ mMap[84]="Bevel";
+ mMap[85]="LeftBracket";
+ mMap[86]="RightBracket";
+ mMap[87]="LeftBrace";
+ mMap[88]="RightBrace";
+ mMap[89]="LeftUpArrow";
+ mMap[90]="BentUpArrow";
+ mMap[91]="BentArrow";
+ mMap[92]="Seal24";
+ mMap[93]="StripedRightArrow";
+ mMap[94]="NotchedRightArrow";
+ mMap[95]="BlockArc";
+ mMap[96]="SmileyFace";
+ mMap[97]="VerticalScroll";
+ mMap[98]="HorizontalScroll";
+ mMap[99]="CircularArrow";
+ mMap[100]="NotchedCircularArrow";
+ mMap[101]="UturnArrow";
+ mMap[102]="CurvedRightArrow";
+ mMap[103]="CurvedLeftArrow";
+ mMap[104]="CurvedUpArrow";
+ mMap[105]="CurvedDownArrow";
+ mMap[106]="CloudCallout";
+ mMap[107]="EllipseRibbon";
+ mMap[108]="EllipseRibbon2";
+ mMap[109]="FlowChartProcess";
+ mMap[110]="FlowChartDecision";
+ mMap[111]="FlowChartInputOutput";
+ mMap[112]="FlowChartPredefinedProcess";
+ mMap[113]="FlowChartInternalStorage";
+ mMap[114]="FlowChartDocument";
+ mMap[115]="FlowChartMultidocument";
+ mMap[116]="FlowChartTerminator";
+ mMap[117]="FlowChartPreparation";
+ mMap[118]="FlowChartManualInput";
+ mMap[119]="FlowChartManualOperation";
+ mMap[120]="FlowChartConnector";
+ mMap[121]="FlowChartPunchedCard";
+ mMap[122]="FlowChartPunchedTape";
+ mMap[123]="FlowChartSummingJunction";
+ mMap[124]="FlowChartOr";
+ mMap[125]="FlowChartCollate";
+ mMap[126]="FlowChartSort";
+ mMap[127]="FlowChartExtract";
+ mMap[128]="FlowChartMerge";
+ mMap[129]="FlowChartOfflineStorage";
+ mMap[130]="FlowChartOnlineStorage";
+ mMap[131]="FlowChartMagneticTape";
+ mMap[132]="FlowChartMagneticDisk";
+ mMap[133]="FlowChartMagneticDrum";
+ mMap[134]="FlowChartDisplay";
+ mMap[135]="FlowChartDelay";
+ mMap[136]="TextPlainText";
+ mMap[137]="TextStop";
+ mMap[138]="TextTriangle";
+ mMap[139]="TextTriangleInverted";
+ mMap[140]="TextChevron";
+ mMap[141]="TextChevronInverted";
+ mMap[142]="TextRingInside";
+ mMap[143]="TextRingOutside";
+ mMap[144]="TextArchUpCurve";
+ mMap[145]="TextArchDownCurve";
+ mMap[146]="TextCircleCurve";
+ mMap[147]="TextButtonCurve";
+ mMap[148]="TextArchUpPour";
+ mMap[149]="TextArchDownPour";
+ mMap[150]="TextCirclePour";
+ mMap[151]="TextButtonPour";
+ mMap[152]="TextCurveUp";
+ mMap[153]="TextCurveDown";
+ mMap[154]="TextCascadeUp";
+ mMap[155]="TextCascadeDown";
+ mMap[156]="TextWave1";
+ mMap[157]="TextWave2";
+ mMap[158]="TextWave3";
+ mMap[159]="TextWave4";
+ mMap[160]="TextInflate";
+ mMap[161]="TextDeflate";
+ mMap[162]="TextInflateBottom";
+ mMap[163]="TextDeflateBottom";
+ mMap[164]="TextInflateTop";
+ mMap[165]="TextDeflateTop";
+ mMap[166]="TextDeflateInflate";
+ mMap[167]="TextDeflateInflateDeflate";
+ mMap[168]="TextFadeRight";
+ mMap[169]="TextFadeLeft";
+ mMap[170]="TextFadeUp";
+ mMap[171]="TextFadeDown";
+ mMap[172]="TextSlantUp";
+ mMap[173]="TextSlantDown";
+ mMap[174]="TextCanUp";
+ mMap[175]="TextCanDown";
+ mMap[176]="FlowChartAlternateProcess";
+ mMap[177]="FlowChartOffpageConnector";
+ mMap[178]="Callout90";
+ mMap[179]="AccentCallout90";
+ mMap[180]="BorderCallout90";
+ mMap[181]="AccentBorderCallout90";
+ mMap[182]="LeftRightUpArrow";
+ mMap[183]="Sun";
+ mMap[184]="Moon";
+ mMap[185]="BracketPair";
+ mMap[186]="BracePair";
+ mMap[187]="Seal4";
+ mMap[188]="DoubleWave";
+ mMap[189]="ActionButtonBlank";
+ mMap[190]="ActionButtonHome";
+ mMap[191]="ActionButtonHelp";
+ mMap[192]="ActionButtonInformation";
+ mMap[193]="ActionButtonForwardNext";
+ mMap[194]="ActionButtonBackPrevious";
+ mMap[195]="ActionButtonEnd";
+ mMap[196]="ActionButtonBeginning";
+ mMap[197]="ActionButtonReturn";
+ mMap[198]="ActionButtonDocument";
+ mMap[199]="ActionButtonSound";
+ mMap[200]="ActionButtonMovie";
+ mMap[201]="HostControl";
+ mMap[202]="TextBox";
+}
+
+// DffOPT
+
+sal_uInt32 DffOPT::get_property_count()
+{
+ return getInstance();
+}
+
+writerfilter::Reference<Properties>::Pointer_t
+DffOPT::get_property(sal_uInt32 nPos)
+{
+ WW8FOPTE * pTmp = new WW8FOPTE(this, 0x8 + nPos * WW8FOPTE::getSize());
+ pTmp->setIndex(nPos);
+
+ return writerfilter::Reference<Properties>::Pointer_t(pTmp);
+}
+
+sal_uInt32 DffOPT::get_extraoffset_count()
+{
+ return get_property_count();
+}
+
+sal_uInt32 DffOPT::get_extraoffset(sal_uInt32 pos)
+{
+ sal_uInt32 nResult;
+ sal_uInt32 nCount = get_property_count();
+
+ if (pos < nCount)
+ {
+ nResult = 0x8 + nCount * WW8FOPTE::getSize();
+
+ for (sal_uInt32 n = 0; n < pos; ++n)
+ {
+ WW8FOPTE aFOPTE(this, 0x8 + n * WW8FOPTE::getSize());
+
+ if (aFOPTE.get_fComplex())
+ {
+ sal_uInt32 nValue = aFOPTE.get_op();
+ nResult += nValue;
+ }
+ }
+ }
+ else
+ nResult = getCount();
+
+ return nResult;
+}
+
+//DffDGG
+
+sal_uInt32 DffDGG::get_fidcl_count()
+{
+ return (getCount() - 0x18) / WW8FIDCL::getSize();
+}
+
+writerfilter::Reference<Properties>::Pointer_t
+DffDGG::get_fidcl(sal_uInt32 pos)
+{
+ return writerfilter::Reference<Properties>::Pointer_t
+ (new WW8FIDCL(this, 0x18 + pos * WW8FIDCL::getSize()));
+}
+
+
+// DffBSE
+
+rtl::OUString DffBSE::get_blipname()
+{
+ rtl::OUString sResult;
+ WW8FBSE aFBSE(this, 0x8);
+
+ if (aFBSE.get_cbName() > 0)
+ sResult = getString(0x24, aFBSE.get_cbName());
+
+ return sResult;
+}
+
+writerfilter::Reference<Properties>::Pointer_t
+DffBSE::get_blip()
+{
+ writerfilter::Reference<Properties>::Pointer_t pResult;
+
+ WW8FBSE aFBSE(this, 8);
+ sal_uInt32 nOffset = 8 + WW8FBSE::getSize() + aFBSE.get_cbName();
+
+ if (nOffset + 8 < getCount())
+ {
+ WW8StructBase aTmp(this, nOffset, 0x8);
+
+ sal_uInt32 nCount = getCount() - 8;
+
+ if (aTmp.getU32(0x4) - 8 < nCount)
+ nCount = aTmp.getU32(0x4) - 8;
+
+ if (nCount)
+ {
+ DffRecord * pRecord = createDffRecord(this, nOffset);
+
+ pResult = writerfilter::Reference<Properties>::Pointer_t(pRecord);
+ }
+ }
+ else
+ {
+ nOffset = sal::static_int_cast<sal_Int32>(aFBSE.get_foDelay());
+ if (! (nOffset & 1 << 31) && nOffset > 0 && getDocument() != NULL)
+ {
+ WW8StructBase aStructBase(*getDocument()->getDocStream(),
+ nOffset, 0x8);
+
+ DffRecord * pRecord =
+ createDffRecord(*getDocument()->getDocStream(),
+ aFBSE.get_foDelay());
+
+ pResult = writerfilter::Reference<Properties>::Pointer_t(pRecord);
+ }
+ }
+
+ return pResult;
+}
+
+#if 0
+WW8BinaryObjReference::Pointer_t DffBSE::get_binary()
+{
+ WW8BinaryObjReference::Pointer_t pResult;
+
+ if (getCount() > 0x45)
+ pResult = WW8BinaryObjReference::Pointer_t
+ (new WW8BinaryObjReference(this, 0x45,
+ getCount() - 0x45));
+ else
+ {
+ WW8FBSE aFBSE(this, 0x8);
+
+ sal_Int32 nOffset = sal::static_int_cast<sal_Int32>(aFBSE.get_foDelay());
+ if (nOffset > 0 && getDocument() != NULL)
+ {
+ WW8StructBase aStructBase(*getDocument()->getDocStream(),
+ nOffset, 0x8);
+
+ sal_uInt32 nCount = aStructBase.getU32(0x4) - 0x11;
+
+ pResult = WW8BinaryObjReference::Pointer_t
+ (new WW8BinaryObjReference(*getDocument()->getDocStream(),
+ aFBSE.get_foDelay() + 0x19, nCount));
+ }
+ }
+
+ return pResult;
+}
+#endif
+
+// WW8FOPTE
+void WW8FOPTE::resolveNoAuto(Properties & rHandler)
+{
+ sal_uInt16 nId = get_pid() + 1;
+ sal_uInt32 nOp = get_op();
+ sal_uInt32 nMask = 2;
+
+ while (isBooleanDffOpt(nId))
+ {
+ WW8Value::Pointer_t pVal = createValue(getDffOptName(nId));
+ rHandler.attribute(NS_rtf::LN_shpname, *pVal);
+
+ pVal = createValue((nOp & nMask) != 0);
+ rHandler.attribute(NS_rtf::LN_shpvalue, *pVal);
+
+ --nId;
+ nMask = nMask << 1;
+ }
+}
+
+// DffFSP
+
+rtl::OUString DffFSP::get_shptypename()
+{
+ string aName = (*ShapeTypeToString::Instance())(get_shptype());
+
+ return rtl::OUString::createFromAscii(aName.c_str());
+}
+
+// DffSpContainer
+
+writerfilter::Reference<Properties>::Pointer_t
+DffSpContainer::get_blip()
+{
+ writerfilter::Reference<Properties>::Pointer_t pResult;
+
+ if (getShapeType() == 75)
+ {
+ sal_uInt32 nBid = getShapeBid();
+
+ if (getDocument() != NULL && nBid > 0)
+ pResult = getDocument()->getBlip(nBid);
+ }
+
+ return pResult;
+}
+
+writerfilter::Reference<Stream>::Pointer_t
+DffSpContainer::get_shptxt()
+{
+ writerfilter::Reference<Stream>::Pointer_t pResult;
+
+ if (getShapeType() == 202)
+ {
+ sal_uInt32 nShpId = getShapeId();
+
+ if (getDocument() != NULL)
+ pResult = getDocument()->getTextboxText(nShpId);
+ }
+
+ return pResult;
+}
+
+// DffUDefProp
+
+void DffUDefProp::resolveNoAuto(Properties & rHandler)
+{
+ sal_uInt32 nOffset = 0x8;
+ sal_uInt32 nCount = getCount();
+
+ while (nOffset + 6 <= nCount)
+ {
+ sal_uInt16 nPid = getU16(nOffset);
+ sal_uInt32 nValue = getU32(nOffset + 2);
+
+ sal_uInt32 nAttrid = 0;
+ switch (nPid)
+ {
+ case 0x38f: nAttrid = NS_rtf::LN_XAlign; break;
+ case 0x390: nAttrid = NS_rtf::LN_XRelTo; break;
+ case 0x391: nAttrid = NS_rtf::LN_YAlign; break;
+ case 0x392: nAttrid = NS_rtf::LN_YRelTo; break;
+ case 0x3bf: nAttrid = NS_rtf::LN_LayoutInTableCell; break;
+ case 0x53f: nAttrid = NS_rtf::LN_Inline; break;
+ default:
+ break;
+ }
+
+ if (nAttrid != 0)
+ {
+ WW8Value::Pointer_t pVal = createValue(nValue);
+ rHandler.attribute(nAttrid, *pVal);
+ }
+
+ nOffset += 6;
+ }
+}
+
+}}