diff options
Diffstat (limited to 'forms/source/xforms/xpathlib/xpathlib.cxx')
-rw-r--r-- | forms/source/xforms/xpathlib/xpathlib.cxx | 570 |
1 files changed, 0 insertions, 570 deletions
diff --git a/forms/source/xforms/xpathlib/xpathlib.cxx b/forms/source/xforms/xpathlib/xpathlib.cxx deleted file mode 100644 index 8990f7bb3..000000000 --- a/forms/source/xforms/xpathlib/xpathlib.cxx +++ /dev/null @@ -1,570 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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. - * - ************************************************************************/ - - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_forms.hxx" -#include <string.h> -#include <sal/types.h> -#include <rtl/alloc.h> -#include <rtl/ustring.hxx> -#include <rtl/string.hxx> -#include <rtl/ustrbuf.hxx> -#include <rtl/strbuf.hxx> -#include <tools/date.hxx> -#include <tools/time.hxx> -#include <tools/datetime.hxx> - -#include <com/sun/star/uno/Reference.hxx> -#include <com/sun/star/uno/Sequence.hxx> -#include <com/sun/star/uno/Any.hxx> -#include <com/sun/star/xforms/XModel.hpp> -#include <com/sun/star/xml/dom/XNode.hpp> -#include <com/sun/star/xml/dom/XDocument.hpp> -#include <com/sun/star/lang/XUnoTunnel.hpp> - -#include "xpathlib.hxx" - -#include "extension.hxx" - -// C interface - -using namespace com::sun::star::uno; -using namespace com::sun::star::xml::dom; -using namespace com::sun::star::xforms; -using namespace com::sun::star::lang; - -xmlXPathFunction xforms_lookupFunc(void *, const xmlChar *xname, const xmlChar *) -{ - - const char *name = (char *)xname; - if (strcmp("boolean-from-string", name)==0) - return xforms_booleanFromStringFunction; - else if ((strcmp("if", name))==0) - return xforms_ifFunction; - else if ((strcmp("avg", name))==0) - return xforms_avgFunction; - else if ((strcmp("min", name))==0) - return xforms_minFunction; - else if ((strcmp("max", name))==0) - return xforms_maxFunction; - else if ((strcmp("count-non-empty", name))==0) - return xforms_countNonEmptyFunction; - else if ((strcmp("index", name))==0) - return xforms_indexFunction; - else if ((strcmp("property", name))==0) - return xforms_propertyFunction; - else if ((strcmp("now", name))==0) - return xforms_nowFunction; - else if ((strcmp("days-from-date", name))==0) - return xforms_daysFromDateFunction; - else if ((strcmp("seconds-from-dateTime", name))==0) - return xforms_secondsFromDateTimeFunction; - else if ((strcmp("seconds", name))==0) - return xforms_secondsFuction; - else if ((strcmp("months", name))==0) - return xforms_monthsFuction; - else if ((strcmp("instance", name))==0) - return xforms_instanceFuction; - else if ((strcmp("current", name))==0) - return xforms_currentFunction; - else - return NULL; -} - -// boolean functions -void xforms_booleanFromStringFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlChar *pString = xmlXPathPopString(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - ::rtl::OUString aString((char*)pString, strlen((char*)pString), RTL_TEXTENCODING_UTF8); - if (aString.equalsIgnoreAsciiCaseAscii("true") || aString.equalsIgnoreAsciiCaseAscii("1")) - xmlXPathReturnTrue(ctxt); - else if (aString.equalsIgnoreAsciiCaseAscii("false") || aString.equalsIgnoreAsciiCaseAscii("0")) - xmlXPathReturnFalse(ctxt); - else - XP_ERROR(XPATH_NUMBER_ERROR); -} - -void xforms_ifFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - if (nargs != 3) XP_ERROR(XPATH_INVALID_ARITY); - xmlChar *s2 = xmlXPathPopString(ctxt); - - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - xmlChar *s1 = xmlXPathPopString(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - bool aBool = xmlXPathPopBoolean(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - - if (aBool) - xmlXPathReturnString(ctxt, s1); - else - xmlXPathReturnString(ctxt, s2); - -} - -// Number Functions -void xforms_avgFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - // use sum(), div() and count() - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - - // save nodeset - xmlXPathObjectPtr pObject = valuePop(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - //push back a copy - valuePush(ctxt, xmlXPathObjectCopy(pObject)); - // get the Sum - xmlXPathSumFunction(ctxt, 1); - double nSum = xmlXPathPopNumber(ctxt); - // push a copy once more - valuePush(ctxt, xmlXPathObjectCopy(pObject)); - xmlXPathCountFunction(ctxt, 1); - double nCount = xmlXPathPopNumber(ctxt); - // push args for div() - xmlXPathReturnNumber(ctxt, nSum); - xmlXPathReturnNumber(ctxt, nCount); - xmlXPathDivValues(ctxt); - // the result is now on the ctxt stack - xmlXPathFreeObject(pObject); -} - -void xforms_minFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlNodeSetPtr pNodeSet = xmlXPathPopNodeSet(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - double nMinimum = 0; - double nNumber = 0; - for (int i = 0; i < xmlXPathNodeSetGetLength(pNodeSet); i++) - { - nNumber = xmlXPathCastNodeToNumber(xmlXPathNodeSetItem(pNodeSet, i)); - if (xmlXPathIsNaN(nNumber)) - { - xmlXPathReturnNumber(ctxt, xmlXPathNAN); - return; - } - if (i == 0) - nMinimum = nNumber; - else if (nNumber < nMinimum) - nMinimum = nNumber; - } - xmlXPathReturnNumber(ctxt, nMinimum); -} - -void xforms_maxFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlNodeSetPtr pNodeSet = xmlXPathPopNodeSet(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - double nMaximum = 0; - double nNumber = 0; - for (int i = 0; i < xmlXPathNodeSetGetLength(pNodeSet); i++) - { - nNumber = xmlXPathCastNodeToNumber(xmlXPathNodeSetItem(pNodeSet, i)); - if (xmlXPathIsNaN(nNumber)) - { - xmlXPathReturnNumber(ctxt, xmlXPathNAN); - return; - } - if (i == 0) - nMaximum = nNumber; - else if (nNumber > nMaximum) - nMaximum = nNumber; - } - xmlXPathReturnNumber(ctxt, nMaximum); -} -void xforms_countNonEmptyFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlNodeSetPtr pNodeSet = xmlXPathPopNodeSet(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - xmlChar *aString; - sal_Int32 nNotEmpty = 0; - for (int i = 0; i < xmlXPathNodeSetGetLength(pNodeSet); i++) - { - aString = xmlXPathCastNodeToString(xmlXPathNodeSetItem(pNodeSet, i)); - if (*aString != 0) nNotEmpty++; - } - xmlXPathReturnNumber(ctxt, nNotEmpty); -} -void xforms_indexFunction(xmlXPathParserContextPtr /*ctxt*/, int /*nargs*/) -{ - // function index takes a string argument that is the IDREF of a - // 'repeat' and returns the current 1-based position of the repeat - // index of the identified repeat -- see xforms/9.3.1 - - // doc.getElementByID - // (...) -} - -// String Functions -static const char* _version = "1.0"; -static const char* _conformance = "conformance"; -void xforms_propertyFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlChar* pString = xmlXPathPopString(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - ::rtl::OUString aString((char*)pString, strlen((char*)pString), RTL_TEXTENCODING_UTF8); - if (aString.equalsIgnoreAsciiCaseAscii("version")) - xmlXPathReturnString(ctxt, (xmlChar*)_version); - else if (aString.equalsIgnoreAsciiCaseAscii("conformance-level")) - xmlXPathReturnString(ctxt, (xmlChar*)_conformance); - else - xmlXPathReturnEmptyString(ctxt); -} - -// Date and Time Functions - -static ::rtl::OString makeDateTimeString (const DateTime& aDateTime, sal_Bool bUTC = sal_True) -{ - ::rtl::OStringBuffer aDateTimeString; - aDateTimeString.append((sal_Int32)aDateTime.GetYear()); - aDateTimeString.append("-"); - if (aDateTime.GetMonth()<10) aDateTimeString.append("0"); - aDateTimeString.append((sal_Int32)aDateTime.GetMonth()); - aDateTimeString.append("-"); - if (aDateTime.GetDay()<10) aDateTimeString.append("0"); - aDateTimeString.append((sal_Int32)aDateTime.GetDay()); - aDateTimeString.append("T"); - if (aDateTime.GetHour()<10) aDateTimeString.append("0"); - aDateTimeString.append((sal_Int32)aDateTime.GetHour()); - aDateTimeString.append(":"); - if (aDateTime.GetMin()<10) aDateTimeString.append("0"); - aDateTimeString.append((sal_Int32)aDateTime.GetMin()); - aDateTimeString.append(":"); - if (aDateTime.GetSec()<10) aDateTimeString.append("0"); - aDateTimeString.append((sal_Int32)aDateTime.GetSec()); - if (bUTC) aDateTimeString.append("Z"); - - return aDateTimeString.makeStringAndClear(); -} - -// returns current system date and time in canonical xsd:dateTime -// format -void xforms_nowFunction(xmlXPathParserContextPtr ctxt, int /*nargs*/) -{ - /* - A single lexical representation, which is a subset of the lexical representations - allowed by [ISO 8601], is allowed for dateTime. This lexical representation is the - [ISO 8601] extended format CCYY-MM-DDThh:mm:ss where "CC" represents the century, - "YY" the year, "MM" the month and "DD" the day, preceded by an optional leading "-" - sign to indicate a negative number. If the sign is omitted, "+" is assumed. The letter - "T" is the date/time separator and "hh", "mm", "ss" represent hour, minute and second - respectively. - */ - - /* - 3.2.7.2 Canonical representation - The canonical representation for dateTime is defined by prohibiting certain options - from the Lexical representation (par.3.2.7.1). Specifically, either the time zone must - be omitted or, if present, the time zone must be Coordinated Universal Time (UTC) - indicated by a "Z". - */ - DateTime aDateTime; - ::rtl::OString aDateTimeString = makeDateTimeString(aDateTime); - xmlChar *pString = static_cast<xmlChar*>(xmlMalloc(aDateTimeString.getLength()+1)); - strncpy((char*)pString, (char*)aDateTimeString.getStr(), aDateTimeString.getLength()); - pString[aDateTimeString.getLength()] = 0; - xmlXPathReturnString(ctxt, pString); -} - -static sal_Bool parseDateTime(const ::rtl::OUString& aString, DateTime& aDateTime) -{ - // take apart a canonical literal xsd:dateTime string - //CCYY-MM-DDThh:mm:ss(Z) - - ::rtl::OUString aDateTimeString = aString.trim(); - - // check length - if (aDateTimeString.getLength() < 19 || aDateTimeString.getLength() > 20) - return sal_False; - - sal_Int32 nDateLength = 10; - sal_Int32 nTimeLength = 8; - - ::rtl::OUString aDateTimeSep(RTL_CONSTASCII_USTRINGPARAM("T")); - ::rtl::OUString aDateSep(RTL_CONSTASCII_USTRINGPARAM("-")); - ::rtl::OUString aTimeSep(RTL_CONSTASCII_USTRINGPARAM(":")); - ::rtl::OUString aUTCString(RTL_CONSTASCII_USTRINGPARAM("Z")); - - ::rtl::OUString aDateString = aDateTimeString.copy(0, nDateLength); - ::rtl::OUString aTimeString = aDateTimeString.copy(nDateLength+1, nTimeLength); - - sal_Int32 nIndex = 0; - sal_Int32 nYear = aDateString.getToken(0, '-', nIndex).toInt32(); - sal_Int32 nMonth = aDateString.getToken(0, '-', nIndex).toInt32(); - sal_Int32 nDay = aDateString.getToken(0, '-', nIndex).toInt32(); - nIndex = 0; - sal_Int32 nHour = aTimeString.getToken(0, ':', nIndex).toInt32(); - sal_Int32 nMinute = aTimeString.getToken(0, ':', nIndex).toInt32(); - sal_Int32 nSecond = aTimeString.getToken(0, ':', nIndex).toInt32(); - - Date tmpDate((sal_uInt16)nDay, (sal_uInt16)nMonth, (sal_uInt16)nYear); - Time tmpTime(nHour, nMinute, nSecond); - DateTime tmpDateTime(tmpDate, tmpTime); - if (aString.indexOf(aUTCString) < 0) - tmpDateTime.ConvertToUTC(); - - aDateTime = tmpDateTime; - - return sal_True; -} - - -void xforms_daysFromDateFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - // number of days from 1970-01-01 to supplied xsd:date(Time) - - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlChar* pString = xmlXPathPopString(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - ::rtl::OUString aString((char*)pString, strlen((char*)pString), RTL_TEXTENCODING_UTF8); - - DateTime aDateTime; - if (parseDateTime(aString, aDateTime)) - { - Date aReferenceDate(1, 1, 1970); - sal_Int32 nDays = aDateTime - aReferenceDate; - xmlXPathReturnNumber(ctxt, nDays); - } - else - xmlXPathReturnNumber(ctxt, xmlXPathNAN); - - -} - - -void xforms_secondsFromDateTimeFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - // number of seconds from 1970-01-01T00:00:00Z to supplied xsd:date(Time) - - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlChar* pString = xmlXPathPopString(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - ::rtl::OUString aString((char*)pString, strlen((char*)pString), RTL_TEXTENCODING_UTF8); - - DateTime aDateTime; - - if (parseDateTime(aString, aDateTime)) - { - Date aReferenceDate(1, 1, 1970); - Time aReferenceTime(0, 0, 0); - sal_Int32 nDays = aDateTime - aReferenceDate; - sal_Int32 nSeconds = nDays * 24 * 60 * 60; - nSeconds += aDateTime.GetHour() * 60 * 60; - nSeconds += aDateTime.GetMin() * 60; - nSeconds += aDateTime.GetSec(); - xmlXPathReturnNumber(ctxt, nSeconds); - } - else - xmlXPathReturnNumber(ctxt, xmlXPathNAN); - -} - -static sal_Bool parseDuration(const xmlChar* aString, sal_Bool& bNegative, sal_Int32& nYears, sal_Int32& nMonth, sal_Int32& nDays, - sal_Int32& nHours, sal_Int32& nMinutes, sal_Int32& nSeconds) -{ - sal_Bool bTime = sal_False; // in part after T - sal_Int32 nLength = strlen((char*)aString)+1; - char *pString = (char*)rtl_allocateMemory(nLength); - char *pString0 = pString; - strncpy(pString, (char*)aString, nLength); - - if (pString[0] == '-') { - bNegative = sal_True; - pString++; - } - - if (pString[0] != 'P') - return sal_False; - pString++; - char* pToken = pString; - while(pToken[0] != 0) - { - switch(pToken[0]) { - case 'Y': - pToken[0] = 0; - nYears = atoi(pString); - pString = ++pToken; - break; - case 'M': - pToken[0] = 0; - if (!bTime) - nMonth = atoi(pString); - else - nMinutes = atoi(pString); - pString = ++pToken; - break; - case 'D': - pToken[0] = 0; - nDays = atoi(pString); - pString = ++pToken; - break; - case 'H': - pToken[0] = 0; - nHours = atoi(pString); - pString = ++pToken; - break; - case 'S': - pToken[0] = 0; - nSeconds = atoi(pString); - pString = ++pToken; - break; - case 'T': - bTime = sal_True; - pString = ++pToken; - break; - default: - pToken++; - } - } - rtl_freeMemory(pString0); - return sal_True; -} - -void xforms_secondsFuction(xmlXPathParserContextPtr ctxt, int nargs) -{ - // convert a xsd:duration to seconds - // (-)PnYnMnDTnHnMnS - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlChar* pString = xmlXPathPopString(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - - sal_Bool bNegative = sal_False; - sal_Int32 nYears = 0; - sal_Int32 nMonths = 0; - sal_Int32 nDays = 0; - sal_Int32 nHours = 0; - sal_Int32 nMinutes = 0; - sal_Int32 nSeconds = 0; - - if (parseDuration(pString, bNegative, nYears, nMonths, nDays, nHours, nMinutes, nSeconds)) - { - nSeconds += nMinutes*60; - nSeconds += nHours*60*60; - nSeconds += nDays*24*60*60; - // year and month are ignored according to spec - if (bNegative) - nSeconds = 0 - nSeconds; - xmlXPathReturnNumber(ctxt, nSeconds); - } - else - xmlXPathReturnNumber(ctxt, xmlXPathNAN); -} - -void xforms_monthsFuction(xmlXPathParserContextPtr ctxt, int nargs) -{ - // convert a xsd:duration to seconds - // (-)PnYnMnDTnHnMnS - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlChar* pString = xmlXPathPopString(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - - sal_Bool bNegative = sal_False; - sal_Int32 nYears = 0; - sal_Int32 nMonths = 0; - sal_Int32 nDays = 0; - sal_Int32 nHours = 0; - sal_Int32 nMinutes = 0; - sal_Int32 nSeconds = 0; - - if (parseDuration(pString, bNegative, nYears, nMonths, nDays, nHours, nMinutes, nSeconds)) - { - nMonths += nYears*12; - // Days, Houres, Minutes and seconds are ignored, see spec - if (bNegative) - nMonths = 0 - nMonths; - xmlXPathReturnNumber(ctxt, nMonths); - } - else - xmlXPathReturnNumber(ctxt, xmlXPathNAN); - -} - -// Node-set Functions -void xforms_instanceFuction(xmlXPathParserContextPtr ctxt, int nargs) -{ - if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY); - xmlChar *pString = xmlXPathPopString(ctxt); - if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); - ::rtl::OUString aString((char*)pString, strlen((char*)pString), RTL_TEXTENCODING_UTF8); - - Reference< XModel > aModel = ((CLibxml2XFormsExtension*)ctxt->context->funcLookupData)->getModel(); - if (aModel.is()) - { - Reference< XDocument > aInstance = aModel->getInstanceDocument(aString); - if (aInstance.is()) - { - try { - // xmlXPathObjectPtr xmlXPathNewNodeSet (xmlNodePtr val); - Reference< XUnoTunnel > aTunnel(aInstance, UNO_QUERY_THROW); - xmlNodePtr pNode = reinterpret_cast< xmlNodePtr >( aTunnel->getSomething(Sequence< sal_Int8 >()) ); - xmlXPathObjectPtr pObject = xmlXPathNewNodeSet(pNode); - xmlXPathReturnNodeSet(ctxt, pObject->nodesetval); - } catch (RuntimeException&) - { - xmlXPathReturnEmptyNodeSet(ctxt); - } - } - else - xmlXPathReturnEmptyNodeSet(ctxt); - } - else - xmlXPathReturnEmptyNodeSet(ctxt); - -} - -// Node-set Functions, XForms 1.1 -void xforms_currentFunction(xmlXPathParserContextPtr ctxt, int nargs) -{ - if (nargs != 0) XP_ERROR(XPATH_INVALID_ARITY); - - Reference< XNode > aNode = ((CLibxml2XFormsExtension*)ctxt->context->funcLookupData)->getContextNode(); - - if (aNode.is()) - { - try { - Reference< XUnoTunnel > aTunnel(aNode, UNO_QUERY_THROW); - xmlNodePtr pNode = reinterpret_cast< xmlNodePtr >( aTunnel->getSomething(Sequence< sal_Int8 >()) ); - xmlXPathObjectPtr pObject = xmlXPathNewNodeSet(pNode); - xmlXPathReturnNodeSet(ctxt, pObject->nodesetval); - } - catch (RuntimeException&) - { - xmlXPathReturnEmptyNodeSet(ctxt); - } - } - else - xmlXPathReturnEmptyNodeSet(ctxt); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |