summaryrefslogtreecommitdiff
path: root/i18npool/source/calendar/calendarImpl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'i18npool/source/calendar/calendarImpl.cxx')
-rw-r--r--i18npool/source/calendar/calendarImpl.cxx324
1 files changed, 324 insertions, 0 deletions
diff --git a/i18npool/source/calendar/calendarImpl.cxx b/i18npool/source/calendar/calendarImpl.cxx
new file mode 100644
index 000000000000..2d09d047c7cb
--- /dev/null
+++ b/i18npool/source/calendar/calendarImpl.cxx
@@ -0,0 +1,324 @@
+/*************************************************************************
+ *
+ * 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_i18npool.hxx"
+
+#include "calendarImpl.hxx"
+#include "localedata.hxx"
+#include <comphelper/processfactory.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::i18n;
+using namespace ::rtl;
+
+#define ERROR RuntimeException()
+
+CalendarImpl::CalendarImpl(const Reference< XMultiServiceFactory > &rxMSF) : xMSF(rxMSF)
+{
+}
+
+CalendarImpl::~CalendarImpl()
+{
+ // Clear lookuptable
+ for (size_t l = 0; l < lookupTable.size(); l++)
+ delete lookupTable[l];
+ lookupTable.clear();
+}
+
+
+void SAL_CALL
+CalendarImpl::loadDefaultCalendar( const Locale& rLocale ) throw(RuntimeException)
+{
+ Sequence< Calendar> xC = LocaleData().getAllCalendars(rLocale);
+ for (sal_Int32 i = 0; i < xC.getLength(); i++) {
+ if (xC[i].Default) {
+ loadCalendar(xC[i].Name, rLocale);
+ return;
+ }
+ }
+ throw ERROR;
+}
+
+void SAL_CALL
+CalendarImpl::loadCalendar(const OUString& uniqueID, const Locale& rLocale ) throw (RuntimeException)
+{
+ Reference < XExtendedCalendar > xOldCalendar( xCalendar ); // backup
+ sal_Int32 i;
+
+ for (i = 0; i < sal::static_int_cast<sal_Int32>(lookupTable.size()); i++) {
+ lookupTableItem *listItem = lookupTable[i];
+ if (uniqueID == listItem->uniqueID) {
+ xCalendar = listItem->xCalendar;
+ break;
+ }
+ }
+
+ if (i >= sal::static_int_cast<sal_Int32>(lookupTable.size())) {
+ Reference < XInterface > xI = xMSF->createInstance(
+ OUString::createFromAscii("com.sun.star.i18n.Calendar_") + uniqueID);
+
+ if ( ! xI.is() ) {
+ // check if the calendar is defined in localedata, load gregorian calendar service.
+ Sequence< Calendar> xC = LocaleData().getAllCalendars(rLocale);
+ for (i = 0; i < xC.getLength(); i++) {
+ if (uniqueID == xC[i].Name) {
+ xI = xMSF->createInstance(
+ OUString::createFromAscii("com.sun.star.i18n.Calendar_gregorian"));
+ break;
+ }
+ }
+ }
+
+ if ( xI.is() )
+ xI->queryInterface(::getCppuType((const Reference< XExtendedCalendar>*)0)) >>= xCalendar;
+ else
+ throw ERROR;
+
+ lookupTable.push_back( new lookupTableItem(uniqueID, xCalendar) );
+ }
+
+ if ( !xCalendar.is() )
+ {
+ xCalendar = xOldCalendar;
+ throw ERROR;
+ }
+
+ try
+ {
+ xCalendar->loadCalendar(uniqueID, rLocale);
+ }
+ catch ( Exception& )
+ { // restore previous calendar and re-throw
+ xCalendar = xOldCalendar;
+ throw;
+ }
+}
+
+Calendar SAL_CALL
+CalendarImpl::getLoadedCalendar() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getLoadedCalendar();
+ else
+ throw ERROR ;
+}
+
+Sequence< OUString > SAL_CALL
+CalendarImpl::getAllCalendars( const Locale& rLocale ) throw(RuntimeException)
+{
+ Sequence< Calendar> xC = LocaleData().getAllCalendars(rLocale);
+ sal_Int32 nLen = xC.getLength();
+ Sequence< OUString > xSeq( nLen );
+ for (sal_Int32 i = 0; i < nLen; i++)
+ xSeq[i] = xC[i].Name;
+ return xSeq;
+}
+
+void SAL_CALL
+CalendarImpl::setDateTime( double timeInDays ) throw(RuntimeException)
+{
+ if (xCalendar.is())
+ xCalendar->setDateTime( timeInDays );
+ else
+ throw ERROR ;
+}
+
+double SAL_CALL
+CalendarImpl::getDateTime() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getDateTime();
+ else
+ throw ERROR ;
+}
+
+OUString SAL_CALL
+CalendarImpl::getUniqueID() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getUniqueID();
+ else
+ throw ERROR ;
+}
+
+void SAL_CALL
+CalendarImpl::setValue( sal_Int16 fieldIndex, sal_Int16 value ) throw(RuntimeException)
+{
+ if (xCalendar.is())
+ xCalendar->setValue( fieldIndex, value );
+ else
+ throw ERROR ;
+}
+
+sal_Int16 SAL_CALL
+CalendarImpl::getValue( sal_Int16 fieldIndex ) throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getValue( fieldIndex );
+ else
+ throw ERROR ;
+}
+
+void SAL_CALL
+CalendarImpl::addValue( sal_Int16 fieldIndex, sal_Int32 amount ) throw(RuntimeException)
+{
+ if (xCalendar.is())
+ xCalendar->addValue( fieldIndex, amount);
+ else
+ throw ERROR ;
+}
+
+sal_Int16 SAL_CALL
+CalendarImpl::getFirstDayOfWeek() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getFirstDayOfWeek();
+ else
+ throw ERROR ;
+}
+
+void SAL_CALL
+CalendarImpl::setFirstDayOfWeek( sal_Int16 day )
+throw(RuntimeException)
+{
+ if (xCalendar.is())
+ xCalendar->setFirstDayOfWeek(day);
+ else
+ throw ERROR ;
+}
+
+void SAL_CALL
+CalendarImpl::setMinimumNumberOfDaysForFirstWeek( sal_Int16 days ) throw(RuntimeException)
+{
+ if (xCalendar.is())
+ xCalendar->setMinimumNumberOfDaysForFirstWeek(days);
+ else
+ throw ERROR ;
+}
+
+sal_Int16 SAL_CALL
+CalendarImpl::getMinimumNumberOfDaysForFirstWeek() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getMinimumNumberOfDaysForFirstWeek();
+ else
+ throw ERROR ;
+}
+
+
+OUString SAL_CALL
+CalendarImpl::getDisplayName( sal_Int16 displayIndex, sal_Int16 idx, sal_Int16 nameType ) throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getDisplayName( displayIndex, idx, nameType );
+ else
+ throw ERROR ;
+}
+
+sal_Int16 SAL_CALL
+CalendarImpl::getNumberOfMonthsInYear() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getNumberOfMonthsInYear();
+ else
+ throw ERROR ;
+}
+
+
+sal_Int16 SAL_CALL
+CalendarImpl::getNumberOfDaysInWeek() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getNumberOfDaysInWeek();
+ else
+ throw ERROR ;
+}
+
+
+Sequence< CalendarItem > SAL_CALL
+CalendarImpl::getMonths() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getMonths();
+ else
+ throw ERROR ;
+}
+
+
+Sequence< CalendarItem > SAL_CALL
+CalendarImpl::getDays() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getDays();
+ else
+ throw ERROR ;
+}
+
+
+sal_Bool SAL_CALL
+CalendarImpl::isValid() throw(RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->isValid();
+ else
+ throw ERROR ;
+}
+
+OUString SAL_CALL
+CalendarImpl::getDisplayString( sal_Int32 nCalendarDisplayCode, sal_Int16 nNativeNumberMode )
+ throw (RuntimeException)
+{
+ if (xCalendar.is())
+ return xCalendar->getDisplayString(nCalendarDisplayCode, nNativeNumberMode);
+ else
+ throw ERROR ;
+}
+
+OUString SAL_CALL
+CalendarImpl::getImplementationName(void) throw( RuntimeException )
+{
+ return OUString::createFromAscii("com.sun.star.i18n.CalendarImpl");
+}
+
+const sal_Char cCalendar[] = "com.sun.star.i18n.LocaleCalendar";
+
+sal_Bool SAL_CALL
+CalendarImpl::supportsService(const OUString& rServiceName) throw( RuntimeException )
+{
+ return !rServiceName.compareToAscii(cCalendar);
+}
+
+Sequence< OUString > SAL_CALL
+CalendarImpl::getSupportedServiceNames(void) throw( RuntimeException )
+{
+ Sequence< OUString > aRet(1);
+ aRet[0] = OUString::createFromAscii(cCalendar);
+ return aRet;
+}
+