/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace writerfilter { using namespace com::sun::star; using namespace std; using text::TextContentAnchorType; static string & logger_file() { static string _logger_file = string(getenv("TEMP")?getenv("TEMP"):"/tmp") + "/writerfilter.ooxml.tmp"; return _logger_file; } static ofstream & logger_stream() { static ofstream _logger_stream(logger_file().c_str()); return _logger_stream; } void logger(string prefix, string message) { logger_stream() << prefix << ":" << message << endl; logger_stream().flush(); } string xmlify(const string & str) { string result = ""; char sBuffer[16]; for (string::const_iterator aIt = str.begin(); aIt != str.end(); ++aIt) { char c = *aIt; if (isprint(c) && c != '\"') { if (c == '<') result += "<"; else if (c == '>') result += ">"; else if (c == '&') result += "&"; else result += c; } else { snprintf(sBuffer, sizeof(sBuffer), "\\%03d", c); result += sBuffer; } } return result; } #ifdef DEBUG string propertysetToString(uno::Reference const & xPropSet) { string sResult; static int nAttribNames = 9; static string sPropertyAttribNames[9] = { "MAYBEVOID", "BOUND", "CONSTRAINED", "TRANSIENT", "READONLY", "MAYBEAMBIGUOUS", "MAYBEDEFAULT", "REMOVEABLE", "OPTIONAL" }; static const ::rtl::OUString sMetaFile(RTL_CONSTASCII_USTRINGPARAM("MetaFile")); uno::Reference xPropSetInfo (xPropSet->getPropertySetInfo()); if (xPropSetInfo.is()) { uno::Sequence aProps(xPropSetInfo->getProperties()); sResult +=""; for (sal_Int32 n = 0; n < aProps.getLength(); n++) { ::rtl::OUString sPropName(aProps[n].Name); if (xPropSetInfo->hasPropertyByName(sPropName)) { bool bPropertyFound = true; uno::Any aAny; try { if (sPropName == sMetaFile) bPropertyFound = false; else xPropSet->getPropertyValue(sPropName) >>= aAny; } catch (beans::UnknownPropertyException) { bPropertyFound = false; } if (bPropertyFound) { sResult += ""; char buffer[256]; if (sPropType == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("byte"))) { sal_Int8 nValue = 0; aAny >>= nValue; snprintf(buffer, sizeof(buffer), "%d", nValue); sResult += buffer; } if (sPropType == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("short"))) { sal_Int16 nValue = 0; aAny >>= nValue; snprintf(buffer, sizeof(buffer), "%d", nValue); sResult += buffer; } else if (sPropType == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("long"))) { sal_Int32 nValue = 0; aAny >>= nValue; snprintf(buffer, sizeof(buffer), "%" SAL_PRIdINT32, nValue); sResult += buffer; } else if (sPropType == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("float"))) { float nValue = 0.0; aAny >>= nValue; snprintf(buffer, sizeof(buffer), "%f", nValue); sResult += buffer; } else if (sPropType == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("double"))) { double nValue = 0.0; aAny >>= nValue; snprintf(buffer, sizeof(buffer), "%lf", nValue); sResult += buffer; } else if (sPropType == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("boolean"))) { sal_Bool nValue = sal_False; aAny >>= nValue; if (nValue) sResult += "true"; else sResult += "false"; } else if (sPropType == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM ("string"))) { ::rtl::OUString sValue; aAny >>= sValue; sResult += OUStringToOString (sValue, RTL_TEXTENCODING_ASCII_US).getStr(); } else if (sPropType == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.text.TextContentAnchorType"))) { text::TextContentAnchorType nValue; aAny >>= nValue; switch (nValue) { case text::TextContentAnchorType_AT_PARAGRAPH: sResult += "AT_PARAGRAPH"; break; case text::TextContentAnchorType_AS_CHARACTER: sResult += "AS_CHARACTER"; break; case text::TextContentAnchorType_AT_PAGE: sResult += "AT_PAGE"; break; case text::TextContentAnchorType_AT_FRAME: sResult += "AT_FRAME"; break; case text::TextContentAnchorType_AT_CHARACTER: sResult += "AT_CHARACTER"; break; case text::TextContentAnchorType_MAKE_FIXED_SIZE: sResult += "MAKE_FIXED_SIZE"; break; default: break; } } else if (sPropType == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.awt.Point"))) { awt::Point aPoint; aAny >>= aPoint; snprintf(buffer, sizeof(buffer), "(%" SAL_PRIdINT32 ", %" SAL_PRIdINT32 ")", aPoint.X, aPoint.Y); sResult += buffer; } else if (sPropType == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.awt.Rectangle"))) { awt::Rectangle aRect; aAny >>= aRect; snprintf(buffer, sizeof(buffer), "(%" SAL_PRIdINT32 ", %" SAL_PRIdINT32 ", %" SAL_PRIdINT32 ", %" SAL_PRIdINT32 ")", aRect.X, aRect.Y, aRect.Width, aRect.Height); sResult += buffer; } else if (sPropType == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.drawing.FillStyle"))) { drawing::FillStyle nValue; aAny >>= nValue; switch (nValue) { case drawing::FillStyle_NONE: sResult += "NONE"; break; case drawing::FillStyle_SOLID: sResult += "SOLID"; break; case drawing::FillStyle_GRADIENT: sResult += "GRADIENT"; break; case drawing::FillStyle_HATCH: sResult += "HATCH"; break; case drawing::FillStyle_BITMAP: sResult += "BITMAP"; break; case drawing::FillStyle_MAKE_FIXED_SIZE: sResult += "MAKE_FIXED_SIZE"; break; } } else if (sPropType == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.drawing.BitmapMode"))) { drawing::BitmapMode nValue; aAny >>= nValue; switch (nValue) { case drawing::BitmapMode_REPEAT: sResult += "REPEAT"; break; case drawing::BitmapMode_STRETCH: sResult += "STRETCH"; break; case drawing::BitmapMode_NO_REPEAT: sResult += "NO_REPEAT"; break; case drawing::BitmapMode_MAKE_FIXED_SIZE: sResult += "MAKE_FIXED_SIZE"; break; } } else if (sPropType == ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.drawing.HomogenMatrix3"))) { drawing::HomogenMatrix3 aMatrix; aAny >>= aMatrix; snprintf(buffer, sizeof(buffer), "((%f %f %f)(%f %f %f)(%f %f %f))", aMatrix.Line1.Column1, aMatrix.Line1.Column2, aMatrix.Line1.Column3, aMatrix.Line2.Column1, aMatrix.Line2.Column2, aMatrix.Line2.Column3, aMatrix.Line3.Column1, aMatrix.Line3.Column2, aMatrix.Line3.Column3); sResult += buffer; } sResult += ""; } } else { sResult += ""; sResult += OUStringToOString (sPropName, RTL_TEXTENCODING_ASCII_US).getStr(); sResult += ""; } } sResult += ""; } return sResult; } string toString(uno::Reference< text::XTextRange > textRange) { string result; if (textRange.get()) { rtl::OUString aOUStr = textRange->getString(); rtl::OString aOStr(aOUStr.getStr(), aOUStr.getLength(), RTL_TEXTENCODING_ASCII_US ); result = aOStr.getStr(); } else { result="(nil)"; } return result; } string toString(const string & rString) { return rString; } #endif }