diff -urN libreoffice-build/configure.in libreoffice-build/configure.in --- libreoffice-build/configure.in 2011-03-15 11:51:33.000000000 -0500 +++ libreoffice-build/configure.in 2011-08-17 15:49:14.302963959 -0500 @@ -81,6 +81,11 @@ --disable-kde4 Disables KDE4 native widgets.], ,) +AC_ARG_ENABLE(tde, +[ + --disable-tde Disables TDE native widgets.], +,) + AC_ARG_ENABLE(mono, [ --enable-mono Enables the compilation of the Mono bindings.], @@ -928,6 +933,16 @@ OOO_WIDGET_FLAGS="$OOO_WIDGET_FLAGS --disable-kde4" fi +OOO_WIDGET_FLAGS= +if test "$enable_tde" != "no"; then + if test "z$with_win32" = "z" -a "z`uname -s`" != "zDarwin" -a "z$with_distro" != "zCrossWin32"; then + OOO_WIDGET_FLAGS="--enable-tde" + widget_sets="tde" + fi +else + OOO_WIDGET_FLAGS="--disable-tde" +fi + if test "$enable_gtk" != "no"; then if test "z$with_win32" = "z" -a "z`uname -s`" != "zDarwin" -a "z$with_distro" != "zCrossWin32"; then OOO_WIDGET_FLAGS="--enable-gtk $OOO_WIDGET_FLAGS" diff -urN libreoffice-build/patches/dev300/apply libreoffice-build/patches/dev300/apply --- libreoffice-build/patches/dev300/apply 2011-08-19 15:12:59.000000000 -0500 +++ libreoffice-build/patches/dev300/apply 2011-08-18 22:23:26.037967292 -0500 @@ -22,7 +22,7 @@ LinuxCommon : Common, Defaults, FontConfigTemporaryHacks, \ FedoraLinuxOnlyFixes, LinuxOnly, msaccess, OpenGLTransitions, \ - CliMonoCommon, Mono, MonoComp, AddressBooks, QuickStarter, KDE4, Netbook, \ + CliMonoCommon, Mono, MonoComp, AddressBooks, QuickStarter, KDE4, TDE, Netbook, \ GlobalNSPluginSupport MacOSXCommon : Common, Defaults Win32Common : Common, Defaults, Win32Only, CliMonoCommon, CliComponent, NotDebian @@ -184,8 +184,6 @@ # pass $ORIGIN correctly to RPATH icu-4.2.1-rpath.diff. pmladek -[ TemporaryHacks ] - # add idl target to toplevel makefile makefile-idl-build.diff, noelpwer @@ -1493,6 +1491,10 @@ # we need a good plan before, though ;-) split-icons-search-usr-share.diff, n#296502, pmladek +[ TDE ] +# add trinity integration +trinity-modules.diff + [ ArkOnly ] SectionOwner => brosenk diff -urN libreoffice-build/patches/dev300/trinity-modules.diff libreoffice-build/patches/dev300/trinity-modules.diff --- libreoffice-build/patches/dev300/trinity-modules.diff 1969-12-31 18:00:00.000000000 -0600 +++ libreoffice-build/patches/dev300/trinity-modules.diff 2011-08-19 21:12:01.176913404 -0500 @@ -0,0 +1,15748 @@ +diff -urN configure.in configure.in +--- configure.in 2011-03-08 12:51:39.000000000 -0600 ++++ configure.in 2011-08-17 16:40:04.716144357 -0500 +@@ -233,6 +233,15 @@ + [ --disable-kdeab Disable the KDE3 address book support + ],,if test "$enable_kde" = "yes"; then enable_kdeab=yes; fi) + ++AC_ARG_ENABLE(tde, ++[ --enable-tde Determines whether to use TQt3/TDE vclplug on platforms ++ where TQt and TDE are available. ++],,) ++ ++AC_ARG_ENABLE(tdeab, ++[ --disable-tdeab Disable the TDE address book support ++],,if test "$enable_tde" = "yes"; then enable_tdeab=yes; fi) ++ + AC_ARG_ENABLE(kde4, + [ --enable-kde4 Determines whether to use Qt4/KDE4 vclplug on platforms + where Qt4 and KDE4 are available. May be used with --enable-kde +@@ -1350,6 +1359,7 @@ + test_cairo=yes + build_gstreamer=yes + test_kde=yes ++ test_tde=yes + test_cups=yes + test_randr=yes + test_freetype=yes +@@ -1385,6 +1395,7 @@ + build_gstreamer=yes + test_kde=yes + test_kde4=yes ++ test_tde=yes + test_cups=yes + test_randr=yes + test_freetype=yes +@@ -1428,6 +1439,7 @@ + build_gstreamer=yes + test_kde=yes + test_kde4=yes ++ test_tde=yes + test_cups=yes + test_randr=yes + test_freetype=yes +@@ -1463,6 +1475,7 @@ + build_gstreamer=yes + test_kde=yes + test_kde4=yes ++ test_tde=yes + test_cups=yes + test_randr=yes + test_freetype=yes +@@ -1482,6 +1495,7 @@ + test_gtk=yes + build_cairo=yes + test_kde=yes ++ test_tde=yes + test_cups=yes + test_freetype=yes + test_randr=yes +@@ -6141,6 +6155,13 @@ + fi + AC_SUBST(ENABLE_KDE4) + ++ENABLE_TDE="" ++if test "x$enable_tde" = "xyes"; then ++ ENABLE_TDE="TRUE" ++ R="$R tde" ++fi ++AC_SUBST(ENABLE_TDE) ++ + if test -z "$R"; then + AC_MSG_RESULT([none]) + else +@@ -7044,6 +7065,129 @@ + AC_SUBST(KDE_HAVE_GLIB) + + dnl =================================================================== ++dnl Check whether the Qt3 and TDE libraries are available. ++dnl =================================================================== ++ ++TDE_CFLAGS="" ++TDE_LIBS="" ++if test "$_os" != "OpenBSD"; then ++ MOC="moc" ++fi ++if test "$test_tde" = "yes" -a "$ENABLE_TDE" = "TRUE" ; then ++ dnl Search paths for Qt3 and TDE ++ if test "$build_cpu" != "x86_64" ; then ++ qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib/qt3/include /usr/lib/qt/include /usr/share/qt3/include /usr/local/include/X11/qt3 $x_includes" ++ qt_libdirs="$QTLIB /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries" ++ else ++ qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib64/qt3/include /usr/lib64/qt/include /usr/share/qt3/include /usr/lib/qt3/include /usr/lib/qt/include /usr/local/include/X11/qt3 $x_includes" ++ qt_libdirs="$QTLIB /usr/local/qt/lib64 /usr/lib64/qt /usr/lib64 /usr/X11R6/lib64/X11/qt /usr/X11R6/lib64/qt /usr/lib64/qt3/lib64 /usr/lib64/qt/lib64 /usr/share/qt3/lib64 /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries" ++ fi ++ if test -n "$QTDIR" ; then ++ qt_incdirs="$QTDIR/include $qt_incdirs" ++ if test "$build_cpu" != "x86_64" ; then ++ qt_libdirs="$QTDIR/lib $qt_libdirs" ++ else ++ qt_libdirs="$QTDIR/lib64 $QTDIR/lib $qt_libdirs" ++ fi ++ fi ++ if test "$build_cpu" != "x86_64" ; then ++ tde_incdirs="/opt/trinity/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes" ++ tde_libdirs="/opt/trinity/lib /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib/kde4/lib /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries" ++ else ++ tde_incdirs="/opt/trinity/include /usr/lib64/kde/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes" ++ tde_libdirs="/opt/trinity/lib /usr/lib64/kde/lib64 /usr/local/kde/lib64 /usr/kde/lib64 /usr/lib64/kde /usr/lib64/kde3 /usr/lib64 /usr/X11R6/lib64 /usr/local/lib64 /opt/trinity/lib64 /opt/kde/lib64 /usr/X11R6/kde/lib64 /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries" ++ fi ++ if test -n "$TDEDIR" ; then ++ tde_incdirs="$TDEDIR/include $tde_incdirs" ++ if test "$build_cpu" != "x86_64" ; then ++ tde_libdirs="$TDEDIR/lib $tde_libdirs" ++ else ++ tde_libdirs="$TDEDIR/lib64 $TDEDIR/lib $tde_libdirs" ++ fi ++ fi ++ ++ dnl What to test ++ qt_test_include="qstyle.h" ++ qt_test_library="libqt-mt.so*" ++ tde_test_include="kapp.h" ++ tde_test_library="libDCOP.so*" ++ ++ dnl Check for Qt3 headers ++ AC_MSG_CHECKING([for Qt3 headers]) ++ qt_incdir="no" ++ for tde_check in $qt_incdirs ; do ++ if test -r "$tde_check/$qt_test_include" ; then ++ qt_incdir="$tde_check" ++ break ++ fi ++ done ++ AC_MSG_RESULT([$qt_incdir]) ++ if test "x$qt_incdir" = "xno" ; then ++ AC_MSG_ERROR([Qt3 headers not found. Please specify the root of ++your Qt3 installation by exporting QTDIR before running "configure".]) ++ fi ++ ++ dnl Check for Qt3 libraries ++ AC_MSG_CHECKING([for Qt3 libraries]) ++ qt_libdir="no" ++ for qt_check in $qt_libdirs ; do ++ if test -r "`ls $qt_check/$qt_test_library 2>/dev/null | head -1`" ; then ++ qt_libdir="$qt_check" ++ break ++ fi ++ done ++ AC_MSG_RESULT([$qt_libdir]) ++ if test "x$qt_libdir" = "xno" ; then ++ AC_MSG_ERROR([Qt3 libraries not found. Please specify the root of ++your Qt3 installation by exporting QTDIR before running "configure".]) ++ fi ++ ++ dnl Check for Meta Object Compiler ++ AC_PATH_PROG( MOC, moc, no, [`dirname $qt_libdir`/bin:$QTDIR/bin:$PATH] ) ++ if test "$MOC" = "no" ; then ++ AC_MSG_ERROR([Qt3 Meta Object Compiler not found. Please specify ++the root of your Qt3 installation by exporting QTDIR before running "configure".]) ++ fi ++ ++ dnl Check for TDE headers ++ AC_MSG_CHECKING([for TDE headers]) ++ tde_incdir="no" ++ for tde_check in $tde_incdirs ; do ++ if test -r "$tde_check/$tde_test_include" ; then ++ tde_incdir="$tde_check" ++ break ++ fi ++ done ++ AC_MSG_RESULT([$tde_incdir]) ++ if test "x$tde_incdir" = "xno" ; then ++ AC_MSG_ERROR([TDE headers not found. Please specify the root of ++your TDE installation by exporting TDEDIR before running "configure".]) ++ fi ++ ++ dnl Check for TDE libraries ++ AC_MSG_CHECKING([for TDE libraries]) ++ tde_libdir="no" ++ for tde_check in $tde_libdirs ; do ++ if test -r "`ls $tde_check/$tde_test_library 2>/dev/null | head -1`" ; then ++ tde_libdir="$tde_check" ++ break ++ fi ++ done ++ AC_MSG_RESULT([$tde_libdir]) ++ if test "x$tde_libdir" = "xno" ; then ++ AC_MSG_ERROR([TDE libraries not found. Please specify the root of ++your TDE installation by exporting TDEDIR before running "configure".]) ++ fi ++ ++ dnl Set the variables ++ TDE_CFLAGS="-I$qt_incdir -I$tde_incdir -I/usr/include/tqt -DQT_CLEAN_NAMESPACE -DQT_THREAD_SUPPORT" ++ TDE_LIBS="-L$tde_libdir -L$qt_libdir -lkdeui -lkdecore -ltqt -lqt-mt" ++fi ++AC_SUBST(TDE_CFLAGS) ++AC_SUBST(TDE_LIBS) ++AC_SUBST(MOC) ++ ++dnl =================================================================== + dnl Test for the enabling the lockdown pieces + dnl =================================================================== + AC_MSG_CHECKING([whether to enable the lockdown pieces]) +@@ -7100,6 +7244,33 @@ + AC_SUBST(ENABLE_KAB) + + dnl =================================================================== ++dnl Test whether to include TDE AB support ++dnl =================================================================== ++AC_MSG_CHECKING([whether to enable TDE address book support]) ++if test "$enable_tdeab" = "yes" && test "$enable_tde" = "yes"; then ++ AC_MSG_RESULT([yes]) ++ AC_LANG_PUSH([C++]) ++ save_CXXFLAGS=$CXXFLAGS ++ CXXFLAGS="$CXXFLAGS $TDE_CFLAGS" ++ AC_MSG_CHECKING([whether TDE is between 3.2 and 3.6]) ++ AC_TRY_RUN([ ++#include ++ ++int main(int argc, char **argv) { ++ if (KDE_VERSION_MAJOR == 3 && 2 <= KDE_VERSION_MINOR && KDE_VERSION_MINOR <= 6) return 0; ++ else return 1; ++} ++ ], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([TDE version too old or too recent, please use another version of TDE or disable TDE address book support])]) ++ CXXFLAGS=$save_CXXFLAGS ++ AC_LANG_POP([C++]) ++ ENABLE_TDEAB=TRUE ++else ++ AC_MSG_RESULT([no]) ++ ENABLE_TDEAB= ++fi ++AC_SUBST(ENABLE_TDEAB) ++ ++dnl =================================================================== + dnl Test whether to include MathMLDTD + dnl =================================================================== + AC_MSG_CHECKING([whether to include MathMLDTD]) +diff -urN connectivity/source/drivers/tdeab/exports.dxp connectivity/source/drivers/tdeab/exports.dxp +--- connectivity/source/drivers/tdeab/exports.dxp 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/exports.dxp 2011-08-17 14:23:01.735590880 -0500 +@@ -0,0 +1,3 @@ ++component_getImplementationEnvironment ++component_writeInfo ++component_getFactory +diff -urN connectivity/source/drivers/tdeab/KCatalog.cxx connectivity/source/drivers/tdeab/KCatalog.cxx +--- connectivity/source/drivers/tdeab/KCatalog.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KCatalog.cxx 2011-08-17 14:29:39.766199199 -0500 +@@ -0,0 +1,128 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KCatalog.hxx" ++#include "KConnection.hxx" ++#include "KTables.hxx" ++ ++using namespace connectivity::kab; ++using namespace ::com::sun::star::uno; ++using namespace ::com::sun::star::beans; ++using namespace ::com::sun::star::sdbcx; ++using namespace ::com::sun::star::sdbc; ++using namespace ::com::sun::star::container; ++using namespace ::com::sun::star::lang; ++using namespace ::cppu; ++ ++// ------------------------------------------------------------------------- ++KabCatalog::KabCatalog(KabConnection* _pCon) ++ : connectivity::sdbcx::OCatalog(_pCon), ++ m_pConnection(_pCon), ++ m_xMetaData(m_pConnection->getMetaData()) ++{ ++} ++// ------------------------------------------------------------------------- ++void KabCatalog::refreshTables() ++{ ++ TStringVector aVector; ++ Sequence< ::rtl::OUString > aTypes(1); ++ aTypes[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")); ++ Reference< XResultSet > xResult = m_xMetaData->getTables( ++ Any(), ++ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")), ++ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")), ++ aTypes); ++ ++ if (xResult.is()) ++ { ++ Reference< XRow > xRow(xResult,UNO_QUERY); ++ ::rtl::OUString aName; ++ // const ::rtl::OUString& sDot = KabCatalog::getDot(); ++ ++ while (xResult->next()) ++ { ++ // aName = xRow->getString(2); ++ // aName += sDot; ++ aName = xRow->getString(3); ++ aVector.push_back(aName); ++ } ++ } ++ if (m_pTables) ++ m_pTables->reFill(aVector); ++ else ++ m_pTables = new KabTables(m_xMetaData,*this,m_aMutex,aVector); ++} ++// ------------------------------------------------------------------------- ++void KabCatalog::refreshViews() ++{ ++} ++// ------------------------------------------------------------------------- ++void KabCatalog::refreshGroups() ++{ ++} ++// ------------------------------------------------------------------------- ++void KabCatalog::refreshUsers() ++{ ++} ++// ------------------------------------------------------------------------- ++const ::rtl::OUString& KabCatalog::getDot() ++{ ++ static const ::rtl::OUString sDot = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".")); ++ return sDot; ++} ++// ----------------------------------------------------------------------------- ++ ++// XTablesSupplier ++Reference< XNameAccess > SAL_CALL KabCatalog::getTables( ) throw(RuntimeException) ++{ ++ ::osl::MutexGuard aGuard(m_aMutex); ++ checkDisposed(rBHelper.bDisposed); ++ ++ try ++ { ++ if (!m_pTables) ++ refreshTables(); ++ } ++ catch( const RuntimeException& ) ++ { ++ // allowed to leave this method ++ throw; ++ } ++ catch( const Exception& ) ++ { ++ // allowed ++ } ++ ++ return m_pTables; ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KCatalog.hxx connectivity/source/drivers/tdeab/KCatalog.hxx +--- connectivity/source/drivers/tdeab/KCatalog.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KCatalog.hxx 2011-08-17 14:29:32.345628247 -0500 +@@ -0,0 +1,68 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_CATALOG_HXX_ ++#define _CONNECTIVITY_KAB_CATALOG_HXX_ ++ ++#include "connectivity/sdbcx/VCatalog.hxx" ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ class KabConnection; ++ ++ class KabCatalog : public connectivity::sdbcx::OCatalog ++ { ++ KabConnection* m_pConnection; // used to get the metadata ++ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; // just to make things easier ++ ++ public: ++ KabCatalog(KabConnection* _pCon); ++ ++ inline KabConnection* getConnection() const { return m_pConnection; } ++ ++ static const ::rtl::OUString& getDot(); ++ ++ // implementation of the pure virtual methods ++ virtual void refreshTables(); ++ virtual void refreshViews(); ++ virtual void refreshGroups(); ++ virtual void refreshUsers(); ++ ++ // XTablesSupplier ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getTables( ++ ) throw(::com::sun::star::uno::RuntimeException); ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_CATALOG_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KColumns.cxx connectivity/source/drivers/tdeab/KColumns.cxx +--- connectivity/source/drivers/tdeab/KColumns.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KColumns.cxx 2011-08-17 14:29:23.634958020 -0500 +@@ -0,0 +1,102 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KColumns.hxx" ++#include "KTable.hxx" ++#include "KTables.hxx" ++#include "KCatalog.hxx" ++#include "connectivity/sdbcx/VColumn.hxx" ++ ++using namespace connectivity::kab; ++using namespace connectivity::sdbcx; ++using namespace connectivity; ++using namespace ::comphelper; ++using namespace ::com::sun::star::uno; ++using namespace ::com::sun::star::beans; ++using namespace ::com::sun::star::sdbc; ++using namespace ::com::sun::star::container; ++using namespace ::com::sun::star::lang; ++ ++// ------------------------------------------------------------------------- ++sdbcx::ObjectType KabColumns::createObject(const ::rtl::OUString& _rName) ++{ ++ Reference< XResultSet > xResult = m_pTable->getConnection()->getMetaData()->getColumns( ++ Any(), ++ m_pTable->getSchema(), ++ m_pTable->getTableName(), ++ _rName); ++ ++ sdbcx::ObjectType xRet = NULL; ++ if (xResult.is()) ++ { ++ Reference< XRow > xRow(xResult,UNO_QUERY); ++ ++ while (xResult->next()) ++ { ++ if (xRow->getString(4) == _rName) ++ { ++ OColumn* pRet = new OColumn( ++ _rName, ++ xRow->getString(6), ++ xRow->getString(13), ++ xRow->getString(12), ++ xRow->getInt(11), ++ xRow->getInt(7), ++ xRow->getInt(9), ++ xRow->getInt(5), ++ sal_False, ++ sal_False, ++ sal_False, ++ sal_True); ++ xRet = pRet; ++ break; ++ } ++ } ++ } ++ ++ return xRet; ++} ++// ------------------------------------------------------------------------- ++void KabColumns::impl_refresh() throw(RuntimeException) ++{ ++ m_pTable->refreshColumns(); ++} ++// ------------------------------------------------------------------------- ++KabColumns::KabColumns( KabTable* _pTable, ++ ::osl::Mutex& _rMutex, ++ const TStringVector &_rVector) ++ : sdbcx::OCollection(*_pTable, sal_True, _rMutex, _rVector), ++ m_pTable(_pTable) ++{ ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KColumns.hxx connectivity/source/drivers/tdeab/KColumns.hxx +--- connectivity/source/drivers/tdeab/KColumns.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KColumns.hxx 2011-08-17 14:29:13.974214692 -0500 +@@ -0,0 +1,58 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_COLUMNS_HXX_ ++#define _CONNECTIVITY_KAB_COLUMNS_HXX_ ++ ++#include "KTable.hxx" ++#include "connectivity/sdbcx/VCollection.hxx" ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ class KabColumns : public sdbcx::OCollection ++ { ++ protected: ++ KabTable* m_pTable; ++ ++ virtual sdbcx::ObjectType createObject(const ::rtl::OUString& _rName); ++ virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); ++ ++ public: ++ KabColumns( KabTable* _pTable, ++ ::osl::Mutex& _rMutex, ++ const TStringVector &_rVector); ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_COLUMNS_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/kcondition.cxx connectivity/source/drivers/tdeab/kcondition.cxx +--- connectivity/source/drivers/tdeab/kcondition.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/kcondition.cxx 2011-08-17 14:29:06.863667577 -0500 +@@ -0,0 +1,233 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "kcondition.hxx" ++#include "kfields.hxx" ++#include "connectivity/CommonTools.hxx" ++ ++using namespace ::connectivity::kab; ++using namespace ::com::sun::star::sdbc; ++// ----------------------------------------------------------------------------- ++KabCondition::~KabCondition() ++{ ++} ++// ----------------------------------------------------------------------------- ++KabConditionConstant::KabConditionConstant(const sal_Bool bValue) ++ : KabCondition(), ++ m_bValue(bValue) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionConstant::isAlwaysTrue() const ++{ ++ return m_bValue; ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionConstant::isAlwaysFalse() const ++{ ++ return !m_bValue; ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionConstant::eval(const ::KABC::Addressee &) const ++{ ++ return m_bValue; ++} ++// ----------------------------------------------------------------------------- ++KabConditionColumn::KabConditionColumn(const ::rtl::OUString &sColumnName) throw(SQLException) ++ : KabCondition(), ++ m_nFieldNumber(findKabField(sColumnName)) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionColumn::isAlwaysTrue() const ++{ ++ // Sometimes true, sometimes false ++ return sal_False; ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionColumn::isAlwaysFalse() const ++{ ++ // Sometimes true, sometimes false ++ return sal_False; ++} ++// ----------------------------------------------------------------------------- ++KabConditionNull::KabConditionNull(const ::rtl::OUString &sColumnName) throw(SQLException) ++ : KabConditionColumn(sColumnName) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionNull::eval(const ::KABC::Addressee &aAddressee) const ++{ ++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); ++ ++ return aQtName.isNull(); ++// TDE address book currently does not use NULL values. ++// But it might do it someday ++} ++// ----------------------------------------------------------------------------- ++KabConditionNotNull::KabConditionNotNull(const ::rtl::OUString &sColumnName) throw(SQLException) ++ : KabConditionColumn(sColumnName) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionNotNull::eval(const ::KABC::Addressee &aAddressee) const ++{ ++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); ++ ++ return !aQtName.isNull(); ++// TDE address book currently does not use NULL values. ++// But it might do it someday ++} ++// ----------------------------------------------------------------------------- ++KabConditionCompare::KabConditionCompare(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException) ++ : KabConditionColumn(sColumnName), ++ m_sMatchString(sMatchString) ++{ ++} ++// ----------------------------------------------------------------------------- ++KabConditionEqual::KabConditionEqual(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException) ++ : KabConditionCompare(sColumnName, sMatchString) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionEqual::eval(const ::KABC::Addressee &aAddressee) const ++{ ++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); ++// Timestamps should not be compared according to their string value ++// The syntax for such queries should be like ++// {ts '2004-03-29 12:55:00.000000'} ++// They should also support operators like '<' or '>=' ++ ++ if (aQtName.isNull()) return sal_False; ++ ++ ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2()); ++ return sValue == m_sMatchString; ++} ++// ----------------------------------------------------------------------------- ++KabConditionDifferent::KabConditionDifferent(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException) ++ : KabConditionCompare(sColumnName, sMatchString) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionDifferent::eval(const ::KABC::Addressee &aAddressee) const ++{ ++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); ++ ++ if (aQtName.isNull()) return sal_False; ++ ++ ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2()); ++ return sValue != m_sMatchString; ++} ++// ----------------------------------------------------------------------------- ++KabConditionSimilar::KabConditionSimilar(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException) ++ : KabConditionCompare(sColumnName, sMatchString) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionSimilar::eval(const ::KABC::Addressee &aAddressee) const ++{ ++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber); ++ ++ if (aQtName.isNull()) return sal_False; ++ ++ ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2()); ++ return match(m_sMatchString, sValue, '\0'); ++} ++// ----------------------------------------------------------------------------- ++KabConditionBoolean::KabConditionBoolean(KabCondition *pLeft, KabCondition *pRight) ++ : KabCondition(), ++ m_pLeft(pLeft), ++ m_pRight(pRight) ++{ ++} ++// ----------------------------------------------------------------------------- ++KabConditionBoolean::~KabConditionBoolean() ++{ ++ delete m_pLeft; ++ delete m_pRight; ++} ++// ----------------------------------------------------------------------------- ++KabConditionOr::KabConditionOr(KabCondition *pLeft, KabCondition *pRight) ++ : KabConditionBoolean(pLeft, pRight) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionOr::isAlwaysTrue() const ++{ ++ return m_pLeft->isAlwaysTrue() || m_pRight->isAlwaysTrue(); ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionOr::isAlwaysFalse() const ++{ ++ return m_pLeft->isAlwaysFalse() && m_pRight->isAlwaysFalse(); ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionOr::eval(const ::KABC::Addressee &aAddressee) const ++{ ++ // We avoid evaluating terms as much as we can ++ if (m_pLeft->isAlwaysTrue() || m_pRight->isAlwaysTrue()) return sal_True; ++ if (m_pLeft->isAlwaysFalse() && m_pRight->isAlwaysFalse()) return sal_False; ++ ++ if (m_pLeft->eval(aAddressee)) return sal_True; ++ if (m_pRight->eval(aAddressee)) return sal_True; ++ ++ return sal_False; ++} ++// ----------------------------------------------------------------------------- ++KabConditionAnd::KabConditionAnd(KabCondition *pLeft, KabCondition *pRight) ++ : KabConditionBoolean(pLeft, pRight) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionAnd::isAlwaysTrue() const ++{ ++ return m_pLeft->isAlwaysTrue() && m_pRight->isAlwaysTrue(); ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionAnd::isAlwaysFalse() const ++{ ++ return m_pLeft->isAlwaysFalse() || m_pRight->isAlwaysFalse(); ++} ++// ----------------------------------------------------------------------------- ++sal_Bool KabConditionAnd::eval(const ::KABC::Addressee &aAddressee) const ++{ ++ // We avoid evaluating terms as much as we can ++ if (m_pLeft->isAlwaysFalse() || m_pRight->isAlwaysFalse()) return sal_False; ++ if (m_pLeft->isAlwaysTrue() && m_pRight->isAlwaysTrue()) return sal_True; ++ ++ if (!m_pLeft->eval(aAddressee)) return sal_False; ++ if (!m_pRight->eval(aAddressee)) return sal_False; ++ ++ return sal_True; ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/kcondition.hxx connectivity/source/drivers/tdeab/kcondition.hxx +--- connectivity/source/drivers/tdeab/kcondition.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/kcondition.hxx 2011-08-17 14:28:59.403093526 -0500 +@@ -0,0 +1,164 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_CONDITION_HXX_ ++#define _CONNECTIVITY_KAB_CONDITION_HXX_ ++ ++#include ++#include ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++// ----------------------------------------------------------------------------- ++class KabCondition ++{ ++ public: ++ virtual ~KabCondition(); ++ virtual sal_Bool isAlwaysTrue() const = 0; ++ virtual sal_Bool isAlwaysFalse() const = 0; ++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const = 0; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionConstant : public KabCondition ++{ ++ protected: ++ sal_Bool m_bValue; ++ ++ public: ++ KabConditionConstant(const sal_Bool bValue); ++ virtual sal_Bool isAlwaysTrue() const; ++ virtual sal_Bool isAlwaysFalse() const; ++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionColumn : public KabCondition ++{ ++ protected: ++ sal_Int32 m_nFieldNumber; ++ ++ QString value(const ::KABC::Addressee &aAddressee) const; ++ ++ public: ++ KabConditionColumn( ++ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException); ++ virtual sal_Bool isAlwaysTrue() const; ++ virtual sal_Bool isAlwaysFalse() const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionNull : public KabConditionColumn ++{ ++ public: ++ KabConditionNull( ++ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException); ++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionNotNull : public KabConditionColumn ++{ ++ public: ++ KabConditionNotNull( ++ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException); ++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionCompare : public KabConditionColumn ++{ ++ protected: ++ const ::rtl::OUString m_sMatchString; ++ ++ public: ++ KabConditionCompare( ++ const ::rtl::OUString &sColumnName, ++ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException); ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionEqual : public KabConditionCompare ++{ ++ public: ++ KabConditionEqual( ++ const ::rtl::OUString &sColumnName, ++ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException); ++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionDifferent : public KabConditionCompare ++{ ++ public: ++ KabConditionDifferent( ++ const ::rtl::OUString &sColumnName, ++ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException); ++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionSimilar : public KabConditionCompare ++{ ++ public: ++ KabConditionSimilar( ++ const ::rtl::OUString &sColumnName, ++ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException); ++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionBoolean : public KabCondition ++{ ++ protected: ++ KabCondition *m_pLeft, *m_pRight; ++ ++ public: ++ KabConditionBoolean(KabCondition *pLeft, KabCondition *pRight); ++ virtual ~KabConditionBoolean(); ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionOr : public KabConditionBoolean ++{ ++ public: ++ KabConditionOr(KabCondition *pLeft, KabCondition *pRight); ++ virtual sal_Bool isAlwaysTrue() const; ++ virtual sal_Bool isAlwaysFalse() const; ++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const; ++}; ++// ----------------------------------------------------------------------------- ++class KabConditionAnd : public KabConditionBoolean ++{ ++ public: ++ KabConditionAnd(KabCondition *pLeft, KabCondition *pRight); ++ virtual sal_Bool isAlwaysTrue() const; ++ virtual sal_Bool isAlwaysFalse() const; ++ virtual sal_Bool eval(const ::KABC::Addressee &addressee) const; ++}; ++// ----------------------------------------------------------------------------- ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_CONDITION_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KConnection.cxx connectivity/source/drivers/tdeab/KConnection.cxx +--- connectivity/source/drivers/tdeab/KConnection.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KConnection.cxx 2011-08-17 14:28:53.822664134 -0500 +@@ -0,0 +1,332 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KConnection.hxx" ++#include "KDatabaseMetaData.hxx" ++#include "KStatement.hxx" ++#include "KPreparedStatement.hxx" ++#include "KDriver.hxx" ++#include "KCatalog.hxx" ++#include ++#include ++#include ++ ++using namespace connectivity::kab; ++using namespace com::sun::star::uno; ++using namespace com::sun::star::lang; ++using namespace com::sun::star::beans; ++using namespace com::sun::star::sdbc; ++using namespace com::sun::star::sdbcx; ++ ++IMPLEMENT_SERVICE_INFO(KabConnection, "com.sun.star.sdbc.drivers.KabConnection", "com.sun.star.sdbc.Connection") ++//----------------------------------------------------------------------------- ++KabConnection::KabConnection(KabDriver* _pDriver) ++ : OMetaConnection_BASE(m_aMutex), ++ OSubComponent((::cppu::OWeakObject*)_pDriver, this), ++ m_xMetaData(NULL), ++ m_pAddressBook(NULL), ++ m_pDriver(_pDriver) ++{ ++ m_pDriver->acquire(); ++} ++//----------------------------------------------------------------------------- ++KabConnection::~KabConnection() ++{ ++ if (!isClosed()) ++ close(); ++ ++ m_pDriver->release(); ++ m_pDriver = NULL; ++} ++//----------------------------------------------------------------------------- ++void SAL_CALL KabConnection::release() throw() ++{ ++ relase_ChildImpl(); ++} ++// ----------------------------------------------------------------------------- ++void KabConnection::construct(const ::rtl::OUString&, const Sequence< PropertyValue >&) throw(SQLException) ++{ ++ osl_incrementInterlockedCount( &m_refCount ); ++ ++ // create a TDE address book object ++ m_pAddressBook = KABC::StdAddressBook::self(); ++ m_pAddressBook->setAutomaticSave(false); ++// perharps we should analyze the URL to know whether the addressbook is local, over LDAP, etc... ++// perharps we should get some user and password information from "info" properties ++ ++ osl_decrementInterlockedCount( &m_refCount ); ++} ++// XServiceInfo ++// -------------------------------------------------------------------------------- ++Reference< XStatement > SAL_CALL KabConnection::createStatement( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // create a statement ++ // the statement can only be executed once ++ Reference< XStatement > xReturn = new KabStatement(this); ++ m_aStatements.push_back(WeakReferenceHelper(xReturn)); ++ return xReturn; ++} ++// -------------------------------------------------------------------------------- ++Reference< XPreparedStatement > SAL_CALL KabConnection::prepareStatement( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // create a statement ++ // the statement can only be executed more than once ++ Reference< XPreparedStatement > xReturn = new KabPreparedStatement(this, _sSql); ++ m_aStatements.push_back(WeakReferenceHelper(xReturn)); ++ return xReturn; ++} ++// -------------------------------------------------------------------------------- ++Reference< XPreparedStatement > SAL_CALL KabConnection::prepareCall( const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // not implemented yet :-) a task to do ++ return NULL; ++} ++// -------------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabConnection::nativeSQL( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ // when you need to transform SQL92 to you driver specific you can do it here ++ ++ return _sSql; ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabConnection::setAutoCommit( sal_Bool ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ // here you have to set your commit mode please have a look at the jdbc documentation to get a clear explanation ++} ++// -------------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabConnection::getAutoCommit( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ // you have to distinguish which if you are in autocommit mode or not ++ // at normal case true should be fine here ++ ++ return sal_True; ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabConnection::commit( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // when you database does support transactions you should commit here ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabConnection::rollback( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // same as commit but for the other case ++} ++// -------------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabConnection::isClosed( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ // just simple -> we are closed when we are disposed, that means someone called dispose(); (XComponent) ++ return KabConnection_BASE::rBHelper.bDisposed; ++} ++// -------------------------------------------------------------------------------- ++Reference< XDatabaseMetaData > SAL_CALL KabConnection::getMetaData( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // here we have to create the class with biggest interface ++ // The answer is 42 :-) ++ Reference< XDatabaseMetaData > xMetaData = m_xMetaData; ++ if (!xMetaData.is()) ++ { ++ xMetaData = new KabDatabaseMetaData(this); // need the connection because it can return it ++ m_xMetaData = xMetaData; ++ } ++ ++ return xMetaData; ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabConnection::setReadOnly( sal_Bool ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // set you connection to readonly ++} ++// -------------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabConnection::isReadOnly( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // return if your connection to readonly ++ return sal_False; ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabConnection::setCatalog( const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // if your database doesn't work with catalogs you go to next method otherwise you kjnow what to do ++} ++// -------------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabConnection::getCatalog( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ ++ // return your current catalog ++ return ::rtl::OUString(); ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabConnection::setTransactionIsolation( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // set your isolation level ++ // please have a look at @see com.sun.star.sdbc.TransactionIsolation ++} ++// -------------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabConnection::getTransactionIsolation( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ ++ // please have a look at @see com.sun.star.sdbc.TransactionIsolation ++ return TransactionIsolation::NONE; ++} ++// -------------------------------------------------------------------------------- ++Reference< ::com::sun::star::container::XNameAccess > SAL_CALL KabConnection::getTypeMap( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ ++ // if your driver has special database types you can return it here ++ ++ return NULL; ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabConnection::setTypeMap( const Reference< ::com::sun::star::container::XNameAccess >& ) throw(SQLException, RuntimeException) ++{ ++ // the other way around ++} ++// -------------------------------------------------------------------------------- ++// XCloseable ++void SAL_CALL KabConnection::close( ) throw(SQLException, RuntimeException) ++{ ++ { ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabConnection_BASE::rBHelper.bDisposed); ++ } ++ dispose(); ++} ++// -------------------------------------------------------------------------------- ++// XWarningsSupplier ++Any SAL_CALL KabConnection::getWarnings( ) throw(SQLException, RuntimeException) ++{ ++ // when you collected some warnings -> return it ++ return Any(); ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabConnection::clearWarnings( ) throw(SQLException, RuntimeException) ++{ ++ // you should clear your collected warnings here ++} ++//------------------------------------------------------------------------------ ++void KabConnection::disposing() ++{ ++ // we noticed that we should be destroied in near future so we have to dispose our statements ++ ::osl::MutexGuard aGuard(m_aMutex); ++ ++ for (OWeakRefArray::iterator i = m_aStatements.begin(); m_aStatements.end() != i; ++i) ++ { ++ Reference< XComponent > xComp(i->get(), UNO_QUERY); ++ if (xComp.is()) ++ xComp->dispose(); ++ } ++ m_aStatements.clear(); ++ ++ if (m_pAddressBook != NULL) ++ { ++ m_pAddressBook->close(); ++ m_pAddressBook = NULL; ++ } ++ ++ m_xMetaData = ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XDatabaseMetaData>(); ++ ++ dispose_ChildImpl(); ++ KabConnection_BASE::disposing(); ++} ++// ----------------------------------------------------------------------------- ++Reference< XTablesSupplier > SAL_CALL KabConnection::createCatalog() ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ Reference< XTablesSupplier > xTab = m_xCatalog; ++ if (!m_xCatalog.is()) ++ { ++ KabCatalog *pCat = new KabCatalog(this); ++ xTab = pCat; ++ m_xCatalog = xTab; ++ } ++ return xTab; ++} ++// ----------------------------------------------------------------------------- ++::KABC::AddressBook* KabConnection::getAddressBook() const ++{ ++ return m_pAddressBook; ++} ++// ----------------------------------------------------------------------------- ++extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL createKabConnection( void* _pDriver ) ++{ ++ KabConnection* pConnection = new KabConnection( static_cast< KabDriver* >( _pDriver ) ); ++ // by definition, the pointer crossing library boundaries as void ptr is acquired once ++ pConnection->acquire(); ++ return pConnection; ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KConnection.hxx connectivity/source/drivers/tdeab/KConnection.hxx +--- connectivity/source/drivers/tdeab/KConnection.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KConnection.hxx 2011-08-17 14:28:47.592184720 -0500 +@@ -0,0 +1,142 @@ ++/* -*- 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_CONNECTION_HXX_ ++#define _CONNECTIVITY_KAB_CONNECTION_HXX_ ++ ++#include ++#include "OSubComponent.hxx" ++#include "connectivity/CommonTools.hxx" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++namespace KABC ++{ ++ class StdAddressBook; ++ class AddressBook; ++} ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ ++ typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::sdbc::XConnection, ++ ::com::sun::star::sdbc::XWarningsSupplier, ++ ::com::sun::star::lang::XServiceInfo ++ > OMetaConnection_BASE; ++ ++ class KabStatement_Base; ++ class KabDriver; ++ class KabDatabaseMetaData; ++ ++ typedef OMetaConnection_BASE KabConnection_BASE; // implements basics and text encoding ++ typedef std::vector< ::com::sun::star::uno::WeakReferenceHelper > OWeakRefArray; ++ ++ class KabConnection : public comphelper::OBaseMutex, ++ public KabConnection_BASE, ++ public OSubComponent ++ { ++ friend class OSubComponent; ++ ++ protected: ++ //==================================================================== ++ // Data attributes ++ //==================================================================== ++ ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; ++ ++ OWeakRefArray m_aStatements; // vector containing a list of all the Statement objects ++ // for this Connection ++ ++ ::KABC::StdAddressBook* m_pAddressBook; // the address book ++ KabDriver* m_pDriver; // pointer to the owning driver object ++ ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier> ++ m_xCatalog; // needed for the SQL interpreter ++ ++ public: ++ virtual void construct( const ::rtl::OUString& url,const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info) throw(::com::sun::star::sdbc::SQLException); ++ ++ KabConnection(KabDriver* _pDriver); ++ virtual ~KabConnection(); ++ ++ void closeAllStatements () throw( ::com::sun::star::sdbc::SQLException); ++ ++ // OComponentHelper ++ virtual void SAL_CALL disposing(void); ++ ++ // XInterface ++ virtual void SAL_CALL release() throw(); ++ ++ // XServiceInfo ++ DECLARE_SERVICE_INFO(); ++ ++ // XConnection ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XStatement > SAL_CALL createStatement( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > SAL_CALL prepareCall( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL nativeSQL( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setAutoCommit( sal_Bool autoCommit ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL getAutoCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL commit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL rollback( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isClosed( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setReadOnly( sal_Bool readOnly ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isReadOnly( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setCatalog( const ::rtl::OUString& catalog ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getCatalog( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setTransactionIsolation( sal_Int32 level ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getTransactionIsolation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getTypeMap( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setTypeMap( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XCloseable ++ virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XWarningsSupplier ++ virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL clearWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // needed for the SQL interpreter ++ ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier > SAL_CALL createCatalog(); ++ ++ // accessors ++ inline KabDriver* getDriver() const { return m_pDriver;} ++ ::KABC::AddressBook* getAddressBook() const; ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_CONNECTION_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx +--- connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx 2011-08-17 14:28:44.171921542 -0500 +@@ -0,0 +1,1084 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KDatabaseMetaData.hxx" ++#include "kfields.hxx" ++#include "TDEInit.h" ++#include ++#include "FDatabaseMetaDataResultSet.hxx" ++#include "OTypeInfo.hxx" ++#include ++#include ++#include ++ ++using namespace connectivity::kab; ++using namespace com::sun::star::uno; ++using namespace com::sun::star::lang; ++using namespace com::sun::star::beans; ++using namespace com::sun::star::sdbc; ++ ++KabDatabaseMetaData::KabDatabaseMetaData(KabConnection* _pCon) ++ : m_xConnection(_pCon), ++ m_bUseCatalog(sal_True) ++{ ++ OSL_ENSURE(_pCon,"KabDatabaseMetaData::KabDatabaseMetaData: No connection set!"); ++ ++ osl_incrementInterlockedCount( &m_refCount ); ++ m_bUseCatalog = !(usesLocalFiles() || usesLocalFilePerTable()); ++ osl_decrementInterlockedCount( &m_refCount ); ++} ++// ------------------------------------------------------------------------- ++KabDatabaseMetaData::~KabDatabaseMetaData() ++{ ++} ++// ------------------------------------------------------------------------- ++const ::rtl::OUString & KabDatabaseMetaData::getAddressBookTableName() ++{ ++ static const ::rtl::OUString aAddressBookTableName ++ (::rtl::OUString::createFromAscii( i18n("Address Book") )); ++ ++ return aAddressBookTableName; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getCatalogSeparator( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aVal; ++ if (m_bUseCatalog) ++ { // do some special here for you database ++ } ++ ++ return aVal; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxBinaryLiteralLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxRowSize( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxCatalogNameLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxCharLiteralLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnNameLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInIndex( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxCursorNameLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxConnections( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInTable( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxStatementLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxTableNameLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxTablesInSelect( ) throw(SQLException, RuntimeException) ++{ ++ // MaxTablesInSelect describes how many tables can participate in the FROM part of a given SELECT statement, ++ // currently, the resultset/statement implementations can cope with one table only ++ sal_Int32 nValue = 1; ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::doesMaxRowSizeIncludeBlobs( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::storesLowerCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::storesLowerCaseIdentifiers( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::storesMixedCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::storesMixedCaseIdentifiers( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::storesUpperCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::storesUpperCaseIdentifiers( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsAlterTableWithAddColumn( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsAlterTableWithDropColumn( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxIndexLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsNonNullableColumns( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getCatalogTerm( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aVal; ++ if (m_bUseCatalog) ++ { ++ } ++ return aVal; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getIdentifierQuoteString( ) throw(SQLException, RuntimeException) ++{ ++ // normally this is " ++ ::rtl::OUString aVal = ::rtl::OUString::createFromAscii("\""); ++ return aVal; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getExtraNameCharacters( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aVal; ++ return aVal; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsDifferentTableCorrelationNames( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::isCatalogAtStart( ) throw(SQLException, RuntimeException) ++{ ++ sal_Bool bValue = sal_False; ++ if (m_bUseCatalog) ++ { ++ } ++ return bValue; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::dataDefinitionIgnoredInTransactions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::dataDefinitionCausesTransactionCommit( ) throw(SQLException, RuntimeException) ++{ ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsDataManipulationTransactionsOnly( ) throw(SQLException, RuntimeException) ++{ ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsPositionedDelete( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsPositionedUpdate( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenStatementsAcrossRollback( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenStatementsAcrossCommit( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenCursorsAcrossCommit( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenCursorsAcrossRollback( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsTransactionIsolationLevel( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInDataManipulation( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsANSI92FullSQL( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsANSI92EntryLevelSQL( ) throw(SQLException, RuntimeException) ++{ ++ return sal_True; // should be supported at least ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsIntegrityEnhancementFacility( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInIndexDefinitions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInTableDefinitions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInTableDefinitions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInIndexDefinitions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInDataManipulation( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsOuterJoins( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxStatements( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxProcedureNameLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxSchemaNameLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsTransactions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::allProceduresAreCallable( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsStoredProcedures( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSelectForUpdate( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::allTablesAreSelectable( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::isReadOnly( ) throw(SQLException, RuntimeException) ++{ ++ // for the moment, we have read-only addresses, but this might change in the future ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::usesLocalFiles( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::usesLocalFilePerTable( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsTypeConversion( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::nullPlusNonNullIsNull( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsColumnAliasing( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsTableCorrelationNames( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsConvert( sal_Int32, sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsExpressionsInOrderBy( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsGroupBy( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsGroupByBeyondSelect( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsGroupByUnrelated( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsMultipleTransactions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsMultipleResultSets( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsLikeEscapeClause( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsOrderByUnrelated( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsUnion( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsUnionAll( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsMixedCaseIdentifiers( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsMixedCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedAtEnd( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedAtStart( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedHigh( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedLow( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInProcedureCalls( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInPrivilegeDefinitions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInProcedureCalls( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInPrivilegeDefinitions( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsCorrelatedSubqueries( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInComparisons( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInExists( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInIns( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInQuantifieds( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsANSI92IntermediateSQL( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getURL( ) throw(SQLException, RuntimeException) ++{ ++ // if someday we support more than the default address book, ++ // this method should return the URL which was used to create it ++ ::rtl::OUString aValue = ::rtl::OUString::createFromAscii("sdbc:address:kab:"); ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getUserName( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aValue; ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getDriverName( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aValue = ::rtl::OUString::createFromAscii("kab"); ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getDriverVersion() throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aValue = ::rtl::OUString::createFromAscii(KAB_DRIVER_VERSION); ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getDatabaseProductVersion( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aValue; ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getDatabaseProductName( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aValue; ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getProcedureTerm( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aValue; ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getSchemaTerm( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aValue; ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getDriverMajorVersion( ) throw(RuntimeException) ++{ ++ return KAB_DRIVER_VERSION_MAJOR; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getDefaultTransactionIsolation( ) throw(SQLException, RuntimeException) ++{ ++ return TransactionIsolation::NONE; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getDriverMinorVersion( ) throw(RuntimeException) ++{ ++ return KAB_DRIVER_VERSION_MINOR; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getSQLKeywords( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aValue; ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getSearchStringEscape( ) throw(SQLException, RuntimeException) ++{ ++ ::rtl::OUString aValue; ++ return aValue; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getStringFunctions( ) throw(SQLException, RuntimeException) ++{ ++ return ::rtl::OUString(); ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getTimeDateFunctions( ) throw(SQLException, RuntimeException) ++{ ++ return ::rtl::OUString(); ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getSystemFunctions( ) throw(SQLException, RuntimeException) ++{ ++ return ::rtl::OUString(); ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabDatabaseMetaData::getNumericFunctions( ) throw(SQLException, RuntimeException) ++{ ++ return ::rtl::OUString(); ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsExtendedSQLGrammar( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsCoreSQLGrammar( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsMinimumSQLGrammar( ) throw(SQLException, RuntimeException) ++{ ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsFullOuterJoins( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsLimitedOuterJoins( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInGroupBy( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInOrderBy( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInSelect( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxUserNameLength( ) throw(SQLException, RuntimeException) ++{ ++ sal_Int32 nValue = 0; // 0 means no limit ++ return nValue; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsResultSetType( sal_Int32 setType ) throw(SQLException, RuntimeException) ++{ ++ switch (setType) ++ { ++ case ResultSetType::FORWARD_ONLY: ++ case ResultSetType::SCROLL_INSENSITIVE: ++ return sal_True; ++ } ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ switch (setType) ++ { ++ case ResultSetType::FORWARD_ONLY: ++ case ResultSetType::SCROLL_INSENSITIVE: ++ return sal_True; ++ } ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::ownUpdatesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::ownDeletesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::ownInsertsAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::othersUpdatesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::othersDeletesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::othersInsertsAreVisible( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::updatesAreDetected( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::deletesAreDetected( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::insertsAreDetected( sal_Int32 ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDatabaseMetaData::supportsBatchUpdates( ) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++Reference< XConnection > SAL_CALL KabDatabaseMetaData::getConnection( ) throw(SQLException, RuntimeException) ++{ ++ return (Reference< XConnection >) m_xConnection.get(); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTableTypes( ) throw(SQLException, RuntimeException) ++{ ++ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTableTypes); ++ Reference< XResultSet > xRef = pResult; ++ ++ static ODatabaseMetaDataResultSet::ORows aRows; ++ static const ::rtl::OUString aTable(::rtl::OUString::createFromAscii("TABLE")); ++ ++ if (aRows.empty()) ++ { ++ ODatabaseMetaDataResultSet::ORow aRow(2); ++ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[1] = new ORowSetValueDecorator(aTable); ++ aRows.push_back(aRow); ++ } ++ pResult->setRows(aRows); ++ return xRef; ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTypeInfo( ) throw(SQLException, RuntimeException) ++{ ++ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTypeInfo); ++ Reference< XResultSet > xRef = pResult; ++ ++ static ODatabaseMetaDataResultSet::ORows aRows; ++ if (aRows.empty()) ++ { ++ ODatabaseMetaDataResultSet::ORow aRow(19); ++ ++ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("CHAR")); ++ aRow[2] = new ORowSetValueDecorator(DataType::CHAR); ++ aRow[3] = new ORowSetValueDecorator((sal_Int32) 254); ++ aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); ++ aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); ++ aRow[6] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[7] = new ORowSetValueDecorator((sal_Int32) ColumnValue::NULLABLE); ++ aRow[8] = ODatabaseMetaDataResultSet::get1Value(); ++ aRow[9] = new ORowSetValueDecorator((sal_Int32) ColumnSearch::CHAR); ++ aRow[10] = ODatabaseMetaDataResultSet::get1Value(); ++ aRow[11] = ODatabaseMetaDataResultSet::get0Value(); ++ aRow[12] = ODatabaseMetaDataResultSet::get0Value(); ++ aRow[13] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[14] = ODatabaseMetaDataResultSet::get0Value(); ++ aRow[15] = ODatabaseMetaDataResultSet::get0Value(); ++ aRow[16] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[17] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[18] = new ORowSetValueDecorator((sal_Int32) 10); ++ aRows.push_back(aRow); ++// Much more types might appear in TDE address books ++// To be completed ++ } ++ pResult->setRows(aRows); ++ return xRef; ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getCatalogs( ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eCatalogs ); ++} ++// ----------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getSchemas( ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eSchemas ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getColumnPrivileges( ++ const Any&, const ::rtl::OUString&, const ::rtl::OUString&, ++ const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eColumnPrivileges ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getColumns( ++ const Any&, ++ const ::rtl::OUString&, ++ const ::rtl::OUString& tableNamePattern, ++ const ::rtl::OUString& columnNamePattern) throw(SQLException, RuntimeException) ++{ ++ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eColumns); ++ Reference< XResultSet > xRef = pResult; ++ ++ ODatabaseMetaDataResultSet::ORows aRows; ++ ++ if (match(tableNamePattern, getAddressBookTableName(), '\0')) ++ { ++ ODatabaseMetaDataResultSet::ORow aRow(19); ++ ++ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[3] = new ORowSetValueDecorator(getAddressBookTableName()); ++ aRow[8] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[9] = ODatabaseMetaDataResultSet::get0Value(); ++ aRow[10] = new ORowSetValueDecorator((sal_Int32) 10); ++ aRow[11] = ODatabaseMetaDataResultSet::get1Value(); ++ aRow[12] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[13] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[14] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[15] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[16] = new ORowSetValueDecorator((sal_Int32) 254); ++ aRow[18] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("YES")); ++ ++ sal_Int32 nPosition = 1; ++ QString aQtName; ++ ::rtl::OUString sName; ++ ++ aQtName = ::KABC::Addressee::revisionLabel(); ++ sName = (const sal_Unicode *) aQtName.ucs2(); ++ if (match(columnNamePattern, sName, '\0')) ++ { ++ aRow[4] = new ORowSetValueDecorator(sName); ++ aRow[5] = new ORowSetValueDecorator(DataType::TIMESTAMP); ++ aRow[6] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIMESTAMP")); ++ aRow[17] = new ORowSetValueDecorator(nPosition++); ++ aRows.push_back(aRow); ++ } ++ ++ ::KABC::Field::List aFields = ::KABC::Field::allFields(); ++ ::KABC::Field::List::iterator aField; ++ ++ for ( aField = aFields.begin(); ++ aField != aFields.end(); ++ ++aField, ++nPosition) ++ { ++ aQtName = (*aField)->label(); ++ sName = (const sal_Unicode *) aQtName.ucs2(); ++ if (match(columnNamePattern, sName, '\0')) ++ { ++ aRow[4] = new ORowSetValueDecorator(sName); ++ aRow[5] = new ORowSetValueDecorator(DataType::CHAR); ++ aRow[6] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("CHAR")); ++ aRow[7] = new ORowSetValueDecorator((sal_Int32) 256); ++// Might be VARCHAR and not CHAR[256]... ++ aRow[17] = new ORowSetValueDecorator(nPosition); ++ aRows.push_back(aRow); ++ } ++ } ++ } ++ pResult->setRows(aRows); ++ return xRef; ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTables( ++ const Any&, ++ const ::rtl::OUString&, ++ const ::rtl::OUString&, ++ const Sequence< ::rtl::OUString >& types) throw(SQLException, RuntimeException) ++{ ++ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTables); ++ Reference< XResultSet > xRef = pResult; ++ ++ // check whether we have tables in the requested types ++ // for the moment, we answer only the "TABLE" table type ++ // when no types are given at all, we return all the tables ++ static const ::rtl::OUString aTable(::rtl::OUString::createFromAscii("TABLE")); ++ sal_Bool bTableFound = sal_False; ++ const ::rtl::OUString* p = types.getConstArray(), ++ * pEnd = p + types.getLength(); ++ ++ if (p == pEnd) ++ { ++ bTableFound = sal_True; ++ } ++ else while (p < pEnd) ++ { ++ if (match(*p, aTable, '\0')) ++ { ++ bTableFound = sal_True; ++ break; ++ } ++ p++; ++ } ++ if (!bTableFound) ++ return xRef; ++ ++ static ODatabaseMetaDataResultSet::ORows aRows; ++ ++ if (aRows.empty()) ++ { ++ ODatabaseMetaDataResultSet::ORow aRow(6); ++ ++ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[3] = new ORowSetValueDecorator(getAddressBookTableName()); ++ aRow[4] = new ORowSetValueDecorator(aTable); ++ aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRows.push_back(aRow); ++ } ++ pResult->setRows(aRows); ++ return xRef; ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getProcedureColumns( ++ const Any&, const ::rtl::OUString&, ++ const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedureColumns ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getProcedures( ++ const Any&, const ::rtl::OUString&, ++ const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedures ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getVersionColumns( ++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& table ) throw(SQLException, RuntimeException) ++{ ++ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eVersionColumns); ++ ++ Reference< XResultSet > xRef = pResult; ++ ++ ODatabaseMetaDataResultSet::ORows aRows; ++ ++ if (table == getAddressBookTableName()) ++ { ++ ODatabaseMetaDataResultSet::ORow aRow( 9 ); ++ QString aQtName = ::KABC::Addressee::revisionLabel(); ++ ::rtl::OUString sName = (const sal_Unicode *) aQtName.ucs2(); ++ ++ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ ++ aRow[2] = new ORowSetValueDecorator(sName); ++ aRow[3] = new ORowSetValueDecorator(DataType::TIMESTAMP); ++ aRow[4] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIMESTAMP")); ++ ++ aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[6] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[7] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ aRow[8] = ODatabaseMetaDataResultSet::getEmptyValue(); ++ ++ aRows.push_back(aRow); ++ } ++ pResult->setRows(aRows); ++ return xRef; ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getExportedKeys( ++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eExportedKeys ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getImportedKeys( ++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eImportedKeys ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getPrimaryKeys( ++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::ePrimaryKeys ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getIndexInfo( ++ const Any&, const ::rtl::OUString&, const ::rtl::OUString&, ++ sal_Bool, sal_Bool ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eIndexInfo ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getBestRowIdentifier( ++ const Any&, const ::rtl::OUString&, const ::rtl::OUString&, sal_Int32, ++ sal_Bool ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eBestRowIdentifier ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTablePrivileges( ++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eTablePrivileges ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getCrossReference( ++ const Any&, const ::rtl::OUString&, ++ const ::rtl::OUString&, const Any&, ++ const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eCrossReference ); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getUDTs( const Any&, const ::rtl::OUString&, const ::rtl::OUString&, const Sequence< sal_Int32 >& ) throw(SQLException, RuntimeException) ++{ ++ OSL_ENSURE(0,"Not implemented yet!"); ++ throw SQLException(); ++} ++// ----------------------------------------------------------------------------- ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx +--- connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx 2011-08-17 14:28:31.880975797 -0500 +@@ -0,0 +1,217 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_ ++#define _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_ ++ ++#include "KConnection.hxx" ++#include ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ //************************************************************** ++ //************ Class: KabDatabaseMetaData ++ //************************************************************** ++ ++ typedef ::cppu::WeakImplHelper1< ::com::sun::star::sdbc::XDatabaseMetaData> KabDatabaseMetaData_BASE; ++ ++ class KabDatabaseMetaData : public KabDatabaseMetaData_BASE ++ { ++ ::com::sun::star::uno::Reference< KabConnection > m_xConnection; ++ sal_Bool m_bUseCatalog; ++ ++ public: ++ ++ inline KabConnection* getOwnConnection() const { return m_xConnection.get(); } ++ ++ KabDatabaseMetaData(KabConnection* _pCon); ++ static const ::rtl::OUString & getAddressBookTableName(); ++ virtual ~KabDatabaseMetaData(); ++ ++ // this interface is really BIG ++ // XDatabaseMetaData ++ virtual sal_Bool SAL_CALL allProceduresAreCallable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL allTablesAreSelectable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getURL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getUserName( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isReadOnly( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL nullsAreSortedHigh( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL nullsAreSortedLow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL nullsAreSortedAtStart( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL nullsAreSortedAtEnd( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getDatabaseProductName( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getDatabaseProductVersion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getDriverName( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getDriverVersion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getDriverMajorVersion( ) throw(::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getDriverMinorVersion( ) throw(::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL usesLocalFiles( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL usesLocalFilePerTable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsMixedCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL storesMixedCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getIdentifierQuoteString( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getSQLKeywords( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getNumericFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getStringFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getSystemFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getTimeDateFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getSearchStringEscape( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getExtraNameCharacters( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsAlterTableWithAddColumn( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsAlterTableWithDropColumn( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsColumnAliasing( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL nullPlusNonNullIsNull( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsTypeConversion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsConvert( sal_Int32 fromType, sal_Int32 toType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsTableCorrelationNames( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsOrderByUnrelated( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsGroupBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsGroupByUnrelated( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsLikeEscapeClause( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsMultipleResultSets( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsMultipleTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsNonNullableColumns( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsCoreSQLGrammar( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsANSI92FullSQL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsOuterJoins( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsFullOuterJoins( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsLimitedOuterJoins( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getSchemaTerm( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getProcedureTerm( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getCatalogTerm( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isCatalogAtStart( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getCatalogSeparator( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSchemasInDataManipulation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSchemasInTableDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsCatalogsInDataManipulation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsCatalogsInTableDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsPositionedDelete( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsPositionedUpdate( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSelectForUpdate( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsStoredProcedures( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSubqueriesInExists( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSubqueriesInIns( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsUnion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsUnionAll( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxCharLiteralLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxColumnNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxColumnsInIndex( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxColumnsInSelect( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxColumnsInTable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxConnections( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxCursorNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxIndexLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxSchemaNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxProcedureNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxCatalogNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxRowSize( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxStatementLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxStatements( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxTableNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxTablesInSelect( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMaxUserNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel( sal_Int32 level ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getProcedures( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& procedureNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getProcedureColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& procedureNamePattern, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTables( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& types ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getSchemas( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getCatalogs( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTableTypes( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getColumnPrivileges( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTablePrivileges( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getBestRowIdentifier( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, sal_Int32 scope, sal_Bool nullable ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getVersionColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getPrimaryKeys( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getImportedKeys( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getExportedKeys( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getCrossReference( const ::com::sun::star::uno::Any& primaryCatalog, const ::rtl::OUString& primarySchema, const ::rtl::OUString& primaryTable, const ::com::sun::star::uno::Any& foreignCatalog, const ::rtl::OUString& foreignSchema, const ::rtl::OUString& foreignTable ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTypeInfo( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getIndexInfo( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, sal_Bool unique, sal_Bool approximate ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsResultSetType( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL ownUpdatesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL ownDeletesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL ownInsertsAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL othersUpdatesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL othersDeletesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL othersInsertsAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL updatesAreDetected( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL deletesAreDetected( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL insertsAreDetected( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsBatchUpdates( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getUDTs( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& typeNamePattern, const ::com::sun::star::uno::Sequence< sal_Int32 >& types ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KDriver.cxx connectivity/source/drivers/tdeab/KDriver.cxx +--- connectivity/source/drivers/tdeab/KDriver.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KDriver.cxx 2011-08-17 14:28:05.938979574 -0500 +@@ -0,0 +1,476 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KDriver.hxx" ++#include "TDEInit.h" ++#include "KConnection.hxx" ++ ++/** === begin UNO includes === **/ ++#include ++#include ++#include ++/** === end UNO includes === **/ ++#include ++#include ++#include "resource/tdeab_res.hrc" ++#include "resource/sharedresources.hxx" ++ ++using namespace com::sun::star::uno; ++using namespace com::sun::star::lang; ++using namespace com::sun::star::beans; ++using namespace com::sun::star::sdbc; ++using namespace com::sun::star::sdb; ++using namespace com::sun::star::frame; ++using namespace connectivity::kab; ++ ++// ======================================================================= ++// = KabImplModule ++// ======================================================================= ++// -------------------------------------------------------------------------------- ++KabImplModule::KabImplModule( const Reference< XMultiServiceFactory >& _rxFactory ) ++ :m_xORB(_rxFactory) ++ ,m_bAttemptedLoadModule(false) ++ ,m_bAttemptedInitialize(false) ++ ,m_hConnectorModule(NULL) ++ ,m_pConnectionFactoryFunc(NULL) ++ ,m_pApplicationInitFunc(NULL) ++ ,m_pApplicationShutdownFunc(NULL) ++ ,m_pTDEVersionCheckFunc(NULL) ++{ ++ if ( !m_xORB.is() ) ++ throw NullPointerException(); ++} ++ ++// -------------------------------------------------------------------------------- ++bool KabImplModule::isTDEPresent() ++{ ++ if ( !impl_loadModule() ) ++ return false; ++ ++ return true; ++} ++ ++// -------------------------------------------------------------------------------- ++KabImplModule::TDEVersionType KabImplModule::matchTDEVersion() ++{ ++ OSL_PRECOND( m_pTDEVersionCheckFunc, "KabImplModule::matchTDEVersion: module not loaded!" ); ++ ++ int nVersionInfo = (*m_pTDEVersionCheckFunc)(); ++ if ( nVersionInfo < 0 ) ++ return eTooOld; ++ if ( nVersionInfo > 0 ) ++ return eToNew; ++ return eSupported; ++} ++ ++// -------------------------------------------------------------------------------- ++namespace ++{ ++ template< typename FUNCTION > ++ void lcl_getFunctionFromModuleOrUnload( oslModule& _rModule, const sal_Char* _pAsciiSymbolName, FUNCTION& _rFunction ) ++ { ++ _rFunction = NULL; ++ if ( _rModule ) ++ { ++ // ++ const ::rtl::OUString sSymbolName = ::rtl::OUString::createFromAscii( _pAsciiSymbolName ); ++ _rFunction = (FUNCTION)( osl_getSymbol( _rModule, sSymbolName.pData ) ); ++ ++ if ( !_rFunction ) ++ { // did not find the symbol ++ OSL_ENSURE( false, ::rtl::OString( "lcl_getFunctionFromModuleOrUnload: could not find the symbol " ) + ::rtl::OString( _pAsciiSymbolName ) ); ++ osl_unloadModule( _rModule ); ++ _rModule = NULL; ++ } ++ } ++ } ++} ++ ++// -------------------------------------------------------------------------------- ++extern "C" { void SAL_CALL thisModule() {} } ++ ++bool KabImplModule::impl_loadModule() ++{ ++ if ( m_bAttemptedLoadModule ) ++ return ( m_hConnectorModule != NULL ); ++ m_bAttemptedLoadModule = true; ++ ++ OSL_ENSURE( !m_hConnectorModule && !m_pConnectionFactoryFunc && !m_pApplicationInitFunc && !m_pApplicationShutdownFunc && !m_pTDEVersionCheckFunc, ++ "KabImplModule::impl_loadModule: inconsistence: inconsistency (never attempted load before, but some values already set)!"); ++ ++ const ::rtl::OUString sModuleName = ::rtl::OUString::createFromAscii( SAL_MODULENAME( "kabdrv1" ) ); ++ m_hConnectorModule = osl_loadModuleRelative( &thisModule, sModuleName.pData, SAL_LOADMODULE_NOW ); // LAZY! #i61335# ++ OSL_ENSURE( m_hConnectorModule, "KabImplModule::impl_loadModule: could not load the implementation library!" ); ++ if ( !m_hConnectorModule ) ++ return false; ++ ++ lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "createKabConnection", m_pConnectionFactoryFunc ); ++ lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "initKApplication", m_pApplicationInitFunc ); ++ lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "shutdownKApplication", m_pApplicationShutdownFunc ); ++ lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "matchTDEVersion", m_pTDEVersionCheckFunc ); ++ ++ if ( !m_hConnectorModule ) ++ // one of the symbols did not exist ++ throw RuntimeException(); ++ ++ return true; ++} ++ ++// -------------------------------------------------------------------------------- ++void KabImplModule::impl_unloadModule() ++{ ++ OSL_PRECOND( m_hConnectorModule != NULL, "KabImplModule::impl_unloadModule: no module!" ); ++ ++ osl_unloadModule( m_hConnectorModule ); ++ m_hConnectorModule = NULL; ++ ++ m_pConnectionFactoryFunc = NULL; ++ m_pApplicationInitFunc = NULL; ++ m_pApplicationShutdownFunc = NULL; ++ m_pTDEVersionCheckFunc = NULL; ++ ++ m_bAttemptedLoadModule = false; ++} ++ ++// -------------------------------------------------------------------------------- ++void KabImplModule::init() ++{ ++ if ( !impl_loadModule() ) ++ impl_throwNoKdeException(); ++ ++ // if we're not running on a supported version, throw ++ KabImplModule::TDEVersionType eTDEVersion = matchTDEVersion(); ++ ++ if ( eTDEVersion == eTooOld ) ++ impl_throwKdeTooOldException(); ++ ++ if ( ( eTDEVersion == eToNew ) && !impl_doAllowNewTDEVersion() ) ++ impl_throwKdeTooNewException(); ++ ++ if ( !m_bAttemptedInitialize ) ++ { ++ m_bAttemptedInitialize = true; ++ (*m_pApplicationInitFunc)(); ++ } ++} ++ ++// -------------------------------------------------------------------------------- ++bool KabImplModule::impl_doAllowNewTDEVersion() ++{ ++ try ++ { ++ Reference< XMultiServiceFactory > xConfigProvider( ++ m_xORB->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider" ) ) ), ++ UNO_QUERY_THROW ); ++ Sequence< Any > aCreationArgs(1); ++ aCreationArgs[0] <<= PropertyValue( ++ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) ), ++ 0, ++ makeAny( KabDriver::impl_getConfigurationSettingsPath() ), ++ PropertyState_DIRECT_VALUE ); ++ Reference< XPropertySet > xSettings( xConfigProvider->createInstanceWithArguments( ++ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" ) ), ++ aCreationArgs ), ++ UNO_QUERY_THROW ); ++ ++ sal_Bool bDisableCheck = sal_False; ++ xSettings->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableTDEMaximumVersionCheck" ) ) ) >>= bDisableCheck; ++ ++ return bDisableCheck != sal_False; ++ } ++ catch( const Exception& ) ++ { ++ DBG_UNHANDLED_EXCEPTION(); ++ } ++ return false; ++} ++ ++// -------------------------------------------------------------------------------- ++void KabImplModule::impl_throwNoKdeException() ++{ ++ ::connectivity::SharedResources aResources; ++ const ::rtl::OUString sError( aResources.getResourceString( ++ STR_NO_TDE_INST ++ ) ); ++ impl_throwGenericSQLException( sError ); ++} ++ ++// -------------------------------------------------------------------------------- ++void KabImplModule::impl_throwKdeTooOldException() ++{ ++ ::connectivity::SharedResources aResources; ++ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( ++ STR_TDE_VERSION_TOO_OLD, ++ "$major$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MAJOR), ++ "$minor$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MINOR) ++ ) ); ++ impl_throwGenericSQLException( sError ); ++} ++ ++// -------------------------------------------------------------------------------- ++void KabImplModule::impl_throwGenericSQLException( const ::rtl::OUString& _rMessage ) ++{ ++ SQLException aError; ++ aError.Message = _rMessage; ++ aError.SQLState = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "S1000" ) ); ++ aError.ErrorCode = 0; ++ throw aError; ++} ++ ++// -------------------------------------------------------------------------------- ++void KabImplModule::impl_throwKdeTooNewException() ++{ ++ ::connectivity::SharedResources aResources; ++ ++ SQLException aError; ++ aError.Message = aResources.getResourceStringWithSubstitution( ++ STR_TDE_VERSION_TOO_NEW, ++ "$major$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MAJOR), ++ "$minor$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MINOR) ++ ); ++ aError.SQLState = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "S1000" ) ); ++ aError.ErrorCode = 0; ++ ++ SQLContext aDetails; ++ ::rtl::OUStringBuffer aMessage; ++ aMessage.append( aResources.getResourceString(STR_TDE_VERSION_TOO_NEW_WORK_AROUND) ); ++ ++ aMessage.appendAscii( "Sub disableTDEMaxVersionCheck\n" ); ++ aMessage.appendAscii( " BasicLibraries.LoadLibrary( \"Tools\" )\n" ); ++ ++ aMessage.appendAscii( " Dim configNode as Object\n" ); ++ aMessage.appendAscii( " configNode = GetRegistryKeyContent( \"" ); ++ aMessage.append( KabDriver::impl_getConfigurationSettingsPath() ); ++ aMessage.appendAscii( "\", true )\n" ); ++ ++ aMessage.appendAscii( " configNode.DisableTDEMaximumVersionCheck = TRUE\n" ); ++ aMessage.appendAscii( " configNode.commitChanges\n" ); ++ aMessage.appendAscii( "End Sub\n" ); ++ ++ aDetails.Message = aMessage.makeStringAndClear(); ++ ++ aError.NextException <<= aDetails; ++ ++ throw aError; ++} ++ ++// -------------------------------------------------------------------------------- ++KabConnection* KabImplModule::createConnection( KabDriver* _pDriver ) const ++{ ++ OSL_PRECOND( m_hConnectorModule, "KabImplModule::createConnection: not initialized!" ); ++ ++ void* pUntypedConnection = (*m_pConnectionFactoryFunc)( _pDriver ); ++ if ( !pUntypedConnection ) ++ throw RuntimeException(); ++ ++ return static_cast< KabConnection* >( pUntypedConnection ); ++} ++ ++// -------------------------------------------------------------------------------- ++void KabImplModule::shutdown() ++{ ++ if ( !m_hConnectorModule ) ++ return; ++ ++ (*m_pApplicationShutdownFunc)(); ++ m_bAttemptedInitialize = false; ++ ++ impl_unloadModule(); ++} ++ ++// ======================================================================= ++// = KabDriver ++// ======================================================================= ++KabDriver::KabDriver( ++ const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) ++ : KDriver_BASE(m_aMutex), ++ m_xMSFactory(_rxFactory), ++ m_aImplModule(_rxFactory) ++{ ++ if ( !m_xMSFactory.is() ) ++ throw NullPointerException(); ++ ++ osl_incrementInterlockedCount( &m_refCount ); ++ try ++ { ++ Reference< XDesktop > xDesktop( ++ m_xMSFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ) ) ), ++ UNO_QUERY_THROW ); ++ xDesktop->addTerminateListener( this ); ++ } ++ catch( const Exception& ) ++ { ++ DBG_UNHANDLED_EXCEPTION(); ++ } ++ osl_decrementInterlockedCount( &m_refCount ); ++} ++// -------------------------------------------------------------------------------- ++void KabDriver::disposing() ++{ ++ ::osl::MutexGuard aGuard(m_aMutex); ++ ++ // when driver will be destroied so all our connections have to be destroied as well ++ for (OWeakRefArray::iterator i = m_xConnections.begin(); m_xConnections.end() != i; ++i) ++ { ++ Reference< XComponent > xComp(i->get(), UNO_QUERY); ++ if (xComp.is()) ++ xComp->dispose(); ++ } ++ m_xConnections.clear(); ++ ++ WeakComponentImplHelperBase::disposing(); ++} ++// static ServiceInfo ++//------------------------------------------------------------------------------ ++rtl::OUString KabDriver::getImplementationName_Static( ) throw(RuntimeException) ++{ ++ return rtl::OUString::createFromAscii( impl_getAsciiImplementationName() ); ++} ++//------------------------------------------------------------------------------ ++Sequence< ::rtl::OUString > KabDriver::getSupportedServiceNames_Static( ) throw (RuntimeException) ++{ ++ // which service is supported ++ // for more information @see com.sun.star.sdbc.Driver ++ Sequence< ::rtl::OUString > aSNS( 1 ); ++ aSNS[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.Driver"); ++ ++ return aSNS; ++} ++//------------------------------------------------------------------ ++::rtl::OUString SAL_CALL KabDriver::getImplementationName( ) throw(RuntimeException) ++{ ++ return getImplementationName_Static(); ++} ++//------------------------------------------------------------------ ++sal_Bool SAL_CALL KabDriver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException) ++{ ++ Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames()); ++ const ::rtl::OUString* pSupported = aSupported.getConstArray(); ++ const ::rtl::OUString* pEnd = pSupported + aSupported.getLength(); ++ ++ while (pSupported != pEnd && !pSupported->equals(_rServiceName)) ++ ++pSupported; ++ return pSupported != pEnd; ++} ++//------------------------------------------------------------------ ++Sequence< ::rtl::OUString > SAL_CALL KabDriver::getSupportedServiceNames( ) throw(RuntimeException) ++{ ++ return getSupportedServiceNames_Static(); ++} ++// -------------------------------------------------------------------------------- ++Reference< XConnection > SAL_CALL KabDriver::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard(m_aMutex); ++ ++ m_aImplModule.init(); ++ ++ // create a new connection with the given properties and append it to our vector ++ KabConnection* pConnection = m_aImplModule.createConnection( this ); ++ OSL_POSTCOND( pConnection, "KabDriver::connect: no connection has been created by the factory!" ); ++ ++ // by definition, the factory function returned an object which was acquired once ++ Reference< XConnection > xConnection = pConnection; ++ pConnection->release(); ++ ++ // late constructor call which can throw exception and allows a correct dtor call when so ++ pConnection->construct( url, info ); ++ ++ // remember it ++ m_xConnections.push_back( WeakReferenceHelper( *pConnection ) ); ++ ++ return xConnection; ++} ++// -------------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabDriver::acceptsURL( const ::rtl::OUString& url ) ++ throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard(m_aMutex); ++ ++ if ( !m_aImplModule.isTDEPresent() ) ++ return sal_False; ++ ++ // here we have to look whether we support this URL format ++ return (!url.compareTo(::rtl::OUString::createFromAscii("sdbc:address:kab:"), 16)); ++} ++// -------------------------------------------------------------------------------- ++Sequence< DriverPropertyInfo > SAL_CALL KabDriver::getPropertyInfo( const ::rtl::OUString&, const Sequence< PropertyValue >& ) throw(SQLException, RuntimeException) ++{ ++ // if you have something special to say, return it here :-) ++ return Sequence< DriverPropertyInfo >(); ++} ++// -------------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDriver::getMajorVersion( ) throw(RuntimeException) ++{ ++ return KAB_DRIVER_VERSION_MAJOR; ++} ++// -------------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabDriver::getMinorVersion( ) throw(RuntimeException) ++{ ++ return KAB_DRIVER_VERSION_MINOR; ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabDriver::queryTermination( const EventObject& ) throw (TerminationVetoException, RuntimeException) ++{ ++ // nothing to do, nothing to veto ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabDriver::notifyTermination( const EventObject& ) throw (RuntimeException) ++{ ++ m_aImplModule.shutdown(); ++} ++// -------------------------------------------------------------------------------- ++void SAL_CALL KabDriver::disposing( const EventObject& ) throw (RuntimeException) ++{ ++ // not interested in (this is the disposing of the desktop, if any) ++} ++// -------------------------------------------------------------------------------- ++const sal_Char* KabDriver::impl_getAsciiImplementationName() ++{ ++ return "com.sun.star.comp.sdbc.kab.Driver"; ++ // this name is referenced in the configuration and in the kab.xml ++ // Please be careful when changing it. ++} ++// -------------------------------------------------------------------------------- ++::rtl::OUString KabDriver::impl_getConfigurationSettingsPath() ++{ ++ ::rtl::OUStringBuffer aPath; ++ aPath.appendAscii( "/org.openoffice.Office.DataAccess/DriverSettings/" ); ++ aPath.appendAscii( "com.sun.star.comp.sdbc.kab.Driver" ); ++ return aPath.makeStringAndClear(); ++} ++// -------------------------------------------------------------------------------- ++Reference< XInterface > SAL_CALL KabDriver::Create( const Reference< XMultiServiceFactory >& _rxFactory ) throw( Exception ) ++{ ++ return *(new KabDriver(_rxFactory)); ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KDriver.hxx connectivity/source/drivers/tdeab/KDriver.hxx +--- connectivity/source/drivers/tdeab/KDriver.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KDriver.hxx 2011-08-17 14:27:57.178305442 -0500 +@@ -0,0 +1,227 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_DRIVER_HXX_ ++#define _CONNECTIVITY_KAB_DRIVER_HXX_ ++ ++/** === begin UNO includes === **/ ++#include ++#include ++#include ++/** === end UNO includes === **/ ++#include ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ class KabConnection; ++ class KabDriver; ++ ++ typedef void* (SAL_CALL * ConnectionFactoryFunction)( void* _pDriver ); ++ typedef void (SAL_CALL * ApplicationInitFunction)( void ); ++ typedef void (SAL_CALL * ApplicationShutdownFunction)( void ); ++ typedef int (SAL_CALL * TDEVersionCheckFunction)( void ); ++ ++ typedef std::vector< ::com::sun::star::uno::WeakReferenceHelper > OWeakRefArray; ++ ++ // =============================================================== ++ // = KabImplModule ++ // =============================================================== ++ class KabImplModule ++ { ++ private: ++ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > ++ m_xORB; ++ ++ /// Did we already attempt to load the module and to retrieve the symbols? ++ bool m_bAttemptedLoadModule; ++ /// Did we already check the TDE version and initialize the impl module (or at least attempted to)? ++ bool m_bAttemptedInitialize; ++ ++ oslModule m_hConnectorModule; ++ ConnectionFactoryFunction m_pConnectionFactoryFunc; ++ ApplicationInitFunction m_pApplicationInitFunc; ++ ApplicationShutdownFunction m_pApplicationShutdownFunc; ++ TDEVersionCheckFunction m_pTDEVersionCheckFunc; ++ ++ public: ++ KabImplModule( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory ); ++ ++ /** determines whether there is a TDE present in the environment ++ */ ++ bool isTDEPresent(); ++ ++ enum TDEVersionType ++ { ++ eTooOld, ++ eSupported, ++ eToNew ++ }; ++ /** checks whether the TDE version we're running against is supported ++ @precond ++ the module is loaded, i.e impl_loadModule has successfully been called ++ */ ++ TDEVersionType matchTDEVersion(); ++ ++ /** initializes the implementation module. ++ ++ @raises ::com::sun::star::uno::RuntimeException ++ if the module could be loaded, but required symbols are missing ++ @raises ::com::sun::star::sdbc::SQLException ++ if the TDE version we're running against is not supported, or no TDE was found at all ++ */ ++ void init(); ++ ++ /** shuts down the impl module (and the TDE application, if we own it) ++ */ ++ void shutdown(); ++ ++ /** creates a new connection ++ @precond ++ init has been called before ++ @raises ::com::sun::star::uno::RuntimeException ++ if no connection object could be created (which is a severe error, normally impossible) ++ */ ++ KabConnection* createConnection( KabDriver* _pDriver ) const; ++ ++ private: ++ /** loads the implementation module and retrieves the needed symbols ++ ++ Save against being called multiple times. ++ ++ @return if the module could be loaded successfully. ++ ++ @raises ::com::sun::star::uno::RuntimeException ++ if the module could be loaded, but required symbols are missing ++ */ ++ bool impl_loadModule(); ++ ++ /** unloads the implementation module, and resets all function pointers to ++ @precond m_hConnectorModule is not ++ */ ++ void impl_unloadModule(); ++ ++ /** throws an SQLException saying than no TDE installation was found ++ */ ++ void impl_throwNoKdeException(); ++ ++ /** throws an SQLException saying that the found TDE version is too old ++ */ ++ void impl_throwKdeTooOldException(); ++ ++ /** throws an SQLException saying that the found TDE version is too new ++ */ ++ void impl_throwKdeTooNewException(); ++ ++ /** throws a generic SQL exception with SQLState S1000 and error code 0 ++ */ ++ void impl_throwGenericSQLException( const ::rtl::OUString& _rMessage ); ++ ++ /** determines whether it's allowed to run on a too-new (not confirmed to work) version ++ */ ++ bool impl_doAllowNewTDEVersion(); ++ }; ++ ++ // =============================================================== ++ // = KabDriver ++ // =============================================================== ++ typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::sdbc::XDriver, ++ ::com::sun::star::lang::XServiceInfo, ++ ::com::sun::star::frame::XTerminateListener > KDriver_BASE; ++ class KabDriver : public KDriver_BASE ++ { ++ protected: ++ ::osl::Mutex m_aMutex; // mutex is need to control member access ++ OWeakRefArray m_xConnections; // vector containing a list of all the ++ // KabConnection objects for this Driver ++ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > ++ m_xMSFactory; // the multi-service factory ++ KabImplModule m_aImplModule; ++ ++ public: ++ static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception ); ++ ++ // XServiceInfo - static versions ++ static ::rtl::OUString getImplementationName_Static( ) throw(::com::sun::star::uno::RuntimeException); ++ static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static( ) throw (::com::sun::star::uno::RuntimeException); ++ ++ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ++ getMSFactory() const { return m_xMSFactory; } ++ ++ /** returns the driver's implementation name (being pure ASCII) for reference in various places ++ */ ++ static const sal_Char* impl_getAsciiImplementationName(); ++ ++ /** returns the path of our configuration settings ++ */ ++ static ::rtl::OUString impl_getConfigurationSettingsPath(); ++ ++ protected: ++ KabDriver(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory); ++ ++ // OComponentHelper ++ virtual void SAL_CALL disposing(void); ++ ++ // XServiceInfo ++ virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException); ++ ++ // XDriver ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL connect( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL acceptsURL( const ::rtl::OUString& url ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMajorVersion() throw(::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getMinorVersion() throw(::com::sun::star::uno::RuntimeException); ++ ++ // XTerminateListener ++ virtual void SAL_CALL queryTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::frame::TerminationVetoException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL notifyTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::uno::RuntimeException); ++ ++ // XEventListener ++ virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); ++ ++ private: ++ /** shuts down the library which contains the real implementations ++ ++ This method is safe against being called multiple times ++ ++ @precond our mutex is locked ++ */ ++ void impl_shutdownImplementationModule(); ++ }; ++ } ++ ++} ++ ++#endif // _CONNECTIVITY_KAB_DRIVER_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/kfields.cxx connectivity/source/drivers/tdeab/kfields.cxx +--- connectivity/source/drivers/tdeab/kfields.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/kfields.cxx 2011-08-17 14:27:40.557026383 -0500 +@@ -0,0 +1,98 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "kfields.hxx" ++#include "resource/common_res.hrc" ++#include "resource/sharedresources.hxx" ++ ++using namespace ::connectivity::kab; ++using namespace ::com::sun::star::sdbc; ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++// ----------------------------------------------------------------------------- ++// return the value of a TDE address book field, given an addressee and a field number ++QString valueOfKabField(const ::KABC::Addressee &aAddressee, sal_Int32 nFieldNumber) ++{ ++ switch (nFieldNumber) ++ { ++ case KAB_FIELD_REVISION: ++ return aAddressee.revision().toString("yyyy-MM-dd hh:mm:ss"); ++ default: ++ ::KABC::Field::List aFields = ::KABC::Field::allFields(); ++ return aFields[nFieldNumber - KAB_DATA_FIELDS]->value(aAddressee); ++ } ++} ++// ------------------------------------------------------------------------------ ++// search the TDE address book field number of a given column name ++sal_uInt32 findKabField(const ::rtl::OUString& columnName) throw(SQLException) ++{ ++ QString aQtName; ++ ::rtl::OUString aName; ++ ++ aQtName = KABC::Addressee::revisionLabel(); ++ aName = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); ++ if (columnName == aName) ++ return KAB_FIELD_REVISION; ++ ++ ::KABC::Field::List aFields = ::KABC::Field::allFields(); ++ ::KABC::Field::List::iterator aField; ++ sal_uInt32 nResult; ++ ++ for ( aField = aFields.begin(), nResult = KAB_DATA_FIELDS; ++ aField != aFields.end(); ++ ++aField, ++nResult) ++ { ++ aQtName = (*aField)->label(); ++ aName = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); ++ ++ if (columnName == aName) ++ return nResult; ++ } ++ ++ ::connectivity::SharedResources aResources; ++ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( ++ STR_INVALID_COLUMNNAME, ++ "$columnname$",columnName ++ ) ); ++ ::dbtools::throwGenericSQLException(sError,NULL); ++ // Unreachable: ++ OSL_ASSERT(false); ++ return 0; ++} ++// ------------------------------------------------------------------------------ ++ } ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/kfields.hxx connectivity/source/drivers/tdeab/kfields.hxx +--- connectivity/source/drivers/tdeab/kfields.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/kfields.hxx 2011-08-17 14:27:31.926362235 -0500 +@@ -0,0 +1,51 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_FIELDS_HXX_ ++#define _CONNECTIVITY_KAB_FIELDS_HXX_ ++ ++#include ++#include ++#include ++ ++#define KAB_FIELD_REVISION 0 ++#define KAB_DATA_FIELDS 1 ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ QString valueOfKabField(const ::KABC::Addressee &aAddressee, sal_Int32 nFieldNumber); ++ sal_uInt32 findKabField(const ::rtl::OUString& columnName) throw(::com::sun::star::sdbc::SQLException); ++ } ++} ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/korder.cxx connectivity/source/drivers/tdeab/korder.cxx +--- connectivity/source/drivers/tdeab/korder.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/korder.cxx 2011-08-17 14:27:22.785658823 -0500 +@@ -0,0 +1,92 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "korder.hxx" ++#include "kfields.hxx" ++ ++using namespace ::connectivity::kab; ++ ++KabOrder::~KabOrder() ++{ ++} ++// ----------------------------------------------------------------------------- ++KabSimpleOrder::KabSimpleOrder(::rtl::OUString &sColumnName, sal_Bool bAscending) ++ : KabOrder(), ++ m_nFieldNumber(findKabField(sColumnName)), ++ m_bAscending(bAscending) ++{ ++} ++// ----------------------------------------------------------------------------- ++sal_Int32 KabSimpleOrder::compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const ++{ ++ sal_Int32 result; ++ ++ result = QString::compare( ++ valueOfKabField(aAddressee1, m_nFieldNumber), ++ valueOfKabField(aAddressee2, m_nFieldNumber)); ++// Timestamps should be compared differently than with their string value ++ ++ if (!m_bAscending) result = -result; ++ ++ return result; ++} ++// ----------------------------------------------------------------------------- ++KabComplexOrder::KabComplexOrder() ++ : KabOrder(), ++ m_aOrders() ++{ ++} ++// ----------------------------------------------------------------------------- ++KabComplexOrder::~KabComplexOrder() ++{ ++ for (sal_uInt32 i = 0; i < m_aOrders.size(); i++) ++ delete m_aOrders[i]; ++} ++// ----------------------------------------------------------------------------- ++void KabComplexOrder::addOrder(KabOrder *pOrder) ++{ ++ m_aOrders.push_back(pOrder); ++} ++// ----------------------------------------------------------------------------- ++sal_Int32 KabComplexOrder::compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const ++{ ++ for (sal_uInt32 i = 0; i < m_aOrders.size(); i++) ++ { ++ const KabOrder *pOrder = m_aOrders[i]; ++ sal_Int32 result = pOrder->compare(aAddressee1, aAddressee2); ++ ++ if (result) return result; ++ } ++ return 0; ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/korder.hxx connectivity/source/drivers/tdeab/korder.hxx +--- connectivity/source/drivers/tdeab/korder.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/korder.hxx 2011-08-17 14:27:15.825123174 -0500 +@@ -0,0 +1,78 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_ORDER_HXX_ ++#define _CONNECTIVITY_KAB_ORDER_HXX_ ++ ++#include "rtl/ustring.hxx" ++#include ++ ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ class KabOrder ++ { ++ public: ++ virtual ~KabOrder(); ++ ++ virtual sal_Int32 compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const = 0; ++ }; ++ ++ class KabSimpleOrder : public KabOrder ++ { ++ sal_Int32 m_nFieldNumber; ++ sal_Bool m_bAscending; ++ ++ QString value(const ::KABC::Addressee &aAddressee) const; ++ public: ++ KabSimpleOrder(::rtl::OUString &sColumnName, sal_Bool bAscending); ++ ++ virtual sal_Int32 compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const; ++ }; ++ ++ class KabComplexOrder : public KabOrder ++ { ++ ::std::vector m_aOrders; ++ ++ public: ++ KabComplexOrder(); ++ virtual ~KabComplexOrder(); ++ ++ void addOrder(KabOrder *pOrder); ++ virtual sal_Int32 compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const; ++ }; ++ } ++} ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KPreparedStatement.cxx connectivity/source/drivers/tdeab/KPreparedStatement.cxx +--- connectivity/source/drivers/tdeab/KPreparedStatement.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KPreparedStatement.cxx 2011-08-17 14:27:09.434631390 -0500 +@@ -0,0 +1,394 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KPreparedStatement.hxx" ++#include "propertyids.hxx" ++#include ++#include ++#include "resource/tdeab_res.hrc" ++#include "resource/sharedresources.hxx" ++ ++using namespace connectivity::kab; ++using namespace com::sun::star::uno; ++using namespace com::sun::star::lang; ++using namespace com::sun::star::sdbc; ++using namespace com::sun::star::util; ++ ++IMPLEMENT_SERVICE_INFO(KabPreparedStatement, "com.sun.star.sdbc.drivers.KabPreparedStatement", "com.sun.star.sdbc.PreparedStatement"); ++// ------------------------------------------------------------------------- ++void KabPreparedStatement::checkAndResizeParameters(sal_Int32 nParams) throw(SQLException) ++{ ++ if ( !m_aParameterRow.is() ) ++ m_aParameterRow = new OValueVector(); ++ ++ if (nParams < 1) ++ ::dbtools::throwInvalidIndexException(*(KabPreparedStatement *) this,Any()); ++ ++ if (nParams >= (sal_Int32) (m_aParameterRow->get()).size()) ++ (m_aParameterRow->get()).resize(nParams); ++} ++// ------------------------------------------------------------------------- ++void KabPreparedStatement::setKabFields() const throw(SQLException) ++{ ++ ::rtl::Reference xColumns; // selected columns ++ ++ xColumns = m_aSQLIterator.getSelectColumns(); ++ if (!xColumns.is()) ++ { ++ ::connectivity::SharedResources aResources; ++ const ::rtl::OUString sError( aResources.getResourceString( ++ STR_INVALID_COLUMN_SELECTION ++ ) ); ++ ::dbtools::throwGenericSQLException(sError,NULL); ++ } ++ m_xMetaData->setKabFields(xColumns); ++} ++// ------------------------------------------------------------------------- ++void KabPreparedStatement::resetParameters() const throw(SQLException) ++{ ++ m_nParameterIndex = 0; ++} ++// ------------------------------------------------------------------------- ++void KabPreparedStatement::getNextParameter(::rtl::OUString &rParameter) const throw(SQLException) ++{ ++ if (m_nParameterIndex >= (sal_Int32) (m_aParameterRow->get()).size()) ++ { ++ ::connectivity::SharedResources aResources; ++ const ::rtl::OUString sError( aResources.getResourceString( ++ STR_INVALID_PARA_COUNT ++ ) ); ++ ::dbtools::throwGenericSQLException(sError,*(KabPreparedStatement *) this); ++ } // if (m_nParameterIndex >= (sal_Int32) (*m_aParameterRow).size()) ++ ++ rParameter = (m_aParameterRow->get())[m_nParameterIndex]; ++ ++ m_nParameterIndex++; ++} ++// ------------------------------------------------------------------------- ++KabPreparedStatement::KabPreparedStatement( ++ KabConnection* _pConnection, ++ const ::rtl::OUString& sql) ++ : KabPreparedStatement_BASE(_pConnection), ++ m_sSqlStatement(sql), ++ m_bPrepared(sal_False), ++ m_nParameterIndex(0), ++ m_aParameterRow() ++{ ++} ++// ------------------------------------------------------------------------- ++KabPreparedStatement::~KabPreparedStatement() ++{ ++} ++// ------------------------------------------------------------------------- ++void KabPreparedStatement::disposing() ++{ ++ KabPreparedStatement_BASE::disposing(); ++ ++ if (m_aParameterRow.is()) ++ { ++ m_aParameterRow->get().clear(); ++ m_aParameterRow = NULL; ++ } ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSetMetaData > SAL_CALL KabPreparedStatement::getMetaData() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ if (!m_xMetaData.is()) ++ { ++ m_xMetaData = new KabResultSetMetaData(getOwnConnection()); ++ setKabFields(); ++ } ++ Reference< XResultSetMetaData > xMetaData = m_xMetaData.get(); ++ return xMetaData; ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::close() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ // Reset last warning message ++ try { ++ clearWarnings (); ++ KabCommonStatement::close(); ++ } ++ catch (SQLException &) { ++ // If we get an error, ignore ++ } ++ ++ // Remove this Statement object from the Connection object's ++ // list ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabPreparedStatement::execute() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ Reference< XResultSet> xRS = KabCommonStatement::executeQuery(m_sSqlStatement); ++ ++ return xRS.is(); ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabPreparedStatement::executeUpdate() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ // same as in statement with the difference that this statement also can contain parameter ++ return 0; ++} ++// ------------------------------------------------------------------------- ++Reference< XConnection > SAL_CALL KabPreparedStatement::getConnection() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ return (Reference< XConnection >) m_pConnection; ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabPreparedStatement::executeQuery() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ Reference< XResultSet > rs = KabCommonStatement::executeQuery(m_sSqlStatement); ++ ++ return rs; ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setNull(sal_Int32 parameterIndex, sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ checkAndResizeParameters(parameterIndex); ++ ++ (m_aParameterRow->get())[parameterIndex - 1].setNull(); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setObjectNull(sal_Int32, sal_Int32, const ::rtl::OUString&) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setObjectNull", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setBoolean(sal_Int32, sal_Bool) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setBoolean", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setByte(sal_Int32, sal_Int8) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setByte", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setShort(sal_Int32, sal_Int16) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setShort", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setInt(sal_Int32, sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setInt", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setLong(sal_Int32, sal_Int64) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setFloat(sal_Int32, float) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setFloat", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setDouble(sal_Int32, double) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setDouble", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setString(sal_Int32 parameterIndex, const ::rtl::OUString &x) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ checkAndResizeParameters(parameterIndex); ++ ++ (m_aParameterRow->get())[parameterIndex - 1] = x; ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setBytes(sal_Int32, const Sequence< sal_Int8 >&) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setBytes", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setDate(sal_Int32, const Date&) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setDate", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setTime(sal_Int32, const Time&) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setTime", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setTimestamp(sal_Int32, const DateTime&) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setTimestamp", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setBinaryStream(sal_Int32, const Reference< ::com::sun::star::io::XInputStream >&, sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setBinaryStream", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setCharacterStream(sal_Int32, const Reference< ::com::sun::star::io::XInputStream >&, sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setCharacterStream", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setObject(sal_Int32 parameterIndex, const Any& x) throw(SQLException, RuntimeException) ++{ ++ if(!::dbtools::implSetObject(this,parameterIndex,x)) ++ { ++ throw SQLException(); ++ } ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setObjectWithInfo(sal_Int32, const Any&, sal_Int32, sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setObjectWithInfo", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setRef(sal_Int32, const Reference< XRef >&) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setRef", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setBlob(sal_Int32, const Reference< XBlob >&) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setBlob", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setClob(sal_Int32, const Reference< XClob >&) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setClob", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::setArray(sal_Int32, const Reference< XArray >&) throw(SQLException, RuntimeException) ++{ ++ ++ ++ ++::dbtools::throwFunctionNotSupportedException("setArray", NULL); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabPreparedStatement::clearParameters() throw(SQLException, RuntimeException) ++{ ++::dbtools::throwFunctionNotSupportedException("clearParameters", NULL); ++} ++// ------------------------------------------------------------------------- ++void KabPreparedStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) throw (Exception) ++{ ++ switch (nHandle) ++ { ++ case PROPERTY_ID_RESULTSETCONCURRENCY: ++ break; ++ case PROPERTY_ID_RESULTSETTYPE: ++ break; ++ case PROPERTY_ID_FETCHDIRECTION: ++ break; ++ case PROPERTY_ID_USEBOOKMARKS: ++ break; ++ default: ++ KabCommonStatement::setFastPropertyValue_NoBroadcast(nHandle,rValue); ++ } ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KPreparedStatement.hxx connectivity/source/drivers/tdeab/KPreparedStatement.hxx +--- connectivity/source/drivers/tdeab/KPreparedStatement.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KPreparedStatement.hxx 2011-08-17 14:27:04.434246577 -0500 +@@ -0,0 +1,123 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_ ++#define _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_ ++ ++#include "KStatement.hxx" ++#include "KResultSetMetaData.hxx" ++#include ++#include ++#include ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ ++ class OBoundParam; ++ typedef ::cppu::ImplInheritanceHelper4< KabCommonStatement, ++ ::com::sun::star::sdbc::XPreparedStatement, ++ ::com::sun::star::sdbc::XParameters, ++ ::com::sun::star::sdbc::XResultSetMetaDataSupplier, ++ ::com::sun::star::lang::XServiceInfo> KabPreparedStatement_BASE; ++ ++ class KabPreparedStatement : public KabPreparedStatement_BASE ++ { ++ protected: ++ ::rtl::OUString m_sSqlStatement; ++ ::rtl::Reference< KabResultSetMetaData > ++ m_xMetaData; ++ sal_Bool m_bPrepared; ++ mutable sal_Int32 m_nParameterIndex; ++ OValueRow m_aParameterRow; ++ ++ void checkAndResizeParameters(sal_Int32 nParams) throw(::com::sun::star::sdbc::SQLException); ++ void setKabFields() const throw(::com::sun::star::sdbc::SQLException); ++ ++ protected: ++ virtual void SAL_CALL setFastPropertyValue_NoBroadcast( ++ sal_Int32 nHandle, ++ const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::uno::Exception); ++ ++ virtual void resetParameters() const throw(::com::sun::star::sdbc::SQLException); ++ virtual void getNextParameter(::rtl::OUString &rParameter) const throw(::com::sun::star::sdbc::SQLException); ++ virtual ~KabPreparedStatement(); ++ ++ public: ++ DECLARE_SERVICE_INFO(); ++ KabPreparedStatement(KabConnection* _pConnection, const ::rtl::OUString& sql); ++ ++ // OComponentHelper ++ virtual void SAL_CALL disposing(); ++ ++ // XPreparedStatement ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL executeUpdate( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL execute( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XParameters ++ virtual void SAL_CALL setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const ::rtl::OUString& typeName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setBoolean( sal_Int32 parameterIndex, sal_Bool x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setByte( sal_Int32 parameterIndex, sal_Int8 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setShort( sal_Int32 parameterIndex, sal_Int16 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setInt( sal_Int32 parameterIndex, sal_Int32 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setLong( sal_Int32 parameterIndex, sal_Int64 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setFloat( sal_Int32 parameterIndex, float x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setDouble( sal_Int32 parameterIndex, double x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setString( sal_Int32 parameterIndex, const ::rtl::OUString& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setBytes( sal_Int32 parameterIndex, const ::com::sun::star::uno::Sequence< sal_Int8 >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setDate( sal_Int32 parameterIndex, const ::com::sun::star::util::Date& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setTime( sal_Int32 parameterIndex, const ::com::sun::star::util::Time& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setTimestamp( sal_Int32 parameterIndex, const ::com::sun::star::util::DateTime& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setBinaryStream( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setCharacterStream( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setObject( sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setObjectWithInfo( sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setRef( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setBlob( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL clearParameters( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XCloseable ++ virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XResultSetMetaDataSupplier ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KResultSet.cxx connectivity/source/drivers/tdeab/KResultSet.cxx +--- connectivity/source/drivers/tdeab/KResultSet.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KResultSet.cxx 2011-08-17 14:26:57.383703991 -0500 +@@ -0,0 +1,991 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KResultSet.hxx" ++#include "KResultSetMetaData.hxx" ++#include "KConnection.hxx" ++#include "kcondition.hxx" ++#include "korder.hxx" ++#include "kfields.hxx" ++#include ++#include ++#include "TConnection.hxx" ++#include ++#include "resource/tdeab_res.hrc" ++#include "resource/sharedresources.hxx" ++ ++using namespace connectivity::kab; ++using namespace cppu; ++using namespace com::sun::star::uno; ++using namespace com::sun::star::lang; ++using namespace com::sun::star::beans; ++using namespace com::sun::star::sdbc; ++using namespace com::sun::star::sdbcx; ++using namespace com::sun::star::io; ++using namespace com::sun::star::util; ++ ++IMPLEMENT_SERVICE_INFO(KabResultSet, "com.sun.star.sdbc.drivers.KabResultSet", "com.sun.star.sdbc.ResultSet"); ++// ------------------------------------------------------------------------- ++KabResultSet::KabResultSet(KabCommonStatement* pStmt) ++ : KabResultSet_BASE(m_aMutex), ++ OPropertySetHelper(KabResultSet_BASE::rBHelper), ++ m_xStatement(pStmt), ++ m_xMetaData(NULL), ++ m_aKabAddressees(), ++ m_nRowPos(-1), ++ m_bWasNull(sal_True) ++{ ++} ++// ------------------------------------------------------------------------- ++KabResultSet::~KabResultSet() ++{ ++} ++// ------------------------------------------------------------------------- ++void KabResultSet::allKabAddressees() ++{ ++ KabConnection* pConnection = static_cast< KabConnection *>(m_xStatement->getConnection().get()); ++ KABC::AddressBook* pAddressBook = pConnection->getAddressBook(); ++ ++ m_aKabAddressees = pAddressBook->allAddressees(); ++} ++// ------------------------------------------------------------------------- ++void KabResultSet::someKabAddressees(const KabCondition *pCondition) ++{ ++ KabConnection* pConnection = static_cast< KabConnection *>(m_xStatement->getConnection().get()); ++ KABC::AddressBook* pAddressBook = pConnection->getAddressBook(); ++ ++ KABC::AddressBook::Iterator iterator; ++ ++ for (iterator = pAddressBook->begin(); ++ iterator != pAddressBook->end(); ++ ++iterator) ++ { ++ if (pCondition->eval(*iterator)) ++ m_aKabAddressees.push_back(*iterator); ++ } ++} ++// ------------------------------------------------------------------------- ++void KabResultSet::sortKabAddressees(const KabOrder *pOrder) ++{ ++ // We do not use class KAddresseeList, which has a sorting algorithm in it, because ++ // it uses templates. It would expand to more or less the same code as the one ++ // which follows, but it would need not be called in a much less convenient way. ++ ++ KABC::Addressee::List::Iterator ++ begin = m_aKabAddressees.begin(), ++ end = m_aKabAddressees.end(), ++ iterator; ++ ++ // Bubble sort. Feel free to implement a better algorithm. ++ while (begin != end) ++ { ++ end--; ++ for (iterator = begin; iterator != end; ++iterator) ++ { ++ if (pOrder->compare(*iterator, *end) > 0) ++ qSwap(*iterator, *end); ++ } ++ } ++} ++// ------------------------------------------------------------------------- ++void KabResultSet::disposing() ++{ ++ OPropertySetHelper::disposing(); ++ ++ ::osl::MutexGuard aGuard(m_aMutex); ++ ++m_xStatement.clear(); ++m_xMetaData.clear(); ++} ++// ------------------------------------------------------------------------- ++Any SAL_CALL KabResultSet::queryInterface(const Type & rType) throw(RuntimeException) ++{ ++ Any aRet = OPropertySetHelper::queryInterface(rType); ++ if (!aRet.hasValue()) ++ aRet = KabResultSet_BASE::queryInterface(rType); ++ return aRet; ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::acquire() throw() ++{ ++ KabResultSet_BASE::acquire(); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::release() throw() ++{ ++ KabResultSet_BASE::release(); ++} ++// ------------------------------------------------------------------------- ++Sequence< Type > SAL_CALL KabResultSet::getTypes() throw(RuntimeException) ++{ ++ OTypeCollection aTypes( ++ ::getCppuType( (const Reference< ::com::sun::star::beans::XMultiPropertySet >*) 0), ++ ::getCppuType( (const Reference< ::com::sun::star::beans::XFastPropertySet >*) 0), ++ ::getCppuType( (const Reference< ::com::sun::star::beans::XPropertySet >*) 0)); ++ ++ return comphelper::concatSequences(aTypes.getTypes(), KabResultSet_BASE::getTypes()); ++} ++// ------------------------------------------------------------------------- ++::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL KabResultSet::getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException) ++{ ++ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()); ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSet::findColumn(const ::rtl::OUString& columnName) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ // find the first column with the name columnName ++ Reference< XResultSetMetaData > xMeta = getMetaData(); ++ sal_Int32 nLen = xMeta->getColumnCount(); ++ ++ for (sal_Int32 i = 1; i <= nLen; ++i) ++ if (xMeta->isCaseSensitive(i) ? ++ columnName == xMeta->getColumnName(i) : ++ columnName.equalsIgnoreAsciiCase(xMeta->getColumnName(i))) ++ return i; ++ ++ ::connectivity::SharedResources aResources; ++ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution( ++ STR_INVALID_COLUMNNAME, ++ "$columnname$",columnName ++ ) ); ++ ::dbtools::throwGenericSQLException(sError,NULL); ++ ++ // Unreachable: ++ OSL_ASSERT(false); ++ return 0; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabResultSet::getString(sal_Int32 columnIndex) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ ::rtl::OUString aRet; ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ ::KABC::Field::List aFields = ::KABC::Field::allFields(); ++ ++ if (m_nRowPos != -1 && m_nRowPos != nAddressees && m_xMetaData.is()) ++ { ++ sal_Int32 nFieldNumber = m_xMetaData->fieldAtColumn(columnIndex); ++ QString aQtName; ++ ++ switch (nFieldNumber) ++ { ++ case KAB_FIELD_REVISION: ++// trigger an exception here ++m_bWasNull = true; ++return aRet; ++ default: ++ aQtName = aFields[nFieldNumber - KAB_DATA_FIELDS]->value(m_aKabAddressees[m_nRowPos]); ++ } ++// TDE address book currently does not use NULL values. ++// But it might do it someday ++ if (!aQtName.isNull()) ++ { ++ m_bWasNull = false; ++ aRet = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); ++ return aRet; ++ } ++ } ++// Trigger an exception ? ++ m_bWasNull = true; ++ return aRet; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::getBoolean(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getBoolean", NULL); ++ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Int8 SAL_CALL KabResultSet::getByte(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getByte", NULL); ++ ++ sal_Int8 nRet = 0; ++ return nRet; ++} ++// ------------------------------------------------------------------------- ++sal_Int16 SAL_CALL KabResultSet::getShort(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getShort", NULL); ++ ++ sal_Int16 nRet = 0; ++ return nRet; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSet::getInt(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getInt", NULL); ++ ++ sal_Int32 nRet = 0; ++ return nRet; ++} ++// ------------------------------------------------------------------------- ++sal_Int64 SAL_CALL KabResultSet::getLong(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getLong", NULL); ++ ++ return sal_Int64(); ++} ++// ------------------------------------------------------------------------- ++float SAL_CALL KabResultSet::getFloat(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getFloat", NULL); ++ ++ float nVal(0); ++ return nVal; ++} ++// ------------------------------------------------------------------------- ++double SAL_CALL KabResultSet::getDouble(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getDouble", NULL); ++ ++ double nRet = 0; ++ return nRet; ++} ++// ------------------------------------------------------------------------- ++Sequence< sal_Int8 > SAL_CALL KabResultSet::getBytes(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("", NULL); ++ ++ return Sequence< sal_Int8 >(); ++} ++// ------------------------------------------------------------------------- ++Date SAL_CALL KabResultSet::getDate(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getDate", NULL); ++ ++ Date aRet; ++ return aRet; ++} ++// ------------------------------------------------------------------------- ++Time SAL_CALL KabResultSet::getTime(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getTime", NULL); ++ ++ Time nRet; ++ return nRet; ++} ++// ------------------------------------------------------------------------- ++DateTime SAL_CALL KabResultSet::getTimestamp(sal_Int32 columnIndex) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ DateTime nRet; ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ ++ if (m_nRowPos != -1 && m_nRowPos != nAddressees && m_xMetaData.is()) ++ { ++ KabResultSetMetaData *pMeta = static_cast(m_xMetaData.get()); ++ sal_Int32 nFieldNumber = pMeta->fieldAtColumn(columnIndex); ++ ++ if (nFieldNumber == KAB_FIELD_REVISION) ++ { ++ QDateTime nRevision(m_aKabAddressees[m_nRowPos].revision()); ++ ++ if (!nRevision.isNull()) ++ { ++ m_bWasNull = false; ++ nRet.Year = nRevision.date().year(); ++ nRet.Month = nRevision.date().month(); ++ nRet.Day = nRevision.date().day(); ++ nRet.Hours = nRevision.time().hour(); ++ nRet.Minutes = nRevision.time().minute(); ++ nRet.Seconds = nRevision.time().second(); ++ nRet.HundredthSeconds = nRevision.time().msec() / 10; ++ return nRet; ++ } ++ } ++ else { ++ ; ++ } ++// trigger an exception here ++ } ++// Trigger an exception ? ++ m_bWasNull = true; ++ return nRet; ++} ++// ------------------------------------------------------------------------- ++Reference< XInputStream > SAL_CALL KabResultSet::getBinaryStream(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getBinaryStream", NULL); ++ ++ return NULL; ++} ++// ------------------------------------------------------------------------- ++Reference< XInputStream > SAL_CALL KabResultSet::getCharacterStream(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getCharacterStream", NULL); ++ ++ return NULL; ++} ++// ------------------------------------------------------------------------- ++Any SAL_CALL KabResultSet::getObject(sal_Int32, const Reference< ::com::sun::star::container::XNameAccess >&) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getObject", NULL); ++ ++ return Any(); ++} ++// ------------------------------------------------------------------------- ++Reference< XRef > SAL_CALL KabResultSet::getRef(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getRef", NULL); ++ ++ return NULL; ++} ++// ------------------------------------------------------------------------- ++Reference< XBlob > SAL_CALL KabResultSet::getBlob(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getBlob", NULL); ++ ++ return NULL; ++} ++// ------------------------------------------------------------------------- ++Reference< XClob > SAL_CALL KabResultSet::getClob(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getClob", NULL); ++ ++ return NULL; ++} ++// ------------------------------------------------------------------------- ++Reference< XArray > SAL_CALL KabResultSet::getArray(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++::dbtools::throwFunctionNotSupportedException("getArray", NULL); ++ ++ return NULL; ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSetMetaData > SAL_CALL KabResultSet::getMetaData() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ if (!m_xMetaData.is()) ++ m_xMetaData = new KabResultSetMetaData(m_xStatement->getOwnConnection()); ++ ++ Reference< XResultSetMetaData > xMetaData = m_xMetaData.get(); ++ return xMetaData; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::isBeforeFirst() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ if (m_nRowPos == -1) ++ return sal_True; ++ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::isAfterLast() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ if (m_nRowPos == nAddressees) ++ return sal_True; ++ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::isFirst() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ if (m_nRowPos == 0) ++ return sal_True; ++ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::isLast() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ if (m_nRowPos == nAddressees - 1) ++ return sal_True; ++ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::beforeFirst() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ // move before the first row ++ m_nRowPos = -1; ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::afterLast() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ // move after the last row ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ m_nRowPos = nAddressees; ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::close() throw(SQLException, RuntimeException) ++{ ++ { ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ } ++ dispose(); ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::first() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ if (nAddressees == 0) ++ return sal_False; ++ ++ m_nRowPos = 0; ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::last() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ if (nAddressees == 0) ++ return sal_False; ++ ++ m_nRowPos = nAddressees - 1; ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSet::getRow() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ return m_nRowPos; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::absolute(sal_Int32 row) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ if (row <= -1 || ++ row >= nAddressees) ++ return sal_False; ++ ++ m_nRowPos = row; ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::relative(sal_Int32 row) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ return absolute(m_nRowPos + row); ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::next() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ return absolute(m_nRowPos + 1); ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::previous() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ return absolute(m_nRowPos - 1); ++} ++// ------------------------------------------------------------------------- ++Reference< XInterface > SAL_CALL KabResultSet::getStatement() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ Reference< XStatement > xStatement = m_xStatement.get(); ++ return xStatement; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::rowDeleted() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::rowInserted() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::rowUpdated() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::wasNull() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ return m_bWasNull; ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::cancel() throw(RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::clearWarnings() throw(SQLException, RuntimeException) ++{ ++} ++// ------------------------------------------------------------------------- ++Any SAL_CALL KabResultSet::getWarnings() throw(SQLException, RuntimeException) ++{ ++ return Any(); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::insertRow() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ // you only have to implement this if you want to insert new rows ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateRow() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ // only when you allow updates ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::deleteRow() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::cancelRowUpdates() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::moveToInsertRow() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ // only when you allow inserts ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::moveToCurrentRow() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateNull(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateBoolean(sal_Int32, sal_Bool) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateByte(sal_Int32, sal_Int8) throw(SQLException, RuntimeException) ++{ ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateShort(sal_Int32, sal_Int16) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateInt(sal_Int32, sal_Int32) throw(SQLException, RuntimeException) ++{ ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateLong(sal_Int32, sal_Int64) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ----------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateFloat(sal_Int32, float) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateDouble(sal_Int32, double) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateString(sal_Int32, const ::rtl::OUString&) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateBytes(sal_Int32, const Sequence< sal_Int8 >&) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateDate(sal_Int32, const Date&) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateTime(sal_Int32, const Time&) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateTimestamp(sal_Int32, const DateTime&) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateBinaryStream(sal_Int32, const Reference< XInputStream >&, sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateCharacterStream(sal_Int32, const Reference< XInputStream >&, sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::refreshRow() throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateObject(sal_Int32, const Any&) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabResultSet::updateNumericObject(sal_Int32, const Any&, sal_Int32) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++} ++// ------------------------------------------------------------------------- ++// XRowLocate ++Any SAL_CALL KabResultSet::getBookmark() throw( SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ ++ if (m_nRowPos != -1 && m_nRowPos != nAddressees) ++ { ++ QString aQtName = m_aKabAddressees[m_nRowPos].uid(); ++ ::rtl::OUString sUniqueIdentifier = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); ++ return makeAny(sUniqueIdentifier); ++ } ++ return Any(); ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::moveToBookmark(const Any& bookmark) throw( SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ ::rtl::OUString sBookmark = comphelper::getString(bookmark); ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ ++ for (sal_Int32 nRow = 0; nRow < nAddressees; nRow++) ++ { ++ QString aQtName = m_aKabAddressees[nRow].uid(); ++ ::rtl::OUString sUniqueIdentifier = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2()); ++ ++ if (sUniqueIdentifier == sBookmark) ++ { ++ m_nRowPos = nRow; ++ return sal_True; ++ } ++ } ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::moveRelativeToBookmark(const Any& bookmark, sal_Int32 rows) throw( SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ sal_Int32 nRowSave = m_nRowPos; ++ ++ if (moveToBookmark(bookmark)) ++ { ++ sal_Int32 nAddressees = m_aKabAddressees.size(); ++ ++ m_nRowPos += rows; ++ ++ if (-1 < m_nRowPos && m_nRowPos < nAddressees) ++ return sal_True; ++ } ++ ++ m_nRowPos = nRowSave; ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSet::compareBookmarks(const Any& firstItem, const Any& secondItem) throw( SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ ::rtl::OUString sFirst = comphelper::getString(firstItem); ++ ::rtl::OUString sSecond = comphelper::getString(secondItem); ++ ++ if (sFirst < sSecond) ++ return CompareBookmark::LESS; ++ if (sFirst > sSecond) ++ return CompareBookmark::GREATER; ++ return CompareBookmark::EQUAL; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSet::hasOrderedBookmarks() throw( SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSet::hashBookmark(const Any& bookmark) throw( SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ ::rtl::OUString sBookmark = comphelper::getString(bookmark); ++ ++ return sBookmark.hashCode(); ++} ++// ------------------------------------------------------------------------- ++// XDeleteRows ++Sequence< sal_Int32 > SAL_CALL KabResultSet::deleteRows(const Sequence< Any >&) throw( SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed); ++ ++ return Sequence< sal_Int32 >(); ++} ++// ------------------------------------------------------------------------- ++IPropertyArrayHelper* KabResultSet::createArrayHelper() const ++{ ++ Sequence< Property > aProps(6); ++ Property* pProperties = aProps.getArray(); ++ sal_Int32 nPos = 0; ++ DECL_PROP1IMPL(CURSORNAME, ::rtl::OUString) PropertyAttribute::READONLY); ++ DECL_PROP0(FETCHDIRECTION, sal_Int32); ++ DECL_PROP0(FETCHSIZE, sal_Int32); ++ DECL_BOOL_PROP1IMPL(ISBOOKMARKABLE) PropertyAttribute::READONLY); ++ DECL_PROP1IMPL(RESULTSETCONCURRENCY,sal_Int32) PropertyAttribute::READONLY); ++ DECL_PROP1IMPL(RESULTSETTYPE, sal_Int32) PropertyAttribute::READONLY); ++ ++ return new OPropertyArrayHelper(aProps); ++} ++// ------------------------------------------------------------------------- ++IPropertyArrayHelper & KabResultSet::getInfoHelper() ++{ ++ return *static_cast(this)->getArrayHelper(); ++} ++// ------------------------------------------------------------------------- ++sal_Bool KabResultSet::convertFastPropertyValue( ++ Any &, ++ Any &, ++ sal_Int32 nHandle, ++ const Any& ) ++ throw (::com::sun::star::lang::IllegalArgumentException) ++{ ++ switch (nHandle) ++ { ++ case PROPERTY_ID_ISBOOKMARKABLE: ++ case PROPERTY_ID_CURSORNAME: ++ case PROPERTY_ID_RESULTSETCONCURRENCY: ++ case PROPERTY_ID_RESULTSETTYPE: ++ throw ::com::sun::star::lang::IllegalArgumentException(); ++ break; ++ case PROPERTY_ID_FETCHDIRECTION: ++ case PROPERTY_ID_FETCHSIZE: ++ default: ++ ; ++ } ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++void KabResultSet::setFastPropertyValue_NoBroadcast( ++ sal_Int32 nHandle, ++ const Any& ) ++ throw (Exception) ++{ ++ switch (nHandle) ++ { ++ case PROPERTY_ID_ISBOOKMARKABLE: ++ case PROPERTY_ID_CURSORNAME: ++ case PROPERTY_ID_RESULTSETCONCURRENCY: ++ case PROPERTY_ID_RESULTSETTYPE: ++ throw Exception(); ++ break; ++ case PROPERTY_ID_FETCHDIRECTION: ++ break; ++ case PROPERTY_ID_FETCHSIZE: ++ break; ++ default: ++ ; ++ } ++} ++// ------------------------------------------------------------------------- ++void KabResultSet::getFastPropertyValue( ++ Any& _rValue, ++ sal_Int32 nHandle) const ++{ ++ switch (nHandle) ++ { ++ case PROPERTY_ID_ISBOOKMARKABLE: ++ _rValue <<= (sal_Bool)sal_False; ++ break; ++ case PROPERTY_ID_CURSORNAME: ++ case PROPERTY_ID_RESULTSETCONCURRENCY: ++ case PROPERTY_ID_RESULTSETTYPE: ++ case PROPERTY_ID_FETCHDIRECTION: ++ case PROPERTY_ID_FETCHSIZE: ++ ; ++ } ++} ++// ----------------------------------------------------------------------------- ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KResultSet.hxx connectivity/source/drivers/tdeab/KResultSet.hxx +--- connectivity/source/drivers/tdeab/KResultSet.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KResultSet.hxx 2011-08-17 14:26:47.312928966 -0500 +@@ -0,0 +1,228 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_RESULTSET_HXX_ ++#define _CONNECTIVITY_KAB_RESULTSET_HXX_ ++ ++#include "KStatement.hxx" ++#include "KResultSetMetaData.hxx" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ /* ++ ** KabResultSet ++ */ ++ typedef ::cppu::WeakComponentImplHelper12< ::com::sun::star::sdbc::XResultSet, ++ ::com::sun::star::sdbc::XRow, ++ ::com::sun::star::sdbc::XResultSetMetaDataSupplier, ++ ::com::sun::star::util::XCancellable, ++ ::com::sun::star::sdbc::XWarningsSupplier, ++ ::com::sun::star::sdbc::XResultSetUpdate, ++ ::com::sun::star::sdbc::XRowUpdate, ++ ::com::sun::star::sdbcx::XRowLocate, ++ ::com::sun::star::sdbcx::XDeleteRows, ++ ::com::sun::star::sdbc::XCloseable, ++ ::com::sun::star::sdbc::XColumnLocate, ++ ::com::sun::star::lang::XServiceInfo> KabResultSet_BASE; ++ ++ class KabResultSet : public comphelper::OBaseMutex, ++ public KabResultSet_BASE, ++ public ::cppu::OPropertySetHelper, ++ public comphelper::OPropertyArrayUsageHelper ++ { ++ protected: ++ ::rtl::Reference< KabCommonStatement > m_xStatement; // the statement that has created this result set ++ ::rtl::Reference< KabResultSetMetaData > m_xMetaData; // the description of the columns in this result set ++ ::KABC::Addressee::List m_aKabAddressees; // address book entries matching the query ++ sal_Int32 m_nRowPos; // the current row within the result set ++ sal_Bool m_bWasNull; // last entry retrieved from this result set was NULL ++ ++ // OPropertyArrayUsageHelper ++ virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; ++ ++ // OPropertySetHelper ++ virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); ++ ++ virtual sal_Bool SAL_CALL convertFastPropertyValue( ++ ::com::sun::star::uno::Any & rConvertedValue, ++ ::com::sun::star::uno::Any & rOldValue, ++ sal_Int32 nHandle, ++ const ::com::sun::star::uno::Any& rValue) ++ throw (::com::sun::star::lang::IllegalArgumentException); ++ virtual void SAL_CALL setFastPropertyValue_NoBroadcast( ++ sal_Int32 nHandle, ++ const ::com::sun::star::uno::Any& rValue) ++ throw (::com::sun::star::uno::Exception); ++ virtual void SAL_CALL getFastPropertyValue( ++ ::com::sun::star::uno::Any& rValue, ++ sal_Int32 nHandle) const; ++ ++ // you can't delete objects of this type ++ virtual ~KabResultSet(); ++ ++ public: ++ DECLARE_SERVICE_INFO(); ++ ++ KabResultSet(KabCommonStatement *pStmt); ++ ++ ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > operator *() ++ { ++ return ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >(*(KabResultSet_BASE*) this); ++ } ++ ++ void allKabAddressees(); ++ void someKabAddressees(const class KabCondition *pCondition); ++ void sortKabAddressees(const class KabOrder *pOrder); ++ ++ // ::cppu::OComponentHelper ++ virtual void SAL_CALL disposing(void); ++ ++ // XInterface ++ virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL acquire() throw(); ++ virtual void SAL_CALL release() throw(); ++ ++ // XTypeProvider ++ virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); ++ ++ // XPropertySet ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); ++ ++ // XResultSet ++ virtual sal_Bool SAL_CALL isBeforeFirst( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isAfterLast( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isFirst( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isLast( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL beforeFirst( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL afterLast( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL first( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL last( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL next( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL previous( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL refreshRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL rowUpdated( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL rowInserted( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL rowDeleted( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getStatement( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XRow ++ virtual sal_Bool SAL_CALL wasNull( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getString( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XResultSetMetaDataSupplier ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XCancellable ++ virtual void SAL_CALL cancel( ) throw(::com::sun::star::uno::RuntimeException); ++ ++ // XCloseable ++ virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XWarningsSupplier ++ virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL clearWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XResultSetUpdate ++ virtual void SAL_CALL insertRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL deleteRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL cancelRowUpdates( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL moveToInsertRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL moveToCurrentRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ // XRowUpdate ++ virtual void SAL_CALL updateNull( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateBoolean( sal_Int32 columnIndex, sal_Bool x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateByte( sal_Int32 columnIndex, sal_Int8 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateShort( sal_Int32 columnIndex, sal_Int16 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateInt( sal_Int32 columnIndex, sal_Int32 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateLong( sal_Int32 columnIndex, sal_Int64 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateFloat( sal_Int32 columnIndex, float x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateDouble( sal_Int32 columnIndex, double x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateString( sal_Int32 columnIndex, const ::rtl::OUString& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateBytes( sal_Int32 columnIndex, const ::com::sun::star::uno::Sequence< sal_Int8 >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateDate( sal_Int32 columnIndex, const ::com::sun::star::util::Date& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateTime( sal_Int32 columnIndex, const ::com::sun::star::util::Time& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateTimestamp( sal_Int32 columnIndex, const ::com::sun::star::util::DateTime& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateBinaryStream( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateCharacterStream( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Any& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL updateNumericObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Any& x, sal_Int32 scale ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XColumnLocate ++ virtual sal_Int32 SAL_CALL findColumn( const ::rtl::OUString& columnName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XRowLocate ++ virtual ::com::sun::star::uno::Any SAL_CALL getBookmark( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL moveToBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL moveRelativeToBookmark( const ::com::sun::star::uno::Any& bookmark, sal_Int32 rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL compareBookmarks( const ::com::sun::star::uno::Any& firstItem, const ::com::sun::star::uno::Any& secondItem ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL hasOrderedBookmarks( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL hashBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XDeleteRows ++ virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL deleteRows( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_RESULTSET_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KResultSetMetaData.cxx connectivity/source/drivers/tdeab/KResultSetMetaData.cxx +--- connectivity/source/drivers/tdeab/KResultSetMetaData.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KResultSetMetaData.cxx 2011-08-17 14:26:20.900896322 -0500 +@@ -0,0 +1,191 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KResultSetMetaData.hxx" ++#include "kfields.hxx" ++#include "KDatabaseMetaData.hxx" ++#include ++ ++using namespace connectivity::kab; ++using namespace com::sun::star::uno; ++using namespace com::sun::star::lang; ++using namespace com::sun::star::sdbc; ++ ++KabResultSetMetaData::KabResultSetMetaData(KabConnection* _pConnection) ++ : m_pConnection(_pConnection), ++ m_aKabFields() ++{ ++} ++// ------------------------------------------------------------------------- ++KabResultSetMetaData::~KabResultSetMetaData() ++{ ++} ++// ------------------------------------------------------------------------- ++void KabResultSetMetaData::setKabFields(const ::rtl::Reference &xColumns) throw(SQLException) ++{ ++ OSQLColumns::Vector::const_iterator aIter; ++ static const ::rtl::OUString aName(::rtl::OUString::createFromAscii("Name")); ++ ++ for (aIter = xColumns->get().begin(); aIter != xColumns->get().end(); ++aIter) ++ { ++ ::rtl::OUString aFieldName; ++ sal_uInt32 nFieldNumber; ++ ++ (*aIter)->getPropertyValue(aName) >>= aFieldName; ++ nFieldNumber = findKabField(aFieldName); ++ m_aKabFields.push_back(nFieldNumber); ++ } ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSetMetaData::getColumnDisplaySize(sal_Int32 column) throw(SQLException, RuntimeException) ++{ ++ return m_aKabFields[column - 1] < KAB_DATA_FIELDS? 20: 50; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSetMetaData::getColumnType(sal_Int32 column) throw(SQLException, RuntimeException) ++{ ++ return m_aKabFields[column - 1] == KAB_FIELD_REVISION? DataType::TIMESTAMP: DataType::CHAR; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSetMetaData::getColumnCount() throw(SQLException, RuntimeException) ++{ ++ return m_aKabFields.size(); ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSetMetaData::isCaseSensitive(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabResultSetMetaData::getSchemaName(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return ::rtl::OUString(); ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnName(sal_Int32 column) throw(SQLException, RuntimeException) ++{ ++ sal_uInt32 nFieldNumber = m_aKabFields[column - 1]; ++ ::KABC::Field::List aFields = ::KABC::Field::allFields(); ++ QString aQtName; ++ ++ switch (nFieldNumber) ++ { ++ case KAB_FIELD_REVISION: ++ aQtName = KABC::Addressee::revisionLabel(); ++ break; ++ default: ++ aQtName = aFields[nFieldNumber - KAB_DATA_FIELDS]->label(); ++ } ++ ::rtl::OUString aName((const sal_Unicode *) aQtName.ucs2()); ++ ++ return aName; ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabResultSetMetaData::getTableName(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return KabDatabaseMetaData::getAddressBookTableName(); ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabResultSetMetaData::getCatalogName(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return ::rtl::OUString(); ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnTypeName(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return ::rtl::OUString(); ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnLabel(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return ::rtl::OUString(); ++} ++// ------------------------------------------------------------------------- ++::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnServiceName(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return ::rtl::OUString(); ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSetMetaData::isCurrency(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSetMetaData::isAutoIncrement(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSetMetaData::isSigned(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSetMetaData::getPrecision(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return 0; ++} ++// ----------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSetMetaData::getScale(sal_Int32) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ++{ ++ return 0; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabResultSetMetaData::isNullable(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return (sal_Int32) sal_True; ++// TDE address book currently does not use NULL values. ++// But it might do it someday ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSetMetaData::isSearchable(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSetMetaData::isReadOnly(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return sal_True; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSetMetaData::isDefinitelyWritable(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabResultSetMetaData::isWritable(sal_Int32) throw(SQLException, RuntimeException) ++{ ++ return sal_False; ++} ++// ------------------------------------------------------------------------- ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KResultSetMetaData.hxx connectivity/source/drivers/tdeab/KResultSetMetaData.hxx +--- connectivity/source/drivers/tdeab/KResultSetMetaData.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KResultSetMetaData.hxx 2011-08-17 14:26:13.350315217 -0500 +@@ -0,0 +1,95 @@ ++/* -*- 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_ ++#define _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_ ++ ++#include "KConnection.hxx" ++#include ++#include ++#include ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ /* ++ ** KabResultSetMetaData ++ */ ++ typedef ::cppu::WeakImplHelper1< ::com::sun::star::sdbc::XResultSetMetaData> KabResultSetMetaData_BASE; ++ ++ class KabResultSetMetaData : public KabResultSetMetaData_BASE ++ { ++ KabConnection* m_pConnection; ++ ::std::vector m_aKabFields; // for each selected column, contains the number ++ // of the corresponding KAddressBook field ++ ++ protected: ++ virtual ~KabResultSetMetaData(); ++ ++ public: ++ KabResultSetMetaData(KabConnection* _pConnection); ++ ++ // avoid ambigous cast error from the compiler ++ inline operator ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > () throw() ++ { return this; } ++ ++ void setKabFields( ++ const ::rtl::Reference &xColumns) throw(::com::sun::star::sdbc::SQLException); ++ inline sal_uInt32 fieldAtColumn(sal_Int32 columnIndex) const ++ { return m_aKabFields[columnIndex - 1]; } ++ ++ virtual sal_Int32 SAL_CALL getColumnCount( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isAutoIncrement( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isCaseSensitive( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isSearchable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isCurrency( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL isNullable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isSigned( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getColumnDisplaySize( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getColumnLabel( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getColumnName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getSchemaName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getPrecision( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getScale( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getTableName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getCatalogName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getColumnType( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getColumnTypeName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isReadOnly( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isWritable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL isDefinitelyWritable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getColumnServiceName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KServices.cxx connectivity/source/drivers/tdeab/KServices.cxx +--- connectivity/source/drivers/tdeab/KServices.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KServices.cxx 2011-08-17 14:26:08.609950397 -0500 +@@ -0,0 +1,180 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KDriver.hxx" ++#include ++#include ++ ++using namespace connectivity::kab; ++using ::rtl::OUString; ++using ::com::sun::star::uno::Reference; ++using ::com::sun::star::uno::Sequence; ++using ::com::sun::star::registry::XRegistryKey; ++using ::com::sun::star::lang::XSingleServiceFactory; ++using ::com::sun::star::lang::XMultiServiceFactory; ++ ++typedef Reference< XSingleServiceFactory > (SAL_CALL *createFactoryFunc) ++ ( ++ const Reference< XMultiServiceFactory > & rServiceManager, ++ const OUString & rComponentName, ++ ::cppu::ComponentInstantiation pCreateFunction, ++ const Sequence< OUString > & rServiceNames, ++ rtl_ModuleCount* _pTemp ++ ); ++ ++//*************************************************************************************** ++// ++// The following C Api must be provided! ++// It consists in three functions that must be exported by the module ++// ++ ++//--------------------------------------------------------------------------------------- ++void REGISTER_PROVIDER( ++ const OUString& aServiceImplName, ++ const Sequence< OUString>& Services, ++ const Reference< ::com::sun::star::registry::XRegistryKey > & xKey) ++{ ++ OUString aMainKeyName; ++ aMainKeyName = OUString::createFromAscii("/"); ++ aMainKeyName += aServiceImplName; ++ aMainKeyName += OUString::createFromAscii("/UNO/SERVICES"); ++ ++ Reference< ::com::sun::star::registry::XRegistryKey > xNewKey( xKey->createKey(aMainKeyName) ); ++ OSL_ENSURE(xNewKey.is(), "KAB::component_writeInfo : could not create a registry key !"); ++ ++ for (sal_Int32 i=0; icreateKey(Services[i]); ++} ++ ++ ++//--------------------------------------------------------------------------------------- ++struct ProviderRequest ++{ ++ Reference< XSingleServiceFactory > xRet; ++ Reference< XMultiServiceFactory > const xServiceManager; ++ OUString const sImplementationName; ++ ++ ProviderRequest( ++ void* pServiceManager, ++ sal_Char const* pImplementationName ++ ) ++ : xServiceManager(reinterpret_cast(pServiceManager)) ++ , sImplementationName(OUString::createFromAscii(pImplementationName)) ++ { ++ } ++ ++ inline ++ sal_Bool CREATE_PROVIDER( ++ const OUString& Implname, ++ const Sequence< OUString > & Services, ++ ::cppu::ComponentInstantiation Factory, ++ createFactoryFunc creator ++ ) ++ { ++ if (!xRet.is() && (Implname == sImplementationName)) ++ try ++ { ++ xRet = creator( xServiceManager, sImplementationName,Factory, Services,0); ++ } ++ catch(...) ++ { ++ } ++ return xRet.is(); ++ } ++ ++ void* getProvider() const { return xRet.get(); } ++}; ++ ++//--------------------------------------------------------------------------------------- ++ ++extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( ++ const sal_Char **ppEnvTypeName, ++ uno_Environment ** ++ ) ++{ ++ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; ++} ++ ++//--------------------------------------------------------------------------------------- ++extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo( ++ void*, ++ void* pRegistryKey ++ ) ++{ ++ if (pRegistryKey) ++ try ++ { ++ Reference< ::com::sun::star::registry::XRegistryKey > xKey(reinterpret_cast< ::com::sun::star::registry::XRegistryKey*>(pRegistryKey)); ++ ++ REGISTER_PROVIDER( ++ KabDriver::getImplementationName_Static(), ++ KabDriver::getSupportedServiceNames_Static(), xKey); ++ ++ return sal_True; ++ } ++ catch (::com::sun::star::registry::InvalidRegistryException& ) ++ { ++ OSL_ENSURE(sal_False, "KAB::component_writeInfo : could not create a registry key ! ## InvalidRegistryException !"); ++ } ++ ++ return sal_False; ++} ++ ++//--------------------------------------------------------------------------------------- ++extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( ++ const sal_Char* pImplementationName, ++ void* pServiceManager, ++ void*) ++{ ++ void* pRet = 0; ++ if (pServiceManager) ++ { ++ ProviderRequest aReq(pServiceManager,pImplementationName); ++ ++ aReq.CREATE_PROVIDER( ++ KabDriver::getImplementationName_Static(), ++ KabDriver::getSupportedServiceNames_Static(), ++ &KabDriver::Create, ++ ::cppu::createSingleFactory) ++ ; ++ ++ if (aReq.xRet.is()) ++ aReq.xRet->acquire(); ++ ++ pRet = aReq.getProvider(); ++ } ++ ++ return pRet; ++}; ++ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KStatement.cxx connectivity/source/drivers/tdeab/KStatement.cxx +--- connectivity/source/drivers/tdeab/KStatement.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KStatement.cxx 2011-08-17 14:26:01.429397755 -0500 +@@ -0,0 +1,588 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KStatement.hxx" ++#include "KConnection.hxx" ++#include "KDriver.hxx" ++#include "KResultSet.hxx" ++#include "KResultSetMetaData.hxx" ++#include "kcondition.hxx" ++#include "korder.hxx" ++#include "TConnection.hxx" ++#include ++#include "resource/tdeab_res.hrc" ++#include "resource/sharedresources.hxx" ++ ++ ++#if OSL_DEBUG_LEVEL > 0 ++# define OUtoCStr( x ) ( ::rtl::OUStringToOString ( (x), RTL_TEXTENCODING_ASCII_US).getStr()) ++#else /* OSL_DEBUG_LEVEL */ ++# define OUtoCStr( x ) ("dummy") ++#endif /* OSL_DEBUG_LEVEL */ ++ ++using namespace connectivity::kab; ++using namespace com::sun::star::uno; ++using namespace com::sun::star::lang; ++using namespace com::sun::star::beans; ++using namespace com::sun::star::sdbc; ++using namespace com::sun::star::sdbcx; ++using namespace com::sun::star::container; ++using namespace com::sun::star::io; ++using namespace com::sun::star::util; ++ ++namespace ++{ ++ void lcl_throwError(sal_uInt16 _nErrorId) ++ { ++ ::connectivity::SharedResources aResources; ++ const ::rtl::OUString sError( aResources.getResourceString(_nErrorId) ); ++ ::dbtools::throwGenericSQLException(sError,NULL); ++ } ++} ++ ++IMPLEMENT_SERVICE_INFO(KabStatement, "com.sun.star.sdbc.drivers.KabStatement", "com.sun.star.sdbc.Statement"); ++//------------------------------------------------------------------------------ ++KabCommonStatement::KabCommonStatement(KabConnection* _pConnection ) ++ : KabCommonStatement_BASE(m_aMutex), ++ OPropertySetHelper(KabCommonStatement_BASE::rBHelper), ++ m_aParser(_pConnection->getDriver()->getMSFactory()), ++ m_aSQLIterator(_pConnection, _pConnection->createCatalog()->getTables(), m_aParser, NULL ), ++ m_pParseTree(NULL), ++ m_pConnection(_pConnection), ++ rBHelper(KabCommonStatement_BASE::rBHelper) ++{ ++ m_pConnection->acquire(); ++} ++// ----------------------------------------------------------------------------- ++KabCommonStatement::~KabCommonStatement() ++{ ++} ++// ----------------------------------------------------------------------------- ++void KabCommonStatement::disposing() ++{ ++ KabCommonStatement_BASE::disposing(); ++} ++// ----------------------------------------------------------------------------- ++void KabCommonStatement::resetParameters() const throw(::com::sun::star::sdbc::SQLException) ++{ ++ lcl_throwError(STR_PARA_ONLY_PREPARED); ++} ++// ----------------------------------------------------------------------------- ++void KabCommonStatement::getNextParameter(::rtl::OUString &) const throw(::com::sun::star::sdbc::SQLException) ++{ ++ lcl_throwError(STR_PARA_ONLY_PREPARED); ++} ++// ----------------------------------------------------------------------------- ++KabCondition *KabCommonStatement::analyseWhereClause(const OSQLParseNode *pParseNode) const throw(SQLException) ++{ ++ if (pParseNode->count() == 3) ++ { ++ const OSQLParseNode *pLeft = pParseNode->getChild(0), ++ *pMiddle = pParseNode->getChild(1), ++ *pRight = pParseNode->getChild(2); ++ ++ // WHERE ( ... ) ? ++ if (SQL_ISPUNCTUATION(pLeft, "(") && SQL_ISPUNCTUATION(pRight, ")")) ++ { ++ return analyseWhereClause(pMiddle); ++ } ++ else if (SQL_ISRULE(pParseNode, comparison_predicate)) ++ { ++ if (pLeft->isToken() && pRight->isToken()) ++ { ++ switch (pMiddle->getNodeType()) ++ { ++ case SQL_NODE_EQUAL: ++ // WHERE 0 = 1 ++ return new KabConditionConstant(pLeft->getTokenValue() == pRight->getTokenValue()); ++ ++ case SQL_NODE_NOTEQUAL: ++ // WHERE 0 <> 1 ++ // (might not be correct SQL... don't care, handling anyway) ++ return new KabConditionConstant(pLeft->getTokenValue() != pRight->getTokenValue()); ++ ++ default: ++ break; ++ } ++ } ++ else if (SQL_ISRULE(pLeft, column_ref)) ++ { ++ ::rtl::OUString sColumnName, ++ sTableRange; ++ ++ m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange); ++ ++ if (pRight->isToken() || SQL_ISRULE(pRight, parameter)) ++ { ++ ::rtl::OUString sMatchString; ++ ++ if (pRight->isToken()) // WHERE Name = 'Doe' ++ sMatchString = pRight->getTokenValue(); ++ else if (SQL_ISRULE(pRight, parameter)) // WHERE Name = ? ++ getNextParameter(sMatchString); ++ ++ switch (pMiddle->getNodeType()) ++ { ++ case SQL_NODE_EQUAL: ++ // WHERE Name = 'Smith' ++ return new KabConditionEqual(sColumnName, sMatchString); ++ ++ case SQL_NODE_NOTEQUAL: ++ // WHERE Name <> 'Jones' ++ return new KabConditionDifferent(sColumnName, sMatchString); ++ ++ default: ++ break; ++ } ++ } ++ } ++ } ++ else if (SQL_ISRULE(pParseNode, search_condition)) ++ { ++ if (SQL_ISTOKEN(pMiddle, OR)) ++ { ++ // WHERE Name = 'Smith' OR Name = 'Jones' ++ return new KabConditionOr( ++ analyseWhereClause(pLeft), ++ analyseWhereClause(pRight)); ++ } ++ } ++ else if (SQL_ISRULE(pParseNode, boolean_term)) ++ { ++ if (SQL_ISTOKEN(pMiddle, AND)) ++ { ++ // WHERE Name = 'Smith' AND "Given Name" = 'Peter' ++ return new KabConditionAnd( ++ analyseWhereClause(pLeft), ++ analyseWhereClause(pRight)); ++ } ++ } ++ } ++ else if (SQL_ISRULE(pParseNode, test_for_null) || SQL_ISRULE(pParseNode, like_predicate)) ++ { ++ const OSQLParseNode *pLeft = pParseNode->getChild(0); ++ const OSQLParseNode* pPart2 = pParseNode->getChild(1); ++ const OSQLParseNode *pMiddleLeft = pPart2->getChild(0), ++ *pMiddleRight = pPart2->getChild(1), ++ *pRight = pPart2->getChild(2); ++ ++ if (SQL_ISRULE(pParseNode, test_for_null)) ++ { ++ if (SQL_ISRULE(pLeft, column_ref) && ++ SQL_ISTOKEN(pMiddleLeft, IS) && ++ SQL_ISTOKEN(pRight, NULL)) ++ { ++ ::rtl::OUString sColumnName, ++ sTableRange; ++ ++ m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange); ++ ++ if (SQL_ISTOKEN(pMiddleRight, NOT)) ++ { ++ // WHERE "Mobile Phone" IS NOT NULL ++ return new KabConditionNotNull(sColumnName); ++ } ++ else ++ { ++ // WHERE "Mobile Phone" IS NULL ++ return new KabConditionNull(sColumnName); ++ } ++ } ++ } ++ else if (SQL_ISRULE(pParseNode, like_predicate)) ++ { ++ if (SQL_ISRULE(pLeft, column_ref)) ++ { ++ ::rtl::OUString sColumnName, ++ sTableRange; ++ ++ m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange); ++ ++ if (pMiddleRight->isToken() || SQL_ISRULE(pMiddleRight, parameter)) ++ { ++ ::rtl::OUString sMatchString; ++ ++ if (pMiddleRight->isToken()) // WHERE Name LIKE 'Sm%' ++ sMatchString = pMiddleRight->getTokenValue(); ++ else if (SQL_ISRULE(pMiddleRight, parameter)) // WHERE Name LIKE ? ++ getNextParameter(sMatchString); ++ ++ return new KabConditionSimilar(sColumnName, sMatchString); ++ } ++ } ++ } ++ } ++ ++ lcl_throwError(STR_QUERY_TOO_COMPLEX); ++ ++ // Unreachable: ++ OSL_ASSERT(false); ++ return 0; ++} ++// ----------------------------------------------------------------------------- ++KabOrder *KabCommonStatement::analyseOrderByClause(const OSQLParseNode *pParseNode) const throw(SQLException) ++{ ++ if (SQL_ISRULE(pParseNode, ordering_spec_commalist)) ++ { ++ KabComplexOrder *list = new KabComplexOrder(); ++ sal_uInt32 n = pParseNode->count(); ++ ++ // Iterate through the ordering columns ++ for (sal_uInt32 i = 0; i < n; i++) ++ { ++ list->addOrder ++ (analyseOrderByClause(pParseNode->getChild(i))); ++ } ++ ++ return list; ++ } ++ else if (SQL_ISRULE(pParseNode, ordering_spec)) ++ { ++ if (pParseNode->count() == 2) ++ { ++ OSQLParseNode* pColumnRef = pParseNode->getChild(0); ++ OSQLParseNode* pAscendingDescending = pParseNode->getChild(1); ++ ++ if (SQL_ISRULE(pColumnRef, column_ref)) ++ { ++ if (pColumnRef->count() == 3) ++ pColumnRef = pColumnRef->getChild(2); ++ ++ if (pColumnRef->count() == 1) ++ { ++ ::rtl::OUString sColumnName = ++ pColumnRef->getChild(0)->getTokenValue(); ++ sal_Bool bAscending = ++ SQL_ISTOKEN(pAscendingDescending, DESC)? ++ sal_False: ++ sal_True; ++ ++ return new KabSimpleOrder(sColumnName, bAscending); ++ } ++ } ++ } ++ } ++ lcl_throwError(STR_QUERY_TOO_COMPLEX); ++ // Unreachable: ++ OSL_ASSERT(false); ++ return 0; ++} ++//------------------------------------------------------------------------------ ++sal_Bool KabCommonStatement::isTableKnown(KabResultSet *pResult) const ++{ ++ // can handle requests like SELECT * FROM addresses addresses ++ // but cannot handle requests like SELECT * FROM addresses persons ++ if (m_aSQLIterator.getTables().size() != 1) ++ return sal_False; ++ ++ if (m_aSQLIterator.getTables().begin()->first != pResult->getMetaData()->getTableName(0)) ++ return sal_False; ++ ++ return sal_True; ++} ++//------------------------------------------------------------------------------ ++void KabCommonStatement::setKabFields(KabResultSet *pResult) const throw(SQLException) ++{ ++ ::rtl::Reference xColumns; // selected columns ++ KabResultSetMetaData *pMeta; // meta information - holds the list of KAddressBook fields ++ ++ xColumns = m_aSQLIterator.getSelectColumns(); ++ if (!xColumns.is()) ++ { ++ lcl_throwError(STR_INVALID_COLUMN_SELECTION); ++ } ++ pMeta = static_cast(pResult->getMetaData().get()); ++ pMeta->setKabFields(xColumns); ++} ++// ------------------------------------------------------------------------- ++void KabCommonStatement::selectAddressees(KabResultSet *pResult) const throw(SQLException) ++{ ++ const OSQLParseNode *pParseNode; ++ KabCondition *pCondition; ++ ++ pParseNode = m_aSQLIterator.getWhereTree(); ++ if (pParseNode != NULL) ++ { ++ if (SQL_ISRULE(pParseNode, where_clause)) ++ { ++ resetParameters(); ++ pParseNode = pParseNode->getChild(1); ++ pCondition = analyseWhereClause(pParseNode); ++ if (pCondition->isAlwaysTrue()) ++ pResult->allKabAddressees(); ++ else if (!pCondition->isAlwaysFalse()) ++ pResult->someKabAddressees(pCondition); ++ delete pCondition; ++ return; ++ } ++ } ++ ++ // no WHERE clause: get all rows ++ pResult->allKabAddressees(); ++} ++// ------------------------------------------------------------------------- ++void KabCommonStatement::sortAddressees(KabResultSet *pResult) const throw(SQLException) ++{ ++ const OSQLParseNode *pParseNode; ++ KabOrder *pOrder; ++ ++ pParseNode = m_aSQLIterator.getOrderTree(); ++ if (pParseNode != NULL) ++ { ++ if (SQL_ISRULE(pParseNode, opt_order_by_clause)) ++ { ++ pParseNode = pParseNode->getChild(2); ++ pOrder = analyseOrderByClause(pParseNode); ++ pResult->sortKabAddressees(pOrder); ++ delete pOrder; ++ } ++ } ++} ++//----------------------------------------------------------------------------- ++Any SAL_CALL KabCommonStatement::queryInterface( const Type & rType ) throw(RuntimeException) ++{ ++ Any aRet = KabCommonStatement_BASE::queryInterface(rType); ++ if (!aRet.hasValue()) ++ aRet = OPropertySetHelper::queryInterface(rType); ++ return aRet; ++} ++// ------------------------------------------------------------------------- ++Sequence< Type > SAL_CALL KabCommonStatement::getTypes( ) throw(RuntimeException) ++{ ++ ::cppu::OTypeCollection aTypes( ::getCppuType( (const Reference< XMultiPropertySet > *)0 ), ++ ::getCppuType( (const Reference< XFastPropertySet > *)0 ), ++ ::getCppuType( (const Reference< XPropertySet > *)0 )); ++ ++ return comphelper::concatSequences(aTypes.getTypes(),KabCommonStatement_BASE::getTypes()); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabCommonStatement::cancel( ) throw(RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ // cancel the current sql statement ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabCommonStatement::close( ) throw(SQLException, RuntimeException) ++{ ++ { ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ } ++ dispose(); ++} ++// ------------------------------------------------------------------------- ++sal_Bool SAL_CALL KabCommonStatement::execute( ++ const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ Reference< XResultSet > xRS = executeQuery(sql); ++ ++ return xRS.is(); ++} ++// ------------------------------------------------------------------------- ++Reference< XResultSet > SAL_CALL KabCommonStatement::executeQuery( ++ const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++OSL_TRACE("TDE Address book - SQL Request: %s", OUtoCStr(sql)); ++ ++ KabResultSet* pResult = new KabResultSet(this); ++ Reference< XResultSet > xRS = pResult; ++ ::rtl::OUString aErr; ++ ++ m_pParseTree = m_aParser.parseTree(aErr, sql); ++ if (m_pParseTree == NULL) ++ throw SQLException(aErr, *this, aErr, 0, Any()); ++ ++ m_aSQLIterator.setParseTree(m_pParseTree); ++ m_aSQLIterator.traverseAll(); ++ switch (m_aSQLIterator.getStatementType()) ++ { ++ case SQL_STATEMENT_SELECT: ++ if (isTableKnown(pResult)) // FROM which table ? ++ { ++ setKabFields(pResult); // SELECT which columns ? ++ selectAddressees(pResult); // WHERE which condition ? ++ sortAddressees(pResult); // ORDER BY which columns ? ++// To be continued: DISTINCT ++// etc... ++ } ++ break; ++ ++ default: ++// To be continued: UPDATE ++// DELETE ++// etc... ++ lcl_throwError(STR_QUERY_TOO_COMPLEX); ++ } ++ ++ return xRS; ++} ++// ------------------------------------------------------------------------- ++Reference< XConnection > SAL_CALL KabCommonStatement::getConnection( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ // just return our connection here ++ return (Reference< XConnection >) m_pConnection; ++} ++// ------------------------------------------------------------------------- ++sal_Int32 SAL_CALL KabCommonStatement::executeUpdate( const ::rtl::OUString& ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ // the return values gives information about how many rows are affected by executing the sql statement ++ return 0; ++} ++// ------------------------------------------------------------------------- ++Any SAL_CALL KabCommonStatement::getWarnings( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ return makeAny(m_aLastWarning); ++} ++// ------------------------------------------------------------------------- ++void SAL_CALL KabCommonStatement::clearWarnings( ) throw(SQLException, RuntimeException) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); ++ ++ m_aLastWarning = SQLWarning(); ++} ++// ------------------------------------------------------------------------- ++::cppu::IPropertyArrayHelper* KabCommonStatement::createArrayHelper( ) const ++{ ++ // this properties are defined by the service statement ++ // they must be in alphabetic order ++ Sequence< Property > aProps(10); ++ Property* pProperties = aProps.getArray(); ++ sal_Int32 nPos = 0; ++ DECL_PROP0(CURSORNAME, ::rtl::OUString); ++ DECL_BOOL_PROP0(ESCAPEPROCESSING); ++ DECL_PROP0(FETCHDIRECTION,sal_Int32); ++ DECL_PROP0(FETCHSIZE, sal_Int32); ++ DECL_PROP0(MAXFIELDSIZE,sal_Int32); ++ DECL_PROP0(MAXROWS, sal_Int32); ++ DECL_PROP0(QUERYTIMEOUT,sal_Int32); ++ DECL_PROP0(RESULTSETCONCURRENCY,sal_Int32); ++ DECL_PROP0(RESULTSETTYPE,sal_Int32); ++ DECL_BOOL_PROP0(USEBOOKMARKS); ++ ++ return new ::cppu::OPropertyArrayHelper(aProps); ++} ++// ------------------------------------------------------------------------- ++::cppu::IPropertyArrayHelper & KabCommonStatement::getInfoHelper() ++{ ++ return *const_cast(this)->getArrayHelper(); ++} ++// ------------------------------------------------------------------------- ++sal_Bool KabCommonStatement::convertFastPropertyValue( ++ Any &, ++ Any &, ++ sal_Int32, ++ const Any&) throw (::com::sun::star::lang::IllegalArgumentException) ++{ ++ sal_Bool bConverted = sal_False; ++ // here we have to try to convert ++ return bConverted; ++} ++// ------------------------------------------------------------------------- ++void KabCommonStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any&) throw (Exception) ++{ ++ // set the value to whatever is nescessary ++ switch (nHandle) ++ { ++ case PROPERTY_ID_QUERYTIMEOUT: ++ case PROPERTY_ID_MAXFIELDSIZE: ++ case PROPERTY_ID_MAXROWS: ++ case PROPERTY_ID_CURSORNAME: ++ case PROPERTY_ID_RESULTSETCONCURRENCY: ++ case PROPERTY_ID_RESULTSETTYPE: ++ case PROPERTY_ID_FETCHDIRECTION: ++ case PROPERTY_ID_FETCHSIZE: ++ case PROPERTY_ID_ESCAPEPROCESSING: ++ case PROPERTY_ID_USEBOOKMARKS: ++ default: ++ ; ++ } ++} ++// ------------------------------------------------------------------------- ++void KabCommonStatement::getFastPropertyValue(Any&,sal_Int32 nHandle) const ++{ ++ switch (nHandle) ++ { ++ case PROPERTY_ID_QUERYTIMEOUT: ++ case PROPERTY_ID_MAXFIELDSIZE: ++ case PROPERTY_ID_MAXROWS: ++ case PROPERTY_ID_CURSORNAME: ++ case PROPERTY_ID_RESULTSETCONCURRENCY: ++ case PROPERTY_ID_RESULTSETTYPE: ++ case PROPERTY_ID_FETCHDIRECTION: ++ case PROPERTY_ID_FETCHSIZE: ++ case PROPERTY_ID_ESCAPEPROCESSING: ++ case PROPERTY_ID_USEBOOKMARKS: ++ default: ++ ; ++ } ++} ++// ----------------------------------------------------------------------------- ++void SAL_CALL KabCommonStatement::acquire() throw() ++{ ++ KabCommonStatement_BASE::acquire(); ++} ++// ----------------------------------------------------------------------------- ++void SAL_CALL KabCommonStatement::release() throw() ++{ ++ KabCommonStatement_BASE::release(); ++} ++// ----------------------------------------------------------------------------- ++Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL KabCommonStatement::getPropertySetInfo( ) throw(RuntimeException) ++{ ++ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()); ++} ++// ----------------------------------------------------------------------------- ++KabStatement::KabStatement(KabConnection* _pConnection) ++ : KabStatement_BASE(_pConnection) ++{ ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KStatement.hxx connectivity/source/drivers/tdeab/KStatement.hxx +--- connectivity/source/drivers/tdeab/KStatement.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KStatement.hxx 2011-08-17 14:25:52.088678867 -0500 +@@ -0,0 +1,174 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_STATEMENT_HXX_ ++#define _CONNECTIVITY_KAB_STATEMENT_HXX_ ++ ++#include "KConnection.hxx" ++#include ++#include "connectivity/sqliterator.hxx" ++#include "connectivity/sqlparse.hxx" ++#include ++#include ++#include ++#include ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ typedef ::cppu::WeakComponentImplHelper4< ::com::sun::star::sdbc::XStatement, ++ ::com::sun::star::sdbc::XWarningsSupplier, ++ ::com::sun::star::util::XCancellable, ++ ::com::sun::star::sdbc::XCloseable> KabCommonStatement_BASE; ++ ++ //************************************************************** ++ // Class KabCommonStatement ++ // is a base class for the normal statement and for the prepared statement ++ //************************************************************** ++ class KabCommonStatement : public comphelper::OBaseMutex, ++ public KabCommonStatement_BASE, ++ public ::cppu::OPropertySetHelper, ++ public comphelper::OPropertyArrayUsageHelper ++ ++ { ++ ::com::sun::star::sdbc::SQLWarning m_aLastWarning; ++ ++ protected: ++ ::std::list< ::rtl::OUString> m_aBatchList; ++ connectivity::OSQLParser m_aParser; ++ connectivity::OSQLParseTreeIterator m_aSQLIterator; ++ connectivity::OSQLParseNode* m_pParseTree; ++ KabConnection* m_pConnection; // The owning Connection object ++ ++ protected: ++ class KabCondition *analyseWhereClause( ++ const OSQLParseNode *pParseNode) const throw(::com::sun::star::sdbc::SQLException); ++ class KabOrder *analyseOrderByClause( ++ const OSQLParseNode *pParseNode) const throw(::com::sun::star::sdbc::SQLException); ++ sal_Bool isTableKnown(class KabResultSet *pResult) const; ++ void setKabFields(class KabResultSet *pResult) const throw(::com::sun::star::sdbc::SQLException); ++ void selectAddressees(KabResultSet *pResult) const throw(::com::sun::star::sdbc::SQLException); ++ void sortAddressees(KabResultSet *pResult) const throw(::com::sun::star::sdbc::SQLException); ++ ++ // OPropertyArrayUsageHelper ++ virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const; ++ ++ // OPropertySetHelper ++ virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); ++ virtual sal_Bool SAL_CALL convertFastPropertyValue( ++ ::com::sun::star::uno::Any & rConvertedValue, ++ ::com::sun::star::uno::Any & rOldValue, ++ sal_Int32 nHandle, ++ const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::lang::IllegalArgumentException); ++ virtual void SAL_CALL setFastPropertyValue_NoBroadcast( ++ sal_Int32 nHandle, ++ const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::uno::Exception); ++ virtual void SAL_CALL getFastPropertyValue( ++ ::com::sun::star::uno::Any& rValue, ++ sal_Int32 nHandle) const; ++ ++ virtual void resetParameters() const throw(::com::sun::star::sdbc::SQLException); ++ virtual void getNextParameter(::rtl::OUString &rParameter) const throw(::com::sun::star::sdbc::SQLException); ++ virtual ~KabCommonStatement(); ++ ++ public: ++ ::cppu::OBroadcastHelper& rBHelper; ++ ++ KabCommonStatement(KabConnection *_pConnection); ++ using KabCommonStatement_BASE::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >; ++ ++ // OComponentHelper ++ virtual void SAL_CALL disposing(); ++ ++ // XInterface ++ virtual void SAL_CALL release() throw(); ++ virtual void SAL_CALL acquire() throw(); ++ virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( ++ const ::com::sun::star::uno::Type & rType ++ ) throw(::com::sun::star::uno::RuntimeException); ++ ++ // XTypeProvider ++ virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ++ ) throw(::com::sun::star::uno::RuntimeException); ++ ++ // XPropertySet ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ++ ) throw(::com::sun::star::uno::RuntimeException); ++ ++ // XStatement ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery( ++ const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL executeUpdate( ++ const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL execute( ++ const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( ++ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XWarningsSupplier ++ virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( ++ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL clearWarnings( ++ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // XCancellable ++ virtual void SAL_CALL cancel( ++ ) throw(::com::sun::star::uno::RuntimeException); ++ ++ // XCloseable ++ virtual void SAL_CALL close( ++ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); ++ ++ // other methods ++ inline KabConnection* getOwnConnection() const { return m_pConnection; } ++ }; ++ ++ //************************************************************** ++ // Class KabStatement ++ //************************************************************** ++ typedef ::cppu::ImplInheritanceHelper1< ++ KabCommonStatement, ::com::sun::star::lang::XServiceInfo > KabStatement_BASE; ++ ++ class KabStatement : public KabStatement_BASE ++ { ++ protected: ++ virtual ~KabStatement() { } ++ ++ public: ++ KabStatement(KabConnection* _pConnection); ++ DECLARE_SERVICE_INFO(); ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_STATEMENT_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KTable.cxx connectivity/source/drivers/tdeab/KTable.cxx +--- connectivity/source/drivers/tdeab/KTable.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KTable.cxx 2011-08-17 14:25:28.396855433 -0500 +@@ -0,0 +1,100 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KTable.hxx" ++#include "KTables.hxx" ++#include "KColumns.hxx" ++#include "KCatalog.hxx" ++ ++using namespace connectivity::kab; ++using namespace connectivity; ++using namespace ::comphelper; ++using namespace ::com::sun::star::uno; ++using namespace ::com::sun::star::beans; ++using namespace ::com::sun::star::sdbcx; ++using namespace ::com::sun::star::sdbc; ++using namespace ::com::sun::star::container; ++using namespace ::com::sun::star::lang; ++ ++// ------------------------------------------------------------------------- ++KabTable::KabTable( sdbcx::OCollection* _pTables, KabConnection* _pConnection) ++ : KabTable_TYPEDEF(_pTables, sal_True), ++ m_pConnection(_pConnection) ++{ ++ construct(); ++} ++// ------------------------------------------------------------------------- ++KabTable::KabTable( sdbcx::OCollection* _pTables, ++ KabConnection* _pConnection, ++ const ::rtl::OUString& _Name, ++ const ::rtl::OUString& _Type, ++ const ::rtl::OUString& _Description , ++ const ::rtl::OUString& _SchemaName, ++ const ::rtl::OUString& _CatalogName ++ ) : KabTable_TYPEDEF(_pTables,sal_True, ++ _Name, ++ _Type, ++ _Description, ++ _SchemaName, ++ _CatalogName), ++ m_pConnection(_pConnection) ++{ ++ construct(); ++} ++// ------------------------------------------------------------------------- ++void KabTable::refreshColumns() ++{ ++ TStringVector aVector; ++ ++ if (!isNew()) ++ { ++ Reference< XResultSet > xResult = m_pConnection->getMetaData()->getColumns( ++ Any(), ++ m_SchemaName, ++ m_Name, ++ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%"))); ++ ++ if (xResult.is()) ++ { ++ Reference< XRow > xRow(xResult, UNO_QUERY); ++ while (xResult->next()) ++ aVector.push_back(xRow->getString(4)); ++ } ++ } ++ ++ if (m_pColumns) ++ m_pColumns->reFill(aVector); ++ else ++ m_pColumns = new KabColumns(this,m_aMutex,aVector); ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KTable.hxx connectivity/source/drivers/tdeab/KTable.hxx +--- connectivity/source/drivers/tdeab/KTable.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KTable.hxx 2011-08-17 14:25:22.436396680 -0500 +@@ -0,0 +1,72 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_TABLE_HXX_ ++#define _CONNECTIVITY_KAB_TABLE_HXX_ ++ ++#include "KConnection.hxx" ++#include "connectivity/sdbcx/VTable.hxx" ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ typedef connectivity::sdbcx::OTable KabTable_TYPEDEF; ++ ++ ::rtl::OUString getTypeString(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xColProp); ++ ++ class KabTable : public KabTable_TYPEDEF ++ { ++ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; ++ KabConnection* m_pConnection; ++ ++ public: ++ KabTable( sdbcx::OCollection* _pTables, KabConnection* _pConnection); ++ KabTable( sdbcx::OCollection* _pTables, ++ KabConnection* _pConnection, ++ const ::rtl::OUString& _Name, ++ const ::rtl::OUString& _Type, ++ const ::rtl::OUString& _Description = ::rtl::OUString(), ++ const ::rtl::OUString& _SchemaName = ::rtl::OUString(), ++ const ::rtl::OUString& _CatalogName = ::rtl::OUString() ++ ); ++ ++ KabConnection* getConnection() { return m_pConnection;} ++ ++ virtual void refreshColumns(); ++ ++ ::rtl::OUString getTableName() const { return m_Name; } ++ ::rtl::OUString getSchema() const { return m_SchemaName; } ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_TABLE_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KTables.cxx connectivity/source/drivers/tdeab/KTables.cxx +--- connectivity/source/drivers/tdeab/KTables.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KTables.cxx 2011-08-17 14:25:16.415933304 -0500 +@@ -0,0 +1,94 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++ ++#include "KTables.hxx" ++#include "KTable.hxx" ++#include "KCatalog.hxx" ++#include "KConnection.hxx" ++#include ++ ++using namespace connectivity::kab; ++using namespace connectivity; ++using namespace ::comphelper; ++using namespace ::cppu; ++using namespace ::com::sun::star::uno; ++using namespace ::com::sun::star::beans; ++using namespace ::com::sun::star::sdbcx; ++using namespace ::com::sun::star::sdbc; ++using namespace ::com::sun::star::container; ++using namespace ::com::sun::star::lang; ++ ++sdbcx::ObjectType KabTables::createObject(const ::rtl::OUString& _rName) ++{ ++ ::rtl::OUString aName,aSchema; ++ aSchema = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")); ++ aName = _rName; ++ ++ Sequence< ::rtl::OUString > aTypes(1); ++ aTypes[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")); ++ ::rtl::OUString sEmpty; ++ ++ Reference< XResultSet > xResult = m_xMetaData->getTables(Any(), aSchema, aName, aTypes); ++ ++ sdbcx::ObjectType xRet = NULL; ++ if (xResult.is()) ++ { ++ Reference< XRow > xRow(xResult, UNO_QUERY); ++ if (xResult->next()) // there can be only one table with this name ++ { ++ KabTable* pRet = new KabTable( ++ this, ++ static_cast(m_rParent).getConnection(), ++ aName, ++ xRow->getString(4), ++ xRow->getString(5), ++ sEmpty); ++ xRet = pRet; ++ } ++ } ++ ::comphelper::disposeComponent(xResult); ++ ++ return xRet; ++} ++// ------------------------------------------------------------------------- ++void KabTables::impl_refresh( ) throw(RuntimeException) ++{ ++ static_cast(m_rParent).refreshTables(); ++} ++// ------------------------------------------------------------------------- ++void KabTables::disposing(void) ++{ ++m_xMetaData.clear(); ++ OCollection::disposing(); ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/KTables.hxx connectivity/source/drivers/tdeab/KTables.hxx +--- connectivity/source/drivers/tdeab/KTables.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/KTables.hxx 2011-08-17 14:24:50.933971998 -0500 +@@ -0,0 +1,65 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _CONNECTIVITY_KAB_TABLES_HXX_ ++#define _CONNECTIVITY_KAB_TABLES_HXX_ ++ ++#include "connectivity/sdbcx/VCollection.hxx" ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ class KabTables : public sdbcx::OCollection ++ { ++ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; ++ ++ protected: ++ virtual sdbcx::ObjectType createObject(const ::rtl::OUString& _rName); ++ virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); ++ ++ public: ++ KabTables( ++ const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rMetaData, ++ ::cppu::OWeakObject& _rParent, ++ ::osl::Mutex& _rMutex, ++ const TStringVector &_rVector) ++ : sdbcx::OCollection(_rParent,sal_True,_rMutex,_rVector), ++ m_xMetaData(_rMetaData) ++ { } ++ ++ virtual void SAL_CALL disposing(void); ++ }; ++ } ++} ++ ++#endif // _CONNECTIVITY_KAB_TABLES_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/makefile.mk connectivity/source/drivers/tdeab/makefile.mk +--- connectivity/source/drivers/tdeab/makefile.mk 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/makefile.mk 2011-08-17 14:24:11.740955243 -0500 +@@ -0,0 +1,139 @@ ++#************************************************************************* ++# ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# Copyright 2000, 2010 Oracle and/or its affiliates. ++# Copyright 2011 Timothy Pearson ++# ++# 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 ++# ++# for a copy of the LGPLv3 License. ++# ++#************************************************************************* ++ ++PRJ=..$/..$/.. ++PRJINC=..$/.. ++PRJNAME=connectivity ++TARGET=tdeab ++TARGET2=$(TARGET)drv ++ ++ENABLE_EXCEPTIONS=TRUE ++VISIBILITY_HIDDEN=TRUE ++ ++# --- Settings ---------------------------------- ++ ++.INCLUDE : $(PRJ)$/makefile.pmk ++.INCLUDE : $(PRJ)$/version.mk ++ ++.IF "$(GUI)" == "UNX" ++.IF "$(ENABLE_TDEAB)" == "TRUE" ++ ++CFLAGS+=$(TDE_CFLAGS) ++ ++.IF "$(TDE_ROOT)"!="" ++EXTRALIBPATHS+=-L$(TDE_ROOT)$/lib ++.ENDIF ++ ++# === TDEAB base library ========================== ++ ++# --- Files ------------------------------------- ++ ++SLOFILES= \ ++ $(SLO)$/KDriver.obj \ ++ $(SLO)$/KServices.obj ++ ++DEPOBJFILES= \ ++ $(SLO2FILES) ++ ++# --- Library ----------------------------------- ++ ++SHL1VERSIONMAP=$(SOLARENV)/src/component.map ++ ++SHL1TARGET= $(TARGET)$(TDEAB_MAJOR) ++SHL1OBJS=$(SLOFILES) ++SHL1STDLIBS=\ ++ $(CPPULIB) \ ++ $(CPPUHELPERLIB) \ ++ $(DBTOOLSLIB) \ ++ $(SALLIB) \ ++ $(SALHELPERLIB) ++ ++SHL1DEPN= ++SHL1IMPLIB= i$(TARGET) ++ ++SHL1DEF= $(MISC)$/$(SHL1TARGET).def ++ ++DEF1NAME= $(SHL1TARGET) ++ ++# === TDEAB impl library ========================== ++ ++# --- Files ------------------------------------- ++ ++SLO2FILES=\ ++ $(SLO)$/KColumns.obj \ ++ $(SLO)$/KTable.obj \ ++ $(SLO)$/KTables.obj \ ++ $(SLO)$/KCatalog.obj \ ++ $(SLO)$/KResultSet.obj \ ++ $(SLO)$/KStatement.obj \ ++ $(SLO)$/KPreparedStatement.obj \ ++ $(SLO)$/KDatabaseMetaData.obj \ ++ $(SLO)$/KConnection.obj \ ++ $(SLO)$/KResultSetMetaData.obj \ ++ $(SLO)$/kcondition.obj \ ++ $(SLO)$/korder.obj \ ++ $(SLO)$/kfields.obj \ ++ $(SLO)$/TDEInit.obj ++ ++TDEAB_LIB=$(TDE_LIBS) -lkabc ++ ++# --- Library ----------------------------------- ++ ++SHL2VERSIONMAP=$(TARGET2).map ++ ++SHL2TARGET= $(TARGET2)$(TDEAB_MAJOR) ++SHL2OBJS=$(SLO2FILES) ++SHL2LINKFLAGS+=$(TDEAB_LIB) ++SHL2STDLIBS=\ ++ $(CPPULIB) \ ++ $(CPPUHELPERLIB) \ ++ $(SALLIB) \ ++ $(SALHELPERLIB) \ ++ $(DBTOOLSLIB) \ ++ $(COMPHELPERLIB) ++ ++SHL2DEPN= ++SHL2IMPLIB= i$(TARGET2) ++ ++SHL2DEF= $(MISC)$/$(SHL2TARGET).def ++ ++DEF2NAME= $(SHL2TARGET) ++ ++# --- Targets ----------------------------------- ++.ELSE # "$(ENABLE_TDEAB)" == "TRUE" ++dummy: ++ @echo TDE Addressbook disabled - nothing to build ++.ENDIF ++ ++.ELSE # "$(GUI)" == "UNX" ++dummy: ++ @echo "Nothing to build for GUI $(GUI)" ++.ENDIF ++ ++.INCLUDE : $(PRJ)$/target.pmk ++ +diff -urN connectivity/source/drivers/tdeab/tdeabdrv.map connectivity/source/drivers/tdeab/tdeabdrv.map +--- connectivity/source/drivers/tdeab/tdeabdrv.map 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/tdeabdrv.map 2011-08-17 14:25:00.664720964 -0500 +@@ -0,0 +1,9 @@ ++UDK_3_0_0 { ++ global: ++ createKabConnection; ++ initKApplication; ++ shutdownKApplication; ++ matchTDEVersion; ++ local: ++ *; ++}; +diff -urN connectivity/source/drivers/tdeab/tdeab.xcu connectivity/source/drivers/tdeab/tdeab.xcu +--- connectivity/source/drivers/tdeab/tdeab.xcu 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/tdeab.xcu 2011-08-17 14:29:58.077608095 -0500 +@@ -0,0 +1,47 @@ ++ ++ ++ ++ ++ ++ ++ com.sun.star.comp.sdbc.kab.Driver ++ ++ ++ TDE Address Book ++ ++ ++ ++ ++ true ++ ++ ++ ++ ++ ++ +diff -urN connectivity/source/drivers/tdeab/tdeab.xml connectivity/source/drivers/tdeab/tdeab.xml +--- connectivity/source/drivers/tdeab/tdeab.xml 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/tdeab.xml 2011-08-17 14:29:44.246543923 -0500 +@@ -0,0 +1,77 @@ ++ ++ ++ ++ kab1 ++ ++ Eric Bischoff ++ com.sun.star.comp.sdbc.kab.Driver ++ This library implements the database driver for TDE address book formats. ++ com.sun.star.loader.SharedLibrary ++ c++ ++ ++ com.sun.star.sdbc.Driver ++ ... ++ ++ cppuhelper ++ cppu ++ sal ++ ++ cppuhelper ++ cppu1 ++ sal1 ++ ++ com.sun.star.registry.XRegistryKey ++ com.sun.star.util.XCancellable ++ com.sun.star.util.XNumberFormatter ++ com.sun.star.uno.TypeClass ++ com.sun.star.uno.XWeak ++ com.sun.star.uno.XAggregation ++ com.sun.star.uno.XComponentContext ++ com.sun.star.beans.PropertyAttribute ++ com.sun.star.beans.XPropertyState ++ com.sun.star.beans.XPropertySet ++ com.sun.star.beans.PropertyValue ++ com.sun.star.beans.XMultiPropertySet ++ com.sun.star.beans.XFastPropertySet ++ com.sun.star.lang.XSingleServiceFactory ++ com.sun.star.lang.XTypeProvider ++ com.sun.star.lang.XSingleComponentFactory ++ com.sun.star.lang.EventObject ++ com.sun.star.lang.XComponent ++ com.sun.star.lang.IllegalArgumentException ++ com.sun.star.lang.DisposedException ++ com.sun.star.lang.XMultiServiceFactory ++ com.sun.star.lang.XServiceInfo ++ com.sun.star.lang.XUnoTunnel ++ com.sun.star.java.XJavaThreadRegister_11 ++ com.sun.star.java.XJavaVM ++ com.sun.star.sdbc.FetchDirection ++ com.sun.star.sdbc.XConnection ++ com.sun.star.sdbc.XStatement ++ com.sun.star.sdbc.XResultSet ++ com.sun.star.sdbc.XResultSetMetaDataSupplier ++ com.sun.star.sdbc.XColumnLocate ++ com.sun.star.sdbc.XResultSetUpdate ++ com.sun.star.sdbc.XWarningsSupplier ++ com.sun.star.sdbc.XRowUpdate ++ com.sun.star.sdbc.XMultipleResults ++ com.sun.star.sdbc.XBatchExecution ++ com.sun.star.sdbc.XPreparedBatchExecution ++ com.sun.star.sdbc.XParameters ++ com.sun.star.sdbc.XOutParameters ++ com.sun.star.sdbc.DriverPropertyInfo ++ com.sun.star.sdbc.SQLWarning ++ com.sun.star.sdbc.XRow ++ com.sun.star.sdbc.ColumnSearch ++ com.sun.star.sdbc.ColumnValue ++ com.sun.star.sdbc.DataType ++ com.sun.star.sdbc.XDriver ++ com.sun.star.sdbc.TransactionIsolation ++ com.sun.star.sdbc.ResultSetType ++ com.sun.star.sdbc.ResultSetConcurrency ++ com.sun.star.sdbcx.XRowLocate ++ com.sun.star.sdbcx.XDeleteRows ++ com.sun.star.sdbcx.CompareBookmark ++ com.sun.star.sdb.XColumnUpdate ++ com.sun.star.sdb.XColumn ++ +diff -urN connectivity/source/drivers/tdeab/TDEInit.cxx connectivity/source/drivers/tdeab/TDEInit.cxx +--- connectivity/source/drivers/tdeab/TDEInit.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/TDEInit.cxx 2011-08-17 14:28:21.700192397 -0500 +@@ -0,0 +1,158 @@ ++/* -*- 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_connectivity.hxx" ++#include "TDEInit.h" ++#include ++#include ++#include ++ ++namespace connectivity ++{ ++ namespace kab ++ { ++ // =============================================================== ++ // = TDEInit ++ // =============================================================== ++ class TDEInit ++ { ++ private: ++ /// TDE application if we own it ++ static KApplication* s_pKApplication; ++ static bool s_bDidInsertCatalogue; ++ ++ public: ++ static void Init(); ++ static void Shutdown(); ++ }; ++ ++ // --------------------------------------------------------------- ++ KApplication* TDEInit::s_pKApplication = NULL; ++ bool TDEInit::s_bDidInsertCatalogue = false; ++ ++ // --------------------------------------------------------------- ++ void TDEInit::Init() ++ { ++ // TODO: All this is not thread-safe ++ ++ // we create a TDE application only if it is not already done ++ if (KApplication::kApplication() == NULL) ++ { ++ OSL_ENSURE(s_pKApplication == NULL, "TDEInit::Init: inconsistency in the application pointers!"); ++ ++ char *kabargs[1] = {(char*)"libkab1"}; ++ KCmdLineArgs::init(1, kabargs, "KAddressBook", *kabargs, "Address Book driver", KAB_DRIVER_VERSION); ++ ++ s_pKApplication = new KApplication(false, false); ++ } ++ ++ // set language ++ rtl_Locale *pProcessLocale; ++ osl_getProcessLocale(&pProcessLocale); ++ // sal_Unicode and QChar are (currently) both 16 bits characters ++ QString aLanguage( ++ (const QChar *) pProcessLocale->Language->buffer, ++ (int) pProcessLocale->Language->length); ++ KGlobal::locale()->setLanguage(aLanguage); ++ ++ // load TDE address book's localized messages ++ KGlobal::locale()->insertCatalogue("kaddressbook"); ++ s_bDidInsertCatalogue = true; ++ } ++ ++ // --------------------------------------------------------------- ++ void TDEInit::Shutdown() ++ { ++ if ( s_bDidInsertCatalogue ) ++ // this guard is necessary, since TDE 3.3 seems to crash if we remove a catalogue ++ // which we did not previously insert ++ KGlobal::locale()->removeCatalogue("kaddressbook"); ++ ++ if ( s_pKApplication != NULL ) ++ { ++ delete s_pKApplication; ++ s_pKApplication = NULL; ++ } ++ } ++ } ++} ++ ++// ======================================================================= ++namespace ++{ ++ double normalizeVersion( unsigned int major, unsigned int minor ) ++ { ++ return major + 1.0 * minor / 1000; ++ } ++} ++ ++// ----------------------------------------------------------------------- ++extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL initKApplication() ++{ ++ ::connectivity::kab::TDEInit::Init(); ++} ++ ++// ----------------------------------------------------------------------- ++extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL shutdownKApplication() ++{ ++ ::connectivity::kab::TDEInit::Shutdown(); ++} ++// ----------------------------------------------------------------------- ++/** checks whether the TDE version on the system we're running at is supported ++ by the driver ++ ++ Has to be called before any other code from this library, in particular, ++ it has to be called before initKApplication() ++ ++ If this function returns 0, then no other code from this library ++ has to be called, else the results are unpredictable. ++ ++ @return ++
  • 0 if the TDE version is supportednon
  • ++
  • a negative value if the version is too old
  • ++
  • a positive value if the version is too new to know whether it works with this driver
  • ++
++ ++ #i60062# / 2006-01-06 / frank.schoenheit@sun.com ++*/ ++extern "C" SAL_DLLPUBLIC_EXPORT int SAL_CALL matchTDEVersion() ++{ ++ double nMinVersion = normalizeVersion( MIN_TDE_VERSION_MAJOR, MIN_TDE_VERSION_MINOR ); ++ double nCurVersion = normalizeVersion( ::KDE::versionMajor(), ::KDE::versionMinor() ); ++ double nMaxVersion = normalizeVersion( MAX_TDE_VERSION_MAJOR, MAX_TDE_VERSION_MINOR ); ++ ++ if ( nCurVersion < nMinVersion ) ++ return -1; ++ if ( nCurVersion > nMaxVersion ) ++ return 1; ++ ++ return 0; ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/drivers/tdeab/TDEInit.h connectivity/source/drivers/tdeab/TDEInit.h +--- connectivity/source/drivers/tdeab/TDEInit.h 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/drivers/tdeab/TDEInit.h 2011-08-17 14:28:13.719578294 -0500 +@@ -0,0 +1,47 @@ ++/* -*- 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef CONNECTIVITY_KAB_TDEINIT_H ++#define CONNECTIVITY_KAB_TDEINIT_H ++ ++// the address book driver's version ++#define KAB_DRIVER_VERSION "0.2" ++#define KAB_DRIVER_VERSION_MAJOR 0 ++#define KAB_DRIVER_VERSION_MINOR 2 ++ ++// the minimum TDE version which is required at runtime ++#define MIN_TDE_VERSION_MAJOR 3 ++#define MIN_TDE_VERSION_MINOR 2 ++ ++#define MAX_TDE_VERSION_MAJOR 3 ++#define MAX_TDE_VERSION_MINOR 6 ++ ++ ++#endif // CONNECTIVITY_KAB_TDEINIT_H ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde/makefile.mk fpicker/source/unx/tde/makefile.mk +--- fpicker/source/unx/tde/makefile.mk 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde/makefile.mk 2011-08-17 14:08:00.486552458 -0500 +@@ -0,0 +1,75 @@ ++#************************************************************************* ++# ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# Copyright 2010 Novell, Inc. ++# Copyright 2011 Timothy Pearson ++# ++# 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 ++# ++# for a copy of the LGPLv3 License. ++# ++#************************************************************************* ++ ++PRJ=..$/..$/.. ++ ++PRJNAME=fpicker ++TARGET=tdefilepicker ++LIBTARGET=NO ++ENABLE_EXCEPTIONS=TRUE ++#COMP1TYPELIST=$(TARGET) ++#COMPRDB=$(SOLARBINDIR)$/types.rdb ++ ++# --- Settings ----------------------------------------------------- ++ ++.INCLUDE : settings.mk ++ ++# ------------------------------------------------------------------ ++ ++.IF "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE" ++ ++dummy: ++ @echo "Nothing to build. GUIBASE == $(GUIBASE), ENABLE_TDE is not set" ++ ++.ELSE # we build for TDE ++ ++CFLAGS+= $(TDE_CFLAGS) ++ ++# --- Files -------------------------------------------------------- ++ ++SLOFILES =\ ++ $(SLO)$/tdecommandthread.obj \ ++ $(SLO)$/tdefilepicker.obj \ ++ $(SLO)$/tdefilepicker.moc.obj \ ++ $(SLO)$/tdefpmain.obj \ ++ $(SLO)$/tdemodalityfilter.obj ++ ++APP1TARGET=$(TARGET) ++APP1OBJS=$(SLOFILES) ++APP1RPATH=BRAND ++APP1LINKFLAGS=$(TDE_LIBS) -lkio -lX11 ++APP1STDLIBS=$(SALLIB) ++ ++.ENDIF # "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE" ++ ++# --- Targets ------------------------------------------------------ ++ ++.INCLUDE : target.mk ++ ++$(MISC)$/tdefilepicker.moc.cxx : tdefilepicker.hxx ++ $(MOC) $< -o $@ +diff -urN fpicker/source/unx/tde/tdecommandthread.cxx fpicker/source/unx/tde/tdecommandthread.cxx +--- fpicker/source/unx/tde/tdecommandthread.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde/tdecommandthread.cxx 2011-08-17 14:05:05.983187311 -0500 +@@ -0,0 +1,178 @@ ++/* -*- 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 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#include ++ ++#include ++ ++#include ++ ++#include ++ ++////////////////////////////////////////////////////////////////////////// ++// CommandEvent ++////////////////////////////////////////////////////////////////////////// ++ ++TDECommandEvent::TDECommandEvent( const QString &qCommand, QStringList *pStringList ) ++ : QCustomEvent( TypeId, pStringList ), ++ m_eCommand( Unknown ) ++{ ++ struct { ++ const char *pName; ++ CommandEventType eType; ++ } *pIdx, pMapping[] = ++ { ++ { "appendControl", AppendControl }, ++ { "enableControl", EnableControl }, ++ { "getValue", GetValue }, ++ { "setValue", SetValue }, ++ { "appendFilter", AppendFilter }, ++ { "appendFilterGroup", AppendFilterGroup }, ++ { "getCurrentFilter", GetCurrentFilter }, ++ { "setCurrentFilter", SetCurrentFilter }, ++ { "getDirectory", GetDirectory }, ++ { "setDirectory", SetDirectory }, ++ { "getFiles", GetFiles }, ++ { "setTitle", SetTitle }, ++ { "setType", SetType }, ++ { "setDefaultName", SetDefaultName }, ++ { "setMultiSelection", SetMultiSelection }, ++ { "exec", Exec }, ++ { 0, Unknown } ++ }; ++ ++ for ( pIdx = pMapping; pIdx->pName && qCommand != pIdx->pName; ++pIdx ) ++ ; ++ ++ m_eCommand = pIdx->eType; ++} ++ ++////////////////////////////////////////////////////////////////////////// ++// CommandThread ++////////////////////////////////////////////////////////////////////////// ++ ++TDECommandThread::TDECommandThread( QWidget *pObject ) ++ : m_pObject( pObject ) ++{ ++} ++ ++TDECommandThread::~TDECommandThread() ++{ ++} ++ ++void TDECommandThread::run() ++{ ++ QTextIStream qStream( stdin ); ++ qStream.setEncoding( QTextStream::UnicodeUTF8 ); ++ ++ QString qLine; ++ bool bQuit = false; ++ while ( !bQuit && !qStream.atEnd() ) ++ { ++ qLine = qStream.readLine(); ++ handleCommand( qLine, bQuit ); ++ } ++} ++ ++void TDECommandThread::handleCommand( const QString &rString, bool &bQuit ) ++{ ++ QMutexLocker qMutexLocker( &m_aMutex ); ++ ++#if OSL_DEBUG_LEVEL > 0 ++ ::std::cerr << "tdefilepicker received: " << rString.latin1() << ::std::endl; ++#endif ++ ++ bQuit = false; ++ QStringList *pTokens = tokenize( rString ); ++ ++ if ( !pTokens ) ++ return; ++ if ( pTokens->empty() ) ++ { ++ delete pTokens, pTokens = NULL; ++ return; ++ } ++ ++ QString qCommand = pTokens->front(); ++ pTokens->pop_front(); ++ ++ if ( qCommand == "exit" ) ++ { ++ bQuit = true; ++ kapp->exit(); ++ kapp->wakeUpGuiThread(); ++ } ++ else ++ kapp->postEvent( m_pObject, new TDECommandEvent( qCommand, pTokens ) ); ++} ++ ++QStringList* TDECommandThread::tokenize( const QString &rString ) ++{ ++ // Commands look like: ++ // command arg1 arg2 arg3 ... ++ // Args may be enclosed in '"', if they contain spaces. ++ ++ QStringList *pList = new QStringList(); ++ ++ QString qBuffer; ++ qBuffer.reserve( 1024 ); ++ ++ const QChar *pUnicode = rString.unicode(); ++ const QChar *pEnd = pUnicode + rString.length(); ++ bool bQuoted = false; ++ ++ for ( ; pUnicode != pEnd; ++pUnicode ) ++ { ++ if ( *pUnicode == '\\' ) ++ { ++ ++pUnicode; ++ if ( pUnicode != pEnd ) ++ { ++ if ( *pUnicode == 'n' ) ++ qBuffer.append( '\n' ); ++ else ++ qBuffer.append( *pUnicode ); ++ } ++ } ++ else if ( *pUnicode == '"' ) ++ bQuoted = !bQuoted; ++ else if ( *pUnicode == ' ' && !bQuoted ) ++ { ++ pList->push_back( qBuffer ); ++ qBuffer.setLength( 0 ); ++ } ++ else ++ qBuffer.append( *pUnicode ); ++ } ++ pList->push_back( qBuffer ); ++ ++ return pList; ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde/tdecommandthread.hxx fpicker/source/unx/tde/tdecommandthread.hxx +--- fpicker/source/unx/tde/tdecommandthread.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde/tdecommandthread.hxx 2011-08-17 14:04:34.560780976 -0500 +@@ -0,0 +1,98 @@ ++/* -*- 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 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _TDECOMMANDTHREAD_HXX_ ++#define _TDECOMMANDTHREAD_HXX_ ++ ++#include ++#include ++#include ++ ++class TDECommandEvent : public QCustomEvent ++{ ++public: ++ enum CommandEventType { ++ Unknown = 0, ++ ++ AppendControl, ++ EnableControl, ++ GetValue, ++ SetValue, ++ ++ AppendFilter, ++ AppendFilterGroup, ++ UpdateFilters, ++ GetCurrentFilter, ++ SetCurrentFilter, ++ ++ GetDirectory, ++ SetDirectory, ++ ++ GetFiles, ++ ++ SetTitle, ++ SetType, ++ SetDefaultName, ++ SetMultiSelection, ++ ++ Exec ++ }; ++ static const QEvent::Type TypeId = (QEvent::Type) ( (int) QEvent::User + 42 /*random magic value*/ ); ++ ++protected: ++ CommandEventType m_eCommand; ++ ++public: ++ TDECommandEvent( const QString &qCommand, QStringList *pStringList ); ++ ++ CommandEventType command() const { return m_eCommand; } ++ QStringList* stringList() { return static_cast< QStringList* >( data() ); } ++}; ++ ++class TDECommandThread : public QThread ++{ ++protected: ++ QObject *m_pObject; ++ ++ QMutex m_aMutex; ++ ++public: ++ TDECommandThread( QWidget *pObject ); ++ virtual ~TDECommandThread(); ++ ++ virtual void run(); ++ ++protected: ++ void handleCommand( const QString &rString, bool &bQuit ); ++ QStringList* tokenize( const QString &rString ); ++}; ++ ++#endif // _TDECOMMANDTHREAD_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde/tdefilepicker.cxx fpicker/source/unx/tde/tdefilepicker.cxx +--- fpicker/source/unx/tde/tdefilepicker.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde/tdefilepicker.cxx 2011-08-17 14:05:04.073041030 -0500 +@@ -0,0 +1,733 @@ ++/* -*- 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 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifdef QT_NO_EMIT ++#define emit ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++////////////////////////////////////////////////////////////////////////// ++// TDEFileDialog ++////////////////////////////////////////////////////////////////////////// ++ ++TDEFileDialog::TDEFileDialog( const QString &startDir, const QString &filter, ++ QWidget *parent, const char *name ) ++ : KFileDialog( startDir, filter, parent, name, true, m_pCustomWidget = new QVBox() ), ++ m_pCombosAndButtons( new QHBox( m_pCustomWidget ) ), ++ m_pLabels( new QVBox( m_pCombosAndButtons ) ), ++ m_pComboBoxes( new QVBox( m_pCombosAndButtons ) ), ++ m_pPushButtons( new QVBox( m_pCombosAndButtons ) ), ++ m_pCheckBoxes( new QGrid( 2, m_pCustomWidget ) ), ++ m_bIsSave( false ), ++ m_bIsExecuting( false ), ++ m_bCanNotifySelection( true ) ++{ ++ connect( this, SIGNAL( fileHighlighted( const QString & ) ), ++ this, SLOT( fileHighlightedCommand( const QString & ) ) ); ++ ++ connect( this, SIGNAL( selectionChanged() ), ++ this, SLOT( selectionChangedCommand() ) ); ++ ++ m_pCustomWidget->setSpacing( KDialog::spacingHint() ); ++ m_pCombosAndButtons->setSpacing( KDialog::spacingHint() ); ++ ++ updateCustomWidgetLayout(); ++} ++ ++TDEFileDialog::~TDEFileDialog() ++{ ++} ++ ++void TDEFileDialog::resizeEvent( QResizeEvent *pEvent ) ++{ ++ KFileDialog::resizeEvent( pEvent ); ++ ++ updateCustomWidgetLayout(); ++} ++ ++void TDEFileDialog::showEvent( QShowEvent *pEvent ) ++{ ++ KFileDialog::showEvent( pEvent ); ++ ++ updateCustomWidgetLayout(); ++} ++ ++void TDEFileDialog::updateCustomWidgetLayout() ++{ ++ QPoint qReferencePoint = filterWidget->mapTo( this, QPoint( 0, 0 ) ); ++ QPoint qCustomPoint = m_pCustomWidget->mapTo( this, QPoint( 0, 0 ) ); ++ ++ int nLeft = qReferencePoint.x() - qCustomPoint.x(); ++ int nRight = m_pCustomWidget->width() - filterWidget->width() - nLeft; ++ ++ nLeft -= KDialog::spacingHint(); ++ nRight -= KDialog::spacingHint(); ++ m_pLabels->setFixedWidth( ( nLeft > 0 )? nLeft: 80 ); ++ // FIXME The following call sets the width of m_pPushButtons all right, ++ // but it also increases the width of m_pComboBoxes rapidly. Can we do ++ // anything about it? ++ m_pPushButtons->setFixedWidth( ( nRight > 0 )? nRight: 100 ); ++} ++ ++void TDEFileDialog::customEvent( QCustomEvent *pEvent ) ++{ ++ if ( pEvent && pEvent->type() == TDECommandEvent::TypeId ) ++ { ++ TDECommandEvent *pCommandEvent = static_cast< TDECommandEvent* >( pEvent ); ++ QStringList *pStringList = pCommandEvent->stringList(); ++ ++ int nListSize = -1; ++ if ( pStringList ) ++ nListSize = pStringList->size(); ++ ++ switch ( pCommandEvent->command() ) ++ { ++ case TDECommandEvent::AppendControl: ++ if ( nListSize >= 3 ) ++ { ++ appendControl( (*pStringList)[0], (*pStringList)[1], (*pStringList)[2] ); ++ } ++ break; ++ case TDECommandEvent::EnableControl: ++ if ( nListSize >= 2 ) ++ { ++ enableControl( (*pStringList)[0], (*pStringList)[1] ); ++ } ++ break; ++ case TDECommandEvent::GetValue: ++ if ( nListSize >= 2 ) ++ { ++ getValue( (*pStringList)[0], (*pStringList)[1] ); ++ } ++ break; ++ case TDECommandEvent::SetValue: ++ if ( nListSize >= 2 ) ++ { ++ QStringList qStringList = (*pStringList); ++ qStringList.pop_front(); ++ qStringList.pop_front(); ++ ++ setValue( (*pStringList)[0], (*pStringList)[1], qStringList ); ++ } ++ break; ++ case TDECommandEvent::AppendFilter: ++ if ( nListSize >= 2 ) ++ { ++ appendFilter( (*pStringList)[0], (*pStringList)[1] ); ++ ++ // update the filters widget ++ setFilter( filters() ); ++ } ++ break; ++ case TDECommandEvent::AppendFilterGroup: ++ if ( nListSize >= 1 ) ++ { ++ QStringList::const_iterator it = pStringList->begin(); ++ ++it; // We ignore the filter group name ++ ++ while ( it != pStringList->end() ) ++ { ++ QString qTitle = *it; ++ ++it; ++ if ( it != pStringList->end() ) ++ { ++ appendFilter( qTitle, (*it) ); ++ ++it; ++ } ++ } ++ ++ // update the filters widget ++ setFilter( filters() ); ++ } ++ break; ++ case TDECommandEvent::GetCurrentFilter: ++ { ++ QString qCurrentFilter = filterWidget->currentText(); ++ sendCommand( "currentFilter " + escapeString( qCurrentFilter ) ); ++ } ++ break; ++ case TDECommandEvent::SetCurrentFilter: ++ if ( nListSize >= 1 ) ++ { ++ static_cast< TDEFileFilterComboHack* >( filterWidget )->setCurrentFilter( pStringList->front() ); ++ } ++ break; ++ case TDECommandEvent::GetDirectory: ++ { ++ QString qDirectory = baseURL().url(); ++ if ( qDirectory.startsWith( "file:/" ) && qDirectory.mid( 6, 1 ) != "/" ) ++ qDirectory.replace( "file:/", "file:///" ); ++ sendCommand( "currentDirectory " + escapeString( qDirectory ) ); ++ } ++ break; ++ case TDECommandEvent::SetDirectory: ++ if ( nListSize >= 1 ) ++ { ++ setURL( pStringList->front() ); ++ } ++ break; ++ case TDECommandEvent::GetFiles: ++ { ++ QString qString; ++ qString.reserve( 1024 ); ++ ++ qString.append( "files" ); ++ ++ if ( result() == QDialog::Accepted ) ++ { ++ KURL::List qList( selectedURLs() ); ++ for ( KURL::List::const_iterator it = qList.begin(); it != qList.end(); ++it ) ++ appendURL( qString, (*it) ); ++ } ++ else ++ { ++ // we have to return the selected files anyway ++ const KFileItemList *pItems = ops->selectedItems(); ++ for ( KFileItemListIterator it( *pItems ); it.current(); ++it ) ++ appendURL( qString, (*it)->url() ); ++ } ++ ++ sendCommand( qString ); ++ setCanNotifySelection( true ); ++ } ++ break; ++ case TDECommandEvent::SetTitle: ++ if ( nListSize >= 1 ) ++ { ++ setCaption( pStringList->front() ); ++ } ++ break; ++ case TDECommandEvent::SetType: ++ if ( nListSize >= 1 ) ++ { ++ QString qType( pStringList->front() ); ++ if ( qType == "open" ) ++ { ++ setIsSave( false ); ++ setCaption( i18n( "Open" ) ); ++ } ++ else if ( qType == "save" ) ++ { ++ setIsSave( true ); ++ setCaption( i18n( "Save As" ) ); ++ } ++ } ++ break; ++ case TDECommandEvent::SetDefaultName: ++ if ( nListSize >= 1 ) ++ { ++ setKeepLocation( true ); ++ setSelection( pStringList->front() ); ++ } ++ break; ++ case TDECommandEvent::SetMultiSelection: ++ if ( nListSize >= 1 ) ++ { ++ if ( pStringList->front() == "true" ) ++ setMode( KFile::Files ); ++ else ++ setMode( KFile::File ); ++ } ++ break; ++ case TDECommandEvent::Exec: ++ { ++ filterWidget->setEditable( false ); ++ setIsExecuting( true ); ++ bool bCanExit = false; ++ do { ++ setCanNotifySelection( true ); ++ exec(); ++ ++ KURL qLocalSelectedURL = mostLocalURL( selectedURL() ); ++ QString qProtocol( qLocalSelectedURL.protocol() ); ++ ++ if ( isSave() && result() == QDialog::Accepted ) ++ { ++ if ( qProtocol == "file" ) ++ { ++ QString qFileName( addExtension( qLocalSelectedURL.path() ) ); ++ bCanExit = ++ !QFile::exists( qFileName ) || ++ ( KMessageBox::warningYesNo( 0, ++ i18n( "A file named \"%1\" already exists. " ++ "Are you sure you want to overwrite it?" ).arg( qFileName ), ++ i18n( "Overwrite File?" ), ++ i18n( "Overwrite" ), KStdGuiItem::cancel() ) == KMessageBox::Yes ); ++ } ++ else if ( !isSupportedProtocol( qProtocol ) ) ++ { ++ KMessageBox::sorry( 0, ++ i18n( "Saving using protocol \"%1\" is not supported." ).arg( qProtocol ) ); ++ bCanExit = false; ++ } ++ else ++ bCanExit = true; ++ } ++ else if ( !isSave() && result() == QDialog::Accepted && !isSupportedProtocol( qProtocol ) ) ++ { ++ KMessageBox::information( 0, ++ i18n( "Protocol \"%1\" is supported only partially. " ++ "Local copy of the file will be created." ).arg( qProtocol ) ); ++ bCanExit = true; ++ } ++ else ++ bCanExit = true; ++ } while ( !bCanExit ); ++ setIsExecuting( false ); ++ ++ if ( result() == QDialog::Accepted ) ++ sendCommand( "accept" ); ++ else ++ sendCommand( "reject" ); ++ } ++ break; ++ default: ++ break; ++ } ++ ++ // FIXME Some cleanup of pEvent? delete something, etc.? ++ } ++} ++ ++void TDEFileDialog::appendControl( const QString &rId, const QString &rType, const QString &rTitle ) ++{ ++ QString qLabel( rTitle ); ++ qLabel.replace( '~', '&' ); ++ ++ if ( rType == "checkbox" ) ++ { ++ QCheckBox *pCheckBox = new QCheckBox( qLabel, m_pCheckBoxes, rId.utf8() ); ++ ++ pCheckBox->setEnabled( true ); ++ pCheckBox->setChecked( false ); ++ } ++ else if ( rType == "listbox" ) ++ { ++ QLabel *pComboLabel = new QLabel( qLabel, m_pLabels ); ++ QComboBox *pComboBox = new QComboBox( m_pComboBoxes, rId.utf8() ); ++ ++ pComboLabel->setBuddy( pComboBox ); ++ pComboBox->setEnabled( true ); ++ } ++ else if ( rType == "pushbutton" ) ++ { ++ QPushButton *pPushButton = new QPushButton( qLabel, m_pPushButtons, rId.utf8() ); ++ pPushButton->setEnabled( true ); ++ } ++} ++ ++QWidget* TDEFileDialog::findControl( const QString &rId ) const ++{ ++ QObjectList *pList = m_pCustomWidget->queryList(); ++ QCString qName( rId.utf8() ); ++ QObjectList::const_iterator it = pList->begin(); ++ ++ for ( ; it != pList->end() && qName != (*it)->name(); ++it ) ++ ; ++ ++ QWidget *pWidget = NULL; ++ if ( it != pList->end() ) ++ pWidget = static_cast< QWidget* >( *it ); ++ ++ delete pList; ++ ++ return pWidget; ++} ++ ++void TDEFileDialog::enableControl( const QString &rId, const QString &rValue ) ++{ ++ QWidget *pWidget = findControl( rId ); ++ ++ if ( pWidget ) ++ pWidget->setEnabled( rValue.lower() == "true" ); ++} ++ ++void TDEFileDialog::getValue( const QString &rId, const QString &rAction ) ++{ ++ QWidget *pWidget = findControl( rId ); ++ QString qString; ++ qString.reserve( 1024 ); ++ qString.append( "value" ); ++ ++ if ( pWidget ) ++ { ++ QCString qClassName = pWidget->className(); ++ if ( qClassName == "QCheckBox" ) ++ { ++ QCheckBox *pCheckBox = static_cast< QCheckBox* >( pWidget ); ++ ++ if ( pCheckBox->isChecked() ) ++ qString.append( " bool true" ); ++ else ++ qString.append( " bool false" ); ++ } ++ else if ( qClassName == "QComboBox" ) ++ { ++ QComboBox *pComboBox = static_cast< QComboBox* >( pWidget ); ++ if ( rAction == "getItems" ) ++ { ++ qString.append( " stringList" ); ++ for ( int nIdx = 0; nIdx < pComboBox->count(); ++nIdx ) ++ { ++ qString.append( ' ' ); ++ appendEscaped( qString, pComboBox->text( nIdx ) ); ++ } ++ } ++ else if ( rAction == "getSelectedItem" ) ++ { ++ qString.append( " string " ); ++ appendEscaped( qString, pComboBox->currentText() ); ++ } ++ else if ( rAction == "getSelectedItemIndex" ) ++ { ++ qString.append( " int " ); ++ qString.append( QString().setNum( pComboBox->currentItem() ) ); ++ } ++ // TODO getHelpURL ++ } ++ // TODO push button ++ } ++ ++ sendCommand( qString ); ++} ++ ++void TDEFileDialog::setValue( const QString &rId, const QString &rAction, const QStringList &rValue ) ++{ ++ QWidget *pWidget = findControl( rId ); ++ ++ if ( pWidget ) ++ { ++ QCString qClassName = pWidget->className(); ++ if ( qClassName == "QCheckBox" ) ++ { ++ QCheckBox *pCheckBox = static_cast< QCheckBox* >( pWidget ); ++ ++ bool bValue = ( !rValue.isEmpty() ) && ( rValue.front().lower() == "true" ); ++ pCheckBox->setChecked( bValue ); ++ } ++ else if ( qClassName == "QComboBox" ) ++ { ++ QComboBox *pComboBox = static_cast< QComboBox* >( pWidget ); ++ if ( rAction == "addItem" ) ++ { ++ if ( !rValue.isEmpty() ) ++ pComboBox->insertItem( rValue.front() ); ++ } ++ else if ( rAction == "addItems" ) ++ { ++ pComboBox->insertStringList( rValue ); ++ } ++ else if ( rAction == "deleteItem" ) ++ { ++ if ( !rValue.isEmpty() ) ++ pComboBox->removeItem( rValue.front().toInt() ); ++ } ++ else if ( rAction == "deleteItems" ) ++ { ++ pComboBox->clear(); ++ } ++ else if ( rAction == "setSelectedItem" ) ++ { ++ if ( !rValue.isEmpty() ) ++ pComboBox->setCurrentItem( rValue.front().toInt() ); ++ } ++ // FIXME setHelpURL is ignored ++ } ++ // TODO push button ++ } ++} ++ ++void TDEFileDialog::appendFilter( const QString &rTitle, const QString &rFilter ) ++{ ++ // Filters are separated by ';' ++ QString qFilter( rFilter ); ++ qFilter.replace( QChar( ';' ), QChar( ' ' ) ).replace( "*.*", "*" ); ++ ++ // Workaround for too wide (*.bmp;...) entry ++ QString qTitle( rTitle ); ++ qTitle.replace( QRegExp( "^<([^>]*)> \\(.*" ), "<\\1>" ); ++ ++ m_aFilters.push_back( qMakePair( qTitle, qFilter ) ); ++} ++ ++QString TDEFileDialog::filters() const ++{ ++ QString qString, qTmp; ++ bool bFirstFilter = true; ++ ++ for ( FilterList::const_iterator it = m_aFilters.begin(); it != m_aFilters.end(); ++it ) ++ { ++ if ( bFirstFilter ) ++ bFirstFilter = false; ++ else ++ qString.append( '\n' ); ++ ++ qString.append( (*it).second ); ++ qString.append( '|' ); ++ ++ qTmp = (*it).first; ++ qString.append( qTmp.replace( '/', "\\/" ) ); ++ } ++ ++ return qString; ++} ++ ++QString TDEFileDialog::addExtension( const QString &rFileName ) const ++{ ++ if ( !isSave() ) ++ return rFileName; ++ ++ QString qExtension; ++ ++ QWidget *pExtensionWidget = findControl( "100" ); // CHECKBOX_AUTOEXTENSION ++ QCheckBox *pExtensionCB = pExtensionWidget? static_cast< QCheckBox* >( pExtensionWidget->qt_cast( "QCheckBox" ) ): NULL; ++ if ( pExtensionCB && pExtensionCB->isChecked() ) ++ { ++ // FIXME: qFilter can be a MIME; we ignore it now... ++ QStringList qFilterList = QStringList::split( " ", currentFilter() ); ++ for ( QStringList::const_iterator it = qFilterList.begin(); ++ qExtension.isEmpty() && it != qFilterList.end(); ++ ++it ) ++ { ++ int nUnwanted = (*it).findRev( '*' ); ++ if ( nUnwanted < 0 ) ++ nUnwanted = (*it).findRev( '?' ); ++ else ++ nUnwanted = ::std::max( nUnwanted, (*it).find( '?', nUnwanted ) ); ++ ++ int nIdx = (*it).find( '.', ::std::max( nUnwanted, 0 ) ); ++ if ( nIdx >= 0 ) ++ qExtension = (*it).mid( nIdx ).lower(); ++ } ++ } ++ ++ if ( qExtension.isEmpty() || qExtension == "." || rFileName.endsWith( qExtension ) ) ++ return rFileName; ++ else ++ return rFileName + qExtension; ++} ++ ++bool TDEFileDialog::isSupportedProtocol( const QString &rProtocol ) const ++{ ++ // TODO Get this information directly from OOo ++ const char * pOOoProtocols[] = { "", "smb", "ftp", "http", "file", "mailto", ++ "vnd.sun.star.webdav", "news", "private", "vnd.sun.star.help", ++ "https", "slot", "macro", "javascript", "imap", "pop3", "data", ++ "cid", "out", "vnd.sun.star.wfs", "vnd.sun.star.hier", "vim", ++ ".uno", ".component", "vnd.sun.star.pkg", "ldap", "db", ++ "vnd.sun.star.cmd", "vnd.sun.star.script", "vnd.sun.star.odma", ++ "telnet", ++ NULL }; ++ ++ for ( const char **pIndex = pOOoProtocols; *pIndex != NULL; ++pIndex ) ++ { ++ if ( rProtocol == *pIndex ) ++ return true; ++ } ++ ++ // TODO gnome-vfs bits here ++ ++ return false; ++} ++ ++KURL TDEFileDialog::mostLocalURL( const KURL &rURL ) const ++{ ++#if KDE_IS_VERSION(3,5,0) ++ KURL qMostLocalURL( KIO::NetAccess::mostLocalURL( rURL, const_cast( this ) ) ); ++ if ( qMostLocalURL.isLocalFile() ) ++ return qMostLocalURL; ++ else ++ { ++ // Terrible hack to get even non-existing media:// files right ++ qMostLocalURL.cd( ".." ); ++ KURL qMostLocalPath( KIO::NetAccess::mostLocalURL( qMostLocalURL, const_cast( this ) ) ); ++ if ( qMostLocalPath.isLocalFile() ) ++ { ++ qMostLocalPath.addPath( rURL.fileName() ); ++ return qMostLocalPath; ++ } ++ } ++#endif ++ ++ return rURL; ++} ++ ++QString TDEFileDialog::localCopy( const QString &rFileName ) const ++{ ++ // 106 == MIB enum for UTF-8 ++ KURL qLocalURL = mostLocalURL( KURL( rFileName, 106 ) ); ++ if ( qLocalURL.isLocalFile() ) ++ return qLocalURL.url(); ++ ++ int nExtensionPos = rFileName.findRev( '/' ); ++ if ( nExtensionPos >= 0 ) ++ nExtensionPos = rFileName.find( '.', nExtensionPos ); ++ else ++ nExtensionPos = rFileName.find( '.' ); ++ ++ KTempFile qTempFile( QString::null, ( nExtensionPos < 0 )? QString(): rFileName.mid( nExtensionPos ) ); ++ KURL qDestURL; ++ qDestURL.setPath( qTempFile.name() ); ++ ++ if ( !KIO::NetAccess::file_copy( rFileName, qDestURL, 0600, true, false, NULL ) ) ++ { ++ KMessageBox::error( 0, KIO::NetAccess::lastErrorString() ); ++ return QString::null; ++ } ++ ++ return qDestURL.url(); ++} ++ ++void TDEFileDialog::fileHighlightedCommand( const QString & ) ++{ ++ if ( canNotifySelection() ) ++ { ++ sendCommand( "fileSelectionChanged" ); ++ setCanNotifySelection( false ); ++ } ++} ++ ++void TDEFileDialog::selectionChangedCommand() ++{ ++ if ( canNotifySelection() ) ++ { ++ sendCommand( "fileSelectionChanged" ); ++ setCanNotifySelection( false ); ++ } ++} ++ ++void TDEFileDialog::sendCommand( const QString &rCommand ) ++{ ++#if OSL_DEBUG_LEVEL > 0 ++ ::std::cerr << "tdefilepicker sent: " << rCommand.latin1() << ::std::endl; ++#endif ++ ++ //m_aOutputStream << rCommand << endl; ++ ::std::cout << rCommand.utf8() << ::std::endl; ++} ++ ++void TDEFileDialog::appendURL( QString &rBuffer, const KURL &rURL ) ++{ ++ // From Martin Kretzschmar: ++ // file:///path/to/test%E0.odt is not a valid URL from OOo's point of ++ // view. (?Most modern parts of?) OOo assume(s) that the URL contains only ++ // ASCII characters (which test%E0.odt does) and is UTF-8 after unescaping ++ // (which file:///path/test%E0.odt is not). ++ // Cf. the comment in sal/inc/osl/file.h. ++ // 106 == MIB enum for UTF-8 ++ QString qUrlStr = addExtension( rURL.url( 0, 106 ) ); ++ ++ if ( !isExecuting() && !isSupportedProtocol( rURL.protocol() ) ) ++ qUrlStr = localCopy( qUrlStr ); ++ ++ if ( qUrlStr.startsWith( "file:/" ) && qUrlStr.mid( 6, 1 ) != "/" ) ++ qUrlStr.replace( "file:/", "file:///" ); ++ ++ rBuffer.append( " " ); ++ if ( !qUrlStr.isEmpty() ) ++ appendEscaped( rBuffer, qUrlStr ); ++} ++ ++void TDEFileDialog::appendEscaped( QString &rBuffer, const QString &rString ) ++{ ++ const QChar *pUnicode = rString.unicode(); ++ const QChar *pEnd = pUnicode + rString.length(); ++ ++ rBuffer.append( '"' ); ++ for ( ; pUnicode != pEnd; ++pUnicode ) ++ { ++ if ( *pUnicode == '\\' ) ++ rBuffer.append( "\\\\" ); ++ else if ( *pUnicode == '"' ) ++ rBuffer.append( "\\\"" ); ++ else if ( *pUnicode == '\n' ) ++ rBuffer.append( "\\\n" ); ++ else ++ rBuffer.append( *pUnicode ); ++ } ++ rBuffer.append( '"' ); ++} ++ ++QString TDEFileDialog::escapeString( const QString &rString ) ++{ ++ QString qString; ++ qString.reserve( 2*rString.length() + 2 ); // every char escaped + quotes ++ ++ appendEscaped( qString, rString ); ++ ++ return qString; ++} ++ ++ ++void TDEFileFilterComboHack::setCurrentFilter( const QString& filter ) ++{ ++ setCurrentText( filter ); ++ filterChanged(); ++ ++ // Workaround for 'Filter name (*.blah)' vs. 'Filter name' ++ if ( currentText() != text( currentItem() ) ) ++ { ++ int nItem = 0; ++ for ( ; nItem < count() && !text( nItem ).startsWith( filter ); ++nItem ); ++ ++ if ( nItem < count() ) ++ setCurrentItem( nItem ); ++ else ++ setCurrentItem( 0 ); ++ ++ filterChanged(); ++ } ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde/tdefilepicker.hxx fpicker/source/unx/tde/tdefilepicker.hxx +--- fpicker/source/unx/tde/tdefilepicker.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde/tdefilepicker.hxx 2011-08-17 14:05:02.262902414 -0500 +@@ -0,0 +1,126 @@ ++/* -*- 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 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _TDEFILEPICKER_HXX_ ++#define _TDEFILEPICKER_HXX_ ++ ++#include ++#include ++ ++class QGrid; ++class QHBox; ++class QVBox; ++ ++class TDEFileDialog : public KFileDialog ++{ ++ Q_OBJECT ++ ++protected: ++ typedef QPair< QString, QString > FilterEntry; ++ typedef QValueList< FilterEntry > FilterList; ++ ++ QVBox *m_pCustomWidget; ++ QHBox *m_pCombosAndButtons; ++ ++ QVBox *m_pLabels; ++ QVBox *m_pComboBoxes; ++ QVBox *m_pPushButtons; ++ ++ QGrid *m_pCheckBoxes; ++ ++ FilterList m_aFilters; ++ ++ /** Are we a "Save As" dialog? ++ * ++ * We cannot use KFileDialog::setOperationMode() here, because then ++ * it automatically adds an "Automatically select filename extension" ++ * check box, and completely destroys the dialog's layout ++ * (custom list boxes are under this check box, which looks ugly). ++ */ ++ bool m_bIsSave; ++ bool m_bIsExecuting; ++ ++ bool m_bCanNotifySelection; ++ ++public: ++ TDEFileDialog( const QString &startDir, const QString &filter, ++ QWidget *parent, const char *name ); ++ virtual ~TDEFileDialog(); ++ ++protected: ++ virtual void resizeEvent( QResizeEvent *pEvent ); ++ virtual void showEvent( QShowEvent *pEvent ); ++ void updateCustomWidgetLayout(); ++ ++ virtual void customEvent( QCustomEvent *pEvent ); ++ ++protected: ++ void appendControl( const QString &rId, const QString &rType, const QString &rTitle ); ++ QWidget* findControl( const QString &rId ) const; ++ void enableControl( const QString &rId, const QString &rValue ); ++ void getValue( const QString &rId, const QString &rAction ); ++ void setValue( const QString &rId, const QString &rAction, const QStringList &rValue ); ++ ++ void appendFilter( const QString &rTitle, const QString &rFilter ); ++ QString filters() const; ++ QString addExtension( const QString &rFileName ) const; ++ ++ void setIsSave( bool bIsSave ) { m_bIsSave = bIsSave; } ++ bool isSave( void ) const { return m_bIsSave; } ++ ++ void setIsExecuting( bool bIsExecuting ) { m_bIsExecuting = bIsExecuting; } ++ bool isExecuting( void ) const { return m_bIsExecuting; } ++ ++ bool isSupportedProtocol( const QString &rProtocol ) const; ++ KURL mostLocalURL( const KURL &rURL ) const; ++ QString localCopy( const QString &rFileName ) const; ++ ++ void setCanNotifySelection( bool bCanNotifySelection ) { m_bCanNotifySelection = bCanNotifySelection; } ++ bool canNotifySelection( void ) const { return m_bCanNotifySelection; } ++ ++protected slots: ++ void fileHighlightedCommand( const QString & ); ++ void selectionChangedCommand(); ++ ++protected: ++ void sendCommand( const QString &rCommand ); ++ void appendURL( QString &rBuffer, const KURL &rURL ); ++ void appendEscaped( QString &rBuffer, const QString &rString ); ++ QString escapeString( const QString &rString ); ++}; ++ ++class TDEFileFilterComboHack : public KFileFilterCombo ++{ ++public: ++ void setCurrentFilter( const QString& filter ); ++}; ++ ++#endif // _TDEFILEPICKER_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde/tdefpmain.cxx fpicker/source/unx/tde/tdefpmain.cxx +--- fpicker/source/unx/tde/tdefpmain.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde/tdefpmain.cxx 2011-08-17 14:04:58.622623640 -0500 +@@ -0,0 +1,93 @@ ++/* -*- 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 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++////////////////////////////////////////////////////////////////////////// ++// Main ++////////////////////////////////////////////////////////////////////////// ++ ++static KCmdLineOptions sOptions[] = ++{ ++ { "winid ", I18N_NOOP("Window ID to which is the fpicker modal"), "0" }, ++ KCmdLineLastOption ++}; ++ ++int main( int argc, char* argv[] ) ++{ ++ // we fake the name of the application to have "OpenOffice.org" in the ++ // title ++ KAboutData qAboutData( "tdefilepicker", I18N_NOOP( "OpenOffice.org" ), ++ "0.1", I18N_NOOP( "tdefilepicker is an implementation of the TDE file dialog for OpenOffice.org." ), ++ KAboutData::License_LGPL, ++ "(c) 2004, Jan Holesovsky" ); ++ qAboutData.addAuthor( "Jan Holesovsky", I18N_NOOP("Original author and current maintainer"), "kendy@openoffice.org" ); ++ ++ // Let the user see that this does something... ++ ::std::cerr << "tdefilepicker, an implementation of TDE file dialog for OOo." << ::std::endl ++ << "Type 'exit' and press Enter to finish." << ::std::endl; ++ ++ KCmdLineArgs::addCmdLineOptions( sOptions ); ++ KCmdLineArgs::init( argc, argv, &qAboutData ); ++ ++ KLocale::setMainCatalogue( "kdialog" ); ++ ++ KApplication kApplication; ++ ++ // Setup the modality ++ KCmdLineArgs *pArgs = KCmdLineArgs::parsedArgs(); ++ long nWinId = atol( pArgs->getOption( "winid" ) ); ++ pArgs->clear(); ++ ++ TDEModalityFilter qModalityFilter( nWinId ); ++ ++ TDEFileDialog aFileDialog( NULL, QString(), NULL, "tdefiledialog" ); ++ ++ TDECommandThread qCommandThread( &aFileDialog ); ++ qCommandThread.start(); ++ ++ kApplication.exec(); ++ ++ qCommandThread.wait(); ++ ++ ::std::cout << "exited" << ::std::endl; ++ ++ return 0; ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde/tdemodalityfilter.cxx fpicker/source/unx/tde/tdemodalityfilter.cxx +--- fpicker/source/unx/tde/tdemodalityfilter.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde/tdemodalityfilter.cxx 2011-08-17 14:04:44.121513143 -0500 +@@ -0,0 +1,68 @@ ++/* -*- 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 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++////////////////////////////////////////////////////////////////////////// ++// Modality filter ++////////////////////////////////////////////////////////////////////////// ++ ++TDEModalityFilter::TDEModalityFilter( WId nWinId ) ++ : m_nWinId( nWinId ) ++{ ++ kapp->installEventFilter( this ); ++} ++ ++TDEModalityFilter::~TDEModalityFilter() ++{ ++ kapp->removeEventFilter( this ); ++} ++ ++bool TDEModalityFilter::eventFilter( QObject *pObject, QEvent *pEvent ) ++{ ++ if ( pObject->isWidgetType() && pEvent->type() == QEvent::Show ) ++ { ++ KDialogBase* pDlg = ::qt_cast< KDialogBase* >( pObject ); ++ if ( pDlg != NULL && m_nWinId != 0 ) ++ { ++ XSetTransientForHint( qt_xdisplay(), pDlg->winId(), m_nWinId ); ++ m_nWinId = 0; ++ } ++ } ++ return false; ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde/tdemodalityfilter.hxx fpicker/source/unx/tde/tdemodalityfilter.hxx +--- fpicker/source/unx/tde/tdemodalityfilter.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde/tdemodalityfilter.hxx 2011-08-17 14:04:27.940273979 -0500 +@@ -0,0 +1,49 @@ ++/* -*- 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 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _TDEMODALITYFILTER_HXX_ ++#define _TDEMODALITYFILTER_HXX_ ++ ++#include ++ ++class TDEModalityFilter : public QObject ++{ ++private: ++ WId m_nWinId; ++ ++public: ++ TDEModalityFilter( WId nWinId ); ++ virtual ~TDEModalityFilter(); ++ ++ virtual bool eventFilter( QObject *pObject, QEvent *pEvent ); ++}; ++ ++#endif // _TDEMODALITYFILTER_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde_unx/FPServiceInfo.hxx fpicker/source/unx/tde_unx/FPServiceInfo.hxx +--- fpicker/source/unx/tde_unx/FPServiceInfo.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/FPServiceInfo.hxx 2011-08-17 14:07:24.203772856 -0500 +@@ -0,0 +1,48 @@ ++/* -*- 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. ++ * Copyright 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _FPSERVICEINFO_HXX_ ++#define _FPSERVICEINFO_HXX_ ++ ++// the service names ++#define FILE_PICKER_SERVICE_NAME "com.sun.star.ui.dialogs.TDEFilePicker" ++ ++// the implementation names ++#define FILE_PICKER_IMPL_NAME "com.sun.star.ui.dialogs.UnxFilePicker" ++ ++// the registry key names ++// a key under which this service will be registered, ++// Format: -> "/ImplName/UNO/SERVICES/ServiceName" ++// ++#define FILE_PICKER_REGKEY_NAME "/com.sun.star.ui.dialogs.UnxFilePicker/UNO/SERVICES/com.sun.star.ui.dialogs.TDEFilePicker" ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde_unx/fps-tde-ucd.txt fpicker/source/unx/tde_unx/fps-tde-ucd.txt +--- fpicker/source/unx/tde_unx/fps-tde-ucd.txt 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/fps-tde-ucd.txt 2011-08-17 14:06:16.168562070 -0500 +@@ -0,0 +1,6 @@ ++[ComponentDescriptor] ++ImplementationName=com.sun.star.ui.dialogs.UnxFilePicker ++ComponentName=fps_tde.uno.so ++LoaderName=com.sun.star.loader.SharedLibrary ++[SupportedServices] ++com.sun.star.ui.dialogs.TDEFilePicker +diff -urN fpicker/source/unx/tde_unx/fps_tde.xml fpicker/source/unx/tde_unx/fps_tde.xml +--- fpicker/source/unx/tde_unx/fps_tde.xml 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/fps_tde.xml 2011-08-17 14:07:17.433254165 -0500 +@@ -0,0 +1,51 @@ ++ ++ ++ ++ fps_tde ++ ++ Jan Holesovsky ++ com.sun.star.comp.ui.dialogs.FilePicker ++ ++ The TDE implementation of the FilePicker service. ++ ++ com.sun.star.loader.SharedLibrary ++ c++ ++ ++ com.sun.star.ui.dialogs.FilePicker ++ ... ++ com.sun.star.ui.dialogs.XExecutableDialog ++ com.sun.star.ui.dialogs.XFilePicker ++ com.sun.star.ui.dialogs.XFilterManager ++ com.sun.star.ui.dialogs.XFilterGroupManager ++ com.sun.star.ui.dialogs.XFilePickerListener ++ com.sun.star.ui.dialogs.ExecutableDialogException ++ com.sun.star.ui.dialogs.XFilePickerNotifier ++ com.sun.star.ui.dialogs.XFilePickerControlAccess ++ com.sun.star.ui.dialogs.XFilePreview ++ com.sun.star.ui.dialogs.ExtendedFilePickerElementIds ++ com.sun.star.ui.dialogs.ExecutableDialogResults ++ com.sun.star.ui.dialogs.FilePickerEvent ++ com.sun.star.ui.dialogs.CommonFilePickerElementIds ++ com.sun.star.ui.dialogs.ListboxControlActions ++ com.sun.star.ui.dialogs.TemplateDescription ++ com.sun.star.ui.dialogs.FilePreviewImageFormats ++ com.sun.star.util.XCancellable ++ com.sun.star.lang.XComponent ++ com.sun.star.lang.XMultiServiceFactory ++ com.sun.star.lang.XSingleServiceFactory ++ com.sun.star.lang.XServiceInfo ++ com.sun.star.lang.XTypeProvider ++ com.sun.star.lang.IllegalArgumentException ++ com.sun.star.uno.TypeClass ++ com.sun.star.uno.XWeak ++ com.sun.star.uno.XAggregation ++ com.sun.star.registry.XRegistryKey ++ com.sun.star.container.XSet ++ ++ cppuhelper ++ cppu ++ sal ++ cppuhelper ++ cppu2 ++ sal2 ++ +diff -urN fpicker/source/unx/tde_unx/makefile.mk fpicker/source/unx/tde_unx/makefile.mk +--- fpicker/source/unx/tde_unx/makefile.mk 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/makefile.mk 2011-08-17 14:07:11.152773020 -0500 +@@ -0,0 +1,78 @@ ++#************************************************************************* ++# ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# Copyright 2000, 2010 Oracle and/or its affiliates. ++# Copyright 2010 Novell, Inc. ++# Copyright 2011 Timothy Pearson ++# ++# 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 ++# ++# for a copy of the LGPLv3 License. ++# ++#************************************************************************* ++ ++PRJ=..$/..$/.. ++ ++PRJNAME=fpicker ++TARGET=fps_tde.uno ++LIBTARGET=NO ++ENABLE_EXCEPTIONS=TRUE ++ ++# --- Settings ----------------------------------------------------- ++ ++.INCLUDE : settings.mk ++DLLPRE= ++ ++# ------------------------------------------------------------------ ++ ++# Currently just TDE is supported... ++.IF "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE" ++ ++dummy: ++ @echo "Nothing to build. GUIBASE == $(GUIBASE), ENABLE_TDE is not set" ++ ++.ELSE # we build for TDE ++ ++# --- Files -------------------------------------------------------- ++ ++SLOFILES =\ ++ $(SLO)$/UnxCommandThread.obj \ ++ $(SLO)$/UnxFilePicker.obj \ ++ $(SLO)$/UnxNotifyThread.obj \ ++ $(SLO)$/UnxFPentry.obj ++ ++SHL1NOCHECK=TRUE ++SHL1TARGET=fps_tde.uno ++SHL1STDLIBS=$(CPPULIB)\ ++ $(CPPUHELPERLIB)\ ++ $(SALLIB)\ ++ $(VCLLIB)\ ++ $(TOOLSLIB) ++ ++SHL1OBJS=$(SLOFILES) ++SHL1DEF=$(MISC)$/$(SHL1TARGET).def ++ ++DEF1NAME=$(SHL1TARGET) ++DEF1VERSIONMAP=$(SOLARENV)/src/component.map ++ ++.ENDIF # "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE" ++ ++# --- Targets ------------------------------------------------------ ++ ++.INCLUDE : target.mk +diff -urN fpicker/source/unx/tde_unx/UnxCommandThread.cxx fpicker/source/unx/tde_unx/UnxCommandThread.cxx +--- fpicker/source/unx/tde_unx/UnxCommandThread.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/UnxCommandThread.cxx 2011-08-17 14:06:59.001842171 -0500 +@@ -0,0 +1,315 @@ ++/* -*- 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 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++using namespace ::com::sun::star; ++ ++////////////////////////////////////////////////////////////////////////// ++// UnxFilePickerCommandThread ++////////////////////////////////////////////////////////////////////////// ++ ++UnxFilePickerCommandThread::UnxFilePickerCommandThread( UnxFilePickerNotifyThread *pNotifyThread, int nReadFD ) ++ : m_pNotifyThread( pNotifyThread ), ++ m_nReadFD( nReadFD ) ++{ ++} ++ ++UnxFilePickerCommandThread::~UnxFilePickerCommandThread() ++{ ++} ++ ++sal_Bool SAL_CALL UnxFilePickerCommandThread::result() ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_aResult; ++} ++ ++::rtl::OUString SAL_CALL UnxFilePickerCommandThread::getCurrentFilter() ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_aGetCurrentFilter; ++} ++ ++::rtl::OUString SAL_CALL UnxFilePickerCommandThread::getDirectory() ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_aGetDirectory; ++} ++ ++uno::Sequence< ::rtl::OUString > SAL_CALL UnxFilePickerCommandThread::getFiles() ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ sal_Int32 nSize = m_aGetFiles.size(); ++ uno::Sequence< ::rtl::OUString > aFiles( ( nSize > 1 )? nSize + 1: nSize ); ++ ++ if ( nSize == 1 ) ++ aFiles[0] = m_aGetFiles.front(); ++ else if ( nSize > 1 ) ++ { ++ // First entry in the sequence must be the dirname, the others are the ++ // filenames, so we have to rearrange the list... ++ ++ ::rtl::OUString aFront = m_aGetFiles.front(); ++ sal_Int32 nLastSlash = aFront.lastIndexOf( '/' ); ++ ++ aFiles[0] = ( nLastSlash >= 0 )? aFront.copy( 0, nLastSlash ): ::rtl::OUString(); ++ ++nLastSlash; ++ ++ sal_Int32 nIdx = 1; ++ for ( ::std::list< ::rtl::OUString >::const_iterator it = m_aGetFiles.begin(); ++ it != m_aGetFiles.end(); ++it, ++nIdx ) ++ { ++ sal_Int32 nLength = (*it).getLength() - nLastSlash; ++ aFiles[nIdx] = ( nLength >= 0 )? (*it).copy( nLastSlash, nLength ): ::rtl::OUString(); ++ } ++ } ++ ++ return aFiles; ++} ++ ++uno::Any SAL_CALL UnxFilePickerCommandThread::getValue() ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_aGetValue; ++} ++ ++void SAL_CALL UnxFilePickerCommandThread::run() ++{ ++ if ( m_nReadFD < 0 ) ++ return; ++ ++ sal_Int32 nBufferSize = 1024; // 1 is for testing, 1024 for real use ++ sal_Char *pBuffer = new sal_Char[nBufferSize]; ++ sal_Char *pBufferEnd = pBuffer + nBufferSize; ++ ++ sal_Char *pWhereToRead = pBuffer; ++ sal_Char *pEntryBegin = pBuffer; ++ sal_Int32 nBytesRead = 0; ++ sal_Bool bShouldExit = sal_False; ++ while ( !bShouldExit && ( nBytesRead = read( m_nReadFD, pWhereToRead, pBufferEnd - pWhereToRead ) ) > 0 ) ++ { ++ sal_Bool bFoundNL = sal_False; ++ sal_Char *pWhereToReadEnd = pWhereToRead + nBytesRead; ++ sal_Char *pEntryEnd = pWhereToRead; ++ do { ++ for ( ; pEntryEnd < pWhereToReadEnd && *pEntryEnd != '\n'; ++pEntryEnd ) ++ ; ++ ++ if ( pEntryEnd < pWhereToReadEnd ) ++ { ++ bFoundNL = sal_True; ++ *pEntryEnd = 0; ++ ++ if ( strcmp( pEntryBegin, "exited" ) == 0 ) ++ bShouldExit = sal_True; ++ else ++ handleCommand( ::rtl::OUString( pEntryBegin, pEntryEnd - pEntryBegin, RTL_TEXTENCODING_UTF8 )/*, bQuit*/ ); ++ ++ pEntryBegin = pEntryEnd + 1; ++ } ++ } while ( pEntryEnd < pWhereToReadEnd ); ++ ++ if ( bFoundNL ) ++ { ++ if ( pEntryBegin < pBufferEnd ) ++ memmove( pBuffer, pEntryBegin, pWhereToReadEnd - pEntryBegin ); ++ } ++ else ++ { ++ // enlarge the buffer size ++ nBufferSize *= 2; ++ sal_Char *pNewBuffer = new sal_Char[nBufferSize]; ++ if ( pEntryBegin < pBufferEnd ) ++ memmove( pNewBuffer, pEntryBegin, pWhereToReadEnd - pEntryBegin ); ++ ++ delete[] pBuffer; ++ pBuffer = pNewBuffer; ++ pBufferEnd = pBuffer + nBufferSize; ++ } ++ ++ pWhereToRead = pBuffer + ( pWhereToReadEnd - pEntryBegin ); ++ pEntryBegin = pBuffer; ++ } ++} ++ ++void SAL_CALL UnxFilePickerCommandThread::handleCommand( const ::rtl::OUString &rCommand ) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++#if OSL_DEBUG_LEVEL > 0 ++ ::std::cerr << "UnxFilePicker received: \"" << ++ OUStringToOString( rCommand, RTL_TEXTENCODING_ASCII_US ).getStr() << "\"" << ::std::endl; ++#endif ++ ++ ::std::list< ::rtl::OUString > aList = tokenize( rCommand ); ++ ++ if ( aList.size() == 0 ) ++ return; ++ ++ ::rtl::OUString aCommandName = aList.front(); ++ aList.pop_front(); ++ ++ if ( aCommandName.equalsAscii( "accept" ) ) ++ { ++ m_aResult = sal_True; ++ m_aExecCondition.set(); ++ } ++ else if ( aCommandName.equalsAscii( "reject" ) ) ++ { ++ m_aResult = sal_False; ++ m_aExecCondition.set(); ++ } ++ else if ( aCommandName.equalsAscii( "fileSelectionChanged" ) ) ++ { ++ if ( m_pNotifyThread ) ++ m_pNotifyThread->fileSelectionChanged(); ++ } ++ else if ( aCommandName.equalsAscii( "files" ) ) ++ { ++ m_aGetFiles = aList; ++ m_aGetFilesCondition.set(); ++ } ++ else if ( aCommandName.equalsAscii( "value" ) ) ++ { ++ ::rtl::OUString aType; ++ if ( !aList.empty() ) ++ { ++ aType = aList.front(); ++ aList.pop_front(); ++ } ++ ++ if ( aType.equalsAscii( "bool" ) ) ++ { ++ sal_Bool bValue = !aList.empty() && aList.front().equalsIgnoreAsciiCaseAscii( "true" ); ++ ++ m_aGetValue <<= bValue; ++ m_aGetValueCondition.set(); ++ } ++ else if ( aType.equalsAscii( "int" ) ) ++ { ++ sal_Int32 nValue = 0; ++ if ( !aList.empty() ) ++ nValue = aList.front().toInt32(); ++ ++ m_aGetValue <<= nValue; ++ m_aGetValueCondition.set(); ++ } ++ else if ( aType.equalsAscii( "string" ) ) ++ { ++ ::rtl::OUString aValue; ++ if ( !aList.empty() ) ++ aValue = aList.front(); ++ ++ m_aGetValue <<= aValue; ++ m_aGetValueCondition.set(); ++ } ++ else if ( aType.equalsAscii( "stringList" ) ) ++ { ++ uno::Sequence< ::rtl::OUString > aSequence( aList.size() ); ++ sal_Int32 nIdx = 0; ++ for ( ::std::list< ::rtl::OUString >::const_iterator it = aList.begin(); it != aList.end(); ++it, ++nIdx ) ++ aSequence[nIdx] = (*it); ++ ++ m_aGetValue <<= aSequence; ++ m_aGetValueCondition.set(); ++ } ++ else ++ { ++ m_aGetValue = uno::Any(); ++ m_aGetValueCondition.set(); ++ } ++ } ++ else if ( aCommandName.equalsAscii( "currentFilter" ) ) ++ { ++ m_aGetCurrentFilter = aList.empty()? ::rtl::OUString(): aList.front(); ++ m_aGetCurrentFilterCondition.set(); ++ } ++ else if ( aCommandName.equalsAscii( "currentDirectory" ) ) ++ { ++ m_aGetDirectory = aList.empty()? ::rtl::OUString(): aList.front(); ++ m_aGetDirectoryCondition.set(); ++ } ++ else ++ { ++#if OSL_DEBUG_LEVEL > 0 ++ ::std::cerr << "Unrecognized command: " ++ << OUStringToOString( aCommandName, RTL_TEXTENCODING_ASCII_US ).getStr() << "\"" << ::std::endl; ++#endif ++ } ++} ++ ++::std::list< ::rtl::OUString > SAL_CALL UnxFilePickerCommandThread::tokenize( const ::rtl::OUString &rCommand ) ++{ ++ ::std::list< ::rtl::OUString > aList; ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ const sal_Unicode *pUnicode = rCommand.getStr(); ++ const sal_Unicode *pEnd = pUnicode + rCommand.getLength(); ++ sal_Bool bQuoted = sal_False; ++ ++ for ( ; pUnicode != pEnd; ++pUnicode ) ++ { ++ if ( *pUnicode == '\\' ) ++ { ++ ++pUnicode; ++ if ( pUnicode != pEnd ) ++ { ++ if ( *pUnicode == 'n' ) ++ aBuffer.appendAscii( "\n", 1 ); ++ else ++ aBuffer.append( *pUnicode ); ++ } ++ } ++ else if ( *pUnicode == '"' ) ++ bQuoted = !bQuoted; ++ else if ( *pUnicode == ' ' && !bQuoted ) ++ aList.push_back( aBuffer.makeStringAndClear() ); ++ else ++ aBuffer.append( *pUnicode ); ++ } ++ aList.push_back( aBuffer.makeStringAndClear() ); ++ ++ return aList; ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde_unx/UnxCommandThread.hxx fpicker/source/unx/tde_unx/UnxCommandThread.hxx +--- fpicker/source/unx/tde_unx/UnxCommandThread.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/UnxCommandThread.hxx 2011-08-17 14:06:49.721131468 -0500 +@@ -0,0 +1,136 @@ ++/* -*- 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 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _UNXCOMMANDTHREAD_HXX_ ++#define _UNXCOMMANDTHREAD_HXX_ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++class UnxFilePickerNotifyThread; ++ ++/** Synchronization for the 'thread-less' version of the fpicker. ++ ++ Something like osl::Condition, but calls Application::Yield() while in ++ wait(). ++*/ ++class YieldingCondition ++{ ++ ::osl::Mutex m_aMutex; ++ bool m_bValue; ++ ++ bool get() ++ { ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ return m_bValue; ++ } ++ ++public: ++ YieldingCondition() { reset(); } ++ ++ void reset() ++ { ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ m_bValue = false; ++ } ++ ++ void set() ++ { ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ m_bValue = true; ++ } ++ ++ void wait() ++ { ++ while ( !get() ) ++ Application::Yield(); ++ } ++}; ++ ++class UnxFilePickerCommandThread : public ::osl::Thread ++{ ++protected: ++ UnxFilePickerNotifyThread *m_pNotifyThread; ++ int m_nReadFD; ++ ++ ::osl::Mutex m_aMutex; ++ ++ YieldingCondition m_aExecCondition; ++ sal_Bool m_aResult; ++ ++ ::osl::Condition m_aGetCurrentFilterCondition; ++ ::rtl::OUString m_aGetCurrentFilter; ++ ++ ::osl::Condition m_aGetDirectoryCondition; ++ ::rtl::OUString m_aGetDirectory; ++ ++ ::osl::Condition m_aGetFilesCondition; ++ ::std::list< ::rtl::OUString > m_aGetFiles; ++ ++ ::osl::Condition m_aGetValueCondition; ++ ::com::sun::star::uno::Any m_aGetValue; ++ ++public: ++ UnxFilePickerCommandThread( UnxFilePickerNotifyThread *pNotifyThread, int nReadFD ); ++ ~UnxFilePickerCommandThread(); ++ ++ YieldingCondition& SAL_CALL execCondition() { return m_aExecCondition; } ++ sal_Bool SAL_CALL result(); ++ ++ ::osl::Condition& SAL_CALL getCurrentFilterCondition() { return m_aGetCurrentFilterCondition; } ++ ::rtl::OUString SAL_CALL getCurrentFilter(); ++ ++ ::osl::Condition& SAL_CALL getDirectoryCondition() { return m_aGetDirectoryCondition; } ++ ::rtl::OUString SAL_CALL getDirectory(); ++ ++ ::osl::Condition& SAL_CALL getFilesCondition() { return m_aGetFilesCondition; } ++ ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getFiles(); ++ ++ ::osl::Condition& SAL_CALL getValueCondition() { return m_aGetValueCondition; } ++ ::com::sun::star::uno::Any SAL_CALL getValue(); ++ ++protected: ++ virtual void SAL_CALL run(); ++ ++ virtual void SAL_CALL handleCommand( const ::rtl::OUString &rCommand/*, sal_Bool &rQuit*/ ); ++ ::std::list< ::rtl::OUString > SAL_CALL tokenize( const ::rtl::OUString &rCommand ); ++}; ++ ++#endif // _UNXCOMMANDTHREAD_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde_unx/UnxFilePicker.cxx fpicker/source/unx/tde_unx/UnxFilePicker.cxx +--- fpicker/source/unx/tde_unx/UnxFilePicker.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/UnxFilePicker.cxx 2011-08-17 14:07:44.765348071 -0500 +@@ -0,0 +1,932 @@ ++/* -*- 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. ++ * Copyright 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++using namespace ::com::sun::star; ++ ++using namespace ::com::sun::star::ui::dialogs; ++using namespace ::com::sun::star::ui::dialogs::TemplateDescription; ++ ++////////////////////////////////////////////////////////////////////////// ++// helper functions ++////////////////////////////////////////////////////////////////////////// ++ ++namespace ++{ ++ // controling event notifications ++ const bool STARTUP_SUSPENDED = true; ++ const bool STARTUP_ALIVE = false; ++ ++ uno::Sequence SAL_CALL FilePicker_getSupportedServiceNames() ++ { ++ uno::Sequence aRet(3); ++ aRet[0] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.FilePicker"); ++ aRet[1] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.SystemFilePicker"); ++ aRet[2] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.TDEFilePicker"); ++ return aRet; ++ } ++} ++ ++////////////////////////////////////////////////////////////////////////// ++// UnxFilePicker ++////////////////////////////////////////////////////////////////////////// ++ ++UnxFilePicker::UnxFilePicker( const uno::Reference& xServiceMgr ) ++ : cppu::WeakComponentImplHelper8< ++ XFilterManager, ++ XFilterGroupManager, ++ XFilePickerControlAccess, ++ XFilePickerNotifier, ++// TODO XFilePreview, ++ lang::XInitialization, ++ util::XCancellable, ++ lang::XEventListener, ++ lang::XServiceInfo>( m_rbHelperMtx ), ++ m_xServiceMgr( xServiceMgr ), ++ m_nFilePickerPid( -1 ), ++ m_nFilePickerWrite( -1 ), ++ m_nFilePickerRead( -1 ), ++ m_pNotifyThread( NULL ), ++ m_pCommandThread( NULL ), ++ m_pResMgr( CREATEVERSIONRESMGR( fps_office ) ) ++{ ++} ++ ++UnxFilePicker::~UnxFilePicker() ++{ ++ if ( m_nFilePickerPid > 0 ) ++ { ++ sendCommand( ::rtl::OUString::createFromAscii( "exit" ) ); ++ waitpid( m_nFilePickerPid, NULL, 0 ); ++ } ++ ++ if ( m_pCommandThread ) ++ { ++ m_pCommandThread->join(); ++ ++ delete m_pCommandThread, m_pCommandThread = NULL; ++ } ++ ++ if ( m_pNotifyThread ) ++ { ++ m_pNotifyThread->exit(); ++ ++ m_pNotifyThread->join(); ++ ++ delete m_pNotifyThread, m_pNotifyThread = NULL; ++ } ++ ++ if ( m_nFilePickerWrite >= 0 ) ++ close( m_nFilePickerWrite ); ++ ++ if ( m_nFilePickerRead >= 0 ) ++ close( m_nFilePickerRead ); ++ ++ delete m_pResMgr, m_pResMgr = NULL; ++} ++ ++void SAL_CALL UnxFilePicker::addFilePickerListener( const uno::Reference& xListener ) ++ throw( uno::RuntimeException ) ++{ ++ OSL_ASSERT( m_pNotifyThread ); ++ osl::MutexGuard aGuard( m_aMutex ); ++ ++ m_pNotifyThread->addFilePickerListener( xListener ); ++} ++ ++void SAL_CALL UnxFilePicker::removeFilePickerListener( const uno::Reference& xListener ) ++ throw( uno::RuntimeException ) ++{ ++ OSL_ASSERT( m_pNotifyThread ); ++ osl::MutexGuard aGuard( m_aMutex ); ++ ++ m_pNotifyThread->removeFilePickerListener( xListener ); ++} ++ ++void SAL_CALL UnxFilePicker::setTitle( const rtl::OUString &rTitle ) ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "setTitle " ); ++ appendEscaped( aBuffer, rTitle ); ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++} ++ ++sal_Int16 SAL_CALL UnxFilePicker::execute() ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ++ // this is _not_ an osl::Condition, see i#93366 ++ m_pCommandThread->execCondition().reset(); ++ ++ sendCommand( ::rtl::OUString::createFromAscii( "exec" ) ); ++ ++ m_pCommandThread->execCondition().wait(); ++ ++ return m_pCommandThread->result(); ++} ++ ++void SAL_CALL UnxFilePicker::setMultiSelectionMode( sal_Bool bMode ) ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUString aString = bMode? ++ ::rtl::OUString::createFromAscii( "setMultiSelection true" ): ++ ::rtl::OUString::createFromAscii( "setMultiSelection false" ); ++ ++ sendCommand( aString ); ++} ++ ++void SAL_CALL UnxFilePicker::setDefaultName( const ::rtl::OUString &rName ) ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "setDefaultName " ); ++ appendEscaped( aBuffer, rName ); ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++} ++ ++void SAL_CALL UnxFilePicker::setDisplayDirectory( const rtl::OUString &rDirectory ) ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "setDirectory " ); ++ appendEscaped( aBuffer, rDirectory ); ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++} ++ ++rtl::OUString SAL_CALL UnxFilePicker::getDisplayDirectory() ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ sendCommand( ::rtl::OUString::createFromAscii( "getDirectory" ), ++ m_pCommandThread->getDirectoryCondition() ); ++ ++ return m_pCommandThread->getDirectory(); ++} ++ ++uno::Sequence< ::rtl::OUString > SAL_CALL UnxFilePicker::getFiles() ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ sendCommand( ::rtl::OUString::createFromAscii( "getFiles" ), ++ m_pCommandThread->getFilesCondition() ); ++ ++ return m_pCommandThread->getFiles(); ++} ++ ++void SAL_CALL UnxFilePicker::appendFilter( const ::rtl::OUString &rTitle, const ::rtl::OUString &rFilter ) ++ throw( lang::IllegalArgumentException, uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "appendFilter " ); ++ appendEscaped( aBuffer, rTitle ); ++ aBuffer.appendAscii( " ", 1 ); ++ appendEscaped( aBuffer, rFilter ); ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++} ++ ++void SAL_CALL UnxFilePicker::setCurrentFilter( const rtl::OUString &rTitle ) ++ throw( lang::IllegalArgumentException, uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "setCurrentFilter " ); ++ appendEscaped( aBuffer, rTitle ); ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++} ++ ++rtl::OUString SAL_CALL UnxFilePicker::getCurrentFilter() ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ sendCommand( ::rtl::OUString::createFromAscii( "getCurrentFilter" ), ++ m_pCommandThread->getCurrentFilterCondition() ); ++ ++ return m_pCommandThread->getCurrentFilter(); ++} ++ ++void SAL_CALL UnxFilePicker::appendFilterGroup( const rtl::OUString &rGroupTitle, const uno::Sequence &rFilters ) ++ throw( lang::IllegalArgumentException, uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "appendFilterGroup " ); ++ appendEscaped( aBuffer, rGroupTitle ); ++ ++ for ( sal_Int32 i = 0; i < rFilters.getLength(); ++i ) ++ { ++ beans::StringPair aPair = rFilters[i]; ++ ++ aBuffer.appendAscii( " ", 1 ); ++ appendEscaped( aBuffer, aPair.First ); ++ aBuffer.appendAscii( " ", 1 ); ++ appendEscaped( aBuffer, aPair.Second ); ++ } ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++} ++ ++void SAL_CALL UnxFilePicker::setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const uno::Any &rValue ) ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUString aType; ++ ::rtl::OUString aAction; ++ sal_Int32 nTitleId; ++ ++ if ( controlIdInfo( nControlId, aType, nTitleId ) && controlActionInfo( nControlAction, aAction ) ) ++ { ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "setValue " ); ++ aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); ++ aBuffer.appendAscii( " ", 1 ); ++ aBuffer.append( aAction ); ++ ++ if ( aType.equalsAscii( "checkbox" ) ) ++ { ++ sal_Bool bControlValue; ++ if ( ( rValue >>= bControlValue ) && bControlValue ) ++ aBuffer.appendAscii( " true" ); ++ else ++ aBuffer.appendAscii( " false" ); ++ } ++ else if ( aType.equalsAscii( "listbox" ) ) ++ { ++ switch ( nControlAction ) ++ { ++ case ControlActions::ADD_ITEM: ++ case ControlActions::SET_HELP_URL: ++ { ++ ::rtl::OUString aString; ++ if ( rValue >>= aString ) ++ { ++ aBuffer.appendAscii( " ", 1 ); ++ appendEscaped( aBuffer, aString ); ++ } ++ } ++ break; ++ ++ case ControlActions::ADD_ITEMS: ++ { ++ uno::Sequence< ::rtl::OUString > aSequence; ++ if ( rValue >>= aSequence ) ++ { ++ for ( sal_Int32 nIdx = 0; nIdx < aSequence.getLength(); ++nIdx ) ++ { ++ aBuffer.appendAscii( " ", 1 ); ++ appendEscaped( aBuffer, aSequence[nIdx] ); ++ } ++ ++ } ++ } ++ break; ++ ++ case ControlActions::DELETE_ITEM: ++ case ControlActions::SET_SELECT_ITEM: ++ { ++ sal_Int32 nInt; ++ if ( rValue >>= nInt ) ++ { ++ aBuffer.appendAscii( " ", 1 ); ++ aBuffer.append( nInt ); ++ } ++ } ++ break; ++ ++ default: ++ // nothing ++ break; ++ } ++ } ++ // TODO else if push button... ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++ } ++} ++ ++uno::Any SAL_CALL UnxFilePicker::getValue( sal_Int16 nControlId, sal_Int16 nControlAction ) ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUString aAction; ++ ++ if ( controlActionInfo( nControlAction, aAction ) ) ++ { ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "getValue " ); ++ aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); ++ aBuffer.appendAscii( " ", 1 ); ++ aBuffer.append( aAction ); ++ ++ sendCommand( aBuffer.makeStringAndClear(), ++ m_pCommandThread->getValueCondition() ); ++ ++ return m_pCommandThread->getValue(); ++ } ++ ++ return uno::Any(); ++} ++ ++void SAL_CALL UnxFilePicker::enableControl( sal_Int16 nControlId, sal_Bool bEnable ) ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "enableControl " ); ++ aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); ++ aBuffer.appendAscii( bEnable? " true": " false" ); ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++} ++ ++void SAL_CALL UnxFilePicker::setLabel( sal_Int16 nControlId, const ::rtl::OUString &rLabel ) ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "setLabel " ); ++ aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); ++ aBuffer.appendAscii( " ", 1 ); ++ appendEscaped( aBuffer, rLabel ); ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++} ++ ++rtl::OUString SAL_CALL UnxFilePicker::getLabel(sal_Int16 /*nControlId*/) ++ throw ( uno::RuntimeException ) ++{ ++ // FIXME getLabel() is not yet implemented ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ // TODO return m_pImpl->getLabel(nControlId); ++ return ::rtl::OUString(); ++} ++ ++/* TODO ++uno::Sequence SAL_CALL UnxFilePicker::getSupportedImageFormats() ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_pImpl->getSupportedImageFormats(); ++} ++ ++sal_Int32 SAL_CALL UnxFilePicker::getTargetColorDepth() ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_pImpl->getTargetColorDepth(); ++} ++ ++sal_Int32 SAL_CALL UnxFilePicker::getAvailableWidth() ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_pImpl->getAvailableWidth(); ++} ++ ++sal_Int32 SAL_CALL UnxFilePicker::getAvailableHeight() ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_pImpl->getAvailableHeight(); ++} ++ ++void SAL_CALL UnxFilePicker::setImage( sal_Int16 aImageFormat, const uno::Any &rImage ) ++ throw( lang::IllegalArgumentException, uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ m_pImpl->setImage( aImageFormat, aImage ); ++} ++ ++sal_Bool SAL_CALL UnxFilePicker::setShowState( sal_Bool bShowState ) ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_pImpl->setShowState( bShowState ); ++} ++ ++sal_Bool SAL_CALL UnxFilePicker::getShowState() ++ throw( uno::RuntimeException ) ++{ ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ return m_pImpl->getShowState(); ++} ++*/ ++ ++void SAL_CALL UnxFilePicker::initialize( const uno::Sequence &rArguments ) ++ throw( uno::Exception, uno::RuntimeException ) ++{ ++ initFilePicker(); ++ ++ // parameter checking ++ uno::Any aAny; ++ if ( 0 == rArguments.getLength( ) ) ++ throw lang::IllegalArgumentException( ++ rtl::OUString::createFromAscii( "no arguments" ), ++ static_cast< XFilePicker* >( this ), 1 ); ++ ++ aAny = rArguments[0]; ++ ++ if ( ( aAny.getValueType() != ::getCppuType( (sal_Int16*)0 ) ) && ( aAny.getValueType() != ::getCppuType( (sal_Int8*)0 ) ) ) ++ throw lang::IllegalArgumentException( ++ rtl::OUString::createFromAscii( "invalid argument type" ), ++ static_cast< XFilePicker* >( this ), 1 ); ++ ++ sal_Int16 templateId = -1; ++ aAny >>= templateId; ++ ++ ::rtl::OUString aTypeOpen = ::rtl::OUString::createFromAscii( "setType \"open\"" ); ++ ::rtl::OUString aTypeSaveAs = ::rtl::OUString::createFromAscii( "setType \"save\"" ); ++ ++ switch ( templateId ) ++ { ++ case FILEOPEN_SIMPLE: ++ sendCommand( aTypeOpen ); ++ break; ++ ++ case FILESAVE_SIMPLE: ++ sendCommand( aTypeSaveAs ); ++ break; ++ ++ case FILESAVE_AUTOEXTENSION_PASSWORD: ++ sendCommand( aTypeSaveAs ); ++ ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD ); ++ break; ++ ++ case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS: ++ sendCommand( aTypeSaveAs ); ++ ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD ); ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS ); ++ break; ++ ++ case FILESAVE_AUTOEXTENSION_SELECTION: ++ sendCommand( aTypeSaveAs ); ++ ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_SELECTION ); ++ break; ++ ++ case FILESAVE_AUTOEXTENSION_TEMPLATE: ++ sendCommand( aTypeSaveAs ); ++ ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); ++ sendAppendControlCommand( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE ); ++ break; ++ ++ case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE: ++ sendCommand( aTypeOpen ); ++ ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_LINK ); ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW ); ++ sendAppendControlCommand( ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE ); ++ break; ++ ++ case FILEOPEN_PLAY: ++ sendCommand( aTypeOpen ); ++ ++ sendAppendControlCommand( ExtendedFilePickerElementIds::PUSHBUTTON_PLAY ); ++ break; ++ ++ case FILEOPEN_READONLY_VERSION: ++ sendCommand( aTypeOpen ); ++ ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_READONLY ); ++ sendAppendControlCommand( ExtendedFilePickerElementIds::LISTBOX_VERSION ); ++ break; ++ ++ case FILEOPEN_LINK_PREVIEW: ++ sendCommand( aTypeOpen ); ++ ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_LINK ); ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW ); ++ break; ++ ++ case FILESAVE_AUTOEXTENSION: ++ sendCommand( aTypeSaveAs ); ++ ++ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION ); ++ break; ++ ++ default: ++ throw lang::IllegalArgumentException( ++ rtl::OUString::createFromAscii( "Unknown template" ), ++ static_cast< XFilePicker* >( this ), ++ 1 ); ++ } ++} ++ ++void SAL_CALL UnxFilePicker::cancel() ++ throw ( uno::RuntimeException ) ++{ ++ // FIXME cancel() is not implemented ++ checkFilePicker(); ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ // TODO m_pImpl->cancel(); ++} ++ ++void SAL_CALL UnxFilePicker::disposing( const lang::EventObject &rEvent ) ++ throw( uno::RuntimeException ) ++{ ++ uno::Reference xFilePickerListener( rEvent.Source, uno::UNO_QUERY ); ++ ++ if ( xFilePickerListener.is() ) ++ removeFilePickerListener( xFilePickerListener ); ++} ++ ++rtl::OUString SAL_CALL UnxFilePicker::getImplementationName() ++ throw( uno::RuntimeException ) ++{ ++ return rtl::OUString::createFromAscii( FILE_PICKER_IMPL_NAME ); ++} ++ ++sal_Bool SAL_CALL UnxFilePicker::supportsService( const rtl::OUString& ServiceName ) ++ throw( uno::RuntimeException ) ++{ ++ uno::Sequence< ::rtl::OUString > SupportedServicesNames = FilePicker_getSupportedServiceNames(); ++ ++ for ( sal_Int32 n = SupportedServicesNames.getLength(); n--; ) ++ { ++ if ( SupportedServicesNames[n].compareTo( ServiceName ) == 0 ) ++ return sal_True; ++ } ++ ++ return sal_False; ++} ++ ++uno::Sequence< ::rtl::OUString > SAL_CALL UnxFilePicker::getSupportedServiceNames() ++ throw( uno::RuntimeException ) ++{ ++ return FilePicker_getSupportedServiceNames(); ++} ++ ++void UnxFilePicker::initFilePicker() ++{ ++ int aFiledesStdin[2], aFiledesStdout[2]; ++ if ( pipe( aFiledesStdin ) < 0 || pipe( aFiledesStdout ) < 0 ) ++ return; ++ ++ m_nFilePickerPid = fork(); ++ if ( m_nFilePickerPid < 0 ) ++ return; ++ ++ if ( m_nFilePickerPid == 0 ) ++ { ++ // Child... ++ close( aFiledesStdin[1] ); // write end of the pipe ++ dup2( aFiledesStdin[0], 0 ); ++ close( aFiledesStdin[0] ); ++ ++ close( aFiledesStdout[0] ); // read end of the pipe ++ dup2( aFiledesStdout[1], 1 ); ++ close( aFiledesStdout[1] ); ++ ++#if OSL_DEBUG_LEVEL == 0 ++ int nRedirect = open( "/dev/null", O_WRONLY ); ++ if( nRedirect != -1 ) ++ { ++ dup2( nRedirect, 2 ); ++ } ++#endif ++ ++ // The executable name ++ const char *pFname = "tdefilepicker"; ++ ++ // ID of the main window ++ const int nIdLen = 20; ++ char pWinId[nIdLen] = "0"; ++ ++ // TODO pass here the real parent (not possible for system dialogs ++ // yet), and default to GetDefDialogParent() only when the real parent ++ // is NULL ++ Window *pParentWin = Application::GetDefDialogParent(); ++ if ( pParentWin ) ++ { ++ const SystemEnvData* pSysData = ((SystemWindow *)pParentWin)->GetSystemData(); ++ if ( pSysData ) ++ { ++ snprintf( pWinId, nIdLen, "%ld", pSysData->aWindow ); // unx only ++ pWinId[nIdLen-1] = 0; ++ } ++ } ++ ++ // Execute the fpicker implementation ++ execlp( pFname, pFname, "--winid", pWinId, NULL ); ++ ++ // Error, finish the child ++ exit( -1 ); ++ } ++ ++ // Parent continues ++ close( aFiledesStdin[0] ); ++ m_nFilePickerWrite = aFiledesStdin[1]; ++ ++ close( aFiledesStdout[1] ); ++ m_nFilePickerRead = aFiledesStdout[0]; ++ ++ // Create the notify thread ++ if ( !m_pNotifyThread ) ++ m_pNotifyThread = new UnxFilePickerNotifyThread( this ); ++ ++ // Create the command thread ++ if ( !m_pCommandThread ) ++ m_pCommandThread = new UnxFilePickerCommandThread( m_pNotifyThread, m_nFilePickerRead ); ++ ++ // Start the threads ++ m_pNotifyThread->create(); ++ m_pCommandThread->create(); ++ ++ return; ++} ++ ++void UnxFilePicker::checkFilePicker() throw( ::com::sun::star::uno::RuntimeException ) ++{ ++ if ( m_nFilePickerPid > 0 ) ++ { ++ // TODO check if external file picker is runnning ++ } ++ else ++ { ++ throw uno::RuntimeException( ++ ::rtl::OUString::createFromAscii( "the external file picker does not run" ), ++ *this ); ++ } ++} ++ ++void UnxFilePicker::sendCommand( const ::rtl::OUString &rCommand ) ++{ ++ if ( m_nFilePickerWrite < 0 ) ++ return; ++ ++ ::rtl::OString aUtfString = OUStringToOString( rCommand + ::rtl::OUString::createFromAscii( "\n" ), RTL_TEXTENCODING_UTF8 ); ++ ++#if OSL_DEBUG_LEVEL > 0 ++ ::std::cerr << "UnxFilePicker sent: \"" << aUtfString.getStr() << "\"" << ::std::endl; ++#endif ++ ++ write( m_nFilePickerWrite, aUtfString.getStr(), aUtfString.getLength() ); ++} ++ ++void UnxFilePicker::sendCommand( const ::rtl::OUString &rCommand, ::osl::Condition &rCondition ) ++{ ++ rCondition.reset(); ++ ++ sendCommand( rCommand ); ++ ++ rCondition.wait(); ++} ++ ++void UnxFilePicker::appendEscaped( ::rtl::OUStringBuffer &rBuffer, const ::rtl::OUString &rString ) ++{ ++ const sal_Unicode *pUnicode = rString.getStr(); ++ const sal_Unicode *pEnd = pUnicode + rString.getLength(); ++ ++ rBuffer.appendAscii( "\"" , 1 ); ++ ++ for ( ; pUnicode != pEnd; ++pUnicode ) ++ { ++ if ( *pUnicode == '\\' ) ++ rBuffer.appendAscii( "\\\\", 2 ); ++ else if ( *pUnicode == '"' ) ++ rBuffer.appendAscii( "\\\"", 2 ); ++ else if ( *pUnicode == '\n' ) ++ rBuffer.appendAscii( "\\n", 2 ); ++ else ++ rBuffer.append( *pUnicode ); ++ } ++ ++ rBuffer.appendAscii( "\"", 1 ); ++} ++ ++sal_Bool UnxFilePicker::controlIdInfo( sal_Int16 nControlId, ::rtl::OUString &rType, sal_Int32 &rTitleId ) ++{ ++ typedef struct { ++ sal_Int16 nId; ++ const ::rtl::OUString *pType; ++ sal_Int32 nTitle; ++ } ElementToName; ++ ++ const ::rtl::OUString aCheckBox( RTL_CONSTASCII_USTRINGPARAM( "checkbox" ) ); ++ const ::rtl::OUString aControl( RTL_CONSTASCII_USTRINGPARAM( "control" ) ); ++ const ::rtl::OUString aEdit( RTL_CONSTASCII_USTRINGPARAM( "edit" ) ); ++ const ::rtl::OUString aLabel( RTL_CONSTASCII_USTRINGPARAM( "label" ) ); ++ const ::rtl::OUString aListBox( RTL_CONSTASCII_USTRINGPARAM( "listbox" ) ); ++ const ::rtl::OUString aPushButton( RTL_CONSTASCII_USTRINGPARAM( "pushbutton" ) ); ++ ++ const ElementToName *pPtr; ++ const ElementToName pArray[] = ++ { ++ { CommonFilePickerElementIds::PUSHBUTTON_OK, &aPushButton, 0/*FIXME?*/ }, ++ { CommonFilePickerElementIds::PUSHBUTTON_CANCEL, &aPushButton, 0/*FIXME?*/ }, ++ { CommonFilePickerElementIds::LISTBOX_FILTER, &aListBox, 0/*FIXME?*/ }, ++ { CommonFilePickerElementIds::CONTROL_FILEVIEW, &aControl, 0/*FIXME?*/ }, ++ { CommonFilePickerElementIds::EDIT_FILEURL, &aEdit, 0/*FIXME?*/ }, ++ { CommonFilePickerElementIds::LISTBOX_FILTER_LABEL, &aLabel, 0/*FIXME?*/ }, ++ { CommonFilePickerElementIds::EDIT_FILEURL_LABEL, &aLabel, 0/*FIXME?*/ }, ++ ++ { ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, &aCheckBox, STR_SVT_FILEPICKER_AUTO_EXTENSION }, ++ { ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, &aCheckBox, STR_SVT_FILEPICKER_PASSWORD }, ++ { ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS, &aCheckBox, STR_SVT_FILEPICKER_FILTER_OPTIONS }, ++ { ExtendedFilePickerElementIds::CHECKBOX_READONLY, &aCheckBox, STR_SVT_FILEPICKER_READONLY }, ++ { ExtendedFilePickerElementIds::CHECKBOX_LINK, &aCheckBox, STR_SVT_FILEPICKER_INSERT_AS_LINK }, ++ { ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, &aCheckBox, STR_SVT_FILEPICKER_SHOW_PREVIEW }, ++ { ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, &aPushButton, STR_SVT_FILEPICKER_PLAY }, ++ { ExtendedFilePickerElementIds::LISTBOX_VERSION, &aListBox, STR_SVT_FILEPICKER_VERSION }, ++ { ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, &aListBox, STR_SVT_FILEPICKER_TEMPLATES }, ++ { ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE, &aListBox, STR_SVT_FILEPICKER_IMAGE_TEMPLATE }, ++ { ExtendedFilePickerElementIds::CHECKBOX_SELECTION, &aCheckBox, STR_SVT_FILEPICKER_SELECTION }, ++ { 0, 0, 0 } ++ }; ++ ++ for ( pPtr = pArray; pPtr->nId && ( pPtr->nId != nControlId ); ++pPtr ) ++ ; ++ ++ if ( pPtr->nId == nControlId ) ++ { ++ rType = *(pPtr->pType); ++ rTitleId = pPtr->nTitle; ++ ++ return sal_True; ++ } ++ ++ return sal_False; ++} ++ ++sal_Bool UnxFilePicker::controlActionInfo( sal_Int16 nControlAction, ::rtl::OUString &rType ) ++{ ++ typedef struct { ++ sal_Int16 nId; ++ const ::rtl::OUString pType; ++ } ElementToName; ++ ++ const ElementToName *pPtr; ++ const ElementToName pArray[] = ++ { ++ { ControlActions::ADD_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "addItem" ) ) }, ++ { ControlActions::ADD_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "addItems" ) ) }, ++ { ControlActions::DELETE_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "deleteItem" ) ) }, ++ { ControlActions::DELETE_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "deleteItems" ) ) }, ++ { ControlActions::SET_SELECT_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "setSelectedItem" ) ) }, ++ { ControlActions::GET_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getItems" ) ) }, ++ { ControlActions::GET_SELECTED_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getSelectedItem" ) ) }, ++ { ControlActions::GET_SELECTED_ITEM_INDEX, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getSelectedItemIndex" ) ) }, ++ { ControlActions::SET_HELP_URL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "setHelpURL" ) ) }, ++ { ControlActions::GET_HELP_URL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getHelpURL" ) ) }, ++ { 0, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "noAction" ) ) } ++ }; ++ ++ for ( pPtr = pArray; pPtr->nId && ( pPtr->nId != nControlAction ); ++pPtr ) ++ ; ++ ++ rType = pPtr->pType; ++ ++ return sal_True; ++} ++ ++void UnxFilePicker::sendAppendControlCommand( sal_Int16 nControlId ) ++{ ++ ::rtl::OUString aType; ++ sal_Int32 nTitleId; ++ ++ if ( controlIdInfo( nControlId, aType, nTitleId ) ) ++ { ++ ::rtl::OUStringBuffer aBuffer( 1024 ); ++ ++ aBuffer.appendAscii( "appendControl " ); ++ aBuffer.append( static_cast< sal_Int32 >( nControlId ) ); ++ aBuffer.appendAscii( " ", 1 ); ++ appendEscaped( aBuffer, aType ); ++ aBuffer.appendAscii( " ", 1 ); ++ appendEscaped( aBuffer, m_pResMgr? String( ResId( nTitleId, *m_pResMgr ) ): String() ); ++ ++ sendCommand( aBuffer.makeStringAndClear() ); ++ } ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde_unx/UnxFilePicker.hxx fpicker/source/unx/tde_unx/UnxFilePicker.hxx +--- fpicker/source/unx/tde_unx/UnxFilePicker.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/UnxFilePicker.hxx 2011-08-17 14:07:41.705113628 -0500 +@@ -0,0 +1,178 @@ ++/* -*- 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. ++ * Copyright 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _UNXFILEPICKER_HXX_ ++#define _UNXFILEPICKER_HXX_ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++class UnxFilePickerCommandThread; ++class UnxFilePickerNotifyThread; ++class ResMgr; ++ ++class UnxFilePickerDummy ++{ ++protected: ++ osl::Mutex m_aMutex; ++ osl::Mutex m_rbHelperMtx; ++}; ++ ++class UnxFilePicker : ++ public UnxFilePickerDummy, ++ public cppu::WeakComponentImplHelper8< ++ ::com::sun::star::ui::dialogs::XFilterManager, ++ ::com::sun::star::ui::dialogs::XFilterGroupManager, ++ ::com::sun::star::ui::dialogs::XFilePickerControlAccess, ++ ::com::sun::star::ui::dialogs::XFilePickerNotifier, ++// TODO ::com::sun::star::ui::dialogs::XFilePreview, ++ ::com::sun::star::lang::XInitialization, ++ ::com::sun::star::util::XCancellable, ++ ::com::sun::star::lang::XEventListener, ++ ::com::sun::star::lang::XServiceInfo > ++{ ++protected: ++ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceMgr; // to instanciate own services ++ ++ pid_t m_nFilePickerPid; ++ int m_nFilePickerWrite; // (tde|...)filepicker gets it as stdin ++ int m_nFilePickerRead; // (tde|...)filepicker gets it as stdout ++ ++ UnxFilePickerNotifyThread *m_pNotifyThread; ++ UnxFilePickerCommandThread *m_pCommandThread; ++ ++ ResMgr *m_pResMgr; ++ ++public: ++ UnxFilePicker( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceMgr ); ++ virtual ~UnxFilePicker(); ++ ++ // XFilePickerNotifier ++ ++ virtual void SAL_CALL addFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException ); ++ virtual void SAL_CALL removeFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException ); ++ ++ // XExecutableDialog functions ++ ++ virtual void SAL_CALL setTitle( const ::rtl::OUString &rTitle ) throw( ::com::sun::star::uno::RuntimeException ); ++ virtual sal_Int16 SAL_CALL execute() throw( ::com::sun::star::uno::RuntimeException ); ++ ++ // XFilePicker functions ++ ++ virtual void SAL_CALL setMultiSelectionMode( sal_Bool bMode ) throw( ::com::sun::star::uno::RuntimeException ); ++ virtual void SAL_CALL setDefaultName( const ::rtl::OUString &rName ) throw( ::com::sun::star::uno::RuntimeException ); ++ virtual void SAL_CALL setDisplayDirectory( const ::rtl::OUString &rDirectory ) throw( ::com::sun::star::uno::RuntimeException ); ++ virtual ::rtl::OUString SAL_CALL getDisplayDirectory() throw( ::com::sun::star::uno::RuntimeException ); ++ virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getFiles() throw( ::com::sun::star::uno::RuntimeException ); ++ ++ // XFilterManager functions ++ ++ virtual void SAL_CALL appendFilter( const ::rtl::OUString &rTitle, const ::rtl::OUString &rFilter ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException ); ++ virtual void SAL_CALL setCurrentFilter( const ::rtl::OUString &rTitle ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException ); ++ virtual ::rtl::OUString SAL_CALL getCurrentFilter() throw( ::com::sun::star::uno::RuntimeException ); ++ ++ // XFilterGroupManager functions ++ ++ virtual void SAL_CALL appendFilterGroup( const ::rtl::OUString &rGroupTitle, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::StringPair > &rFilters ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); ++ ++ // XFilePickerControlAccess functions ++ ++ virtual void SAL_CALL setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const ::com::sun::star::uno::Any &rValue ) throw (::com::sun::star::uno::RuntimeException); ++ virtual ::com::sun::star::uno::Any SAL_CALL getValue( sal_Int16 nControlId, sal_Int16 nControlAction ) throw (::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL enableControl( sal_Int16 nControlId, sal_Bool bEnable ) throw( ::com::sun::star::uno::RuntimeException ); ++ virtual void SAL_CALL setLabel( sal_Int16 nControlId, const ::rtl::OUString &rLabel ) throw (::com::sun::star::uno::RuntimeException); ++ virtual ::rtl::OUString SAL_CALL getLabel( sal_Int16 nControlId ) throw (::com::sun::star::uno::RuntimeException); ++ ++ /* TODO XFilePreview ++ ++ virtual ::com::sun::star::uno::Sequence< sal_Int16 > SAL_CALL getSupportedImageFormats( ) throw (::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getTargetColorDepth( ) throw (::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getAvailableWidth( ) throw (::com::sun::star::uno::RuntimeException); ++ virtual sal_Int32 SAL_CALL getAvailableHeight( ) throw (::com::sun::star::uno::RuntimeException); ++ virtual void SAL_CALL setImage( sal_Int16 aImageFormat, const ::com::sun::star::uno::Any &rImage ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL setShowState( sal_Bool bShowState ) throw (::com::sun::star::uno::RuntimeException); ++ virtual sal_Bool SAL_CALL getShowState( ) throw (::com::sun::star::uno::RuntimeException); ++ */ ++ ++ // XInitialization ++ ++ virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > &rArguments ) throw( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); ++ ++ // XCancellable ++ ++ virtual void SAL_CALL cancel( ) throw( ::com::sun::star::uno::RuntimeException ); ++ ++ // XEventListener ++ ++ virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject &rEvent ) throw( ::com::sun::star::uno::RuntimeException ); ++ ++ // XServiceInfo ++ ++ virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException ); ++ virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString &rServiceName ) throw( ::com::sun::star::uno::RuntimeException ); ++ virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException ); ++ ++private: ++ // prevent copy and assignment ++ UnxFilePicker( const UnxFilePicker& ); ++ UnxFilePicker& operator=( const UnxFilePicker& ); ++ ++protected: ++ void initFilePicker(); ++ void checkFilePicker() throw( ::com::sun::star::uno::RuntimeException ); ++ ++ // Async sendCommand ++ void sendCommand( const ::rtl::OUString &rCommand ); ++ // Synchronized sendCommand ++ void sendCommand( const ::rtl::OUString &rCommand, ::osl::Condition &rCondition ); ++ void appendEscaped( ::rtl::OUStringBuffer &rBuffer, const ::rtl::OUString &rString ); ++ ++private: ++ sal_Bool controlIdInfo( sal_Int16 nControlId, ::rtl::OUString &rType, sal_Int32 &rTitleId ); ++ sal_Bool controlActionInfo( sal_Int16 nControlId, ::rtl::OUString &rType ); ++ void sendAppendControlCommand( sal_Int16 nControlId ); ++}; ++ ++#endif // _UNXFILEPICKER_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde_unx/UnxFPentry.cxx fpicker/source/unx/tde_unx/UnxFPentry.cxx +--- fpicker/source/unx/tde_unx/UnxFPentry.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/UnxFPentry.cxx 2011-08-17 14:06:26.059319485 -0500 +@@ -0,0 +1,128 @@ ++/* -*- 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. ++ * Copyright 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#include ++ ++#include ++#include ++ ++#include "UnxFilePicker.hxx" ++#include "FPServiceInfo.hxx" ++ ++using namespace ::rtl; ++using namespace ::com::sun::star::uno; ++using namespace ::com::sun::star::container; ++using namespace ::com::sun::star::lang; ++using namespace ::com::sun::star::registry; ++using namespace ::cppu; ++using ::com::sun::star::ui::dialogs::XFilePicker; ++ ++////////////////////////////////////////////////////////////////////////// ++// ++////////////////////////////////////////////////////////////////////////// ++ ++static Reference< XInterface > SAL_CALL createInstance( const Reference< XMultiServiceFactory >& rServiceManager ) ++{ ++ return Reference< XInterface >( ++ static_cast< XFilePicker* >( new UnxFilePicker( rServiceManager ) ) ); ++} ++ ++////////////////////////////////////////////////////////////////////////// ++// the three uno functions that will be exported ++////////////////////////////////////////////////////////////////////////// ++ ++extern "C" ++{ ++ ++////////////////////////////////////////////////////////////////////////// ++// component_getImplementationEnvironment ++////////////////////////////////////////////////////////////////////////// ++ ++void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv ) ++{ ++ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; ++} ++ ++////////////////////////////////////////////////////////////////////////// ++// ++////////////////////////////////////////////////////////////////////////// ++ ++sal_Bool SAL_CALL component_writeInfo( void* pServiceManager, void* pRegistryKey ) ++{ ++ sal_Bool bRetVal = sal_True; ++ ++ if ( pRegistryKey ) ++ { ++ try ++ { ++ Reference< XRegistryKey > pXNewKey( static_cast< XRegistryKey* >( pRegistryKey ) ); ++ pXNewKey->createKey( OUString::createFromAscii( FILE_PICKER_REGKEY_NAME ) ); ++ } ++ catch( InvalidRegistryException& ) ++ { ++ OSL_ENSURE( sal_False, "InvalidRegistryException caught" ); ++ bRetVal = sal_False; ++ } ++ } ++ ++ return bRetVal; ++} ++ ++////////////////////////////////////////////////////////////////////////// ++// ++////////////////////////////////////////////////////////////////////////// ++ ++void* SAL_CALL component_getFactory( const sal_Char* pImplName, uno_Interface* pSrvManager, uno_Interface* pRegistryKey ) ++{ ++ void* pRet = 0; ++ ++ if ( pSrvManager && ( 0 == rtl_str_compare( pImplName, FILE_PICKER_IMPL_NAME ) ) ) ++ { ++ Sequence< OUString > aSNS( 1 ); ++ aSNS.getArray( )[0] = OUString::createFromAscii( FILE_PICKER_SERVICE_NAME ); ++ ++ Reference< XSingleServiceFactory > xFactory ( createSingleFactory( ++ reinterpret_cast< XMultiServiceFactory* > ( pSrvManager ), ++ OUString::createFromAscii( pImplName ), ++ createInstance, ++ aSNS ) ); ++ if ( xFactory.is() ) ++ { ++ xFactory->acquire(); ++ pRet = xFactory.get(); ++ } ++ } ++ ++ return pRet; ++} ++ ++} // extern "C" ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde_unx/UnxNotifyThread.cxx fpicker/source/unx/tde_unx/UnxNotifyThread.cxx +--- fpicker/source/unx/tde_unx/UnxNotifyThread.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/UnxNotifyThread.cxx 2011-08-17 14:06:06.307806939 -0500 +@@ -0,0 +1,116 @@ ++/* -*- 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. ++ * Copyright 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#include ++#include ++ ++using namespace ::com::sun::star; ++ ++////////////////////////////////////////////////////////////////////////// ++// UnxFilePickerNotifyThread ++////////////////////////////////////////////////////////////////////////// ++ ++UnxFilePickerNotifyThread::UnxFilePickerNotifyThread( UnxFilePicker *pUnxFilePicker ) ++ : m_pUnxFilePicker( pUnxFilePicker ), ++ m_bExit( sal_False ), ++ m_eNotifyType( Nothing ), ++ m_nControlId( 0 ) ++{ ++} ++ ++void SAL_CALL UnxFilePickerNotifyThread::addFilePickerListener( const uno::Reference< ui::dialogs::XFilePickerListener >& xListener ) ++ throw( uno::RuntimeException ) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ m_xListener = xListener; ++} ++ ++void SAL_CALL UnxFilePickerNotifyThread::removeFilePickerListener( const uno::Reference< ui::dialogs::XFilePickerListener >& xListener ) ++ throw( uno::RuntimeException ) ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ m_xListener.clear(); ++} ++ ++void SAL_CALL UnxFilePickerNotifyThread::exit() ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ m_bExit = sal_True; ++ ++ m_aExitCondition.reset(); ++ m_aNotifyCondition.set(); ++ ++ m_aExitCondition.wait(); ++} ++ ++void SAL_CALL UnxFilePickerNotifyThread::fileSelectionChanged() ++{ ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ m_eNotifyType = FileSelectionChanged; ++ m_nControlId = 0; ++ ++ m_aNotifyCondition.set(); ++} ++ ++void SAL_CALL UnxFilePickerNotifyThread::run() ++{ ++ do { ++ m_aNotifyCondition.reset(); ++ m_aNotifyCondition.wait(); ++ ++ if ( m_xListener.is() && m_pUnxFilePicker ) ++ { ++ ::osl::MutexGuard aGuard( m_aMutex ); ++ ++ ui::dialogs::FilePickerEvent aEvent( *m_pUnxFilePicker, m_nControlId ); ++ ++ switch ( m_eNotifyType ) ++ { ++ case FileSelectionChanged: ++ m_xListener->fileSelectionChanged( aEvent ); ++ break; ++ ++ // TODO More to come... ++ ++ default: ++ // nothing ++ break; ++ } ++ } ++ } while ( !m_bExit ); ++ ++ m_aExitCondition.set(); ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN fpicker/source/unx/tde_unx/UnxNotifyThread.hxx fpicker/source/unx/tde_unx/UnxNotifyThread.hxx +--- fpicker/source/unx/tde_unx/UnxNotifyThread.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ fpicker/source/unx/tde_unx/UnxNotifyThread.hxx 2011-08-17 14:05:56.737074019 -0500 +@@ -0,0 +1,90 @@ ++/* -*- 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. ++ * Copyright 2010 Novell, Inc. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _UNXNOTIFYTHREAD_HXX_ ++#define _UNXNOTIFYTHREAD_HXX_ ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++class UnxFilePicker; ++ ++class UnxFilePickerNotifyThread : public ::osl::Thread ++{ ++protected: ++ enum NotifyType ++ { ++ Nothing = 0, ++ FileSelectionChanged ++ // TODO More to come... ++ }; ++ ++ UnxFilePicker *m_pUnxFilePicker; ++ ++ ::osl::Mutex m_aMutex; ++ ++ ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener > m_xListener; ++ ++ sal_Bool m_bExit; ++ ::osl::Condition m_aExitCondition; ++ ++ NotifyType m_eNotifyType; ++ ::osl::Condition m_aNotifyCondition; ++ sal_Int16 m_nControlId; ++ ++public: ++ UnxFilePickerNotifyThread( UnxFilePicker *pUnxFilePicker ); ++ ++ virtual void SAL_CALL addFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) ++ throw( ::com::sun::star::uno::RuntimeException ); ++ virtual void SAL_CALL removeFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) ++ throw( ::com::sun::star::uno::RuntimeException ); ++ ++ void SAL_CALL exit(); ++ ++ void SAL_CALL fileSelectionChanged(); ++ /* TODO ++ void SAL_CALL directoryChanged( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent ); ++ rtl::OUString SAL_CALL helpRequested( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent ) const; ++ void SAL_CALL controlStateChanged( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent ); ++ void SAL_CALL dialogSizeChanged( ); ++ */ ++ ++protected: ++ virtual void SAL_CALL run(); ++}; ++ ++#endif // _UNXNOTIFYTHREAD_HXX_ ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN shell/source/backends/tdebe/makefile.mk shell/source/backends/tdebe/makefile.mk +--- shell/source/backends/tdebe/makefile.mk 1969-12-31 18:00:00.000000000 -0600 ++++ shell/source/backends/tdebe/makefile.mk 2011-08-17 14:16:06.283767347 -0500 +@@ -0,0 +1,82 @@ ++#************************************************************************* ++# ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# Copyright 2000, 2010 Oracle and/or its affiliates. ++# Copyright 2011 Timothy Pearson ++# ++# 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 ++# ++# for a copy of the LGPLv3 License. ++# ++#************************************************************************* ++PRJ=..$/..$/.. ++ ++PRJNAME=shell ++TARGET=tdebe ++ ++LIBTARGET=NO ++ENABLE_EXCEPTIONS=TRUE ++VISIBILITY_HIDDEN=TRUE ++ ++# --- Settings --- ++ ++.INCLUDE : settings.mk ++ ++# For some of the included external TDE headers, GCC complains about shadowed ++# symbols in instantiated template code only at the end of a compilation unit, ++# so the only solution is to disable that warning here: ++.IF "$(COM)" == "GCC" ++CFLAGSCXX+=-Wno-shadow ++.ENDIF ++ ++UNIXTEXT=$(MISC)/$(TARGET)1-ucd.txt ++ ++# no "lib" prefix ++DLLPRE = ++ ++.IF "$(ENABLE_TDE)" == "TRUE" ++ ++CFLAGS+=$(TDE_CFLAGS) ++ ++# --- Files --- ++ ++SLOFILES=\ ++ $(SLO)$/tdeaccess.obj \ ++ $(SLO)$/tdebackend.obj ++ ++SHL1NOCHECK=TRUE ++SHL1TARGET=$(TARGET)1.uno ++SHL1OBJS=$(SLOFILES) ++SHL1DEF=$(MISC)$/$(SHL1TARGET).def ++ ++SHL1IMPLIB=i$(SHL1TARGET) ++SHL1LINKFLAGS+=$(TDE_LIBS) -lkio ++SHL1STDLIBS= \ ++ $(CPPUHELPERLIB) \ ++ $(CPPULIB) \ ++ $(SALLIB) ++ ++SHL1DEF=$(MISC)$/$(SHL1TARGET).def ++DEF1NAME=$(SHL1TARGET) ++ ++.ENDIF # "$(ENABLE_TDE)" == "TRUE" ++ ++# --- Targets --- ++ ++.INCLUDE : target.mk +diff -urN shell/source/backends/tdebe/tdeaccess.cxx shell/source/backends/tdebe/tdeaccess.cxx +--- shell/source/backends/tdebe/tdeaccess.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ shell/source/backends/tdebe/tdeaccess.cxx 2011-08-17 14:16:46.426842396 -0500 +@@ -0,0 +1,319 @@ ++/* -*- 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. ++* Copyright 2011 Timothy Pearson ++* ++* 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 ++* ++* for a copy of the LGPLv3 License. ++* ++************************************************************************/ ++ ++#include "precompiled_shell.hxx" ++#include "sal/config.h" ++ ++#include "com/sun/star/uno/Any.hxx" ++#include "cppu/unotype.hxx" ++#include "osl/diagnose.h" ++#include "osl/file.h" ++#include "rtl/string.h" ++#include "rtl/ustring.hxx" ++ ++#include "tde_headers.h" ++ ++#include "tdeaccess.hxx" ++ ++#define SPACE ' ' ++#define COMMA ',' ++#define SEMI_COLON ';' ++ ++namespace tdeaccess { ++ ++namespace { ++ ++namespace css = com::sun::star ; ++namespace uno = css::uno ; ++ ++} ++ ++css::beans::Optional< css::uno::Any > getValue(rtl::OUString const & id) { ++ if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ExternalMailer"))) { ++ KEMailSettings aEmailSettings; ++ QString aClientProgram; ++ ::rtl::OUString sClientProgram; ++ ++ aClientProgram = aEmailSettings.getSetting( KEMailSettings::ClientProgram ); ++ if ( aClientProgram.isEmpty() ) ++ aClientProgram = "kmail"; ++ else ++ aClientProgram = aClientProgram.section(SPACE, 0, 0); ++ sClientProgram = (const sal_Unicode *) aClientProgram.ucs2(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( sClientProgram ) ); ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("SourceViewFontHeight"))) ++ { ++ QFont aFixedFont; ++ short nFontHeight; ++ ++ aFixedFont = KGlobalSettings::fixedFont(); ++ nFontHeight = aFixedFont.pointSize(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( nFontHeight ) ); ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("SourceViewFontName"))) ++ { ++ QFont aFixedFont; ++ QString aFontName; ++ :: rtl::OUString sFontName; ++ ++ aFixedFont = KGlobalSettings::fixedFont(); ++ aFontName = aFixedFont.family(); ++ sFontName = (const sal_Unicode *) aFontName.ucs2(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( sFontName ) ); ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("EnableATToolSupport"))) ++ { ++ /* does not make much sense without an accessibility bridge */ ++ sal_Bool ATToolSupport = sal_False; ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( rtl::OUString::valueOf( ATToolSupport ) ) ); ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("WorkPathVariable"))) ++ { ++ QString aDocumentsDir( KGlobalSettings::documentPath() ); ++ rtl::OUString sDocumentsDir; ++ rtl::OUString sDocumentsURL; ++ if ( aDocumentsDir.endsWith(QChar('/')) ) ++ aDocumentsDir.truncate ( aDocumentsDir.length() - 1 ); ++ sDocumentsDir = (const sal_Unicode *) aDocumentsDir.ucs2(); ++ osl_getFileURLFromSystemPath( sDocumentsDir.pData, &sDocumentsURL.pData ); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( sDocumentsURL ) ); ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName"))) ++ { ++ QString aFTPProxy; ++ switch ( KProtocolManager::proxyType() ) ++ { ++ case KProtocolManager::ManualProxy: // Proxies are manually configured ++ aFTPProxy = KProtocolManager::proxyFor( "FTP" ); ++ break; ++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given ++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered ++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables ++// In such cases, the proxy address is not stored in TDE, but determined dynamically. ++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... ++// The best we can do here is to ask the current value for a given address. ++ aFTPProxy = KProtocolManager::proxyForURL( "ftp://ftp.openoffice.org" ); ++ break; ++ default: // No proxy is used ++ break; ++ } ++ if ( !aFTPProxy.isEmpty() ) ++ { ++ KURL aProxy(aFTPProxy); ++ ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( sProxy ) ); ++ } ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort"))) ++ { ++ QString aFTPProxy; ++ switch ( KProtocolManager::proxyType() ) ++ { ++ case KProtocolManager::ManualProxy: // Proxies are manually configured ++ aFTPProxy = KProtocolManager::proxyFor( "FTP" ); ++ break; ++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given ++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered ++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables ++// In such cases, the proxy address is not stored in TDE, but determined dynamically. ++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... ++// The best we can do here is to ask the current value for a given address. ++ aFTPProxy = KProtocolManager::proxyForURL( "ftp://ftp.openoffice.org" ); ++ break; ++ default: // No proxy is used ++ break; ++ } ++ if ( !aFTPProxy.isEmpty() ) ++ { ++ KURL aProxy(aFTPProxy); ++ sal_Int32 nPort = aProxy.port(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( nPort ) ); ++ } ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName"))) ++ { ++ QString aHTTPProxy; ++ switch ( KProtocolManager::proxyType() ) ++ { ++ case KProtocolManager::ManualProxy: // Proxies are manually configured ++ aHTTPProxy = KProtocolManager::proxyFor( "HTTP" ); ++ break; ++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given ++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered ++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables ++// In such cases, the proxy address is not stored in TDE, but determined dynamically. ++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... ++// The best we can do here is to ask the current value for a given address. ++ aHTTPProxy = KProtocolManager::proxyForURL( "http://http.openoffice.org" ); ++ break; ++ default: // No proxy is used ++ break; ++ } ++ if ( !aHTTPProxy.isEmpty() ) ++ { ++ KURL aProxy(aHTTPProxy); ++ ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( sProxy ) ); ++ } ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort"))) ++ { ++ QString aHTTPProxy; ++ switch ( KProtocolManager::proxyType() ) ++ { ++ case KProtocolManager::ManualProxy: // Proxies are manually configured ++ aHTTPProxy = KProtocolManager::proxyFor( "HTTP" ); ++ break; ++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given ++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered ++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables ++// In such cases, the proxy address is not stored in TDE, but determined dynamically. ++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... ++// The best we can do here is to ask the current value for a given address. ++ aHTTPProxy = KProtocolManager::proxyForURL( "http://http.openoffice.org" ); ++ break; ++ default: // No proxy is used ++ break; ++ } ++ if ( !aHTTPProxy.isEmpty() ) ++ { ++ KURL aProxy(aHTTPProxy); ++ sal_Int32 nPort = aProxy.port(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( nPort ) ); ++ } ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName"))) ++ { ++ QString aHTTPSProxy; ++ switch ( KProtocolManager::proxyType() ) ++ { ++ case KProtocolManager::ManualProxy: // Proxies are manually configured ++ aHTTPSProxy = KProtocolManager::proxyFor( "HTTPS" ); ++ break; ++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given ++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered ++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables ++// In such cases, the proxy address is not stored in TDE, but determined dynamically. ++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... ++// The best we can do here is to ask the current value for a given address. ++ aHTTPSProxy = KProtocolManager::proxyForURL( "https://https.openoffice.org" ); ++ break; ++ default: // No proxy is used ++ break; ++ } ++ if ( !aHTTPSProxy.isEmpty() ) ++ { ++ KURL aProxy(aHTTPSProxy); ++ ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( sProxy ) ); ++ } ++ } else if (id.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort"))) ++ { ++ QString aHTTPSProxy; ++ switch ( KProtocolManager::proxyType() ) ++ { ++ case KProtocolManager::ManualProxy: // Proxies are manually configured ++ aHTTPSProxy = KProtocolManager::proxyFor( "HTTPS" ); ++ break; ++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given ++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered ++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables ++// In such cases, the proxy address is not stored in TDE, but determined dynamically. ++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind... ++// The best we can do here is to ask the current value for a given address. ++ aHTTPSProxy = KProtocolManager::proxyForURL( "https://https.openoffice.org" ); ++ break; ++ default: // No proxy is used ++ break; ++ } ++ if ( !aHTTPSProxy.isEmpty() ) ++ { ++ KURL aProxy(aHTTPSProxy); ++ sal_Int32 nPort = aProxy.port(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( nPort ) ); ++ } ++ } else if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy"))) { ++ QString aNoProxyFor; ++ switch ( KProtocolManager::proxyType() ) ++ { ++ case KProtocolManager::ManualProxy: // Proxies are manually configured ++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given ++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered ++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables ++ aNoProxyFor = KProtocolManager::noProxyFor(); ++ break; ++ default: // No proxy is used ++ break; ++ } ++ if ( !aNoProxyFor.isEmpty() ) ++ { ++ ::rtl::OUString sNoProxyFor; ++ ++ aNoProxyFor = aNoProxyFor.replace( COMMA, SEMI_COLON ); ++ sNoProxyFor = (const sal_Unicode *) aNoProxyFor.ucs2(); ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( sNoProxyFor ) ); ++ } ++ } else if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetProxyType"))) { ++ int nProxyType; ++ switch ( KProtocolManager::proxyType() ) ++ { ++ case KProtocolManager::ManualProxy: // Proxies are manually configured ++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given ++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered ++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables ++ nProxyType = 1; ++ break; ++ default: // No proxy is used ++ nProxyType = 0; ++ } ++ return css::beans::Optional< css::uno::Any >( ++ true, uno::makeAny( (sal_Int32) nProxyType ) ); ++ } else { ++ OSL_ASSERT(false); // this cannot happen ++ } ++ return css::beans::Optional< css::uno::Any >(); ++} ++ ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN shell/source/backends/tdebe/tdeaccess.hxx shell/source/backends/tdebe/tdeaccess.hxx +--- shell/source/backends/tdebe/tdeaccess.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ shell/source/backends/tdebe/tdeaccess.hxx 2011-08-17 14:16:31.565704001 -0500 +@@ -0,0 +1,51 @@ ++/* -*- 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. ++* Copyright 2011 Timothy Pearson ++* ++* 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 ++* ++* for a copy of the LGPLv3 License. ++* ++************************************************************************/ ++ ++#ifndef INCLUDED_SHELL_SOURCE_BACKENDS_TDEBE_TDEACCESS_HXX ++#define INCLUDED_SHELL_SOURCE_BACKENDS_TDEBE_TDEACCESS_HXX ++ ++#include "sal/config.h" ++ ++#include "com/sun/star/beans/Optional.hpp" ++ ++namespace com { namespace sun { namespace star { namespace uno { ++ class Any; ++} } } } ++namespace rtl { class OUString; } ++ ++namespace tdeaccess { ++ ++com::sun::star::beans::Optional< com::sun::star::uno::Any > getValue( ++ rtl::OUString const & id); ++ ++} ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN shell/source/backends/tdebe/tdebackend.cxx shell/source/backends/tdebe/tdebackend.cxx +--- shell/source/backends/tdebe/tdebackend.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ shell/source/backends/tdebe/tdebackend.cxx 2011-08-17 14:16:42.136513747 -0500 +@@ -0,0 +1,262 @@ ++/* -*- 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. ++* Copyright 2011 Timothy Pearson ++* ++* 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 ++* ++* for a copy of the LGPLv3 License. ++* ++************************************************************************/ ++ ++#include "precompiled_shell.hxx" ++#include "sal/config.h" ++ ++#include "boost/noncopyable.hpp" ++#include "com/sun/star/beans/Optional.hpp" ++#include "com/sun/star/beans/PropertyVetoException.hpp" ++#include "com/sun/star/beans/UnknownPropertyException.hpp" ++#include "com/sun/star/beans/XPropertyChangeListener.hpp" ++#include "com/sun/star/beans/XPropertySet.hpp" ++#include "com/sun/star/beans/XPropertySetInfo.hpp" ++#include "com/sun/star/beans/XVetoableChangeListener.hpp" ++#include "com/sun/star/lang/IllegalArgumentException.hpp" ++#include "com/sun/star/lang/WrappedTargetException.hpp" ++#include "com/sun/star/lang/XMultiComponentFactory.hpp" ++#include "com/sun/star/lang/XServiceInfo.hpp" ++#include "com/sun/star/lang/WrappedTargetException.hpp" ++#include "com/sun/star/uno/Any.hxx" ++#include "com/sun/star/uno/Reference.hxx" ++#include "com/sun/star/uno/RuntimeException.hpp" ++#include "com/sun/star/uno/Sequence.hxx" ++#include "com/sun/star/uno/XComponentContext.hpp" ++#include "com/sun/star/uno/XCurrentContext.hpp" ++#include "cppuhelper/factory.hxx" ++#include "cppuhelper/implbase2.hxx" ++#include "cppuhelper/implementationentry.hxx" ++#include "cppuhelper/weak.hxx" ++#include "rtl/string.h" ++#include "rtl/ustring.h" ++#include "rtl/ustring.hxx" ++#include "sal/types.h" ++#include "uno/current_context.hxx" ++#include "uno/lbnames.h" ++ ++#include "tde_headers.h" ++ ++#include "tdeaccess.hxx" ++ ++namespace { ++ ++namespace css = com::sun::star; ++ ++rtl::OUString SAL_CALL getServiceImplementationName() { ++ return rtl::OUString( ++ RTL_CONSTASCII_USTRINGPARAM( ++ "com.sun.star.comp.configuration.backend.TDEBackend")); ++} ++ ++css::uno::Sequence< rtl::OUString > SAL_CALL getServiceSupportedServiceNames() { ++ rtl::OUString name( ++ RTL_CONSTASCII_USTRINGPARAM( ++ "com.sun.star.configuration.backend.TDEBackend")); ++ return css::uno::Sequence< rtl::OUString >(&name, 1); ++} ++ ++class Service: ++ public cppu::WeakImplHelper2< ++ css::lang::XServiceInfo, css::beans::XPropertySet >, ++ private boost::noncopyable ++{ ++public: ++ Service(); ++ ++private: ++ virtual ~Service() {} ++ ++ virtual rtl::OUString SAL_CALL getImplementationName() ++ throw (css::uno::RuntimeException) ++ { return getServiceImplementationName(); } ++ ++ virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName) ++ throw (css::uno::RuntimeException) ++ { return ServiceName == getSupportedServiceNames()[0]; } ++ ++ virtual css::uno::Sequence< rtl::OUString > SAL_CALL ++ getSupportedServiceNames() throw (css::uno::RuntimeException) ++ { return getServiceSupportedServiceNames(); } ++ ++ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL ++ getPropertySetInfo() throw (css::uno::RuntimeException) ++ { return css::uno::Reference< css::beans::XPropertySetInfo >(); } ++ ++ virtual void SAL_CALL setPropertyValue( ++ rtl::OUString const &, css::uno::Any const &) ++ throw ( ++ css::beans::UnknownPropertyException, ++ css::beans::PropertyVetoException, ++ css::lang::IllegalArgumentException, ++ css::lang::WrappedTargetException, css::uno::RuntimeException); ++ ++ virtual css::uno::Any SAL_CALL getPropertyValue( ++ rtl::OUString const & PropertyName) ++ throw ( ++ css::beans::UnknownPropertyException, ++ css::lang::WrappedTargetException, css::uno::RuntimeException); ++ ++ virtual void SAL_CALL addPropertyChangeListener( ++ rtl::OUString const &, ++ css::uno::Reference< css::beans::XPropertyChangeListener > const &) ++ throw ( ++ css::beans::UnknownPropertyException, ++ css::lang::WrappedTargetException, css::uno::RuntimeException) ++ {} ++ ++ virtual void SAL_CALL removePropertyChangeListener( ++ rtl::OUString const &, ++ css::uno::Reference< css::beans::XPropertyChangeListener > const &) ++ throw ( ++ css::beans::UnknownPropertyException, ++ css::lang::WrappedTargetException, css::uno::RuntimeException) ++ {} ++ ++ virtual void SAL_CALL addVetoableChangeListener( ++ rtl::OUString const &, ++ css::uno::Reference< css::beans::XVetoableChangeListener > const &) ++ throw ( ++ css::beans::UnknownPropertyException, ++ css::lang::WrappedTargetException, css::uno::RuntimeException) ++ {} ++ ++ virtual void SAL_CALL removeVetoableChangeListener( ++ rtl::OUString const &, ++ css::uno::Reference< css::beans::XVetoableChangeListener > const &) ++ throw ( ++ css::beans::UnknownPropertyException, ++ css::lang::WrappedTargetException, css::uno::RuntimeException) ++ {} ++ ++ bool enabled_; ++}; ++ ++Service::Service(): enabled_(false) { ++ css::uno::Reference< css::uno::XCurrentContext > context( ++ css::uno::getCurrentContext()); ++ if (context.is()) { ++ rtl::OUString desktop; ++ context->getValueByName( ++ rtl::OUString( ++ RTL_CONSTASCII_USTRINGPARAM("system.desktop-environment"))) >>= ++ desktop; ++ enabled_ = desktop.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("TDE")) && ++ KApplication::kApplication() != 0; ++ } ++} ++ ++void Service::setPropertyValue(rtl::OUString const &, css::uno::Any const &) ++ throw ( ++ css::beans::UnknownPropertyException, css::beans::PropertyVetoException, ++ css::lang::IllegalArgumentException, css::lang::WrappedTargetException, ++ css::uno::RuntimeException) ++{ ++ throw css::lang::IllegalArgumentException( ++ rtl::OUString( ++ RTL_CONSTASCII_USTRINGPARAM("setPropertyValue not supported")), ++ static_cast< cppu::OWeakObject * >(this), -1); ++} ++ ++css::uno::Any Service::getPropertyValue(rtl::OUString const & PropertyName) ++ throw ( ++ css::beans::UnknownPropertyException, css::lang::WrappedTargetException, ++ css::uno::RuntimeException) ++{ ++ if (PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("EnableATToolSupport")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ExternalMailer")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("SourceViewFontHeight")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("SourceViewFontName")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("WorkPathVariable")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy")) || ++ PropertyName.equalsAsciiL( ++ RTL_CONSTASCII_STRINGPARAM("ooInetProxyType"))) ++ { ++ return css::uno::makeAny( ++ enabled_ ++ ? tdeaccess::getValue(PropertyName) ++ : css::beans::Optional< css::uno::Any >()); ++ } ++ throw css::beans::UnknownPropertyException( ++ PropertyName, static_cast< cppu::OWeakObject * >(this)); ++} ++ ++css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( ++ css::uno::Reference< css::uno::XComponentContext > const &) ++{ ++ return static_cast< cppu::OWeakObject * >(new Service); ++} ++ ++static cppu::ImplementationEntry const services[] = { ++ { &createInstance, &getServiceImplementationName, ++ &getServiceSupportedServiceNames, &cppu::createSingleComponentFactory, 0, ++ 0 }, ++ { 0, 0, 0, 0, 0, 0 } ++}; ++ ++} ++ ++extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( ++ char const * pImplName, void * pServiceManager, void * pRegistryKey) ++{ ++ return cppu::component_getFactoryHelper( ++ pImplName, pServiceManager, pRegistryKey, services); ++} ++ ++extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL ++component_getImplementationEnvironment( ++ char const ** ppEnvTypeName, uno_Environment **) ++{ ++ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; ++} ++ ++extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo( ++ void * pServiceManager, void * pRegistryKey) ++{ ++ return component_writeInfoHelper(pServiceManager, pRegistryKey, services); ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN shell/source/backends/tdebe/tdebe1-ucd.txt shell/source/backends/tdebe/tdebe1-ucd.txt +--- shell/source/backends/tdebe/tdebe1-ucd.txt 1969-12-31 18:00:00.000000000 -0600 ++++ shell/source/backends/tdebe/tdebe1-ucd.txt 2011-08-17 14:16:36.266064060 -0500 +@@ -0,0 +1,6 @@ ++[ComponentDescriptor] ++ImplementationName=com.sun.star.comp.configuration.backend.TDEBackend ++ComponentName=tdebe1.uno.so ++LoaderName=com.sun.star.loader.SharedLibrary ++[SupportedServices] ++com.sun.star.configuration.backend.TDEBackend +--- fpicker/prj/build.lst 2010-11-11 09:30:08.000000000 -0600 ++++ fpicker/prj/build.lst 2011-08-17 19:28:07.578452546 -0500 +@@ -7,8 +7,10 @@ + fp fpicker\source\unx\kde4 nmake - u fp_kde4_filepicker fp_inc NULL + fp fpicker\source\unx\kde_unx nmake - u fp_unx_common fp_inc NULL + fp fpicker\source\unx\kde nmake - u fp_unx_kde_filepicker fp_inc NULL ++fp fpicker\source\unx\tde_unx nmake - u fp_unx_tdecommon fp_inc NULL ++fp fpicker\source\unx\tde nmake - u fp_unx_tde_filepicker fp_inc NULL + fp fpicker\source\aqua nmake - u fp_macosx_filepicker NULL + fp fpicker\source\win32\filepicker nmake - w fp_win32_filepicker fp_inc NULL + fp fpicker\source\win32\folderpicker nmake - w fp_win32_folderpicker fp_inc NULL + fp fpicker\source\win32\misc nmake - w fp_win32_misc fp_win32_filepicker.w fp_win32_folderpicker.w fp_inc NULL +-fp fpicker\util nmake - all fp_util fp_gnome_filepicker.u fp_unx_common.u fp_unx_kde_filepicker.u fp_win32_filepicker.w fp_win32_misc.w fp_win32_folderpicker.w NULL ++fp fpicker\util nmake - all fp_util fp_gnome_filepicker.u fp_unx_common.u fp_unx_kde_filepicker.u fp_unx_tdecommon.u fp_unx_tde_filepicker.u fp_win32_filepicker.w fp_win32_misc.w fp_win32_folderpicker.w NULL +--- shell/prj/build.lst 2010-11-11 09:30:08.000000000 -0600 ++++ shell/prj/build.lst 2011-08-17 19:29:38.835371237 -0500 +@@ -30,5 +30,6 @@ + sl shell\source\backends\gconfbe nmake - u sl_backends_gconfbe sl_inc NULL + sl shell\source\backends\kdebe nmake - u sl_backends_kdebe sl_inc NULL + sl shell\source\backends\kde4be nmake - u sl_backends_kde4be sl_inc NULL ++sl shell\source\backends\tdebe nmake - u sl_backends_tdebe sl_inc NULL + sl shell\source\backends\desktopbe nmake - u sl_backends_desktopbe sl_inc NULL + sl shell\source\win32\shlxthandler\ooofilt nmake - w sl_win32_shlxthandler_ooofilt sl_all_zipfile.w sl_all_ooofilereader.w sl_win32_shlxthandler_util.w sl_all sl_inc NULL +--- connectivity/prj/build.lst 2010-11-11 13:08:58.000000000 -0600 ++++ connectivity/prj/build.lst 2011-08-17 19:31:47.795150674 -0500 +@@ -12,6 +12,7 @@ + cn connectivity\source\drivers\mozab\bootstrap nmake - all cn_mozab_bootstrap cn_mozab_mozillasrc cn_inc NULL + cn connectivity\source\drivers\mozab nmake - all cn_mozab cn_mozab_bootstrap cn_dbtools cn_inc NULL + cn connectivity\source\drivers\kab nmake - all cn_kab cn_dbtools cn_inc NULL ++cn connectivity\source\drivers\tdeab nmake - all cn_tdeab cn_dbtools cn_inc NULL + cn connectivity\source\drivers\macab nmake - all cn_macab cn_dbtools cn_inc NULL + cn connectivity\source\drivers\evoab2 nmake - all cn_evoab2 cn_dbtools cn_file cn_inc NULL + cn connectivity\source\drivers\calc nmake - all cn_calc cn_file cn_inc NULL +@@ -28,5 +29,5 @@ + cn connectivity\source\simpledbt nmake - all cn_simpledbt cn_cmtools cn_inc NULL + cn connectivity\source\dbtools nmake - all cn_dbtools cn_simpledbt cn_cmtools cn_parse cn_res cn_sdbcx cn_inc cn_res NULL + cn connectivity\qa\connectivity\tools nmake - all cn_qa_tools cn_inc NULL +-cn connectivity\util nmake - all cn_util cn_ado cn_mozab cn_kab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_adabas cn_flat cn_dbase cn_hsqldb cn_macab NULL ++cn connectivity\util nmake - all cn_util cn_ado cn_mozab cn_kab cn_tdeab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_adabas cn_flat cn_dbase cn_hsqldb cn_macab NULL + +--- set_soenv.in 2011-03-08 12:51:39.000000000 -0600 ++++ set_soenv.in 2011-08-17 22:19:40.994282148 -0500 +@@ -1732,6 +1732,10 @@ + ToFile( "KDE_GLIB_LIBS", "@KDE_GLIB_LIBS@", "e" ); + ToFile( "KDE_HAVE_GLIB", "@KDE_HAVE_GLIB@", "e" ); + ToFile( "ENABLE_KAB", "@ENABLE_KAB@", "e" ); ++ToFile( "ENABLE_TDE", "@ENABLE_TDE@", "e" ); ++ToFile( "TDE_CFLAGS", "@TDE_CFLAGS@", "e" ); ++ToFile( "TDE_LIBS", "@TDE_LIBS@", "e" ); ++ToFile( "ENABLE_TDEAB", "@ENABLE_TDEAB@", "e" ); + ToFile( "PSPRINT", "TRUE", "e" ); + ToFile( "MKDEPENDSOLVER", "TRUE", "e" ); + ToFile( "nodep", "@nodep@", "e" ); +diff -urN shell/inc/tde_headers.h shell/inc/tde_headers.h +--- shell/inc/tde_headers.h 1969-12-31 18:00:00.000000000 -0600 ++++ shell/inc/tde_headers.h 2011-08-18 00:00:30.118955481 -0500 +@@ -0,0 +1,98 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef INCLUDED_VCL_TDE_HEADERS_H ++#define INCLUDED_VCL_TDE_HEADERS_H ++ ++/* ********* Suppress warnings if needed */ ++#include "sal/config.h" ++ ++#if defined __GNUC__ ++#pragma GCC system_header ++#endif ++ ++ ++/* ********* Hack, but needed because of conflicting types... */ ++#define Region QtXRegion ++ ++ ++/* ********* Qt headers */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* ********* See hack on top of this file */ ++#undef Region ++ ++ ++/* ********* TDE base headers */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++/* ********* TDE address book connectivity headers */ ++#include ++#include ++#include ++#include ++ ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN connectivity/source/inc/resource/tdeab_res.hrc connectivity/source/inc/resource/tdeab_res.hrc +--- connectivity/source/inc/resource/tdeab_res.hrc 1969-12-31 18:00:00.000000000 -0600 ++++ connectivity/source/inc/resource/tdeab_res.hrc 2011-08-18 00:42:41.185561810 -0500 +@@ -0,0 +1,44 @@ ++/************************************************************************* ++ * ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * Copyright 2000, 2010 Oracle and/or its affiliates. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef CONNECTIVITY_RESOURCE_KAB_HRC ++#define CONNECTIVITY_RESOURCE_KAB_HRC ++ ++#include "resource/conn_shared_res.hrc" ++#include "resource/common_res.hrc" ++// ============================================================================ ++// = the tdeab driver's resource strings ++// ============================================================================ ++ ++#define STR_NO_TDE_INST ( STR_KAB_BASE + 0 ) ++#define STR_TDE_VERSION_TOO_OLD ( STR_KAB_BASE + 1 ) ++#define STR_TDE_VERSION_TOO_NEW ( STR_KAB_BASE + 2 ) ++#define STR_TDE_VERSION_TOO_NEW_WORK_AROUND ( STR_KAB_BASE + 3 ) ++ ++#endif // CONNECTIVITY_RESOURCE_KAB_HRC ++ +diff -urN shell/prj/d.lst shell/prj/d.lst +--- shell/prj/d.lst 2010-11-11 09:30:08.000000000 -0600 ++++ shell/prj/d.lst 2011-08-18 00:54:55.072395417 -0500 +@@ -14,6 +14,7 @@ + ..\%__SRC%\bin\open-url %_DEST%\bin%_EXT%\open-url + ..\%__SRC%\bin\cde-open-url %_DEST%\bin%_EXT%\cde-open-url + ..\%__SRC%\bin\kde-open-url %_DEST%\bin%_EXT%\kde-open-url ++..\%__SRC%\bin\tde-open-url %_DEST%\bin%_EXT%\tde-open-url + ..\%__SRC%\bin\gnome-open-url %_DEST%\bin%_EXT%\gnome-open-url + ..\%__SRC%\bin\gnome-open-url.bin %_DEST%\bin%_EXT%\gnome-open-url.bin + ..\%__SRC%\bin\senddoc %_DEST%\bin%_EXT%\senddoc +@@ -23,3 +24,4 @@ + + ..\%__SRC%\misc\*-ucd.txt %_DEST%\bin%_EXT%\*-ucd.txt + ..\inc\kde_headers.h %_DEST%\inc%_EXT%\shell\kde_headers.h ++..\inc\tde_headers.h %_DEST%\inc%_EXT%\shell\tde_headers.h +diff -urN fpicker/prj/d.lst fpicker/prj/d.lst +--- fpicker/prj/d.lst 2010-11-11 09:30:08.000000000 -0600 ++++ fpicker/prj/d.lst 2011-08-18 00:57:05.532528127 -0500 +@@ -5,6 +5,7 @@ + ..\%__SRC%\bin\f*.res %_DEST%\bin%_EXT%\ + ..\%__SRC%\bin\f*.dll %_DEST%\bin%_EXT%\ + ..\%__SRC%\bin\kdefilepicker %_DEST%\bin%_EXT%\kdefilepicker ++..\%__SRC%\bin\tdefilepicker %_DEST%\bin%_EXT%\tdefilepicker + ..\%__SRC%\lib\f*.so %_DEST%\lib%_EXT%\ + ..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\*.dylib + +@@ -14,3 +15,4 @@ + ..\source\unx\kde4\fps-kde4-ucd.txt %_DEST%\bin%_EXT%\fps-kde4-ucd.txt + ..\source\aqua\fps-aqua-ucd.txt %_DEST%\bin%_EXT%\fps-aqua-ucd.txt + ..\source\unx\kde_unx\fps-kde-ucd.txt %_DEST%\bin%_EXT%\fps-kde-ucd.txt ++..\source\unx\tde_unx\fps-tde-ucd.txt %_DEST%\bin%_EXT%\fps-tde-ucd.txt +diff -urN connectivity/prj/d.lst connectivity/prj/d.lst +--- connectivity/prj/d.lst 2010-11-11 09:30:07.000000000 -0600 ++++ connectivity/prj/d.lst 2011-08-18 00:58:04.797146865 -0500 +@@ -8,6 +8,7 @@ + ..\source\drivers\adabas\*.xml %_DEST%\xml%_EXT%\*.xml + ..\source\drivers\ado\*.xml %_DEST%\xml%_EXT%\*.xml + ..\source\drivers\kab\*.xml %_DEST%\xml%_EXT%\*.xml ++..\source\drivers\tdeab\*.xml %_DEST%\xml%_EXT%\*.xml + ..\source\drivers\macab\*.xml %_DEST%\xml%_EXT%\*.xml + ..\source\drivers\file\*.xml %_DEST%\xml%_EXT%\*.xml + ..\source\drivers\flat\*.xml %_DEST%\xml%_EXT%\*.xml +diff -urN scp2/prj/build.lst scp2/prj/build.lst +--- scp2/prj/build.lst 2010-11-30 14:17:23.000000000 -0600 ++++ scp2/prj/build.lst 2011-08-18 11:36:10.411551109 -0500 +@@ -14,6 +14,7 @@ + cp scp2\source\impress nmake - all cp_impress cp_langmacros cp_langtemplates NULL + cp scp2\source\javafilter nmake - all cp_javafilter cp_langmacros cp_langtemplates NULL + cp scp2\source\kde nmake - all cp_kde cp_langmacros cp_langtemplates NULL ++cp scp2\source\tde nmake - all cp_tde cp_langmacros cp_langtemplates NULL + cp scp2\source\layout nmake - all cp_layout cp_langmacros NULL + cp scp2\source\math nmake - all cp_math cp_langmacros cp_langtemplates NULL + cp scp2\source\ooo nmake - all cp_ooo cp_langmacros cp_langtemplates NULL +@@ -27,4 +28,4 @@ + cp scp2\source\winexplorerext nmake - all cp_winexplorerext cp_langmacros cp_langtemplates NULL + cp scp2\source\onlineupdate nmake - all cp_update cp_langmacros cp_langtemplates NULL + cp scp2\source\accessories nmake - all cp_accessories cp_langmacros NULL +-cp scp2\util nmake - all cp_util cp_activex cp_binfilter cp_calc cp_canvas cp_crashrep cp_draw cp_extensions cp_gnome cp_graphicfilter cp_impress cp_javafilter cp_kde cp_layout cp_math cp_ooo cp_python cp_quickstart cp_testtool cp_writer cp_base cp_xsltfilter cp_winexplorerext cp_sdkoo cp_update cp_accessories NULL ++cp scp2\util nmake - all cp_util cp_activex cp_binfilter cp_calc cp_canvas cp_crashrep cp_draw cp_extensions cp_gnome cp_graphicfilter cp_impress cp_javafilter cp_kde cp_tde cp_layout cp_math cp_ooo cp_python cp_quickstart cp_testtool cp_writer cp_base cp_xsltfilter cp_winexplorerext cp_sdkoo cp_update cp_accessories NULL +diff -urN scp2/source/ooo/file_library_ooo.scp scp2/source/ooo/file_library_ooo.scp +--- scp2/source/ooo/file_library_ooo.scp 2010-11-11 09:08:07.000000000 -0600 ++++ scp2/source/ooo/file_library_ooo.scp 2011-08-18 11:42:28.890516734 -0500 +@@ -590,6 +590,25 @@ + End + #endif + #endif ++#ifdef ENABLE_TDE ++#ifndef MACOSX ++File gid_File_Lib_Fps_Tde ++ TXT_FILE_BODY; ++ Styles = (PACKED,UNO_COMPONENT); ++ RegistryID = gid_Starregistry_Services_Rdb; ++ Dir = gid_Dir_Program; ++ Name = SPECIAL_COMPONENT_LIB_NAME(fps_tde.uno); ++ Regmergefile = "fps-tde-ucd.txt"; ++End ++File gid_File_Bin_TdeFilePicker ++ BIN_FILE_BODY; ++ Styles = (PACKED); ++ Dir = gid_Brand_Dir_Program; ++ Name = "tdefilepicker"; ++End ++#endif ++#endif ++ + #endif + + #ifdef MACOSX +@@ -1207,6 +1226,17 @@ + End + #endif + #endif ++#ifdef ENABLE_TDE ++#ifndef MACOSX ++File gid_File_Lib_Vclplug_Tde ++ Name = LIBNAME(vclplug_tde); ++ TXT_FILE_BODY; ++ Styles = (PACKED); ++ Dir = SCP2_OOO_BIN_DIR; ++End ++#endif ++#endif ++ + #endif + + #if defined(QUARTZ) +diff -urN scp2/source/ooo/file_ooo.scp scp2/source/ooo/file_ooo.scp +--- scp2/source/ooo/file_ooo.scp 2011-03-08 13:12:46.000000000 -0600 ++++ scp2/source/ooo/file_ooo.scp 2011-08-18 11:40:40.942257980 -0500 +@@ -209,6 +209,13 @@ + Styles = (PACKED); + End + ++File gid_File_Bin_Tde_Open_Url ++ BIN_FILE_BODY; ++ Dir = gid_Dir_Program; ++ Name = "tde-open-url"; ++ Styles = (PACKED); ++End ++ + File gid_File_Bin_Cde_Open_Url + BIN_FILE_BODY; + Dir = gid_Dir_Program; +diff -urN scp2/source/ooo/module_hidden_ooo.scp scp2/source/ooo/module_hidden_ooo.scp +--- scp2/source/ooo/module_hidden_ooo.scp 2010-12-14 09:40:37.000000000 -0600 ++++ scp2/source/ooo/module_hidden_ooo.scp 2011-08-18 11:44:02.297661319 -0500 +@@ -40,6 +40,7 @@ + gid_File_Bin_Gnome_Open_Url, + gid_File_Bin_Gnome_Open_Url_Bin, + gid_File_Bin_Kde_Open_Url, ++ gid_File_Bin_Tde_Open_Url, + gid_File_Bin_Open_Url, + gid_File_Bin_Pagein, + gid_File_Bin_Pluginapp, +@@ -239,6 +240,7 @@ + gid_File_Lib_Vclplug_Gtk, + gid_File_Lib_Vclplug_Kde, + gid_File_Lib_Vclplug_Kde4, ++ gid_File_Lib_Vclplug_Tde, + gid_File_Lib_Vclplug_Svp, + gid_File_Lib_Basctl, + gid_File_Lib_CanvasTools, +diff -urN scp2/source/tde/file_tde.scp scp2/source/tde/file_tde.scp +--- scp2/source/tde/file_tde.scp 1969-12-31 18:00:00.000000000 -0600 ++++ scp2/source/tde/file_tde.scp 2011-08-18 11:38:30.302260303 -0500 +@@ -0,0 +1,39 @@ ++/************************************************************************* ++ * ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * Copyright 2000, 2010 Oracle and/or its affiliates. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++#include "macros.inc" ++ ++#ifdef ENABLE_TDE ++File gid_File_Lib_Tdebe ++ TXT_FILE_BODY; ++ Styles = (PACKED); ++ Dir = SCP2_OOO_BIN_DIR; ++ Name = STRING(CONCAT2(tdebe1.uno,UNXSUFFIX)); ++ RegistryID = gid_Starregistry_Services_Rdb; ++ Regmergefile = "tdebe1-ucd.txt"; ++End ++#endif +diff -urN scp2/source/tde/makefile.mk scp2/source/tde/makefile.mk +--- scp2/source/tde/makefile.mk 1969-12-31 18:00:00.000000000 -0600 ++++ scp2/source/tde/makefile.mk 2011-08-18 11:37:33.667925169 -0500 +@@ -0,0 +1,59 @@ ++#************************************************************************* ++# ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# Copyright 2000, 2010 Oracle and/or its affiliates. ++# Copyright 2011 Timothy Pearson ++# ++# 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 ++# ++# for a copy of the LGPLv3 License. ++# ++#************************************************************************* ++ ++PRJ=..$/.. ++ ++PRJPCH= ++ ++PRJNAME=scp2 ++TARGET=tde ++TARGETTYPE=CUI ++ ++# --- Settings ----------------------------------------------------- ++ ++.INCLUDE : settings.mk ++ ++SCP_PRODUCT_TYPE=osl ++ ++.IF "$(ENABLE_TDE)" == "TRUE" ++ ++.IF "$(ENABLE_TDE)" != "" ++SCPDEFS+=-DENABLE_TDE ++.ENDIF ++ ++PARFILES = \ ++ module_tde.par \ ++ file_tde.par ++ ++ULFFILES= \ ++ module_tde.ulf ++.ENDIF ++ ++# --- File --------------------------------------------------------- ++ ++.INCLUDE : target.mk +diff -urN scp2/source/tde/module_tde.scp scp2/source/tde/module_tde.scp +--- scp2/source/tde/module_tde.scp 1969-12-31 18:00:00.000000000 -0600 ++++ scp2/source/tde/module_tde.scp 2011-08-18 11:38:07.870543319 -0500 +@@ -0,0 +1,45 @@ ++/************************************************************************* ++ * ++ * 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 ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#include "macros.inc" ++ ++#if defined( ENABLE_TDE ) ++Module gid_Module_Optional_Tde ++ ParentID = gid_Module_Optional; ++ Default = YES; ++ PackageInfo = "packinfo_office.txt"; ++ MOD_NAME_DESC(MODULE_OPTIONAL_TDE); ++ Styles = (DONTSHOWINUSERINSTALL); ++ Files = ( ++#ifdef ENABLE_TDE ++ gid_File_Lib_Tdebe ++#endif // ENABLE_TDE ++ ); ++End ++#endif ++ +diff -urN scp2/source/tde/module_tde.ulf scp2/source/tde/module_tde.ulf +--- scp2/source/tde/module_tde.ulf 1969-12-31 18:00:00.000000000 -0600 ++++ scp2/source/tde/module_tde.ulf 2011-08-18 11:37:03.345603863 -0500 +@@ -0,0 +1,34 @@ ++/************************************************************************* ++ * ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * Copyright 2000, 2010 Oracle and/or its affiliates. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++[STR_NAME_MODULE_OPTIONAL_TDE] ++en-US = "TDE Integration" ++ ++[STR_DESC_MODULE_OPTIONAL_TDE] ++en-US = "System integration of %PRODUCTNAME %PRODUCTVERSION into TDE." ++ +diff -urN scp2/util/makefile.mk scp2/util/makefile.mk +--- scp2/util/makefile.mk 2010-12-16 07:54:12.000000000 -0600 ++++ scp2/util/makefile.mk 2011-08-18 11:39:59.419080617 -0500 +@@ -197,6 +197,12 @@ + module_kde.par \ + file_kde.par + .ENDIF ++ ++.IF "$(ENABLE_TDE)" == "TRUE" ++SCP1FILES += \ ++ module_tde.par \ ++ file_tde.par ++.ENDIF + .ENDIF + + .IF "$(ENABLE_CRASHDUMP)" != "" +@@ -380,6 +386,12 @@ + module_kde.par \ + file_kde.par + .ENDIF ++ ++.IF "$(ENABLE_TDE)" == "TRUE" ++SCP2FILES += \ ++ module_tde.par \ ++ file_tde.par ++.ENDIF + .ENDIF + + .IF "$(ENABLE_CRASHDUMP)" != "" +diff -urN shell/source/unix/misc/makefile.mk shell/source/unix/misc/makefile.mk +--- shell/source/unix/misc/makefile.mk 2010-11-11 09:30:08.000000000 -0600 ++++ shell/source/unix/misc/makefile.mk 2011-08-18 14:27:51.206440704 -0500 +@@ -45,7 +45,8 @@ + $(BIN)$/open-url \ + $(BIN)$/cde-open-url \ + $(BIN)$/gnome-open-url \ +- $(BIN)$/kde-open-url ++ $(BIN)$/kde-open-url \ ++ $(BIN)$/tde-open-url + + .IF "$(GUI)" == "OS2" + +diff -urN shell/source/unix/misc/tde-open-url.sh shell/source/unix/misc/tde-open-url.sh +--- shell/source/unix/misc/tde-open-url.sh 1969-12-31 18:00:00.000000000 -0600 ++++ shell/source/unix/misc/tde-open-url.sh 2010-11-11 09:30:08.000000000 -0600 +@@ -0,0 +1,10 @@ ++#!/bin/sh ++ ++# special handling for mailto: uris ++if echo $1 | grep '^mailto:' > /dev/null; then ++ kmailservice "$1" & ++else ++ kfmclient openURL "$1" & ++fi ++ ++exit 0 +diff -urN setup_native/source/packinfo/packinfo_office.txt setup_native/source/packinfo/packinfo_office.txt +--- setup_native/source/packinfo/packinfo_office.txt 2011-03-08 13:12:46.000000000 -0600 ++++ setup_native/source/packinfo/packinfo_office.txt 2011-08-18 14:46:02.820250783 -0500 +@@ -48,6 +48,21 @@ + End + + Start ++module = "gid_Module_Optional_Tde" ++solarispackagename = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-tde-integration" ++solarisrequires = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01" ++packagename = "%BASISPACKAGEPREFIX%OOOBASEVERSION-tde-integration" ++freebsdrequires = "%BASISPACKAGEPREFIX%OOOBASEVERSION-core01" ++requires = "%BASISPACKAGEPREFIX%OOOBASEVERSION-core01" ++copyright = "1999-2009 by OpenOffice.org" ++solariscopyright = "solariscopyrightfile" ++vendor = "The Document Foundation" ++description = "TDE integration module for LibreOffice %OOOBASEVERSION" ++destpath = "/opt" ++packageversion = "%OOOPACKAGEVERSION" ++End ++ ++Start + module = "gid_Module_Root" + # script = "shellscripts_core01.txt" + solarispackagename = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01" +diff -urN scp2/source/ooo/makefile.mk scp2/source/ooo/makefile.mk +--- scp2/source/ooo/makefile.mk 2010-12-16 05:06:55.000000000 -0600 ++++ scp2/source/ooo/makefile.mk 2011-08-18 15:49:48.543071983 -0500 +@@ -88,6 +88,14 @@ + SCPDEFS+=-DENABLE_KAB + .ENDIF + ++.IF "$(ENABLE_TDE)" != "" ++SCPDEFS+=-DENABLE_TDE ++.ENDIF ++ ++.IF "$(ENABLE_TDEAB)" != "" ++SCPDEFS+=-DENABLE_TDEAB ++.ENDIF ++ + .IF "$(ENABLE_EVOAB2)" != "" + SCPDEFS+=-DENABLE_EVOAB2 + .ENDIF +diff -urN solenv/config/sooo330.ini solenv/config/sooo330.ini +--- solenv/config/sooo330.ini 2010-11-11 09:08:07.000000000 -0600 ++++ solenv/config/sooo330.ini 2011-08-18 19:37:01.865529222 -0500 +@@ -646,6 +646,8 @@ + CVER C432 + ENABLE_KAB TRUE + ENABLE_KDE TRUE ++ ENABLE_TDEAB TRUE ++ ENABLE_TDE TRUE + ENABLE_EVOAB2 TRUE + ENV_TOOLS %SOLARROOT%/et_linux_libc2.5/%WORK_STAMP%/bin + GUI UNX +@@ -656,6 +658,7 @@ + JDK14PATH %SOLAR_JDK14PATH% + JDK15PATH %SOLAR_JDK15PATH% + KDE_ROOT /so/env/kde/linux/kde-3.2.2 ++ TDE_ROOT /so/env/tde/linux/tde-3.2.2 + LIBMYSQL_PATH %SOLAR_ENV_ROOT%/mysql-connector-c-6.0.2/unxlngi6 + NO_BSYMBOLIC True + OJDK16PATH %SOLAR_OJDK16PATH% +@@ -921,6 +924,8 @@ + CVER C341 + ENABLE_KAB TRUE + ENABLE_KDE TRUE ++ ENABLE_TDEAB TRUE ++ ENABLE_TDE TRUE + ENV_TOOLS %SOLARROOT%/et_linux_libc2.32/%WORK_STAMP%/bin + GUI UNX + GUIBASE unx +@@ -930,6 +935,7 @@ + JDK14PATH %SOLAR_JDK14PATH% + JDK15PATH %SOLAR_JDK15PATH% + KDE_ROOT /so/env/kde/linux/kde-3.2.2 ++ TDE_ROOT /so/env/tde/linux/tde-3.2.2 + LIBMYSQL_PATH %SOLAR_ENV_ROOT%/mysql-connector-c-6.0.2/unxlngx6 + NO_BSYMBOLIC True + OJDK16PATH %SOLAR_OJDK16PATH% +diff -urN solenv/config/ssolar.cmn solenv/config/ssolar.cmn +--- solenv/config/ssolar.cmn 2010-11-11 09:08:07.000000000 -0600 ++++ solenv/config/ssolar.cmn 2011-08-18 19:37:26.207387814 -0500 +@@ -89,6 +89,7 @@ + ENABLE_GCONF + ENABLE_GNOMEVFS + ENABLE_KDE ++ ENABLE_TDE + ENABLE_MEDIAWIKI + ENABLE_MINIMIZER + ENABLE_NSS_MODULE +diff -urN solenv/inc/unx.mk solenv/inc/unx.mk +--- solenv/inc/unx.mk 2010-11-11 09:08:07.000000000 -0600 ++++ solenv/inc/unx.mk 2011-08-18 19:35:33.868809472 -0500 +@@ -206,4 +206,13 @@ + .ENDIF # "$(KDE_ROOT)"!="" + .ENDIF # "$(ENABLE_KDE)" != "" + ++# enable building/linking TDE-dependent code in both OOo and SO build environment ++.IF "$(ENABLE_TDE)" != "" ++.IF "$(TDE_ROOT)"!="" ++TDE_CFLAGS:=-I$(TDE_ROOT)/include -I/usr/include/tqt -DQT_CLEAN_NAMESPACE ++TDE_LIBS:=-lkdeui -lkdecore -ltqt -lqt-mt ++SOLARLIB+=-L$(TDE_ROOT)/lib ++.ENDIF # "$(TDE_ROOT)"!="" ++.ENDIF # "$(ENABLE_TDE)" != "" ++ + OOO_LIBRARY_PATH_VAR *= LD_LIBRARY_PATH +diff -urN svx/util/makefile.pmk svx/util/makefile.pmk +--- svx/util/makefile.pmk 2010-11-11 09:30:08.000000000 -0600 ++++ svx/util/makefile.pmk 2011-08-18 19:40:05.809571436 -0500 +@@ -40,4 +40,8 @@ + CFLAGS+=-DENABLE_KDE4 + .ENDIF + ++.IF "$(ENABLE_TDE)" != "" ++CFLAGS+=-DENABLE_TDE ++.ENDIF ++ + VISIBILITY_HIDDEN=TRUE +diff -urN cui/source/options/optgdlg.cxx cui/source/options/optgdlg.cxx +--- cui/source/options/optgdlg.cxx 2011-01-05 12:03:17.000000000 -0600 ++++ cui/source/options/optgdlg.cxx 2011-08-18 19:41:16.134938506 -0500 +@@ -157,6 +157,14 @@ + return rtl::OUString(); + #endif + } ++ else if ( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "tde" ) ) ++ { ++ #ifdef ENABLE_TDE ++ return ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.TDEFilePicker" ); ++ #else ++ return rtl::OUString(); ++ #endif ++ } + #if defined WNT + return ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.SystemFilePicker" ); + #elif (defined MACOSX && defined QUARTZ) +diff -urN cui/util/makefile.pmk cui/util/makefile.pmk +--- cui/util/makefile.pmk 2010-11-11 09:12:41.000000000 -0600 ++++ cui/util/makefile.pmk 2011-08-18 19:40:36.291897881 -0500 +@@ -37,4 +37,8 @@ + CFLAGS+=-DENABLE_KDE4 + .ENDIF + ++.IF "$(ENABLE_TDE)" != "" ++CFLAGS+=-DENABLE_TDE ++.ENDIF ++ + VISIBILITY_HIDDEN=TRUE +diff -urN desktop/source/pagein/makefile.mk desktop/source/pagein/makefile.mk +--- desktop/source/pagein/makefile.mk 2010-11-11 09:30:07.000000000 -0600 ++++ desktop/source/pagein/makefile.mk 2011-08-18 19:41:55.037907135 -0500 +@@ -129,6 +129,9 @@ + .IF "$(ENABLE_KDE)" != "" + @-echo $(DLLPRE)vclplug_kde$(DFTDLLPOST) >> $@ + .ENDIF # ENABLE_KDE ++.IF "$(ENABLE_TDE)" != "" ++ @-echo $(DLLPRE)vclplug_tde$(DFTDLLPOST) >> $@ ++.ENDIF # ENABLE_TDE + # + @-echo $(DLLPRE)basegfx$(DFTDLLPOST) >> $@ + @-echo $(DLLPRE)sot$(DFTDLLPOST) >> $@ +diff -urN toolkit/source/layout/core/dialogbuttonhbox.cxx toolkit/source/layout/core/dialogbuttonhbox.cxx +--- toolkit/source/layout/core/dialogbuttonhbox.cxx 2010-11-11 09:22:48.000000000 -0600 ++++ toolkit/source/layout/core/dialogbuttonhbox.cxx 2011-08-18 19:46:04.396929494 -0500 +@@ -57,6 +57,8 @@ + DialogButtonHBox::WINDOWS; + #elif defined( ENABLE_KDE ) + DialogButtonHBox::KDE; ++#elif defined( ENABLE_TDE ) ++DialogButtonHBox::TDE; + #else /* !MACOSX && !SAL_W32 && !ENABLE_KDE */ + DialogButtonHBox::GNOME; + #endif /* !MACOSX && !SAL_W32 && !ENABLE_KDE */ +@@ -84,6 +86,8 @@ + mnOrdering = GNOME; + else if ( ordering.equalsIgnoreAsciiCaseAscii( "KDE" ) ) + mnOrdering = KDE; ++ else if ( ordering.equalsIgnoreAsciiCaseAscii( "TDE" ) ) ++ mnOrdering = TDE; + else if ( ordering.equalsIgnoreAsciiCaseAscii( "MacOS" ) ) + mnOrdering = MACOS; + else if ( ordering.equalsIgnoreAsciiCaseAscii( "Windows" ) ) +@@ -144,6 +148,8 @@ + macosOrdering(); + else if ( mnOrdering == KDE ) + kdeOrdering(); ++ else if ( mnOrdering == TDE ) ++ tdeOrdering(); + else if ( 1 || mnOrdering == GNOME ) + gnomeOrdering(); + } +@@ -218,6 +224,30 @@ + { + std::list< Box_Base::ChildData * > ordered; + if ( mpHelp ) ++ ordered.push_back( mpHelp ); ++ if ( mpReset ) ++ ordered.push_back( mpReset ); ++ if ( mpFlow && ( mpHelp || mpReset ) ) ++ ordered.push_back( mpFlow ); ++ ordered.insert( ordered.end(), maOther.begin(), maOther.end() ); ++ if ( mpAction ) ++ ordered.push_back( mpAction ); ++ if ( mpAffirmative ) ++ ordered.push_back( mpAffirmative ); ++ if ( mpApply ) ++ ordered.push_back( mpApply ); ++ if ( mpAlternate ) ++ ordered.push_back( mpAlternate ); ++ if ( mpCancel ) ++ ordered.push_back( mpCancel ); ++ maChildren = ordered; ++} ++ ++void ++DialogButtonHBox::tdeOrdering() ++{ ++ std::list< Box_Base::ChildData * > ordered; ++ if ( mpHelp ) + ordered.push_back( mpHelp ); + if ( mpReset ) + ordered.push_back( mpReset ); +diff -urN toolkit/source/layout/core/dialogbuttonhbox.hxx toolkit/source/layout/core/dialogbuttonhbox.hxx +--- toolkit/source/layout/core/dialogbuttonhbox.hxx 2010-11-11 09:22:48.000000000 -0600 ++++ toolkit/source/layout/core/dialogbuttonhbox.hxx 2011-08-18 19:46:17.897959152 -0500 +@@ -45,11 +45,12 @@ + void SAL_CALL removeChild( css::uno::Reference< css::awt::XLayoutConstrains > const& xChild ) throw ( css::uno::RuntimeException ); + + private: +- enum Ordering { PLATFORM, GNOME, KDE, MACOS, WINDOWS }; ++ enum Ordering { PLATFORM, GNOME, KDE, TDE, MACOS, WINDOWS }; + + void orderChildren(); + void gnomeOrdering(); + void kdeOrdering(); ++ void tdeOrdering(); + void macosOrdering(); + void windowsOrdering(); + +diff -urN vcl/util/makefile.mk vcl/util/makefile.mk +--- vcl/util/makefile.mk 2011-03-08 12:51:41.000000000 -0600 ++++ vcl/util/makefile.mk 2011-08-18 19:55:25.649710040 -0500 +@@ -420,6 +420,35 @@ + + .ENDIF # "$(ENABLE_KDE)" != "" + ++# TDE plugin ++.IF "$(ENABLE_TDE)" != "" ++.IF "$(TDE_ROOT)"!="" ++EXTRALIBPATHS+=-L$(TDE_ROOT)$/lib ++.ENDIF ++LIB5TARGET=$(SLB)$/itde_plug_ ++LIB5FILES=$(SLB)$/tdeplug.lib ++SHL5TARGET=vclplug_tde$(DLLPOSTFIX) ++SHL5IMPLIB=itde_plug_ ++SHL5LIBS=$(LIB5TARGET) ++SHL5DEPN=$(SHL2TARGETN) ++# libs for TDE plugin ++SHL5STDLIBS+=-l$(SHL2TARGET) ++SHL5STDLIBS+=\ ++ $(VCLLIB) \ ++ $(TOOLSLIB) \ ++ $(SALLIB) \ ++ $(X11LINK_DYNAMIC) ++ ++.IF "$(ENABLE_RANDR)" != "" ++.IF "$(XRANDR_DLOPEN)" == "FALSE" ++SHL5STDLIBS+= $(XRANDR_LIBS) ++.ENDIF ++.ENDIF ++ ++SHL5LINKFLAGS+=$(TDE_LIBS) ++ ++.ENDIF # "$(ENABLE_TDE)" != "" ++ + # KDE4 plugin + .IF "$(ENABLE_KDE4)" != "" + .IF "$(KDE4_ROOT)"!="" +diff -urN vcl/unx/tde/makefile.mk vcl/unx/tde/makefile.mk +--- vcl/unx/tde/makefile.mk 1969-12-31 18:00:00.000000000 -0600 ++++ vcl/unx/tde/makefile.mk 2011-08-18 20:13:01.750097435 -0500 +@@ -0,0 +1,82 @@ ++#************************************************************************* ++# ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# Copyright 2000, 2010 Oracle and/or its affiliates. ++# Copyright 2011 Timothy Pearson ++# ++# 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 ++# ++# for a copy of the LGPLv3 License. ++# ++#************************************************************************* ++ ++PRJ=..$/.. ++ ++PRJNAME=vcl ++TARGET=tdeplug ++.INCLUDE : $(PRJ)$/util$/makefile.pmk ++ ++# workaround for makedepend hang ++MTDEPENDSOLVER= ++ ++# --- Settings ----------------------------------------------------- ++ ++.INCLUDE : settings.mk ++.INCLUDE : $(PRJ)$/util$/makefile2.pmk ++ ++# For some of the included external TDE headers, GCC complains about shadowed ++# symbols in instantiated template code only at the end of a compilation unit, ++# so the only solution is to disable that warning here: ++.IF "$(COM)" == "GCC" ++CFLAGSCXX+=-Wno-shadow ++.ENDIF ++ ++# --- Files -------------------------------------------------------- ++ ++.IF "$(GUIBASE)"!="unx" ++ ++dummy: ++ @echo "Nothing to build for GUIBASE $(GUIBASE)" ++ ++.ELSE # "$(GUIBASE)"!="unx" ++ ++.IF "$(ENABLE_TDE)" != "" ++ ++CFLAGS+=$(TDE_CFLAGS) ++ ++.IF "$(ENABLE_RANDR)" != "" ++CDEFS+=-DUSE_RANDR ++.ENDIF ++ ++SLOFILES=\ ++ $(SLO)$/tdedata.obj \ ++ $(SLO)$/salnativewidgets-tde.obj ++ ++.ELSE # "$(ENABLE_TDE)" != "" ++ ++dummy: ++ @echo TDE disabled - nothing to build ++.ENDIF ++.ENDIF # "$(GUIBASE)"!="unx" ++ ++# --- Targets ------------------------------------------------------ ++ ++.INCLUDE : target.mk ++ ++.INCLUDE : $(PRJ)$/util$/target.pmk +diff -urN vcl/unx/tde/salnativewidgets-tde.cxx vcl/unx/tde/salnativewidgets-tde.cxx +--- vcl/unx/tde/salnativewidgets-tde.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ vcl/unx/tde/salnativewidgets-tde.cxx 2011-08-18 20:13:46.133472981 -0500 +@@ -0,0 +1,2119 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_vcl.hxx" ++ ++#define _SV_SALNATIVEWIDGETS_TDE_CXX ++#include ++ ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++using namespace ::rtl; ++ ++/** Cached native widgets. ++ ++ A class which caches and paints the native widgets. ++*/ ++class WidgetPainter ++{ ++ protected: ++ /** Cached push button. ++ ++ It is necessary for the QStyle::drawControl(). The buttons are created ++ on demand and they are still hidden (no QWidget::show() is called). ++ */ ++ QPushButton *m_pPushButton; ++ ++ /** Cached radio button. ++ ++ @see m_pPushButton ++ */ ++ QRadioButton *m_pRadioButton; ++ ++ /** Cached check box. ++ ++ @see m_pPushButton ++ */ ++ QCheckBox *m_pCheckBox; ++ ++ /** Cached combo box. ++ ++ @see m_pPushButton ++ */ ++ QComboBox *m_pComboBox; ++ ++ /** Cached editable combo box. ++ ++ Needed, because some styles do not like dynamic changes ++ (QComboBox::setEditable()). ++ ++ @see m_pPushButton ++ */ ++ QComboBox *m_pEditableComboBox; ++ ++ /** Cached line edit box. ++ ++ @see m_pPushButton ++ */ ++ QLineEdit *m_pLineEdit; ++ ++ /** Cached spin box. ++ ++ @see m_pPushButton ++ */ ++ QSpinWidget *m_pSpinWidget; ++ ++ /** Cached spin box'es line edit. ++ ++ @see m_pPushButton ++ */ ++ QLineEdit *m_pSpinEdit; ++ ++ /** Cached tab. ++ ++ Left, middle, right tab and a tab which is alone. ++ ++ @see m_pPushButton ++ */ ++ QTab *m_pTabLeft, *m_pTabMiddle, *m_pTabRight, *m_pTabAlone; ++ ++ /** Cached tab bar's parent widget. ++ ++ Needed, because the Qt windows style checks for the availability ++ of tab bar's parent. We cannot use m_pTabWidget, because ++ TabWidget::setTabBar() and TabWidget::tabBar() methods are ++ protected. ++ ++ @see m_pPushButton, m_pTabWidget ++ */ ++ QWidget *m_pTabBarParent; ++ ++ /** Cached tab bar widget. ++ ++ @see m_pPushButton ++ */ ++ QTabBar *m_pTabBar; ++ ++ /** Cached tab widget. ++ ++ We need it to draw the tab page. It cannot be used to draw the ++ tabs themselves, because the drawing has to be tweaked a little ++ due to not enough information from VCL. ++ ++ @see m_pPushButton, m_pTabBarParent ++ */ ++ QTabWidget *m_pTabWidget; ++ ++ /** Cached list view. ++ ++ @see m_pPushButton ++ */ ++ QListView *m_pListView; ++ ++ /** Cached scroll bar. ++ ++ @see m_pPushButton ++ */ ++ QScrollBar *m_pScrollBar; ++ ++ /** Cached dock area. Needed for proper functionality of tool bars. ++ ++ @see m_pPushButton ++ */ ++ QMainWindow *m_pMainWindow; ++ ++ /** Cached tool bar. ++ ++ @see m_pPushButton ++ */ ++ QToolBar *m_pToolBarHoriz, *m_pToolBarVert; ++ ++ /** Cached tool button. ++ ++ @see m_pPushButton ++ */ ++ QToolButton *m_pToolButton; ++ ++ /** Cached menu bar. ++ ++ @see m_pPushButton ++ */ ++ QMenuBar *m_pMenuBar; ++ ++ /** Identifiers of menu bar items. ++ */ ++ int m_nMenuBarEnabledItem, m_nMenuBarDisabledItem; ++ ++ /** Cached popup menu. ++ ++ @see m_pPushButton ++ */ ++ QPopupMenu *m_pPopupMenu; ++ ++ /** Identifiers of popup menu items. ++ */ ++ int m_nPopupMenuEnabledItem, m_nPopupMenuDisabledItem; ++ ++ /** cached progress bar ++ */ ++ QProgressBar *m_pProgressBar; ++ ++ // TODO other widgets ++ ++ public: ++ /** Implicit constructor. ++ ++ It creates an empty WidgetPainter with all the cached widgets initialized ++ to NULL. The widgets are created on demand and they are still hidden ++ (no QWidget::show()), because they are needed just as a parameter for ++ QStyle::drawControl(). ++ ++ @see m_pPushButton ++ */ ++ WidgetPainter( void ); ++ ++ /** Destructor. ++ ++ Destruct all the cached widgets. ++ */ ++ virtual ~WidgetPainter( void ); ++ ++ /** Paints the specified widget to the X window. ++ ++ Use X calls to bitblt (bit block transfer) the widget qWidget to ++ the window specified by drawable with the style defined by nStyle. ++ ++ @param qWidget ++ A pointer to the cached widget. ++ ++ @param nState ++ The state of the control (focused, on/off, ...) ++ ++ @param aValue ++ The value (true/false, ...) ++ ++ @param dpy ++ The display to be used by the X calls. ++ ++ @param drawable ++ The destination X window. ++ ++ @param gc ++ The graphics context. ++ */ ++ BOOL drawStyledWidget( QWidget *pWidget, ++ ControlState nState, const ImplControlValue& aValue, ++ Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc, ++ ControlPart nPart = PART_ENTIRE_CONTROL ); ++ ++ /** 'Get' method for push button. ++ ++ The method returns the cached push button. It is constructed if it ++ does not exist. It has NULL as a parent and it stays hidden, but it ++ is necessary for the drawStyledWidget() method. ++ ++ @return valid push button. ++ */ ++ QPushButton *pushButton( const Rectangle& rControlRegion, BOOL bDefault ); ++ ++ /** 'Get' method for radio button. ++ ++ @see pushButton() ++ */ ++ QRadioButton *radioButton( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for check box. ++ ++ @see pushButton() ++ */ ++ QCheckBox *checkBox( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for combo box. ++ ++ It returns m_pComboBox or m_pEditableComboBox according to ++ bEditable. ++ ++ @see pushButton(), m_pEditableComboBox ++ */ ++ QComboBox *comboBox( const Rectangle& rControlRegion, BOOL bEditable ); ++ ++ /** 'Get' method for line edit box. ++ ++ @see pushButton() ++ */ ++ QLineEdit *lineEdit( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for spin box. ++ ++ @see pushButton() ++ */ ++ QSpinWidget *spinWidget( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for tab bar. ++ ++ @see pushButton() ++ */ ++ QTabBar *tabBar( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for tab widget. ++ ++ @see pushButton() ++ */ ++ QTabWidget *tabWidget( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for list view. ++ ++ @see pushButton() ++ */ ++ QListView *listView( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for scroll bar. ++ ++ @see pushButton() ++ */ ++ QScrollBar *scrollBar( const Rectangle& rControlRegion, ++ BOOL bHorizontal, const ImplControlValue& aValue ); ++ ++ /** 'Get' method for tool bar. ++ ++ @see pushButton() ++ */ ++ QToolBar *toolBar( const Rectangle& rControlRegion, BOOL bHorizontal ); ++ ++ /** 'Get' method for tool button. ++ ++ @see pushButton() ++ */ ++ QToolButton *toolButton( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for menu bar. ++ ++ @see pushButton() ++ */ ++ QMenuBar *menuBar( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for popup menu. ++ ++ @see pushButton() ++ */ ++ QPopupMenu *popupMenu( const Rectangle& rControlRegion ); ++ ++ /** 'Get' method for progress bar ++ ++ @see pushButton() ++ */ ++ QProgressBar *progressBar( const Rectangle& rControlRegion ); ++ ++ // TODO other widgets ++ ++ protected: ++ /** Style conversion function. ++ ++ Conversion function between VCL ControlState together with ++ ImplControlValue and Qt state flags. ++ ++ @param nState ++ State of the widget (default, focused, ...) as defined in Native ++ Widget Framework. ++ ++ @param aValue ++ Value held by the widget (on, off, ...) ++ */ ++ QStyle::SFlags vclStateValue2SFlags( ControlState nState, const ImplControlValue& aValue ); ++ ++ public: ++ /** Convert VCL Rectangle to QRect. ++ ++ @param rControlRegion ++ The region to convert. ++ ++ @return ++ The bounding box of the region. ++ */ ++ static QRect region2QRect( const Rectangle& rControlRegion ); ++}; ++ ++WidgetPainter::WidgetPainter( void ) ++ : m_pPushButton( NULL ), ++ m_pRadioButton( NULL ), ++ m_pCheckBox( NULL ), ++ m_pComboBox( NULL ), ++ m_pEditableComboBox( NULL ), ++ m_pLineEdit( NULL ), ++ m_pSpinWidget( NULL ), ++ m_pSpinEdit( NULL ), ++ m_pTabLeft( NULL ), ++ m_pTabMiddle( NULL ), ++ m_pTabRight( NULL ), ++ m_pTabAlone( NULL ), ++ m_pTabBarParent( NULL ), ++ m_pTabBar( NULL ), ++ m_pTabWidget( NULL ), ++ m_pListView( NULL ), ++ m_pScrollBar( NULL ), ++ m_pMainWindow( NULL ), ++ m_pToolBarHoriz( NULL ), ++ m_pToolBarVert( NULL ), ++ m_pToolButton( NULL ), ++ m_pMenuBar( NULL ), ++ m_pPopupMenu( NULL ), ++ m_pProgressBar( NULL ) ++{ ++} ++ ++WidgetPainter::~WidgetPainter( void ) ++{ ++ delete m_pPushButton, m_pPushButton = NULL; ++ delete m_pRadioButton, m_pRadioButton = NULL; ++ delete m_pCheckBox, m_pCheckBox = NULL; ++ delete m_pComboBox, m_pComboBox = NULL; ++ delete m_pEditableComboBox, m_pEditableComboBox = NULL; ++ delete m_pLineEdit, m_pLineEdit = NULL; ++ delete m_pSpinWidget, m_pSpinWidget = NULL; ++ m_pSpinEdit = NULL; // Deleted in m_pSpinWidget's destructor ++ delete m_pTabAlone, m_pTabAlone = NULL; ++ delete m_pTabBarParent, m_pTabBarParent = NULL; ++ m_pTabBar = NULL; // Deleted in m_pTabBarParent's destructor ++ m_pTabLeft = NULL; ++ m_pTabMiddle = NULL; ++ m_pTabRight = NULL; ++ delete m_pTabWidget, m_pTabWidget = NULL; ++ delete m_pListView, m_pListView = NULL; ++ delete m_pScrollBar, m_pScrollBar = NULL; ++ delete m_pToolBarHoriz, m_pToolBarHoriz = NULL; ++ delete m_pToolBarVert, m_pToolBarVert = NULL; ++ delete m_pMainWindow, m_pMainWindow = NULL; ++ delete m_pToolButton, m_pToolButton = NULL; ++ delete m_pMenuBar, m_pMenuBar = NULL; ++ delete m_pPopupMenu, m_pPopupMenu = NULL; ++ delete m_pProgressBar, m_pProgressBar = NULL; ++} ++ ++BOOL WidgetPainter::drawStyledWidget( QWidget *pWidget, ++ ControlState nState, const ImplControlValue& aValue, ++ Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc, ++ ControlPart nPart ) ++{ ++ if ( !pWidget ) ++ return FALSE; ++ ++ // Normalize the widget ++ QPoint qWidgetPos( pWidget->pos() ); ++ pWidget->move( 0, 0 ); ++ ++ // Enable/disable the widget ++ pWidget->setEnabled( nState & CTRL_STATE_ENABLED ); ++ ++ // Create pixmap to paint to ++ QPixmap qPixmap( pWidget->width(), pWidget->height() ); ++ QPainter qPainter( &qPixmap ); ++ QRect qRect( 0, 0, pWidget->width(), pWidget->height() ); ++ ++ // Use the background of the widget ++ qPixmap.fill( pWidget, QPoint(0, 0) ); ++ ++ // Convert the flags ++ QStyle::SFlags nStyle = vclStateValue2SFlags( nState, aValue ); ++ ++ // Store the widget class ++ const char *pClassName = pWidget->className(); ++ ++ // Draw the widget to the pixmap ++ if ( strcmp( "QPushButton", pClassName ) == 0 ) ++ { ++ // Workaround for the Platinum style. ++ // Platinum takes the state directly from the widget, not from SFlags. ++ QPushButton *pPushButton = static_cast( pWidget->qt_cast( "QPushButton" ) ); ++ if ( pPushButton ) ++ { ++ pPushButton->setDown ( nStyle & QStyle::Style_Down ); ++ pPushButton->setOn ( nStyle & QStyle::Style_On ); ++ pPushButton->setEnabled( nStyle & QStyle::Style_Enabled ); ++ } ++ ++ kapp->style().drawControl( QStyle::CE_PushButton, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle ); ++ } ++ else if ( strcmp( "QRadioButton", pClassName ) == 0 ) ++ { ++ // Bitblt from the screen, because the radio buttons are usually not ++ // rectangular, and there could be a bitmap under them ++ GC aTmpGC = XCreateGC( dpy, qPixmap.handle(), 0, NULL ); ++ X11SalGraphics::CopyScreenArea( dpy, ++ drawable, nScreen, nDepth, ++ qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(), ++ aTmpGC, ++ qWidgetPos.x(), qWidgetPos.y(), qRect.width(), qRect.height(), ++ 0, 0 ); ++ XFreeGC( dpy, aTmpGC ); ++ ++ kapp->style().drawControl( QStyle::CE_RadioButton, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle ); ++ } ++ else if ( strcmp( "QCheckBox", pClassName ) == 0 ) ++ { ++ kapp->style().drawControl( QStyle::CE_CheckBox, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle ); ++ } ++ else if ( strcmp( "QComboBox", pClassName ) == 0 ) ++ { ++ kapp->style().drawComplexControl( QStyle::CC_ComboBox, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle ); ++ ++ // Editable combo box uses the background of the associated edit box ++ QComboBox *pComboBox = static_cast( pWidget->qt_cast( "QComboBox" ) ); ++ if ( pComboBox && pComboBox->editable() && pComboBox->lineEdit() ) ++ { ++ QColorGroup::ColorRole eColorRole = ( pComboBox->isEnabled() )? ++ QColorGroup::Base: QColorGroup::Background; ++ qPainter.fillRect( ++ kapp->style().querySubControlMetrics( QStyle::CC_ComboBox, ++ pComboBox, QStyle::SC_ComboBoxEditField ), ++ pComboBox->lineEdit()->colorGroup().brush( eColorRole ) ); ++ } ++ } ++ else if ( strcmp( "QLineEdit", pClassName ) == 0 ) ++ { ++ kapp->style().drawPrimitive( QStyle::PE_PanelLineEdit, ++ &qPainter, qRect, ++ pWidget->colorGroup(), nStyle | QStyle::Style_Sunken ); ++ } ++ else if ( strcmp( "QSpinWidget", pClassName ) == 0 ) ++ { ++ const SpinbuttonValue *pValue = static_cast ( &aValue ); ++ ++ // Is any of the buttons pressed? ++ QStyle::SCFlags eActive = QStyle::SC_None; ++ if ( pValue ) ++ { ++ if ( pValue->mnUpperState & CTRL_STATE_PRESSED ) ++ eActive = QStyle::SC_SpinWidgetUp; ++ else if ( pValue->mnLowerState & CTRL_STATE_PRESSED ) ++ eActive = QStyle::SC_SpinWidgetDown; ++ ++ // Update the enable/disable state of the widget ++ if ( ( nState & CTRL_STATE_ENABLED ) || ++ ( pValue->mnUpperState & CTRL_STATE_ENABLED ) || ++ ( pValue->mnLowerState & CTRL_STATE_ENABLED ) ) ++ { ++ pWidget->setEnabled( true ); ++ nStyle |= QStyle::Style_Enabled; ++ } ++ else ++ pWidget->setEnabled( false ); ++ ++ // Mouse-over effect ++ if ( (pValue->mnUpperState & CTRL_STATE_ROLLOVER) || ++ (pValue->mnLowerState & CTRL_STATE_ROLLOVER) ) ++ nStyle |= QStyle::Style_MouseOver; ++ } ++ ++ // Spin widget uses the background of the associated edit box ++ QSpinWidget *pSpinWidget = static_cast( pWidget->qt_cast( "QSpinWidget" ) ); ++ if ( pSpinWidget && pSpinWidget->editWidget() ) ++ { ++ QColorGroup::ColorRole eColorRole = ( pSpinWidget->isEnabled() )? ++ QColorGroup::Base: QColorGroup::Background; ++ qPainter.fillRect( ++ kapp->style().querySubControlMetrics( QStyle::CC_SpinWidget, ++ pSpinWidget, QStyle::SC_SpinWidgetEditField ), ++ pSpinWidget->editWidget()->colorGroup().brush( eColorRole ) ); ++ } ++ ++ // Adjust the frame (needed for Motif Plus style) ++ QRect qFrameRect = kapp->style().querySubControlMetrics( QStyle::CC_SpinWidget, ++ pWidget, QStyle::SC_SpinWidgetFrame ); ++ ++ kapp->style().drawComplexControl( QStyle::CC_SpinWidget, ++ &qPainter, pWidget, qFrameRect, ++ pWidget->colorGroup(), nStyle, ++ QStyle::SC_All, eActive ); ++ } ++ else if ( strcmp( "QTabBar", pClassName ) == 0 ) ++ { ++ const TabitemValue *pValue = static_cast ( &aValue ); ++ ++ QTab *pTab = NULL; ++ if ( pValue ) ++ { ++ if ( ( pValue->isFirst() || pValue->isLeftAligned() ) && ( pValue->isLast() || pValue->isRightAligned() ) ) ++ pTab = m_pTabAlone; ++ else if ( pValue->isFirst() || pValue->isLeftAligned() ) ++ pTab = m_pTabLeft; ++ else if ( pValue->isLast() || pValue->isRightAligned() ) ++ pTab = m_pTabRight; ++ else ++ pTab = m_pTabMiddle; ++ } ++ if ( !pTab ) ++ return FALSE; ++ ++ pTab->setRect( qRect ); ++ ++ kapp->style().drawControl( QStyle::CE_TabBarTab, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle, ++ QStyleOption( pTab ) ); ++ } ++ else if ( strcmp( "QTabWidget", pClassName ) == 0 ) ++ { ++ kapp->style().drawPrimitive( QStyle::PE_PanelTabWidget, ++ &qPainter, qRect, ++ pWidget->colorGroup(), nStyle ); ++ } ++ else if ( strcmp( "QListView", pClassName ) == 0 ) ++ { ++ kapp->style().drawPrimitive( QStyle::PE_Panel, ++ &qPainter, qRect, ++ pWidget->colorGroup(), nStyle | QStyle::Style_Sunken ); ++ } ++ else if ( strcmp( "QScrollBar", pClassName ) == 0 ) ++ { ++ const ScrollbarValue *pValue = static_cast ( &aValue ); ++ ++ QStyle::SCFlags eActive = QStyle::SC_None; ++ if ( pValue ) ++ { ++ // Workaround for Style_MouseOver-aware themes. ++ // Quite ugly, but I do not know about a better solution. ++ const char *pStyleName = kapp->style().className(); ++ if ( strcmp( "QMotifPlusStyle", pStyleName ) == 0 ) ++ { ++ nStyle |= QStyle::Style_MouseOver; ++ if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER ) ++ eActive = QStyle::SC_ScrollBarSlider; ++ } ++ else if ( strcmp( "QSGIStyle", pStyleName ) == 0 ) ++ { ++ nStyle |= QStyle::Style_MouseOver; ++ if ( pValue->mnButton1State & CTRL_STATE_ROLLOVER ) ++ eActive = QStyle::SC_ScrollBarSubLine; ++ else if ( pValue->mnButton2State & CTRL_STATE_ROLLOVER ) ++ eActive = QStyle::SC_ScrollBarAddLine; ++ else if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER ) ++ eActive = QStyle::SC_ScrollBarSlider; ++ } ++ ++ if ( pValue->mnButton1State & CTRL_STATE_PRESSED ) ++ eActive = QStyle::SC_ScrollBarSubLine; ++ else if ( pValue->mnButton2State & CTRL_STATE_PRESSED ) ++ eActive = QStyle::SC_ScrollBarAddLine; ++ else if ( pValue->mnThumbState & CTRL_STATE_PRESSED ) ++ eActive = QStyle::SC_ScrollBarSlider; ++ else if ( pValue->mnPage1State & CTRL_STATE_PRESSED ) ++ eActive = QStyle::SC_ScrollBarSubPage; ++ else if ( pValue->mnPage2State & CTRL_STATE_PRESSED ) ++ eActive = QStyle::SC_ScrollBarAddPage; ++ ++ // Update the enable/disable state of the widget ++ if ( ( nState & CTRL_STATE_ENABLED ) || ++ ( pValue->mnButton1State & CTRL_STATE_ENABLED ) || ++ ( pValue->mnButton2State & CTRL_STATE_ENABLED ) || ++ ( pValue->mnThumbState & CTRL_STATE_ENABLED ) || ++ ( pValue->mnPage1State & CTRL_STATE_ENABLED ) || ++ ( pValue->mnPage2State & CTRL_STATE_ENABLED ) ) ++ { ++ pWidget->setEnabled( true ); ++ nStyle |= QStyle::Style_Enabled; ++ } ++ else ++ pWidget->setEnabled( false ); ++ } ++ ++ // Is it a horizontal scroll bar? ++ QScrollBar *pScrollBar = static_cast ( pWidget->qt_cast( "QScrollBar" ) ); ++ QStyle::StyleFlags eHoriz = QStyle::Style_Default; ++ if ( pScrollBar && pScrollBar->orientation() == Qt::Horizontal ) ++ eHoriz = QStyle::Style_Horizontal; ++ ++ kapp->style().drawComplexControl( QStyle::CC_ScrollBar, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle | eHoriz, ++ QStyle::SC_All, eActive ); ++ } ++ else if ( strcmp( "QToolBar", pClassName ) == 0 ) ++ { ++ QToolBar *pToolBar = static_cast< QToolBar * >( pWidget->qt_cast( "QToolBar" ) ); ++ bool bIsHorizontal = false; ++ if ( pToolBar && pToolBar->orientation() == Qt::Horizontal ) ++ { ++ nStyle |= QStyle::Style_Horizontal; ++ bIsHorizontal = true; ++ } ++ ++ kapp->style().drawControl( QStyle::CE_DockWindowEmptyArea, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle ); ++ ++ kapp->style().drawPrimitive( QStyle::PE_PanelDockWindow, ++ &qPainter, qRect, pWidget->colorGroup(), nStyle ); ++ ++ if ( nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT ) ++ { ++ const ToolbarValue *pValue = static_cast< const ToolbarValue * >( &aValue ); ++ ++ QRect qThumbRect = region2QRect( pValue->maGripRect ); ++ qThumbRect.moveBy( -qWidgetPos.x(), -qWidgetPos.y() ); ++ if ( bIsHorizontal ) ++ qThumbRect.addCoords( 0, 2, 0, -3 ); // make the thumb a bit nicer ++ else ++ qThumbRect.addCoords( 2, 0, -3, 0 ); // make the thumb a bit nicer ++ ++ if ( kapp->style().inherits( "HighColorStyle" ) || ++ kapp->style().inherits( "HighContrastStyle" ) || ++ kapp->style().inherits( "KeramikStyle" ) || ++ kapp->style().inherits( "KThemeStyle" ) || ++ kapp->style().inherits( "ThinKeramikStyle" ) ) ++ { ++ // Workaround for the workaround in KStyle::drawPrimitive() ++ KStyle *pStyle = static_cast< KStyle * >( &kapp->style() ); ++ pStyle->drawKStylePrimitive( KStyle::KPE_ToolBarHandle, ++ &qPainter, pToolBar, qThumbRect, ++ pWidget->colorGroup(), nStyle ); ++ } ++ else ++ kapp->style().drawPrimitive( QStyle::PE_DockWindowHandle, ++ &qPainter, qThumbRect, pWidget->colorGroup(), nStyle ); ++ } ++ } ++ else if ( strcmp( "QToolButton", pClassName ) == 0 ) ++ { ++ if( (nStyle & QStyle::Style_MouseOver) ) ++ nStyle &= ~QStyle::Style_Off; ++ kapp->style().drawComplexControl( QStyle::CC_ToolButton, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle, ++ QStyle::SC_ToolButton ); ++ } ++ else if ( strcmp( "QMenuBar", pClassName ) == 0 ) ++ { ++ if ( nPart == PART_ENTIRE_CONTROL ) ++ { ++ kapp->style().drawControl( QStyle::CE_MenuBarEmptyArea, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle ); ++ } ++ else if ( nPart == PART_MENU_ITEM ) ++ { ++ int nMenuItem = ( nStyle & QStyle::Style_Enabled )? m_nMenuBarEnabledItem: m_nMenuBarDisabledItem; ++ QMenuItem *pMenuItem = static_cast( pWidget )->findItem( nMenuItem ); ++ ++ if ( nStyle & QStyle::Style_Selected ) ++ nStyle |= QStyle::Style_Active | QStyle::Style_Down | QStyle::Style_HasFocus; ++ ++ kapp->style().drawControl( QStyle::CE_MenuBarItem, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle, ++ QStyleOption( pMenuItem ) ); ++ } ++ } ++ else if ( strcmp( "QPopupMenu", pClassName ) == 0 ) ++ { ++ int nMenuItem = ( nStyle & QStyle::Style_Enabled )? m_nPopupMenuEnabledItem: m_nPopupMenuDisabledItem; ++ QMenuItem *pMenuItem = static_cast( pWidget )->findItem( nMenuItem ); ++ ++ if ( nStyle & QStyle::Style_Selected ) ++ nStyle |= QStyle::Style_Active; ++ ++ kapp->style().drawControl( QStyle::CE_PopupMenuItem, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle, ++ QStyleOption( pMenuItem, 0, 0 ) ); ++ } ++ else if ( strcmp( "QProgressBar", pClassName ) == 0 ) ++ { ++ long nProgressWidth = aValue.getNumericVal(); ++ QProgressBar* pProgress = static_cast(pWidget); ++ pProgress->setProgress( nProgressWidth, qRect.width() ); ++ ++ kapp->style().drawControl( QStyle::CE_ProgressBarGroove, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle ); ++ kapp->style().drawControl( QStyle::CE_ProgressBarContents, ++ &qPainter, pWidget, qRect, ++ pWidget->colorGroup(), nStyle ); ++ } ++ else ++ return FALSE; ++ ++ // Bitblt it to the screen ++ X11SalGraphics::CopyScreenArea( dpy, ++ qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(), ++ drawable, nScreen, nDepth, ++ gc, ++ 0, 0, qRect.width(), qRect.height(), ++ qWidgetPos.x(), qWidgetPos.y() ); ++ ++ // Restore widget's position ++ pWidget->move( qWidgetPos ); ++ ++ return TRUE; ++} ++ ++QPushButton *WidgetPainter::pushButton( const Rectangle& rControlRegion, ++ BOOL bDefault ) ++{ ++ if ( !m_pPushButton ) ++ m_pPushButton = new QPushButton( NULL, "push_button" ); ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ // Workaround for broken styles which do not add ++ // QStyle::PM_ButtonDefaultIndicator to the size of the default button ++ // (for example Keramik) ++ // FIXME Fix Keramik style to be consistant with Qt built-in styles. Aargh! ++ if ( bDefault ) ++ { ++ QSize qContentsSize( 50, 50 ); ++ m_pPushButton->setDefault( false ); ++ QSize qNormalSize = kapp->style().sizeFromContents( QStyle::CT_PushButton, ++ m_pPushButton, qContentsSize ); ++ m_pPushButton->setDefault( true ); ++ QSize qDefSize = kapp->style().sizeFromContents( QStyle::CT_PushButton, ++ m_pPushButton, qContentsSize ); ++ ++ int nIndicatorSize = kapp->style().pixelMetric( ++ QStyle::PM_ButtonDefaultIndicator, m_pPushButton ); ++ if ( qNormalSize.width() == qDefSize.width() ) ++ qRect.addCoords( nIndicatorSize, 0, -nIndicatorSize, 0 ); ++ if ( qNormalSize.height() == qDefSize.height() ) ++ qRect.addCoords( 0, nIndicatorSize, 0, -nIndicatorSize ); ++ } ++ ++ m_pPushButton->move( qRect.topLeft() ); ++ m_pPushButton->resize( qRect.size() ); ++ m_pPushButton->setDefault( bDefault ); ++ ++ return m_pPushButton; ++} ++ ++QRadioButton *WidgetPainter::radioButton( const Rectangle& rControlRegion ) ++{ ++ if ( !m_pRadioButton ) ++ m_pRadioButton = new QRadioButton( NULL, "radio_button" ); ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ // Workaround for broken themes which do not honor the given size. ++ // Quite ugly, but I do not know about a better solution. ++ const char *pStyleName = kapp->style().className(); ++ if ( strcmp( "KThemeStyle", pStyleName ) == 0 ) ++ { ++ QRect qOldRect( qRect ); ++ ++ qRect.setWidth( kapp->style().pixelMetric( ++ QStyle::PM_ExclusiveIndicatorWidth, m_pRadioButton ) ); ++ qRect.setHeight( kapp->style().pixelMetric( ++ QStyle::PM_ExclusiveIndicatorHeight, m_pRadioButton ) ); ++ ++ qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2, ++ ( qOldRect.height() - qRect.height() ) / 2 ); ++ } ++ ++ m_pRadioButton->move( qRect.topLeft() ); ++ m_pRadioButton->resize( qRect.size() ); ++ ++ return m_pRadioButton; ++} ++ ++QCheckBox *WidgetPainter::checkBox( const Rectangle& rControlRegion ) ++{ ++ if ( !m_pCheckBox ) ++ m_pCheckBox = new QCheckBox( NULL, "check_box" ); ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ // Workaround for broken themes which do not honor the given size. ++ // Quite ugly, but I do not know about a better solution. ++ const char *pStyleName = kapp->style().className(); ++ if ( strcmp( "KThemeStyle", pStyleName ) == 0 ) ++ { ++ QRect qOldRect( qRect ); ++ ++ qRect.setWidth( kapp->style().pixelMetric( ++ QStyle::PM_IndicatorWidth, m_pCheckBox ) ); ++ qRect.setHeight( kapp->style().pixelMetric( ++ QStyle::PM_IndicatorHeight, m_pCheckBox ) ); ++ ++ qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2, ++ ( qOldRect.height() - qRect.height() ) / 2 ); ++ } ++ ++ m_pCheckBox->move( qRect.topLeft() ); ++ m_pCheckBox->resize( qRect.size() ); ++ ++ return m_pCheckBox; ++} ++ ++QComboBox *WidgetPainter::comboBox( const Rectangle& rControlRegion, ++ BOOL bEditable ) ++{ ++ QComboBox *pComboBox = NULL; ++ if ( bEditable ) ++ { ++ if ( !m_pEditableComboBox ) ++ m_pEditableComboBox = new QComboBox( true, NULL, "combo_box_edit" ); ++ pComboBox = m_pEditableComboBox; ++ } ++ else ++ { ++ if ( !m_pComboBox ) ++ m_pComboBox = new QComboBox( false, NULL, "combo_box" ); ++ pComboBox = m_pComboBox; ++ } ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ pComboBox->move( qRect.topLeft() ); ++ pComboBox->resize( qRect.size() ); ++ ++ return pComboBox; ++} ++ ++QLineEdit *WidgetPainter::lineEdit( const Rectangle& rControlRegion ) ++{ ++ if ( !m_pLineEdit ) ++ m_pLineEdit = new QLineEdit( NULL, "line_edit" ); ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ m_pLineEdit->move( qRect.topLeft() ); ++ m_pLineEdit->resize( qRect.size() ); ++ ++ return m_pLineEdit; ++} ++ ++QSpinWidget *WidgetPainter::spinWidget( const Rectangle& rControlRegion ) ++{ ++ if ( !m_pSpinWidget ) ++ { ++ m_pSpinWidget = new QSpinWidget( NULL, "spin_widget" ); ++ ++ m_pSpinEdit = new QLineEdit( NULL, "line_edit_spin" ); ++ m_pSpinWidget->setEditWidget( m_pSpinEdit ); ++ } ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ m_pSpinWidget->move( qRect.topLeft() ); ++ m_pSpinWidget->resize( qRect.size() ); ++ m_pSpinWidget->arrange(); ++ ++ return m_pSpinWidget; ++} ++ ++QTabBar *WidgetPainter::tabBar( const Rectangle& rControlRegion ) ++{ ++ if ( !m_pTabBar ) ++ { ++ if ( !m_pTabBarParent ) ++ m_pTabBarParent = new QWidget( NULL, "tab_bar_parent" ); ++ ++ m_pTabBar = new QTabBar( m_pTabBarParent, "tab_bar" ); ++ ++ m_pTabLeft = new QTab(); ++ m_pTabMiddle = new QTab(); ++ m_pTabRight = new QTab(); ++ m_pTabAlone = new QTab(); ++ ++ m_pTabBar->addTab( m_pTabLeft ); ++ m_pTabBar->addTab( m_pTabMiddle ); ++ m_pTabBar->addTab( m_pTabRight ); ++ } ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ m_pTabBar->move( qRect.topLeft() ); ++ m_pTabBar->resize( qRect.size() ); ++ ++ m_pTabBar->setShape( QTabBar::RoundedAbove ); ++ ++ return m_pTabBar; ++} ++ ++QTabWidget *WidgetPainter::tabWidget( const Rectangle& rControlRegion ) ++{ ++ if ( !m_pTabWidget ) ++ m_pTabWidget = new QTabWidget( NULL, "tab_widget" ); ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ --qRect.rTop(); ++ ++ m_pTabWidget->move( qRect.topLeft() ); ++ m_pTabWidget->resize( qRect.size() ); ++ ++ return m_pTabWidget; ++} ++ ++QListView *WidgetPainter::listView( const Rectangle& rControlRegion ) ++{ ++ if ( !m_pListView ) ++ m_pListView = new QListView( NULL, "list_view" ); ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ m_pListView->move( qRect.topLeft() ); ++ m_pListView->resize( qRect.size() ); ++ ++ return m_pListView; ++} ++ ++QScrollBar *WidgetPainter::scrollBar( const Rectangle& rControlRegion, ++ BOOL bHorizontal, const ImplControlValue& aValue ) ++{ ++ if ( !m_pScrollBar ) ++ { ++ m_pScrollBar = new QScrollBar( NULL, "scroll_bar" ); ++ m_pScrollBar->setTracking( false ); ++ m_pScrollBar->setLineStep( 1 ); ++ } ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ m_pScrollBar->move( qRect.topLeft() ); ++ m_pScrollBar->resize( qRect.size() ); ++ m_pScrollBar->setOrientation( bHorizontal? Qt::Horizontal: Qt::Vertical ); ++ ++ const ScrollbarValue *pValue = static_cast ( &aValue ); ++ if ( pValue ) ++ { ++ m_pScrollBar->setMinValue( pValue->mnMin ); ++ m_pScrollBar->setMaxValue( pValue->mnMax - pValue->mnVisibleSize ); ++ m_pScrollBar->setValue( pValue->mnCur ); ++ m_pScrollBar->setPageStep( pValue->mnVisibleSize ); ++ } ++ ++ return m_pScrollBar; ++} ++ ++QToolBar *WidgetPainter::toolBar( const Rectangle& rControlRegion, BOOL bHorizontal ) ++{ ++ if ( !m_pMainWindow ) ++ m_pMainWindow = new QMainWindow( NULL, "main_window" ); ++ ++ QToolBar *pToolBar; ++ if ( bHorizontal ) ++ { ++ if ( !m_pToolBarHoriz ) ++ { ++ m_pToolBarHoriz = new QToolBar( m_pMainWindow, "tool_bar_horiz" ); ++ m_pMainWindow->moveDockWindow( m_pToolBarHoriz, Qt::DockTop ); ++ } ++ pToolBar = m_pToolBarHoriz; ++ } ++ else ++ { ++ if ( !m_pToolBarVert ) ++ { ++ m_pToolBarVert = new QToolBar( m_pMainWindow, "tool_bar_horiz" ); ++ m_pMainWindow->moveDockWindow( m_pToolBarVert, Qt::DockLeft ); ++ } ++ pToolBar = m_pToolBarVert; ++ } ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ pToolBar->move( qRect.topLeft() ); ++ pToolBar->resize( qRect.size() ); ++ ++ return pToolBar; ++} ++ ++QToolButton *WidgetPainter::toolButton( const Rectangle& rControlRegion) ++{ ++ if ( !m_pToolButton ) ++ m_pToolButton = new QToolButton( NULL, "tool_button" ); ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ m_pToolButton->move( qRect.topLeft() ); ++ m_pToolButton->resize( qRect.size() ); ++ ++ return m_pToolButton; ++} ++ ++QMenuBar *WidgetPainter::menuBar( const Rectangle& rControlRegion) ++{ ++ if ( !m_pMenuBar ) ++ { ++ m_pMenuBar = new QMenuBar( NULL, "menu_bar" ); ++ ++ m_nMenuBarEnabledItem = m_pMenuBar->insertItem( "" ); ++ m_nMenuBarDisabledItem = m_pMenuBar->insertItem( "" ); ++ ++ m_pMenuBar->setItemEnabled( m_nMenuBarEnabledItem, true ); ++ m_pMenuBar->setItemEnabled( m_nMenuBarDisabledItem, false ); ++ } ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ m_pMenuBar->move( qRect.topLeft() ); ++ m_pMenuBar->resize( qRect.size() ); ++ ++ return m_pMenuBar; ++} ++ ++QPopupMenu *WidgetPainter::popupMenu( const Rectangle& rControlRegion) ++{ ++ if ( !m_pPopupMenu ) ++ { ++ m_pPopupMenu = new QPopupMenu( NULL, "popup_menu" ); ++ ++ m_nPopupMenuEnabledItem = m_pPopupMenu->insertItem( "" ); ++ m_nPopupMenuDisabledItem = m_pPopupMenu->insertItem( "" ); ++ ++ m_pPopupMenu->setItemEnabled( m_nPopupMenuEnabledItem, true ); ++ m_pPopupMenu->setItemEnabled( m_nPopupMenuDisabledItem, false ); ++ } ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ m_pPopupMenu->move( qRect.topLeft() ); ++ m_pPopupMenu->resize( qRect.size() ); ++ ++ return m_pPopupMenu; ++} ++ ++QProgressBar *WidgetPainter::progressBar( const Rectangle& rControlRegion ) ++{ ++ if ( !m_pProgressBar ) ++ m_pProgressBar = new QProgressBar( NULL, "progress_bar" ); ++ ++ QRect qRect = region2QRect( rControlRegion ); ++ ++ m_pProgressBar->move( qRect.topLeft() ); ++ m_pProgressBar->resize( qRect.size() ); ++ ++ return m_pProgressBar; ++} ++ ++QStyle::SFlags WidgetPainter::vclStateValue2SFlags( ControlState nState, ++ const ImplControlValue& aValue ) ++{ ++ QStyle::SFlags nStyle = ++ ( (nState & CTRL_STATE_DEFAULT)? QStyle::Style_ButtonDefault: QStyle::Style_Default ) | ++ ( (nState & CTRL_STATE_ENABLED)? QStyle::Style_Enabled: QStyle::Style_Default ) | ++ ( (nState & CTRL_STATE_FOCUSED)? QStyle::Style_HasFocus: QStyle::Style_Default ) | ++ ( (nState & CTRL_STATE_PRESSED)? QStyle::Style_Down: QStyle::Style_Raised ) | ++ ( (nState & CTRL_STATE_SELECTED)? QStyle::Style_Selected : QStyle::Style_Default ) | ++ ( (nState & CTRL_STATE_ROLLOVER)? QStyle::Style_MouseOver: QStyle::Style_Default ); ++ //TODO ( (nState & CTRL_STATE_HIDDEN)? QStyle::Style_: QStyle::Style_Default ) | ++ ++ switch ( aValue.getTristateVal() ) ++ { ++ case BUTTONVALUE_ON: nStyle |= QStyle::Style_On; break; ++ case BUTTONVALUE_OFF: nStyle |= QStyle::Style_Off; break; ++ case BUTTONVALUE_MIXED: nStyle |= QStyle::Style_NoChange; break; ++ default: break; ++ } ++ ++ return nStyle; ++} ++ ++QRect WidgetPainter::region2QRect( const Rectangle& rControlRegion ) ++{ ++ return QRect( QPoint( rControlRegion.Left(), rControlRegion.Top() ), ++ QPoint( rControlRegion.Right(), rControlRegion.Bottom() ) ); ++} ++ ++/** Instance of WidgetPainter. ++ ++ It is used to paint the widgets requested by NWF. ++*/ ++static WidgetPainter *pWidgetPainter; ++ ++class TDESalGraphics : public X11SalGraphics ++{ ++ public: ++ TDESalGraphics() {} ++ virtual ~TDESalGraphics() {} ++ virtual BOOL IsNativeControlSupported( ControlType nType, ControlPart nPart ); ++ virtual BOOL hitTestNativeControl( ControlType nType, ControlPart nPart, ++ const Rectangle& rControlRegion, const Point& aPos, ++ BOOL& rIsInside ); ++ virtual BOOL drawNativeControl( ControlType nType, ControlPart nPart, ++ const Rectangle& rControlRegion, ControlState nState, ++ const ImplControlValue& aValue, ++ const OUString& aCaption ); ++ virtual BOOL drawNativeControlText( ControlType nType, ControlPart nPart, ++ const Rectangle& rControlRegion, ControlState nState, ++ const ImplControlValue& aValue, ++ const OUString& aCaption ); ++ virtual BOOL getNativeControlRegion( ControlType nType, ControlPart nPart, ++ const Rectangle& rControlRegion, ControlState nState, ++ const ImplControlValue& aValue, ++ const OUString& aCaption, ++ Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion ); ++}; ++ ++/** What widgets can be drawn the native way. ++ ++ @param nType ++ Type of the widget. ++ ++ @param nPart ++ Specification of the widget's part if it consists of more than one. ++ ++ @return TRUE if the platform supports native drawing of the widget nType ++ defined by nPart. ++*/ ++BOOL TDESalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart ) ++{ ++ return ++ ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) || ++ ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) || ++ ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) ) || ++ ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) || ++ ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) || ++ ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_WINDOW || nPart == HAS_BACKGROUND_TEXTURE ) ) || ++ ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) || ++ // no CTRL_SPINBUTTONS for TDE ++ ( (nType == CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) ) || ++ ( (nType == CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) ) || ++ // no CTRL_TAB_BODY for TDE ++ ( (nType == CTRL_SCROLLBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) ) || ++ ( (nType == CTRL_SCROLLBAR) && (nPart == HAS_THREE_BUTTONS) ) || // TODO small optimization is possible here: return this only if the style really has 3 buttons ++ // CTRL_GROUPBOX not supported ++ // CTRL_FIXEDLINE not supported ++ // CTRL_FIXEDBORDER not supported ++ ( (nType == CTRL_TOOLBAR) && (nPart == PART_ENTIRE_CONTROL || ++ nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT || ++ nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT || ++ nPart == PART_BUTTON) ) || ++ ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) || ++ ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) || ++ ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) ) ++ ; ++} ++ ++ ++/** Test whether the position is in the native widget. ++ ++ If the return value is TRUE, bIsInside contains information whether ++ aPos was or was not inside the native widget specified by the ++ nType/nPart combination. ++*/ ++BOOL TDESalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart, ++ const Rectangle& rControlRegion, const Point& rPos, ++ BOOL& rIsInside ) ++{ ++ if ( nType == CTRL_SCROLLBAR ) ++ { ++ // make position relative to rControlRegion ++ Point aPos = rPos - rControlRegion.TopLeft(); ++ rIsInside = FALSE; ++ ++ BOOL bHorizontal = ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT ); ++ ++ QScrollBar *pScrollBar = pWidgetPainter->scrollBar( rControlRegion, ++ bHorizontal, ImplControlValue() ); ++ QRect qRectSubLine = kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarSubLine ); ++ QRect qRectAddLine = kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarAddLine ); ++ ++ // There are 2 buttons on the right/bottom side of the scrollbar ++ BOOL bTwoSubButtons = FALSE; ++ ++ // It is a Platinum style scroll bar ++ BOOL bPlatinumStyle = FALSE; ++ ++ // Workaround for Platinum and 3 button style scroll bars. ++ // It makes the right/down button bigger. ++ if ( bHorizontal ) ++ { ++ qRectAddLine.setLeft( kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pScrollBar, ++ QStyle::SC_ScrollBarAddPage ).right() + 1 ); ++ if ( qRectAddLine.width() > qRectSubLine.width() ) ++ bTwoSubButtons = TRUE; ++ if ( qRectSubLine.left() > kapp->style().querySubControlMetrics( QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarSubPage ).left() ) ++ bPlatinumStyle = TRUE; ++ } ++ else ++ { ++ qRectAddLine.setTop( kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pScrollBar, ++ QStyle::SC_ScrollBarAddPage ).bottom() + 1 ); ++ if ( qRectAddLine.height() > qRectSubLine.height() ) ++ bTwoSubButtons = TRUE; ++ if ( qRectSubLine.top() > kapp->style().querySubControlMetrics( QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarSubPage ).top() ) ++ bPlatinumStyle = TRUE; ++ } ++ ++ switch ( nPart ) ++ { ++ case PART_BUTTON_LEFT: ++ if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) ) ++ rIsInside = TRUE; ++ else if ( bTwoSubButtons ) ++ { ++ qRectAddLine.setWidth( qRectAddLine.width() / 2 ); ++ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() ); ++ } ++ break; ++ ++ case PART_BUTTON_UP: ++ if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) ) ++ rIsInside = TRUE; ++ else if ( bTwoSubButtons ) ++ { ++ qRectAddLine.setHeight( qRectAddLine.height() / 2 ); ++ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() ); ++ } ++ break; ++ ++ case PART_BUTTON_RIGHT: ++ if ( bTwoSubButtons ) ++ qRectAddLine.setLeft( qRectAddLine.left() + qRectAddLine.width() / 2 ); ++ ++ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() ); ++ break; ++ ++ case PART_BUTTON_DOWN: ++ if ( bTwoSubButtons ) ++ qRectAddLine.setTop( qRectAddLine.top() + qRectAddLine.height() / 2 ); ++ ++ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() ); ++ break; ++ ++ // cases PART_TRACK_HORZ_AREA and PART_TRACK_VERT_AREA ++ default: ++ return FALSE; ++ } ++ ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++ ++/** Draw the requested control described by nPart/nState. ++ ++ @param rControlRegion ++ The bounding region of the complete control in VCL frame coordinates. ++ ++ @param aValue ++ An optional value (tristate/numerical/string). ++ ++ @param aCaption ++ A caption or title string (like button text etc.) ++*/ ++BOOL TDESalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, ++ const Rectangle& rControlRegion, ControlState nState, ++ const ImplControlValue& aValue, ++ const OUString& ) ++{ ++ BOOL bReturn = FALSE; ++ ++ Display *dpy = GetXDisplay(); ++ XLIB_Window drawable = GetDrawable(); ++ GC gc = SelectPen(); //SelectFont(); // GC with current clipping region set ++ ++ if ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->pushButton( rControlRegion, (nState & CTRL_STATE_DEFAULT) ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->radioButton( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->checkBox( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->comboBox( rControlRegion, TRUE ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->lineEdit( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->comboBox( rControlRegion, FALSE ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_LISTBOX) && (nPart == PART_WINDOW) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->listView( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->spinWidget( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType==CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->tabBar( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType==CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->tabWidget( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_SCROLLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->scrollBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ, aValue ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT || nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->toolBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_THUMB_VERT ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart ); ++ } ++ else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_BUTTON) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->toolButton( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart ); ++ } ++ else if ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->menuBar( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart ); ++ } ++ else if ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->popupMenu( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ else if ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) ) ++ { ++ bReturn = pWidgetPainter->drawStyledWidget( ++ pWidgetPainter->progressBar( rControlRegion ), ++ nState, aValue, ++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc ); ++ } ++ ++ return bReturn; ++} ++ ++ ++/** Draw text on the widget. ++ ++ OPTIONAL. Draws the requested text for the control described by nPart/nState. ++ Used if text is not drawn by DrawNativeControl(). ++ ++ @param rControlRegion ++ The bounding region of the complete control in VCL frame coordinates. ++ ++ @param aValue ++ An optional value (tristate/numerical/string) ++ ++ @param aCaption ++ A caption or title string (like button text etc.) ++*/ ++BOOL TDESalGraphics::drawNativeControlText( ControlType, ControlPart, ++ const Rectangle&, ControlState, ++ const ImplControlValue&, ++ const OUString& ) ++{ ++ return FALSE; ++} ++ ++/** Check if the bounding regions match. ++ ++ If the return value is TRUE, rNativeBoundingRegion ++ contains the true bounding region covered by the control ++ including any adornment, while rNativeContentRegion contains the area ++ within the control that can be safely drawn into without drawing over ++ the borders of the control. ++ ++ @param rControlRegion ++ The bounding region of the control in VCL frame coordinates. ++ ++ @param aValue ++ An optional value (tristate/numerical/string) ++ ++ @param aCaption ++ A caption or title string (like button text etc.) ++*/ ++BOOL TDESalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart, ++ const Rectangle& rControlRegion, ControlState nState, ++ const ImplControlValue&, ++ const OUString&, ++ Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion ) ++{ ++ BOOL bReturn = FALSE; ++ QRect qBoundingRect = WidgetPainter::region2QRect( rControlRegion ); ++ QRect qRect; ++ ++ QWidget *pWidget = NULL; ++ switch ( nType ) ++ { ++ // Metrics of the push button ++ case CTRL_PUSHBUTTON: ++ pWidget = pWidgetPainter->pushButton( rControlRegion, ( nState & CTRL_STATE_DEFAULT ) ); ++ ++ switch ( nPart ) ++ { ++ case PART_ENTIRE_CONTROL: ++ qRect = qBoundingRect; ++ ++ if ( nState & CTRL_STATE_DEFAULT ) ++ { ++ int nIndicatorSize = kapp->style().pixelMetric( ++ QStyle::PM_ButtonDefaultIndicator, pWidget ); ++ qBoundingRect.addCoords( -nIndicatorSize, -nIndicatorSize, ++ nIndicatorSize, nIndicatorSize ); ++ bReturn = TRUE; ++ } ++ break; ++ } ++ break; ++ ++ // Metrics of the radio button ++ case CTRL_RADIOBUTTON: ++ pWidget = pWidgetPainter->radioButton( rControlRegion ); ++ ++ if ( nPart == PART_ENTIRE_CONTROL ) ++ { ++ qRect.setWidth( kapp->style().pixelMetric( QStyle::PM_ExclusiveIndicatorWidth, pWidget ) ); ++ qRect.setHeight( kapp->style().pixelMetric( QStyle::PM_ExclusiveIndicatorHeight, pWidget ) ); ++ ++ bReturn = TRUE; ++ } ++ break; ++ ++ // Metrics of the check box ++ case CTRL_CHECKBOX: ++ pWidget = pWidgetPainter->checkBox( rControlRegion ); ++ ++ if ( nPart == PART_ENTIRE_CONTROL ) ++ { ++ qRect.setWidth( kapp->style().pixelMetric( QStyle::PM_IndicatorWidth, pWidget ) ); ++ qRect.setHeight( kapp->style().pixelMetric( QStyle::PM_IndicatorHeight, pWidget ) ); ++ ++ bReturn = TRUE; ++ } ++ break; ++ ++ // Metrics of the combo box ++ case CTRL_COMBOBOX: ++ case CTRL_LISTBOX: ++ pWidget = pWidgetPainter->comboBox( rControlRegion, ( nType == CTRL_COMBOBOX ) ); ++ switch ( nPart ) ++ { ++ case PART_BUTTON_DOWN: ++ qRect = kapp->style().querySubControlMetrics( ++ QStyle::CC_ComboBox, pWidget, QStyle::SC_ComboBoxArrow ); ++ qRect.setLeft( kapp->style().querySubControlMetrics( ++ QStyle::CC_ComboBox, pWidget, ++ QStyle::SC_ComboBoxEditField ).right() + 1 ); ++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); ++ bReturn = TRUE; ++ break; ++ ++ case PART_SUB_EDIT: ++ qRect = kapp->style().querySubControlMetrics( ++ QStyle::CC_ComboBox, pWidget, QStyle::SC_ComboBoxEditField ); ++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); ++ bReturn = TRUE; ++ break; ++ } ++ break; ++ ++ // Metrics of the spin box ++ case CTRL_SPINBOX: ++ pWidget = pWidgetPainter->spinWidget( rControlRegion ); ++ switch ( nPart ) ++ { ++ case PART_BUTTON_UP: ++ qRect = kapp->style().querySubControlMetrics( ++ QStyle::CC_SpinWidget, pWidget, QStyle::SC_SpinWidgetUp ); ++ bReturn = TRUE; ++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); ++ break; ++ ++ case PART_BUTTON_DOWN: ++ qRect = kapp->style().querySubControlMetrics( ++ QStyle::CC_SpinWidget, pWidget, QStyle::SC_SpinWidgetDown ); ++ bReturn = TRUE; ++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); ++ break; ++ ++ case PART_SUB_EDIT: ++ qRect = kapp->style().querySubControlMetrics( ++ QStyle::CC_SpinWidget, pWidget, QStyle::SC_SpinWidgetEditField ); ++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); ++ bReturn = TRUE; ++ break; ++ } ++ break; ++ ++ // Metrics of the scroll bar ++ case CTRL_SCROLLBAR: ++ pWidget = pWidgetPainter->scrollBar( rControlRegion, ++ ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT ), ++ ImplControlValue() ); ++ switch ( nPart ) ++ { ++ case PART_BUTTON_LEFT: ++ case PART_BUTTON_UP: ++ qRect = kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pWidget, QStyle::SC_ScrollBarSubLine ); ++ ++ // Workaround for Platinum style scroll bars. It makes the ++ // left/up button invisible. ++ if ( nPart == PART_BUTTON_LEFT ) ++ { ++ if ( qRect.left() > kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pWidget, ++ QStyle::SC_ScrollBarSubPage ).left() ) ++ { ++ qRect.setLeft( 0 ); ++ qRect.setRight( 0 ); ++ } ++ } ++ else ++ { ++ if ( qRect.top() > kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pWidget, ++ QStyle::SC_ScrollBarSubPage ).top() ) ++ { ++ qRect.setTop( 0 ); ++ qRect.setBottom( 0 ); ++ } ++ } ++ ++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); ++ ++ bReturn = TRUE; ++ break; ++ ++ case PART_BUTTON_RIGHT: ++ case PART_BUTTON_DOWN: ++ qRect = kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pWidget, QStyle::SC_ScrollBarAddLine ); ++ ++ // Workaround for Platinum and 3 button style scroll bars. ++ // It makes the right/down button bigger. ++ if ( nPart == PART_BUTTON_RIGHT ) ++ qRect.setLeft( kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pWidget, ++ QStyle::SC_ScrollBarAddPage ).right() + 1 ); ++ else ++ qRect.setTop( kapp->style().querySubControlMetrics( ++ QStyle::CC_ScrollBar, pWidget, ++ QStyle::SC_ScrollBarAddPage ).bottom() + 1 ); ++ ++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() ); ++ ++ bReturn = TRUE; ++ break; ++ } ++ break; ++ } ++ ++ // Fill rNativeBoundingRegion and rNativeContentRegion ++ if ( bReturn ) ++ { ++ // Bounding region ++ Point aBPoint( qBoundingRect.x(), qBoundingRect.y() ); ++ Size aBSize( qBoundingRect.width(), qBoundingRect.height() ); ++ rNativeBoundingRegion = Rectangle( aBPoint, aBSize ); ++ ++ // Region of the content ++ Point aPoint( qRect.x(), qRect.y() ); ++ Size aSize( qRect.width(), qRect.height() ); ++ rNativeContentRegion = Rectangle( aPoint, aSize ); ++ } ++ ++ return bReturn; ++} ++ ++// ----------------------------------------------------------------------- ++// TDESalFrame implementation ++// ----------------------------------------------------------------------- ++ ++TDESalFrame::TDESalFrame( SalFrame* pParent, ULONG nStyle ) : ++ X11SalFrame( pParent, nStyle ) ++{ ++} ++ ++void TDESalFrame::Show( BOOL bVisible, BOOL bNoActivate ) ++{ ++ if ( !GetParent() && ! (GetStyle() & SAL_FRAME_STYLE_INTRO) ) ++ { ++ TDEXLib* pXLib = static_cast(GetDisplay()->GetXLib()); ++ pXLib->doStartup(); ++ } ++ X11SalFrame::Show( bVisible, bNoActivate ); ++} ++ ++/** Helper function to convert colors. ++*/ ++static Color toColor( const QColor &rColor ) ++{ ++ return Color( rColor.red(), rColor.green(), rColor.blue() ); ++} ++ ++/** Helper function to read untranslated text entry from KConfig configuration repository. ++*/ ++static OUString readEntryUntranslated( KConfig *pConfig, const char *pKey ) ++{ ++ return OUString::createFromAscii( pConfig->readEntryUntranslated( pKey ).ascii() ); ++} ++ ++/** Helper function to read color from KConfig configuration repository. ++*/ ++static Color readColor( KConfig *pConfig, const char *pKey ) ++{ ++ return toColor( pConfig->readColorEntry( pKey ) ); ++} ++ ++/** Helper function to add information to Font from QFont. ++ ++ Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx). ++*/ ++static Font toFont( const QFont &rQFont, const ::com::sun::star::lang::Locale& rLocale ) ++{ ++ psp::FastPrintFontInfo aInfo; ++ QFontInfo qFontInfo( rQFont ); ++ ++ // set family name ++ aInfo.m_aFamilyName = String( rQFont.family().utf8(), RTL_TEXTENCODING_UTF8 ); ++ ++ // set italic ++ aInfo.m_eItalic = ( qFontInfo.italic()? psp::italic::Italic: psp::italic::Upright ); ++ ++ // set weight ++ int nWeight = qFontInfo.weight(); ++ if ( nWeight <= QFont::Light ) ++ aInfo.m_eWeight = psp::weight::Light; ++ else if ( nWeight <= QFont::Normal ) ++ aInfo.m_eWeight = psp::weight::Normal; ++ else if ( nWeight <= QFont::DemiBold ) ++ aInfo.m_eWeight = psp::weight::SemiBold; ++ else if ( nWeight <= QFont::Bold ) ++ aInfo.m_eWeight = psp::weight::Bold; ++ else ++ aInfo.m_eWeight = psp::weight::UltraBold; ++ ++ // set width ++ int nStretch = rQFont.stretch(); ++ if ( nStretch <= QFont::UltraCondensed ) ++ aInfo.m_eWidth = psp::width::UltraCondensed; ++ else if ( nStretch <= QFont::ExtraCondensed ) ++ aInfo.m_eWidth = psp::width::ExtraCondensed; ++ else if ( nStretch <= QFont::Condensed ) ++ aInfo.m_eWidth = psp::width::Condensed; ++ else if ( nStretch <= QFont::SemiCondensed ) ++ aInfo.m_eWidth = psp::width::SemiCondensed; ++ else if ( nStretch <= QFont::Unstretched ) ++ aInfo.m_eWidth = psp::width::Normal; ++ else if ( nStretch <= QFont::SemiExpanded ) ++ aInfo.m_eWidth = psp::width::SemiExpanded; ++ else if ( nStretch <= QFont::Expanded ) ++ aInfo.m_eWidth = psp::width::Expanded; ++ else if ( nStretch <= QFont::ExtraExpanded ) ++ aInfo.m_eWidth = psp::width::ExtraExpanded; ++ else ++ aInfo.m_eWidth = psp::width::UltraExpanded; ++ ++#if OSL_DEBUG_LEVEL > 1 ++ fprintf( stderr, "font name BEFORE system match: \"%s\"\n", OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); ++#endif ++ ++ // match font to e.g. resolve "Sans" ++ psp::PrintFontManager::get().matchFont( aInfo, rLocale ); ++ ++#if OSL_DEBUG_LEVEL > 1 ++ fprintf( stderr, "font match %s, name AFTER: \"%s\"\n", ++ aInfo.m_nID != 0 ? "succeeded" : "failed", ++ OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); ++#endif ++ ++ // font height ++ int nPointHeight = qFontInfo.pointSize(); ++ if ( nPointHeight <= 0 ) ++ nPointHeight = rQFont.pointSize(); ++ ++ // Create the font ++ Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) ); ++ if( aInfo.m_eWeight != psp::weight::Unknown ) ++ aFont.SetWeight( PspGraphics::ToFontWeight( aInfo.m_eWeight ) ); ++ if( aInfo.m_eWidth != psp::width::Unknown ) ++ aFont.SetWidthType( PspGraphics::ToFontWidth( aInfo.m_eWidth ) ); ++ if( aInfo.m_eItalic != psp::italic::Unknown ) ++ aFont.SetItalic( PspGraphics::ToFontItalic( aInfo.m_eItalic ) ); ++ if( aInfo.m_ePitch != psp::pitch::Unknown ) ++ aFont.SetPitch( PspGraphics::ToFontPitch( aInfo.m_ePitch ) ); ++ ++ return aFont; ++} ++ ++/** Implementation of TDE integration's main method. ++*/ ++void TDESalFrame::UpdateSettings( AllSettings& rSettings ) ++{ ++ StyleSettings aStyleSettings( rSettings.GetStyleSettings() ); ++ bool bSetTitleFont = false; ++ ++ aStyleSettings.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_LARGE ); ++ ++ // WM settings ++ KConfig *pConfig = KGlobal::config(); ++ if ( pConfig ) ++ { ++ pConfig->setGroup( "WM" ); ++ const char *pKey; ++ ++ pKey = "activeBackground"; ++ if ( pConfig->hasKey( pKey ) ) ++ aStyleSettings.SetActiveColor( readColor( pConfig, pKey ) ); ++ ++ pKey = "activeBlend"; ++ if ( pConfig->hasKey( pKey ) ) ++ aStyleSettings.SetActiveColor2( readColor( pConfig, pKey ) ); ++ ++ pKey = "inactiveBackground"; ++ if ( pConfig->hasKey( pKey ) ) ++ aStyleSettings.SetDeactiveColor( readColor( pConfig, pKey ) ); ++ ++ pKey = "inactiveBlend"; ++ if ( pConfig->hasKey( pKey ) ) ++ aStyleSettings.SetDeactiveColor2( readColor( pConfig, pKey ) ); ++ ++ pKey = "inactiveForeground"; ++ if ( pConfig->hasKey( pKey ) ) ++ aStyleSettings.SetDeactiveTextColor( readColor( pConfig, pKey ) ); ++ ++ pKey = "activeForeground"; ++ if ( pConfig->hasKey( pKey ) ) ++ aStyleSettings.SetActiveTextColor( readColor( pConfig, pKey ) ); ++ ++ pKey = "titleFont"; ++ if ( pConfig->hasKey( pKey ) ) ++ { ++ Font aFont = toFont( pConfig->readFontEntry( pKey ), rSettings.GetUILocale() ); ++ aStyleSettings.SetTitleFont( aFont ); ++ bSetTitleFont = true; ++ } ++ ++ pConfig->setGroup( "Icons" ); ++ ++ pKey = "Theme"; ++ if ( pConfig->hasKey( pKey ) ) ++ aStyleSettings.SetPreferredSymbolsStyleName( readEntryUntranslated( pConfig, pKey ) ); ++ } ++ ++ // General settings ++ QColorGroup qColorGroup = kapp->palette().active(); ++ ++ Color aFore = toColor( qColorGroup.foreground() ); ++ Color aBack = toColor( qColorGroup.background() ); ++ Color aText = toColor( qColorGroup.text() ); ++ Color aBase = toColor( qColorGroup.base() ); ++ ++ // Foreground ++ aStyleSettings.SetRadioCheckTextColor( aFore ); ++ aStyleSettings.SetLabelTextColor( aFore ); ++ aStyleSettings.SetInfoTextColor( aFore ); ++ aStyleSettings.SetDialogTextColor( aFore ); ++ aStyleSettings.SetGroupTextColor( aFore ); ++ ++ // Text ++ aStyleSettings.SetFieldTextColor( aText ); ++ aStyleSettings.SetFieldRolloverTextColor( aText ); ++ aStyleSettings.SetWindowTextColor( aText ); ++ aStyleSettings.SetHelpTextColor( aText ); ++ ++ // Base ++ aStyleSettings.SetFieldColor( aBase ); ++ aStyleSettings.SetHelpColor( aBase ); ++ aStyleSettings.SetWindowColor( aBase ); ++ aStyleSettings.SetActiveTabColor( aBase ); ++ ++ // Buttons ++ aStyleSettings.SetButtonTextColor( toColor( qColorGroup.buttonText() ) ); ++ aStyleSettings.SetButtonRolloverTextColor( toColor( qColorGroup.buttonText() ) ); ++ ++ // Disable color ++ aStyleSettings.SetDisableColor( toColor( qColorGroup.mid() ) ); ++ ++ // Workspace ++ aStyleSettings.SetWorkspaceColor( toColor( qColorGroup.mid() ) ); ++ ++ // Background ++ aStyleSettings.Set3DColors( aBack ); ++ aStyleSettings.SetFaceColor( aBack ); ++ aStyleSettings.SetInactiveTabColor( aBack ); ++ aStyleSettings.SetDialogColor( aBack ); ++ if( aBack == COL_LIGHTGRAY ) ++ aStyleSettings.SetCheckedColor( Color( 0xCC, 0xCC, 0xCC ) ); ++ else ++ { ++ Color aColor2 = aStyleSettings.GetLightColor(); ++ aStyleSettings. ++ SetCheckedColor( Color( (BYTE)(((USHORT)aBack.GetRed()+(USHORT)aColor2.GetRed())/2), ++ (BYTE)(((USHORT)aBack.GetGreen()+(USHORT)aColor2.GetGreen())/2), ++ (BYTE)(((USHORT)aBack.GetBlue()+(USHORT)aColor2.GetBlue())/2) ++ ) ); ++ } ++ ++ // Selection ++ aStyleSettings.SetHighlightColor( toColor( qColorGroup.highlight() ) ); ++ aStyleSettings.SetHighlightTextColor( toColor( qColorGroup.highlightedText() ) ); ++ ++ // Font ++ Font aFont = toFont( kapp->font(), rSettings.GetUILocale() ); ++ ++ aStyleSettings.SetAppFont( aFont ); ++ aStyleSettings.SetHelpFont( aFont ); ++ aStyleSettings.SetMenuFont( aFont ); // will be changed according to pMenuBar ++ aStyleSettings.SetToolFont( aFont ); // will be changed according to pToolBar ++ aStyleSettings.SetLabelFont( aFont ); ++ aStyleSettings.SetInfoFont( aFont ); ++ aStyleSettings.SetRadioCheckFont( aFont ); ++ aStyleSettings.SetPushButtonFont( aFont ); ++ aStyleSettings.SetFieldFont( aFont ); ++ aStyleSettings.SetIconFont( aFont ); ++ aStyleSettings.SetGroupFont( aFont ); ++ ++ aFont.SetWeight( WEIGHT_BOLD ); ++ if( !bSetTitleFont ) ++ aStyleSettings.SetTitleFont( aFont ); ++ aStyleSettings.SetFloatTitleFont( aFont ); ++ ++ int flash_time = QApplication::cursorFlashTime(); ++ aStyleSettings.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME ); ++ ++ KMainWindow qMainWindow; ++ qMainWindow.createGUI( "/dev/null" ); // hack ++ ++ // Menu ++ aStyleSettings.SetSkipDisabledInMenus( TRUE ); ++ KMenuBar *pMenuBar = qMainWindow.menuBar(); ++ if ( pMenuBar ) ++ { ++ // Color ++ QColorGroup qMenuCG = pMenuBar->colorGroup(); ++ ++ // Menu text and background color, theme specific ++ Color aMenuFore = toColor( qMenuCG.foreground() ); ++ Color aMenuBack = toColor( qMenuCG.background() ); ++ if ( kapp->style().inherits( "LightStyleV2" ) || ++ kapp->style().inherits( "LightStyleV3" ) || ++ ( kapp->style().inherits( "QMotifStyle" ) && !kapp->style().inherits( "QSGIStyle" ) ) || ++ kapp->style().inherits( "QWindowsStyle" ) ) ++ { ++ aMenuFore = toColor( qMenuCG.buttonText() ); ++ aMenuBack = toColor( qMenuCG.button() ); ++ } ++ ++ aStyleSettings.SetMenuTextColor( aMenuFore ); ++ aStyleSettings.SetMenuBarTextColor( aMenuFore ); ++ aStyleSettings.SetMenuColor( aMenuBack ); ++ aStyleSettings.SetMenuBarColor( aMenuBack ); ++ ++ aStyleSettings.SetMenuHighlightColor( toColor ( qMenuCG.highlight() ) ); ++ ++ // Menu items higlight text color, theme specific ++ if ( kapp->style().inherits( "HighContrastStyle" ) || ++ kapp->style().inherits( "KeramikStyle" ) || ++ kapp->style().inherits( "QWindowsStyle" ) || ++ kapp->style().inherits( "ThinKeramikStyle" ) || ++ kapp->style().inherits( "PlastikStyle" ) ) ++ { ++ aStyleSettings.SetMenuHighlightTextColor( toColor ( qMenuCG.highlightedText() ) ); ++ } ++ else ++ aStyleSettings.SetMenuHighlightTextColor( aMenuFore ); ++ ++ // set special menubar higlight text color ++ if ( kapp->style().inherits( "HighContrastStyle" ) ) ++ ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.highlightedText() ); ++ else ++ ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore; ++ ++ // Font ++ aFont = toFont( pMenuBar->font(), rSettings.GetUILocale() ); ++ aStyleSettings.SetMenuFont( aFont ); ++ } ++ ++ // Tool bar ++ KToolBar *pToolBar = qMainWindow.toolBar(); ++ if ( pToolBar ) ++ { ++ aFont = toFont( pToolBar->font(), rSettings.GetUILocale() ); ++ aStyleSettings.SetToolFont( aFont ); ++ } ++ ++ // Scroll bar size ++ aStyleSettings.SetScrollBarSize( kapp->style().pixelMetric( QStyle::PM_ScrollBarExtent ) ); ++ ++ rSettings.SetStyleSettings( aStyleSettings ); ++} ++ ++SalGraphics* TDESalFrame::GetGraphics() ++{ ++ if( GetWindow() ) ++ { ++ for( int i = 0; i < nMaxGraphics; i++ ) ++ { ++ if( ! m_aGraphics[i].bInUse ) ++ { ++ m_aGraphics[i].bInUse = true; ++ if( ! m_aGraphics[i].pGraphics ) ++ { ++ m_aGraphics[i].pGraphics = new TDESalGraphics(); ++ m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() ); ++ } ++ return m_aGraphics[i].pGraphics; ++ } ++ } ++ } ++ ++ return NULL; ++} ++ ++void TDESalFrame::ReleaseGraphics( SalGraphics *pGraphics ) ++{ ++ for( int i = 0; i < nMaxGraphics; i++ ) ++ { ++ if( m_aGraphics[i].pGraphics == pGraphics ) ++ { ++ m_aGraphics[i].bInUse = false; ++ break; ++ } ++ } ++} ++ ++void TDESalFrame::updateGraphics( bool bClear ) ++{ ++ Drawable aDrawable = bClear ? None : GetWindow(); ++ for( int i = 0; i < nMaxGraphics; i++ ) ++ { ++ if( m_aGraphics[i].bInUse ) ++ m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() ); ++ } ++} ++ ++TDESalFrame::~TDESalFrame() ++{ ++} ++ ++TDESalFrame::GraphicsHolder::~GraphicsHolder() ++{ ++ delete pGraphics; ++} ++ ++// ----------------------------------------------------------------------- ++// TDESalInstance implementation ++// ----------------------------------------------------------------------- ++ ++SalFrame * ++TDESalInstance::CreateFrame( SalFrame *pParent, ULONG nStyle ) ++{ ++ return new TDESalFrame( pParent, nStyle ); ++} ++ ++// ----------------------------------------------------------------------- ++// TDESalData pieces ++// ----------------------------------------------------------------------- ++ ++// Create the widget painter so we have some control over ++// the destruction sequence, so Qt doesn't die in action. ++ ++void TDEData::initNWF() ++{ ++ ImplSVData *pSVData = ImplGetSVData(); ++ // draw toolbars on separate lines ++ pSVData->maNWFData.mbDockingAreaSeparateTB = true; ++ ++ pWidgetPainter = new WidgetPainter(); ++} ++ ++void TDEData::deInitNWF() ++{ ++ delete pWidgetPainter; ++ pWidgetPainter = NULL; ++ ++ // We have to destroy the style early ++ kapp->setStyle( NULL ); ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN vcl/unx/tde/tdedata.cxx vcl/unx/tde/tdedata.cxx +--- vcl/unx/tde/tdedata.cxx 1969-12-31 18:00:00.000000000 -0600 ++++ vcl/unx/tde/tdedata.cxx 2011-08-18 20:14:26.186519004 -0500 +@@ -0,0 +1,274 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++// MARKER(update_precomp.py): autogen include statement, do not remove ++#include "precompiled_vcl.hxx" ++ ++#define _SV_SALDATA_CXX ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#ifdef FREEBSD ++#include ++#include ++#include ++#endif ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include "i18n_im.hxx" ++#include "i18n_xkb.hxx" ++ ++/* #i59042# override KApplications method for session management ++ * since it will interfere badly with our own. ++ */ ++class VCLTDEApplication : public KApplication ++{ ++ public: ++ VCLTDEApplication() : KApplication() {} ++ ++ virtual void commitData(QSessionManager &sm); ++}; ++ ++void VCLTDEApplication::commitData(QSessionManager&) ++{ ++} ++ ++/*************************************************************************** ++ * class SalTDEDisplay * ++ ***************************************************************************/ ++ ++SalTDEDisplay::SalTDEDisplay( Display* pDisp ) ++ : SalX11Display( pDisp ) ++{ ++} ++ ++SalTDEDisplay::~SalTDEDisplay() ++{ ++ // in case never a frame opened ++ static_cast(GetXLib())->doStartup(); ++ // clean up own members ++ doDestruct(); ++ // prevent SalDisplay from closing KApplication's display ++ pDisp_ = NULL; ++} ++ ++/*************************************************************************** ++ * class TDEXLib * ++ ***************************************************************************/ ++ ++TDEXLib::~TDEXLib() ++{ ++ // #158056# on 64 bit linux using libXRandr.so.2 will crash in ++ // XCloseDisplay when freeing extension data ++ // no known work around, therefor currently leak. Hopefully ++ // this does not make problems since we're shutting down anyway ++ // should we ever get a real tde plugin that uses the TDE event loop ++ // we should use tde's method to signal screen changes similar ++ // to the gtk plugin ++ #if ! defined USE_RANDR || ! (defined LINUX && defined X86_64) ++ // properly deinitialize KApplication ++ delete (VCLTDEApplication*)m_pApplication; ++ #endif ++ // free the faked cmdline arguments no longer needed by KApplication ++ for( int i = 0; i < m_nFakeCmdLineArgs; i++ ) ++ free( m_pFreeCmdLineArgs[i] ); ++ delete [] m_pFreeCmdLineArgs; ++ delete [] m_pAppCmdLineArgs; ++} ++ ++void TDEXLib::Init() ++{ ++ SalI18N_InputMethod* pInputMethod = new SalI18N_InputMethod; ++ pInputMethod->SetLocale(); ++ XrmInitialize(); ++ ++ KAboutData *kAboutData = new KAboutData( "LibreOffice", ++ I18N_NOOP( "LibreOffice" ), ++ "1.1.0", ++ I18N_NOOP( "LibreOffice with TDE Native Widget Support." ), ++ KAboutData::License_LGPL, ++ "(c) 2003, 2004 Novell, Inc", ++ I18N_NOOP( "LibreOffice is an office suite.\n" ), ++ "http://libreoffice.org", ++ "libreoffice@lists.freedesktop.org"); ++ kAboutData->addAuthor( "Jan Holesovsky", ++ I18N_NOOP( "Original author and maintainer of the TDE NWF." ), ++ "kendy@artax.karlin.mff.cuni.cz", ++ "http://artax.karlin.mff.cuni.cz/~kendy" ); ++ ++ m_nFakeCmdLineArgs = 1; ++ USHORT nIdx; ++ int nParams = osl_getCommandArgCount(); ++ rtl::OString aDisplay; ++ rtl::OUString aParam, aBin; ++ ++ for ( nIdx = 0; nIdx < nParams; ++nIdx ) ++ { ++ osl_getCommandArg( nIdx, &aParam.pData ); ++ if ( !m_pFreeCmdLineArgs && aParam.equalsAscii( "-display" ) && nIdx + 1 < nParams ) ++ { ++ osl_getCommandArg( nIdx + 1, &aParam.pData ); ++ aDisplay = rtl::OUStringToOString( aParam, osl_getThreadTextEncoding() ); ++ ++ m_nFakeCmdLineArgs = 3; ++ m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; ++ m_pFreeCmdLineArgs[ 1 ] = strdup( "-display" ); ++ m_pFreeCmdLineArgs[ 2 ] = strdup( aDisplay.getStr() ); ++ } ++ } ++ if ( !m_pFreeCmdLineArgs ) ++ m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; ++ ++ osl_getExecutableFile( &aParam.pData ); ++ osl_getSystemPathFromFileURL( aParam.pData, &aBin.pData ); ++ rtl::OString aExec = rtl::OUStringToOString( aBin, osl_getThreadTextEncoding() ); ++ m_pFreeCmdLineArgs[0] = strdup( aExec.getStr() ); ++ ++ // make a copy of the string list for freeing it since ++ // KApplication manipulates the pointers inside the argument vector ++ // note: KApplication bad ! ++ m_pAppCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; ++ for( int i = 0; i < m_nFakeCmdLineArgs; i++ ) ++ m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i]; ++ ++ KCmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs, kAboutData ); ++ ++ KApplication::disableAutoDcopRegistration(); ++ m_pApplication = new VCLTDEApplication(); ++ kapp->disableSessionManagement(); ++ ++ Display* pDisp = QPaintDevice::x11AppDisplay(); ++ ++ SalDisplay *pSalDisplay = new SalTDEDisplay( pDisp ); ++ ++ pInputMethod->CreateMethod( pDisp ); ++ pInputMethod->AddConnectionWatch( pDisp, (void*)this ); ++ pSalDisplay->SetInputMethod( pInputMethod ); ++ ++ PushXErrorLevel( true ); ++ SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp ); ++ XSync( pDisp, False ); ++ ++ pKbdExtension->UseExtension( ! HasXErrorOccured() ); ++ PopXErrorLevel(); ++ ++ pSalDisplay->SetKbdExtension( pKbdExtension ); ++} ++ ++void TDEXLib::doStartup() ++{ ++ if( ! m_bStartupDone ) ++ { ++ KStartupInfo::appStarted(); ++ m_bStartupDone = true; ++ #if OSL_DEBUG_LEVEL > 1 ++ fprintf( stderr, "called KStartupInfo::appStarted()\n" ); ++ #endif ++ } ++} ++ ++/********************************************************************** ++ * class TDEData * ++ **********************************************************************/ ++ ++TDEData::~TDEData() ++{ ++} ++ ++void TDEData::Init() ++{ ++ pXLib_ = new TDEXLib(); ++ pXLib_->Init(); ++} ++ ++/********************************************************************** ++ * plugin entry point * ++ **********************************************************************/ ++ ++extern "C" { ++ VCL_DLLPUBLIC SalInstance* create_SalInstance( oslModule ) ++ { ++ /* #i92121# workaround deadlocks in the X11 implementation ++ */ ++ static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" ); ++ /* #i90094# ++ from now on we know that an X connection will be ++ established, so protect X against itself ++ */ ++ if( ! ( pNoXInitThreads && *pNoXInitThreads ) ) ++ XInitThreads(); ++ ++ rtl::OString aVersion( qVersion() ); ++#if OSL_DEBUG_LEVEL > 1 ++ fprintf( stderr, "qt version string is \"%s\"\n", aVersion.getStr() ); ++#endif ++ sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0, nMicro = 0; ++ nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32(); ++ if( nIndex > 0 ) ++ nMinor = aVersion.getToken( 0, '.', nIndex ).toInt32(); ++ if( nIndex > 0 ) ++ nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32(); ++ if( nMajor != 3 || nMinor < 2 || (nMinor == 2 && nMicro < 2) ) ++ { ++#if OSL_DEBUG_LEVEL > 1 ++ fprintf( stderr, "unsuitable qt version %d.%d.%d\n", (int)nMajor, (int)nMinor, (int)nMicro ); ++#endif ++ return NULL; ++ } ++ ++ TDESalInstance* pInstance = new TDESalInstance( new SalYieldMutex() ); ++#if OSL_DEBUG_LEVEL > 1 ++ fprintf( stderr, "created TDESalInstance 0x%p\n", pInstance ); ++#endif ++ ++ // initialize SalData ++ TDEData *pSalData = new TDEData(); ++ SetSalData( pSalData ); ++ pSalData->m_pInstance = pInstance; ++ pSalData->Init(); ++ pSalData->initNWF(); ++ ++ return pInstance; ++ } ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN vcl/prj/build.lst vcl/prj/build.lst +--- vcl/prj/build.lst 2010-11-11 13:09:00.000000000 -0600 ++++ vcl/prj/build.lst 2011-08-18 20:31:51.496382806 -0500 +@@ -35,6 +35,7 @@ + vc vcl\unx\headless nmake - u vc__hl vc_inc NULL + vc vcl\unx\kde nmake - u vc__kde vc_inc NULL + vc vcl\unx\kde4 nmake - u vc__kde4 vc_inc NULL ++vc vcl\unx\tde nmake - u vc__tde vc_inc NULL + vc vcl\aqua\source\a11y nmake - u vc__aquy vc_inc NULL + vc vcl\aqua\source\app nmake - u vc__appa vc_inc NULL + vc vcl\aqua\source\dtrans nmake - u vc__dtra vc_inc NULL +@@ -45,6 +46,6 @@ + vc vcl\mac\source\gdi nmake - m vc__gdim vc_inc NULL + vc vcl\mac\source\window nmake - m vc__winm vc_inc NULL + vc vcl\mac\source\src nmake - m vc__srcm vc_inc NULL +-vc vcl\util nmake - all vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL ++vc vcl\util nmake - all vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__tde.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL + vc vcl\util\linksvp nmake - u vc_lsvp vc_util NULL + vc vcl\workben nmake - all vc_wrkb vc_util vc_salmain NULL +diff -urN vcl/prj/d.lst vcl/prj/d.lst +--- vcl/prj/d.lst 2010-11-11 09:22:48.000000000 -0600 ++++ vcl/prj/d.lst 2011-08-18 20:30:59.772430360 -0500 +@@ -62,6 +62,7 @@ + ..\inc\vcl\javachild.hxx %_DEST%\inc%_EXT%\vcl\javachild.hxx + ..\inc\vcl\jobset.hxx %_DEST%\inc%_EXT%\vcl\jobset.hxx + ..\unx\inc\kde_headers.h %_DEST%\inc%_EXT%\vcl\kde_headers.h ++..\unx\inc\tde_headers.h %_DEST%\inc%_EXT%\vcl\tde_headers.h + ..\inc\vcl\keycod.hxx %_DEST%\inc%_EXT%\vcl\keycod.hxx + ..\inc\vcl\keycodes.hxx %_DEST%\inc%_EXT%\vcl\keycodes.hxx + ..\inc\vcl\lineinfo.hxx %_DEST%\inc%_EXT%\vcl\lineinfo.hxx +diff -urN vcl/source/app/settings.cxx vcl/source/app/settings.cxx +--- vcl/source/app/settings.cxx 2011-03-08 12:51:41.000000000 -0600 ++++ vcl/source/app/settings.cxx 2011-08-18 20:32:39.820075101 -0500 +@@ -830,6 +830,8 @@ + nRet = STYLE_SYMBOLS_CRYSTAL; + else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "kde4" ) ) + nRet = STYLE_SYMBOLS_OXYGEN; ++ else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "tde" ) ) ++ nRet = STYLE_SYMBOLS_CRYSTAL; + } + + // falback to any existing style +diff -urN vcl/unx/source/gdi/dtint.cxx vcl/unx/source/gdi/dtint.cxx +--- vcl/unx/source/gdi/dtint.cxx 2010-11-11 09:22:48.000000000 -0600 ++++ vcl/unx/source/gdi/dtint.cxx 2011-08-18 20:35:34.753448320 -0500 +@@ -96,7 +96,7 @@ + /* + * #i22061# override desktop detection + * if environment variable OOO_FORCE_DESKTOP is set +- * to one of "cde" "kde" "gnome" then autodetection ++ * to one of "cde" "kde" "tde" "gnome" then autodetection + * is overridden. + */ + static const char* pOverride = getenv( "OOO_FORCE_DESKTOP" ); +diff -urN vcl/unx/source/plugadapt/salplug.cxx vcl/unx/source/plugadapt/salplug.cxx +--- vcl/unx/source/plugadapt/salplug.cxx 2010-11-11 13:09:00.000000000 -0600 ++++ vcl/unx/source/plugadapt/salplug.cxx 2011-08-18 20:35:23.512588295 -0500 +@@ -55,10 +55,11 @@ + DESKTOP_GNOME, + DESKTOP_KDE, + DESKTOP_KDE4, ++ DESKTOP_TDE, + DESKTOP_CDE + }; + +-static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "CDE" }; ++static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "TDE", "CDE" }; + + static SalInstance* tryInstance( const OUString& rModuleBase ) + { +@@ -162,7 +166,7 @@ + { + static const char* pKDEFallbackList[] = + { +- "kde4", "kde", "gtk", "gen", 0 ++ "kde4", "kde", "tde", "gtk", "gen", 0 + }; + + static const char* pStandardFallbackList[] = +@@ -191,6 +195,11 @@ + } + else if( desktop.equalsAscii( desktop_strings[DESKTOP_KDE4] ) ) + pList = pKDEFallbackList; ++ else if( desktop.equalsAscii( desktop_strings[DESKTOP_TDE] ) ) ++ { ++ pList = pKDEFallbackList; ++ nListEntry = 1; ++ } + + SalInstance* pInst = NULL; + while( pList[nListEntry] && pInst == NULL ) +@@ -235,7 +244,7 @@ + pInst = autodetect_plugin(); + + // fallback, try everything +- const char* pPlugin[] = { "gtk", "kde", "gen", 0 }; ++ const char* pPlugin[] = { "gtk", "kde", "tde", "gen", 0 }; + + for ( int i = 0; !pInst && pPlugin[ i ]; ++i ) + pInst = tryInstance( OUString::createFromAscii( pPlugin[ i ] ) ); +diff -urN vcl/unx/inc/plugins/tde/tdedata.hxx vcl/unx/inc/plugins/tde/tdedata.hxx +--- vcl/unx/inc/plugins/tde/tdedata.hxx 1969-12-31 18:00:00.000000000 -0600 ++++ vcl/unx/inc/plugins/tde/tdedata.hxx 2011-08-18 20:45:32.009117227 -0500 +@@ -0,0 +1,114 @@ ++/* -*- 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. ++ * Copyright 2011 Timothy Pearson ++ * ++ * 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 ++ * ++ * for a copy of the LGPLv3 License. ++ * ++ ************************************************************************/ ++ ++#ifndef _VCL_TDEDATA_HXX ++#define _VCL_TDEDATA_HXX ++ ++#include ++#include ++#include ++ ++class TDEData : public X11SalData ++{ ++public: ++ TDEData() {} ++ virtual ~TDEData(); ++ ++ virtual void Init(); ++ virtual void initNWF(); ++ virtual void deInitNWF(); ++}; ++ ++class SalTDEDisplay : public SalX11Display ++{ ++public: ++ SalTDEDisplay( Display* pDisp ); ++ virtual ~SalTDEDisplay(); ++}; ++ ++class TDESalFrame : public X11SalFrame ++{ ++ static const int nMaxGraphics = 2; ++ ++ struct GraphicsHolder ++ { ++ X11SalGraphics* pGraphics; ++ bool bInUse; ++ GraphicsHolder() ++ : pGraphics( NULL ), ++ bInUse( false ) ++ {} ++ ~GraphicsHolder(); ++ }; ++ GraphicsHolder m_aGraphics[ nMaxGraphics ]; ++ ++public: ++ TDESalFrame( SalFrame* pParent, ULONG nStyle ); ++ virtual ~TDESalFrame(); ++ ++ virtual SalGraphics* GetGraphics(); ++ virtual void ReleaseGraphics( SalGraphics *pGraphics ); ++ virtual void updateGraphics( bool bClear ); ++ virtual void UpdateSettings( AllSettings& rSettings ); ++ virtual void Show( BOOL bVisible, BOOL bNoActivate ); ++}; ++ ++class TDESalInstance : public X11SalInstance ++{ ++public: ++ TDESalInstance( SalYieldMutex* pMutex ) ++ : X11SalInstance( pMutex ) {} ++ virtual ~TDESalInstance() {} ++ virtual SalFrame* CreateFrame( SalFrame* pParent, ULONG nStyle ); ++}; ++ ++class TDEXLib : public SalXLib ++{ ++ bool m_bStartupDone; ++ void* m_pApplication; ++ char** m_pFreeCmdLineArgs; ++ char** m_pAppCmdLineArgs; ++ int m_nFakeCmdLineArgs; ++public: ++ TDEXLib() : SalXLib(), ++ m_bStartupDone( false ), ++ m_pApplication( NULL ), ++ m_pFreeCmdLineArgs( NULL ), ++ m_pAppCmdLineArgs( NULL ), ++ m_nFakeCmdLineArgs( 0 ) ++ {} ++ virtual ~TDEXLib(); ++ virtual void Init(); ++ ++ void doStartup(); ++}; ++ ++#endif // _VCL_TDEDATA_HXX ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff -urN scp2/source/ooo/file_library_ooo.scp scp2/source/ooo/file_library_ooo.scp +--- scp2/source/ooo/file_library_ooo.scp 2010-11-11 09:08:07.000000000 -0600 ++++ scp2/source/ooo/file_library_ooo.scp 2011-08-19 03:12:08.329491869 -0500 +@@ -463,6 +463,24 @@ + + #endif + ++#ifdef ENABLE_TDEAB ++File gid_File_Lib_Tdeab_1 ++ TXT_FILE_BODY; ++ Styles = (PACKED,UNO_COMPONENT); ++ RegistryID = gid_Starregistry_Services_Rdb; ++ Dir = SCP2_OOO_BIN_DIR; ++ Name = STRING(CONCAT2(libtdeab1,UNXSUFFIX)); ++End ++ ++File gid_File_Lib_Tdeab_Drv_1 ++ TXT_FILE_BODY; ++ Styles = (PACKED); ++ Dir = SCP2_OOO_BIN_DIR; ++ Name = STRING(CONCAT2(libtdeabdrv1,UNXSUFFIX)); ++End ++ ++#endif ++ + #ifdef MACOSX + File gid_File_Lib_Macab_1 + TXT_FILE_BODY; +diff -urN scp2/source/ooo/module_hidden_ooo.scp scp2/source/ooo/module_hidden_ooo.scp +--- scp2/source/ooo/module_hidden_ooo.scp 2010-12-14 09:40:37.000000000 -0600 ++++ scp2/source/ooo/module_hidden_ooo.scp 2011-08-19 03:13:34.946155129 -0500 +@@ -285,6 +285,8 @@ + gid_File_Lib_Evoab_2, + gid_File_Lib_Kab_1, + gid_File_Lib_Kab_Drv_1, ++ gid_File_Lib_Tdeab_1, ++ gid_File_Lib_Tdeab_Drv_1, + gid_File_Lib_Macab_1, + gid_File_Lib_Macab_Drv_1, + gid_File_Lib_Evtatt, +diff -urN postprocess/packregistry/makefile.mk postprocess/packregistry/makefile.mk +--- postprocess/packregistry/makefile.mk 2010-12-01 12:05:07.000000000 -0600 ++++ postprocess/packregistry/makefile.mk 2011-08-19 03:54:29.454469572 -0500 +@@ -336,6 +336,9 @@ + .IF "$(ENABLE_KAB)" == "TRUE" + MY_FILES_main += $(MY_MOD)/DataAccess/kab.xcu + .END ++.IF "$(ENABLE_TDEAB)" == "TRUE" ++MY_FILES_main += $(MY_MOD)/DataAccess/tdeab.xcu ++.END + .IF "$(SYSTEM_MOZILLA)" != "YES" && "$(WITH_MOZILLA)" != "NO" && \ + "$(OS)" != "MACOSX" + .IF "$(OS)" == "WNT" +diff -urN connectivity/version.mk connectivity/version.mk +--- connectivity/version.mk 2010-11-11 09:30:07.000000000 -0600 ++++ connectivity/version.mk 2011-08-19 03:55:43.470147349 -0500 +@@ -101,6 +101,16 @@ + # the micro + KAB_MICRO=0 + ++# ----------------------------Tdeab settings-------------------------------------# ++# target ++TDEAB_TARGET=tdeab ++ ++# the major ++TDEAB_MAJOR=1 ++# the minor ++TDEAB_MINOR=0 ++# the micro ++TDEAB_MICRO=0 + + # ----------------------------Macab settings-------------------------------------# + # target +diff -urN fpicker/source/generic/fpicker.cxx fpicker/source/generic/fpicker.cxx +--- fpicker/source/generic/fpicker.cxx 2010-11-11 09:30:08.000000000 -0600 ++++ fpicker/source/generic/fpicker.cxx 2011-08-19 19:55:13.344690587 -0500 +@@ -64,6 +64,8 @@ + return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDEFilePicker")); + else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("kde4")) + return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDE4FilePicker")); ++ else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("tde")) ++ return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.TDEFilePicker")); + else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("macosx")) + return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.AquaFilePicker")); + #endif +@@ -139,6 +141,8 @@ + return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.GtkFolderPicker")); + else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("kde")) + return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDEFolderPicker")); ++ else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("tde")) ++ return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.TDEFolderPicker")); + else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("macosx")) + return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.AquaFolderPicker")); + #endif +diff -urN vcl/unx/source/desktopdetect/desktopdetector.cxx vcl/unx/source/desktopdetect/desktopdetector.cxx +--- vcl/unx/source/desktopdetect/desktopdetector.cxx 2010-11-11 09:22:48.000000000 -0600 ++++ vcl/unx/source/desktopdetect/desktopdetector.cxx 2011-08-19 21:10:45.481110576 -0500 +@@ -49,12 +49,13 @@ + DESKTOP_NONE = 0, + DESKTOP_UNKNOWN, + DESKTOP_GNOME, ++ DESKTOP_TDE, + DESKTOP_KDE, + DESKTOP_KDE4, + DESKTOP_CDE + }; + +-static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "CDE" }; ++static const char * desktop_strings[] = { "none", "unknown", "GNOME", "TDE", "KDE", "KDE4", "CDE" }; + + static bool is_gnome_desktop( Display* pDisplay ) + { +@@ -218,6 +219,15 @@ + return false; + } + ++static bool is_tde_desktop( Display* pDisplay ) ++{ ++ if ( NULL != getenv( "TDE_FULL_SESSION" ) ) ++ { ++ return true; ++ } ++ return false; ++} ++ + static bool is_kde4_desktop( Display* pDisplay ) + { + if ( NULL != getenv( "KDE_FULL_SESSION" ) ) +@@ -265,6 +275,8 @@ + + if ( aOver.equalsIgnoreAsciiCase( "cde" ) ) + aRet.appendAscii( desktop_strings[DESKTOP_CDE] ); ++ if ( aOver.equalsIgnoreAsciiCase( "tde" ) ) ++ aRet.appendAscii( desktop_strings[DESKTOP_TDE] ); + if ( aOver.equalsIgnoreAsciiCase( "kde4" ) ) + aRet.appendAscii( desktop_strings[DESKTOP_KDE4] ); + if ( aOver.equalsIgnoreAsciiCase( "gnome" ) ) +@@ -319,7 +331,9 @@ + { + XErrorHandler pOldHdl = XSetErrorHandler( autodect_error_handler ); + +- if ( is_kde4_desktop( pDisplay ) ) ++ if ( is_tde_desktop( pDisplay ) ) ++ aRet.appendAscii( desktop_strings[DESKTOP_TDE] ); ++ else if ( is_kde4_desktop( pDisplay ) ) + aRet.appendAscii( desktop_strings[DESKTOP_KDE4] ); + else if ( is_gnome_desktop( pDisplay ) ) + aRet.appendAscii( desktop_strings[DESKTOP_GNOME] ); diff -urN libreoffice-build/patches/unittesting/unittesting-vcl.diff libreoffice-build/patches/unittesting/unittesting-vcl.diff --- libreoffice-build/patches/unittesting/unittesting-vcl.diff 2010-11-11 08:41:39.000000000 -0600 +++ libreoffice-build/patches/unittesting/unittesting-vcl.diff 2011-08-18 22:40:48.267879029 -0500 @@ -10,7 +10,7 @@ +++ vcl/prj/build.lst @@ -47,4 +47,3 @@ vc vcl\mac\source\window nmake - m vc__winm vc_inc NULL vc vcl\mac\source\src nmake - m vc__srcm vc_inc NULL - vc vcl\util nmake - all vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL + vc vcl\util nmake - all vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__tde.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL vc vcl\util\linksvp nmake - u vc_lsvp vc_util NULL -vc vcl\workben nmake - all vc_wrkb vc_util vc_salmain NULL diff --git vcl/prj/tests.lst vcl/prj/tests.lst Binary files new.ORIGINAL.FROMARCHIVE.UNTOUCHABLE/libreoffice_3.3.2-1ubuntu4.debian.tar.gz and new.trinity.latest/libreoffice_3.3.2-1ubuntu4.debian.tar.gz differ