summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-10-30 21:38:42 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-10-30 21:38:42 -0500
commita6ba6e4cf3ddacf76a6513492a90b7fc0f02e027 (patch)
tree14cb262a29ba1ca00999f820c87ac8f0e8c890dd
parentbfb8895e56527b719d72c9c16a8ac6254b23e6cf (diff)
downloadtde-a6ba6e4cf3ddacf76a6513492a90b7fc0f02e027.tar.gz
tde-a6ba6e4cf3ddacf76a6513492a90b7fc0f02e027.zip
Add LibreOffice GIT HEAD patch filev3.5.13
-rw-r--r--main/thirdparty/libreoffice/git_10_28_2011/patches/libreoffice-trinity.diff16171
1 files changed, 16171 insertions, 0 deletions
diff --git a/main/thirdparty/libreoffice/git_10_28_2011/patches/libreoffice-trinity.diff b/main/thirdparty/libreoffice/git_10_28_2011/patches/libreoffice-trinity.diff
new file mode 100644
index 000000000..fccd9f4e6
--- /dev/null
+++ b/main/thirdparty/libreoffice/git_10_28_2011/patches/libreoffice-trinity.diff
@@ -0,0 +1,16171 @@
+diff --git a/Repository.mk b/Repository.mk
+index 5fab1b5..f123f3b 100644
+--- a/Repository.mk
++++ b/Repository.mk
+@@ -229,6 +229,7 @@ $(eval $(call gb_Helper_register_libraries,OOOLIBS, \
+ vclplug_gtk \
+ vclplug_gtk3 \
+ vclplug_kde \
++ vclplug_tde \
+ vclplug_kde4 \
+ vclplug_svp \
+ visioimport \
+diff --git a/bin/distro-install-file-lists b/bin/distro-install-file-lists
+index b233030..23f2504 100755
+--- a/bin/distro-install-file-lists
++++ b/bin/distro-install-file-lists
+@@ -211,6 +211,13 @@ if test "z$OOO_VENDOR" != "zDebian" ; then
+ mv_file_between_flists kde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libkabdrv1.so
+ add_used_directories kde_list.txt common_list.txt
+
++ # tde subpackage
++ test -f $DESTDIR/gid_Module_Optional_Tde && cp $DESTDIR/gid_Module_Optional_Tde tde_list.txt || :
++ mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/program/tdefilepicker
++ mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/fps_tde.uno.so
++ mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libvclplug_tdel..so
++ mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libtdeabdrv1.so
++
+ # create kde4 subpackage
+ mv_file_between_flists kde4_list.txt kde_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/kde4be1.uno.so
+ mv_file_between_flists kde4_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libvclplug_kde4l..so
+@@ -416,6 +423,7 @@ else
+ create_package_directory gid_Module_Optional_Pyuno pkg/python-uno
+ create_package_directory gid_Module_Optional_Gnome pkg/libreoffice-gnome
+ create_package_directory gid_Module_Optional_Kde pkg/libreoffice-kde
++ create_package_directory gid_Module_Optional_Tde pkg/libreoffice-tde
+
+ create_package_directory gid_Module_Root_Files_2 pkg/libreoffice-common
+ create_package_directory gid_Module_Root_Files_3 pkg/libreoffice-common
+@@ -494,7 +502,7 @@ else
+ fi &&
+ ( cd pkg/libreoffice-common/$d
+ find -maxdepth 1 \
+- -regex '\./\(.*\.so.*\|.*\.bin\|pagein\|nsplugin\|kdefilepicker\|msfontextract\|.*\.rdb\|javaldx\|uri-encode\)' \
++ -regex '\./\(.*\.so.*\|.*\.bin\|pagein\|nsplugin\|kdefilepicker\|tdefilepicker\|msfontextract\|.*\.rdb\|javaldx\|uri-encode\)' \
+ -exec mv {} $DESTDIR/pkg/libreoffice-core/$d \;
+ ); \
+ done
+diff --git a/configure.in b/configure.in
+index 3b48331..2888cbb 100644
+--- a/configure.in
++++ b/configure.in
+@@ -381,6 +381,15 @@ AC_ARG_ENABLE(kdeab,
+ 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,
+ AS_HELP_STRING([--enable-kde4],
+ [Determines whether to use Qt4/KDE4 vclplug on platforms where Qt4 and
+@@ -1554,6 +1563,7 @@ solaris*)
+ test_gtk=yes
+ build_gstreamer=yes
+ test_kde=yes
++ test_tde=yes
+ test_freetype=yes
+ test_gstreamer=yes
+ _os=SunOS
+@@ -1587,6 +1597,7 @@ linux-gnu*|k*bsd*-gnu*)
+ test_gtk=yes
+ build_gstreamer=yes
+ test_kde=yes
++ test_tde=yes
+ test_kde4=yes
+ test_freetype=yes
+ test_unix_quickstarter=yes
+@@ -1659,6 +1670,7 @@ freebsd*)
+ test_gtk=yes
+ build_gstreamer=yes
+ test_kde=yes
++ test_tde=yes
+ test_kde4=yes
+ test_freetype=yes
+ AC_MSG_CHECKING([the FreeBSD operating system release])
+@@ -1703,6 +1715,7 @@ aix*)
+ openbsd*)
+ test_gtk=yes
+ test_kde=yes
++ test_tde=yes
+ test_freetype=yes
+ PTHREAD_CFLAGS="-D_THREAD_SAFE"
+ PTHREAD_LIBS="-pthread"
+@@ -1713,6 +1726,7 @@ dragonfly*)
+ test_gtk=yes
+ build_gstreamer=yes
+ test_kde=yes
++ test_tde=yes
+ test_kde4=yes
+ test_freetype=yes
+ PTHREAD_LIBS="-pthread"
+@@ -6941,6 +6955,13 @@ if test "x$enable_kde4" = "xyes"; then
+ 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
+@@ -7852,6 +7873,129 @@ AC_SUBST(KDE_GLIB_LIBS)
+ 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="tmoc"
++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, tmoc, no, [`dirname $qt_libdir`/bin:$QTDIR/bin:$PATH] )
++ if test "$MOC" = "no" ; then
++ AC_MSG_ERROR([TQt3 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])
+@@ -7908,6 +8052,33 @@ fi
+ 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 <kdeversion.h>
++
++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 --git a/connectivity/prj/build.lst b/connectivity/prj/build.lst
+index 9860897..be07edb 100644
+--- a/connectivity/prj/build.lst
++++ b/connectivity/prj/build.lst
+@@ -12,6 +12,7 @@ cn connectivity\source\drivers\mozab\mozillasrc nmake - all cn_mozab_moz
+ 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,4 +29,4 @@ cn connectivity\source\simpledbt nmake - all cn_simpledbt
+ 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\qa nmake - all cn_qa 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_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_flat cn_dbase cn_hsqldb cn_macab NULL
+diff --git a/connectivity/prj/d.lst b/connectivity/prj/d.lst
+index 1387da4..400ecaa 100644
+--- a/connectivity/prj/d.lst
++++ b/connectivity/prj/d.lst
+@@ -11,6 +11,7 @@
+ ..\source\drivers\adabas\*.xml %_DEST%\xml\*.xml
+ ..\source\drivers\ado\*.xml %_DEST%\xml\*.xml
+ ..\source\drivers\kab\*.xml %_DEST%\xml\*.xml
++..\source\drivers\tdeab\*.xml %_DEST%\xml\*.xml
+ ..\source\drivers\macab\*.xml %_DEST%\xml\*.xml
+ ..\source\drivers\file\*.xml %_DEST%\xml\*.xml
+ ..\source\drivers\flat\*.xml %_DEST%\xml\*.xml
+diff --git a/connectivity/source/drivers/tdeab/KCatalog.cxx b/connectivity/source/drivers/tdeab/KCatalog.cxx
+new file mode 100644
+index 0000000..262144e
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KCatalog.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_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 --git a/connectivity/source/drivers/tdeab/KCatalog.hxx b/connectivity/source/drivers/tdeab/KCatalog.hxx
+new file mode 100644
+index 0000000..ddfe1e9
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KCatalog.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * 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 --git a/connectivity/source/drivers/tdeab/KColumns.cxx b/connectivity/source/drivers/tdeab/KColumns.cxx
+new file mode 100644
+index 0000000..e61e457
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KColumns.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_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 --git a/connectivity/source/drivers/tdeab/KColumns.hxx b/connectivity/source/drivers/tdeab/KColumns.hxx
+new file mode 100644
+index 0000000..1919747
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KColumns.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * 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 --git a/connectivity/source/drivers/tdeab/KConnection.cxx b/connectivity/source/drivers/tdeab/KConnection.cxx
+new file mode 100644
+index 0000000..26824bf
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KConnection.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_connectivity.hxx"
++
++#include "KConnection.hxx"
++#include "KDatabaseMetaData.hxx"
++#include "KStatement.hxx"
++#include "KPreparedStatement.hxx"
++#include "KDriver.hxx"
++#include "KCatalog.hxx"
++#include <com/sun/star/sdbc/ColumnValue.hpp>
++#include <com/sun/star/sdbc/TransactionIsolation.hpp>
++#include <shell/tde_headers.h>
++
++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<KabConnection, KabConnection_BASE>((::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 --git a/connectivity/source/drivers/tdeab/KConnection.hxx b/connectivity/source/drivers/tdeab/KConnection.hxx
+new file mode 100644
+index 0000000..66b75d4
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KConnection.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_CONNECTION_HXX_
++#define _CONNECTIVITY_KAB_CONNECTION_HXX_
++
++#include <map>
++#include "OSubComponent.hxx"
++#include "connectivity/CommonTools.hxx"
++#include <com/sun/star/lang/XServiceInfo.hpp>
++#include <com/sun/star/sdbc/SQLWarning.hpp>
++#include <com/sun/star/sdbc/XWarningsSupplier.hpp>
++#include <com/sun/star/sdbc/XConnection.hpp>
++#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
++#include <comphelper/broadcasthelper.hxx>
++#include <cppuhelper/compbase3.hxx>
++
++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<KabConnection, KabConnection_BASE>
++ {
++ friend class OSubComponent<KabConnection, KabConnection_BASE>;
++
++ 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 --git a/connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx b/connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx
+new file mode 100644
+index 0000000..1bff0ea
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_connectivity.hxx"
++
++#include "KDatabaseMetaData.hxx"
++#include "kfields.hxx"
++#include "TDEInit.h"
++#include <shell/tde_headers.h>
++#include "FDatabaseMetaDataResultSet.hxx"
++#include "OTypeInfo.hxx"
++#include <com/sun/star/sdbc/ColumnValue.hpp>
++#include <com/sun/star/sdbc/ResultSetType.hpp>
++#include <com/sun/star/sdbc/TransactionIsolation.hpp>
++
++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;
++ TQString 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 );
++ TQString 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 --git a/connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx b/connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx
+new file mode 100644
+index 0000000..9ddc063
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_
++#define _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_
++
++#include "KConnection.hxx"
++#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
++#include <cppuhelper/implbase1.hxx>
++
++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 --git a/connectivity/source/drivers/tdeab/KDriver.cxx b/connectivity/source/drivers/tdeab/KDriver.cxx
+new file mode 100644
+index 0000000..cdf0463
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KDriver.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_connectivity.hxx"
++
++#include "KDriver.hxx"
++#include "TDEInit.h"
++#include "KConnection.hxx"
++
++/** === begin UNO includes === **/
++#include <com/sun/star/sdb/SQLContext.hpp>
++#include <com/sun/star/lang/NullPointerException.hpp>
++#include <com/sun/star/frame/XDesktop.hpp>
++/** === end UNO includes === **/
++#include <rtl/ustrbuf.hxx>
++#include <tools/diagnose_ex.h>
++#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 --git a/connectivity/source/drivers/tdeab/KDriver.hxx b/connectivity/source/drivers/tdeab/KDriver.hxx
+new file mode 100644
+index 0000000..b09a7d2
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KDriver.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_DRIVER_HXX_
++#define _CONNECTIVITY_KAB_DRIVER_HXX_
++
++/** === begin UNO includes === **/
++#include <com/sun/star/sdbc/XDriver.hpp>
++#include <com/sun/star/lang/XServiceInfo.hpp>
++#include <com/sun/star/frame/XTerminateListener.hpp>
++/** === end UNO includes === **/
++#include <cppuhelper/compbase3.hxx>
++#include <osl/module.h>
++
++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
++ <member>init</member> 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 <TRUE/> 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 <NULL/>
++ @precond m_hConnectorModule is not <NULL/>
++ */
++ 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 --git a/connectivity/source/drivers/tdeab/KPreparedStatement.cxx b/connectivity/source/drivers/tdeab/KPreparedStatement.cxx
+new file mode 100644
+index 0000000..12816c2
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KPreparedStatement.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_connectivity.hxx"
++
++#include "KPreparedStatement.hxx"
++#include "propertyids.hxx"
++#include <connectivity/dbexception.hxx>
++#include <connectivity/dbtools.hxx>
++#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<connectivity::OSQLColumns> 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 --git a/connectivity/source/drivers/tdeab/KPreparedStatement.hxx b/connectivity/source/drivers/tdeab/KPreparedStatement.hxx
+new file mode 100644
+index 0000000..25a7a01
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KPreparedStatement.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_
++#define _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_
++
++#include "KStatement.hxx"
++#include "KResultSetMetaData.hxx"
++#include <connectivity/FValue.hxx>
++#include <com/sun/star/sdbc/XParameters.hpp>
++#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
++#include <cppuhelper/implbase4.hxx>
++
++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 --git a/connectivity/source/drivers/tdeab/KResultSet.cxx b/connectivity/source/drivers/tdeab/KResultSet.cxx
+new file mode 100644
+index 0000000..a0d6b07
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KResultSet.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_connectivity.hxx"
++
++#include "KResultSet.hxx"
++#include "KResultSetMetaData.hxx"
++#include "KConnection.hxx"
++#include "kcondition.hxx"
++#include "korder.hxx"
++#include "kfields.hxx"
++#include <com/sun/star/beans/PropertyAttribute.hpp>
++#include <com/sun/star/sdbcx/CompareBookmark.hpp>
++#include "TConnection.hxx"
++#include <connectivity/dbexception.hxx>
++#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);
++ TQString 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<KabResultSetMetaData *>(m_xMetaData.get());
++ sal_Int32 nFieldNumber = pMeta->fieldAtColumn(columnIndex);
++
++ if (nFieldNumber == KAB_FIELD_REVISION)
++ {
++ TQDateTime 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)
++ {
++ TQString 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++)
++ {
++ TQString 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<KabResultSet*>(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 --git a/connectivity/source/drivers/tdeab/KResultSet.hxx b/connectivity/source/drivers/tdeab/KResultSet.hxx
+new file mode 100644
+index 0000000..d68f676
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KResultSet.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_RESULTSET_HXX_
++#define _CONNECTIVITY_KAB_RESULTSET_HXX_
++
++#include "KStatement.hxx"
++#include "KResultSetMetaData.hxx"
++#include <shell/tde_headers.h>
++#include <com/sun/star/sdbc/XRow.hpp>
++#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
++#include <com/sun/star/sdbc/XColumnLocate.hpp>
++#include <com/sun/star/sdbc/XResultSetUpdate.hpp>
++#include <com/sun/star/sdbc/XRowUpdate.hpp>
++#include <com/sun/star/sdbcx/XRowLocate.hpp>
++#include <com/sun/star/sdbcx/XDeleteRows.hpp>
++#include <cppuhelper/compbase12.hxx>
++
++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<KabResultSet>
++ {
++ 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 --git a/connectivity/source/drivers/tdeab/KResultSetMetaData.cxx b/connectivity/source/drivers/tdeab/KResultSetMetaData.cxx
+new file mode 100644
+index 0000000..08dfb05
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KResultSetMetaData.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_connectivity.hxx"
++
++#include "KResultSetMetaData.hxx"
++#include "kfields.hxx"
++#include "KDatabaseMetaData.hxx"
++#include <com/sun/star/sdbc/DataType.hpp>
++
++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<connectivity::OSQLColumns> &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();
++ TQString 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 --git a/connectivity/source/drivers/tdeab/KResultSetMetaData.hxx b/connectivity/source/drivers/tdeab/KResultSetMetaData.hxx
+new file mode 100644
+index 0000000..8a04fc0
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KResultSetMetaData.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_
++#define _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_
++
++#include "KConnection.hxx"
++#include <connectivity/CommonTools.hxx>
++#include <com/sun/star/sdbc/XResultSetMetaData.hpp>
++#include <cppuhelper/implbase1.hxx>
++#include <rtl/ref.hxx>
++
++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<sal_Int32> 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<connectivity::OSQLColumns> &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 --git a/connectivity/source/drivers/tdeab/KServices.cxx b/connectivity/source/drivers/tdeab/KServices.cxx
+new file mode 100644
+index 0000000..a82b756
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KServices.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_connectivity.hxx"
++
++#include "KDriver.hxx"
++#include <cppuhelper/factory.hxx>
++#include <osl/diagnose.h>
++
++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; i<Services.getLength(); ++i)
++ xNewKey->createKey(Services[i]);
++}
++
++
++//---------------------------------------------------------------------------------------
++struct ProviderRequest
++{
++ Reference< XSingleServiceFactory > xRet;
++ Reference< XMultiServiceFactory > const xServiceManager;
++ OUString const sImplementationName;
++
++ ProviderRequest(
++ void* pServiceManager,
++ sal_Char const* pImplementationName
++ )
++ : xServiceManager(reinterpret_cast<XMultiServiceFactory*>(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 --git a/connectivity/source/drivers/tdeab/KStatement.cxx b/connectivity/source/drivers/tdeab/KStatement.cxx
+new file mode 100644
+index 0000000..1301349
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KStatement.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_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 <connectivity/dbexception.hxx>
++#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<connectivity::OSQLColumns> 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<KabResultSetMetaData *>(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<KabCommonStatement*>(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 --git a/connectivity/source/drivers/tdeab/KStatement.hxx b/connectivity/source/drivers/tdeab/KStatement.hxx
+new file mode 100644
+index 0000000..c5f6564
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KStatement.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_STATEMENT_HXX_
++#define _CONNECTIVITY_KAB_STATEMENT_HXX_
++
++#include "KConnection.hxx"
++#include <list>
++#include "connectivity/sqliterator.hxx"
++#include "connectivity/sqlparse.hxx"
++#include <com/sun/star/sdbc/XStatement.hpp>
++#include <com/sun/star/util/XCancellable.hpp>
++#include <cppuhelper/compbase4.hxx>
++#include <cppuhelper/implbase1.hxx>
++#include <comphelper/proparrhlp.hxx>
++
++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<KabCommonStatement>
++
++ {
++ ::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 --git a/connectivity/source/drivers/tdeab/KTable.cxx b/connectivity/source/drivers/tdeab/KTable.cxx
+new file mode 100644
+index 0000000..6103ce9
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KTable.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_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 --git a/connectivity/source/drivers/tdeab/KTable.hxx b/connectivity/source/drivers/tdeab/KTable.hxx
+new file mode 100644
+index 0000000..608cf18
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KTable.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * 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 --git a/connectivity/source/drivers/tdeab/KTables.cxx b/connectivity/source/drivers/tdeab/KTables.cxx
+new file mode 100644
+index 0000000..f63aaa9
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KTables.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_connectivity.hxx"
++
++#include "KTables.hxx"
++#include "KTable.hxx"
++#include "KCatalog.hxx"
++#include "KConnection.hxx"
++#include <comphelper/types.hxx>
++
++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<KabCatalog&>(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<KabCatalog&>(m_rParent).refreshTables();
++}
++// -------------------------------------------------------------------------
++void KabTables::disposing(void)
++{
++m_xMetaData.clear();
++ OCollection::disposing();
++}
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/connectivity/source/drivers/tdeab/KTables.hxx b/connectivity/source/drivers/tdeab/KTables.hxx
+new file mode 100644
+index 0000000..8c1c036
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/KTables.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_TABLES_HXX_
++#define _CONNECTIVITY_KAB_TABLES_HXX_
++
++#include "connectivity/sdbcx/VCollection.hxx"
++#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
++
++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 --git a/connectivity/source/drivers/tdeab/TDEInit.cxx b/connectivity/source/drivers/tdeab/TDEInit.cxx
+new file mode 100644
+index 0000000..375b158
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/TDEInit.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_connectivity.hxx"
++#include "TDEInit.h"
++#include <osl/diagnose.h>
++#include <osl/process.h>
++#include <shell/tde_headers.h>
++
++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 TQChar are (currently) both 16 bits characters
++ TQString aLanguage(
++ (const TQChar *) 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 <code>0</code>, then no other code from this library
++ has to be called, else the results are unpredictable.
++
++ @return
++ <ul><li><code>0</code> if the TDE version is supportednon</li>
++ <li>a negative value if the version is too old</li>
++ <li>a positive value if the version is too new to know whether it works with this driver</li>
++ </ul>
++
++ #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 --git a/connectivity/source/drivers/tdeab/TDEInit.h b/connectivity/source/drivers/tdeab/TDEInit.h
+new file mode 100644
+index 0000000..350502d
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/TDEInit.h
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * 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 --git a/connectivity/source/drivers/tdeab/exports.dxp b/connectivity/source/drivers/tdeab/exports.dxp
+new file mode 100644
+index 0000000..9630d7e
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/exports.dxp
+@@ -0,0 +1,3 @@
++component_getImplementationEnvironment
++component_writeInfo
++component_getFactory
+diff --git a/connectivity/source/drivers/tdeab/kcondition.cxx b/connectivity/source/drivers/tdeab/kcondition.cxx
+new file mode 100644
+index 0000000..57d2745
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/kcondition.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_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
++{
++ TQString 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
++{
++ TQString 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
++{
++ TQString 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
++{
++ TQString 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
++{
++ TQString 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 --git a/connectivity/source/drivers/tdeab/kcondition.hxx b/connectivity/source/drivers/tdeab/kcondition.hxx
+new file mode 100644
+index 0000000..a8b729f
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/kcondition.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_CONDITION_HXX_
++#define _CONNECTIVITY_KAB_CONDITION_HXX_
++
++#include <comphelper/types.hxx>
++#include <shell/tde_headers.h>
++#include <connectivity/dbexception.hxx>
++
++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;
++
++ TQString 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 --git a/connectivity/source/drivers/tdeab/kfields.cxx b/connectivity/source/drivers/tdeab/kfields.cxx
+new file mode 100644
+index 0000000..2d375d7
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/kfields.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_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
++TQString 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)
++{
++ TQString 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 --git a/connectivity/source/drivers/tdeab/kfields.hxx b/connectivity/source/drivers/tdeab/kfields.hxx
+new file mode 100644
+index 0000000..2c5c63b
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/kfields.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_FIELDS_HXX_
++#define _CONNECTIVITY_KAB_FIELDS_HXX_
++
++#include <shell/tde_headers.h>
++#include <connectivity/dbexception.hxx>
++#include <rtl/ustring.hxx>
++
++#define KAB_FIELD_REVISION 0
++#define KAB_DATA_FIELDS 1
++
++namespace connectivity
++{
++ namespace kab
++ {
++ TQString 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 --git a/connectivity/source/drivers/tdeab/korder.cxx b/connectivity/source/drivers/tdeab/korder.cxx
+new file mode 100644
+index 0000000..994c41f
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/korder.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_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 = TQString::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 --git a/connectivity/source/drivers/tdeab/korder.hxx b/connectivity/source/drivers/tdeab/korder.hxx
+new file mode 100644
+index 0000000..8e62b79
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/korder.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _CONNECTIVITY_KAB_ORDER_HXX_
++#define _CONNECTIVITY_KAB_ORDER_HXX_
++
++#include "rtl/ustring.hxx"
++#include <shell/tde_headers.h>
++
++#include <vector>
++
++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;
++
++ TQString 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<KabOrder *> 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 --git a/connectivity/source/drivers/tdeab/makefile.mk b/connectivity/source/drivers/tdeab/makefile.mk
+new file mode 100644
+index 0000000..cde838a
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/makefile.mk
+@@ -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
++# <http://www.openoffice.org/license.html>
++# 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 --git a/connectivity/source/drivers/tdeab/tdeab.xcu b/connectivity/source/drivers/tdeab/tdeab.xcu
+new file mode 100644
+index 0000000..63b2761
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/tdeab.xcu
+@@ -0,0 +1,47 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--***********************************************************************
++ *
++ * 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************ -->
++<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema">
++ <node oor:name="Installed">
++ <node oor:name="sdbc:address:kab" oor:op="replace">
++ <prop oor:name="Driver">
++ <value>com.sun.star.comp.sdbc.kab.Driver</value>
++ </prop>
++ <prop oor:name="DriverTypeDisplayName" oor:type="xs:string">
++ <value xml:lang="en-US">TDE Address Book</value>
++ </prop>
++ <node oor:name="Features">
++ <node oor:name="EscapeDateTime" oor:op="replace">
++ <prop oor:name="Value" oor:type="xs:boolean">
++ <value>true</value>
++ </prop>
++ </node>
++ </node>
++ </node>
++ </node>
++</oor:component-data>
+diff --git a/connectivity/source/drivers/tdeab/tdeab.xml b/connectivity/source/drivers/tdeab/tdeab.xml
+new file mode 100644
+index 0000000..4deb1d1
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/tdeab.xml
+@@ -0,0 +1,77 @@
++<?xml version='1.0' encoding="UTF-8"?>
++<!DOCTYPE COMPONENTDESCRIPTION PUBLIC "-//W3C//DTD HTML 3.2//EN" "module-description.dtd">
++<module-description xmlns:xlink="http://www.w3.org/1999/xlink">
++ <module-name> kab1 </module-name>
++ <component-description>
++ <Author>Eric Bischoff</Author>
++ <Name>com.sun.star.comp.sdbc.kab.Driver</Name>
++ <description>This library implements the database driver for TDE address book formats.</description>
++ <loader-name>com.sun.star.loader.SharedLibrary</loader-name>
++ <language>c++</language>
++ <status value="final"/>
++ <supported-service>com.sun.star.sdbc.Driver</supported-service>
++ <service-dependency> ... </service-dependency>
++ </component-description>
++ <project-build-dependency> cppuhelper </project-build-dependency>
++ <project-build-dependency> cppu </project-build-dependency>
++ <project-build-dependency> sal </project-build-dependency>
++
++ <runtime-module-dependency> cppuhelper </runtime-module-dependency>
++ <runtime-module-dependency> cppu1 </runtime-module-dependency>
++ <runtime-module-dependency> sal1 </runtime-module-dependency>
++
++ <type> com.sun.star.registry.XRegistryKey </type>
++ <type> com.sun.star.util.XCancellable </type>
++ <type> com.sun.star.util.XNumberFormatter </type>
++ <type> com.sun.star.uno.TypeClass </type>
++ <type> com.sun.star.uno.XWeak </type>
++ <type> com.sun.star.uno.XAggregation </type>
++ <type> com.sun.star.uno.XComponentContext </type>
++ <type> com.sun.star.beans.PropertyAttribute </type>
++ <type> com.sun.star.beans.XPropertyState </type>
++ <type> com.sun.star.beans.XPropertySet </type>
++ <type> com.sun.star.beans.PropertyValue </type>
++ <type> com.sun.star.beans.XMultiPropertySet </type>
++ <type> com.sun.star.beans.XFastPropertySet </type>
++ <type> com.sun.star.lang.XSingleServiceFactory </type>
++ <type> com.sun.star.lang.XTypeProvider </type>
++ <type> com.sun.star.lang.XSingleComponentFactory </type>
++ <type> com.sun.star.lang.EventObject </type>
++ <type> com.sun.star.lang.XComponent </type>
++ <type> com.sun.star.lang.IllegalArgumentException </type>
++ <type> com.sun.star.lang.DisposedException </type>
++ <type> com.sun.star.lang.XMultiServiceFactory </type>
++ <type> com.sun.star.lang.XServiceInfo </type>
++ <type> com.sun.star.lang.XUnoTunnel </type>
++ <type> com.sun.star.java.XJavaThreadRegister_11 </type>
++ <type> com.sun.star.java.XJavaVM </type>
++ <type> com.sun.star.sdbc.FetchDirection </type>
++ <type> com.sun.star.sdbc.XConnection </type>
++ <type> com.sun.star.sdbc.XStatement </type>
++ <type> com.sun.star.sdbc.XResultSet </type>
++ <type> com.sun.star.sdbc.XResultSetMetaDataSupplier</type>
++ <type> com.sun.star.sdbc.XColumnLocate </type>
++ <type> com.sun.star.sdbc.XResultSetUpdate </type>
++ <type> com.sun.star.sdbc.XWarningsSupplier </type>
++ <type> com.sun.star.sdbc.XRowUpdate </type>
++ <type> com.sun.star.sdbc.XMultipleResults </type>
++ <type> com.sun.star.sdbc.XBatchExecution </type>
++ <type> com.sun.star.sdbc.XPreparedBatchExecution </type>
++ <type> com.sun.star.sdbc.XParameters </type>
++ <type> com.sun.star.sdbc.XOutParameters </type>
++ <type> com.sun.star.sdbc.DriverPropertyInfo </type>
++ <type> com.sun.star.sdbc.SQLWarning </type>
++ <type> com.sun.star.sdbc.XRow </type>
++ <type> com.sun.star.sdbc.ColumnSearch </type>
++ <type> com.sun.star.sdbc.ColumnValue </type>
++ <type> com.sun.star.sdbc.DataType </type>
++ <type> com.sun.star.sdbc.XDriver </type>
++ <type> com.sun.star.sdbc.TransactionIsolation </type>
++ <type> com.sun.star.sdbc.ResultSetType </type>
++ <type> com.sun.star.sdbc.ResultSetConcurrency </type>
++ <type> com.sun.star.sdbcx.XRowLocate </type>
++ <type> com.sun.star.sdbcx.XDeleteRows </type>
++ <type> com.sun.star.sdbcx.CompareBookmark </type>
++ <type> com.sun.star.sdb.XColumnUpdate </type>
++ <type> com.sun.star.sdb.XColumn </type>
++</module-description>
+diff --git a/connectivity/source/drivers/tdeab/tdeabdrv.map b/connectivity/source/drivers/tdeab/tdeabdrv.map
+new file mode 100644
+index 0000000..2c828d8
+--- /dev/null
++++ b/connectivity/source/drivers/tdeab/tdeabdrv.map
+@@ -0,0 +1,9 @@
++UDK_3_0_0 {
++ global:
++ createKabConnection;
++ initKApplication;
++ shutdownKApplication;
++ matchTDEVersion;
++ local:
++ *;
++};
+diff --git a/connectivity/source/inc/resource/tdeab_res.hrc b/connectivity/source/inc/resource/tdeab_res.hrc
+new file mode 100644
+index 0000000..ff6a7b2
+--- /dev/null
++++ b/connectivity/source/inc/resource/tdeab_res.hrc
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * 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 --git a/connectivity/version.mk b/connectivity/version.mk
+index fd2235c..9ff6151 100755
+--- a/connectivity/version.mk
++++ b/connectivity/version.mk
+@@ -101,6 +101,16 @@ KAB_MINOR=0
+ # 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 --git a/cui/Library_cui.mk b/cui/Library_cui.mk
+index 94d8a4a..1113ab0 100644
+--- a/cui/Library_cui.mk
++++ b/cui/Library_cui.mk
+@@ -41,6 +41,7 @@ $(eval $(call gb_Library_set_include,cui,\
+ $(eval $(call gb_Library_add_defs,cui,\
+ $(if $(filter TRUE,$(ENABLE_GTK)),-DENABLE_GTK) \
+ $(if $(filter TRUE,$(ENABLE_KDE)),-DENABLE_KDE) \
++ $(if $(filter TRUE,$(ENABLE_TDE)),-DENABLE_TDE) \
+ $(if $(filter TRUE,$(ENABLE_KDE4)),-DENABLE_KDE4) \
+ ))
+
+diff --git a/cui/source/options/optgdlg.cxx b/cui/source/options/optgdlg.cxx
+index e08dcc7..8237c02 100644
+--- a/cui/source/options/optgdlg.cxx
++++ b/cui/source/options/optgdlg.cxx
+@@ -153,6 +153,14 @@ namespace
+ 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(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ui.dialogs.SystemFilePicker") );
+ #elif (defined MACOSX && defined QUARTZ)
+diff --git a/desktop/Pagein_common.mk b/desktop/Pagein_common.mk
+index 3b0330c..e119474 100644
+--- a/desktop/Pagein_common.mk
++++ b/desktop/Pagein_common.mk
+@@ -46,6 +46,7 @@ $(eval $(call desktop_Pagein_add_libs,common,\
+ vclplug_gen \
+ $(if $(findstring TRUE,$(ENABLE_GTK)),vclplug_gtk) \
+ $(if $(findstring TRUE,$(ENABLE_KDE)),vclplug_kde) \
++ $(if $(findstring TRUE,$(ENABLE_TDE)),vclplug_tde) \
+ basegfx \
+ sot \
+ xcr \
+diff --git a/fpicker/prj/build.lst b/fpicker/prj/build.lst
+index 114a301..b4f0898f 100644
+--- a/fpicker/prj/build.lst
++++ b/fpicker/prj/build.lst
+@@ -7,8 +7,10 @@ fp fpicker\source\unx\gnome nmake - u fp_gnome_filepicker fp_inc NULL
+ 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
+diff --git a/fpicker/prj/d.lst b/fpicker/prj/d.lst
+index 71ec565..bef8b71 100644
+--- a/fpicker/prj/d.lst
++++ b/fpicker/prj/d.lst
+@@ -5,6 +5,7 @@ mkdir: %COMMON_DEST%\bin\hid
+ ..\%__SRC%\bin\f*.res %_DEST%\bin\
+ ..\%__SRC%\bin\f*.dll %_DEST%\bin\
+ ..\%__SRC%\bin\kdefilepicker %_DEST%\bin\kdefilepicker
++..\%__SRC%\bin\tdefilepicker %_DEST%\bin\tdefilepicker
+ ..\%__SRC%\lib\f*.so %_DEST%\lib\
+ ..\%__SRC%\lib\*.dylib %_DEST%\lib\*.dylib
+
+diff --git a/fpicker/source/generic/fpicker.cxx b/fpicker/source/generic/fpicker.cxx
+index 1444fde..fa5b2ec 100644
+--- a/fpicker/source/generic/fpicker.cxx
++++ b/fpicker/source/generic/fpicker.cxx
+@@ -65,6 +65,8 @@ static OUString FilePicker_getSystemPickerServiceName()
+ 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"));
+ else
+@@ -141,6 +143,8 @@ static OUString FolderPicker_getSystemPickerServiceName()
+ 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 --git a/fpicker/source/unx/kde/makefile.mk b/fpicker/source/unx/kde/makefile.mk
+index 1548d7b..768c946 100644
+--- a/fpicker/source/unx/kde/makefile.mk
++++ b/fpicker/source/unx/kde/makefile.mk
+@@ -29,8 +29,8 @@ PRJ=..$/..$/..
+
+ PRJNAME=fpicker
+ TARGET=kdefilepicker
+-LIBTARGET=NO
+ ENABLE_EXCEPTIONS=TRUE
++LIBTARGET=NO
+ EXTERNAL_WARNINGS_NOT_ERRORS=TRUE
+
+ # --- Settings -----------------------------------------------------
+@@ -63,7 +63,7 @@ SLOFILES =\
+
+ APP1TARGET=$(TARGET)
+ APP1OBJS=$(SLOFILES)
+-APP1RPATH=OOO
++APP1RPATH=BRAND
+ APP1LINKFLAGS=$(KDE_LIBS) -lkio -lX11
+ APP1STDLIBS=$(SALLIB)
+
+diff --git a/fpicker/source/unx/tde/makefile.mk b/fpicker/source/unx/tde/makefile.mk
+new file mode 100644
+index 0000000..26d7979
+--- /dev/null
++++ b/fpicker/source/unx/tde/makefile.mk
+@@ -0,0 +1,78 @@
++#*************************************************************************
++#
++# 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
++# <http://www.openoffice.org/license.html>
++# for a copy of the LGPLv3 License.
++#
++#*************************************************************************
++
++PRJ=..$/..$/..
++
++PRJNAME=fpicker
++TARGET=tdefilepicker
++ENABLE_EXCEPTIONS=TRUE
++LIBTARGET=NO
++EXTERNAL_WARNINGS_NOT_ERRORS=TRUE
++
++# --- 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)
++
++.IF "$(COM)" == "GCC"
++CFLAGSCXX+=-Wno-shadow
++.ENDIF
++
++# --- Files --------------------------------------------------------
++
++SLOFILES =\
++ $(SLO)$/tdecommandthread.obj \
++ $(SLO)$/tdefilepicker.obj \
++ $(SLO)$/tdefilepicker.moc.obj \
++ $(SLO)$/tdefpmain.obj \
++ $(SLO)$/tdemodalityfilter.obj
++
++APP1TARGET=$(TARGET)
++APP1OBJS=$(SLOFILES)
++APP1RPATH=OOO
++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 --git a/fpicker/source/unx/tde/tdecommandthread.cxx b/fpicker/source/unx/tde/tdecommandthread.cxx
+new file mode 100644
+index 0000000..8da50d2
+--- /dev/null
++++ b/fpicker/source/unx/tde/tdecommandthread.cxx
+@@ -0,0 +1,183 @@
++/* -*- 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#include <cstddef>
++
++#include <tdecommandthread.hxx>
++
++#include <tqstringlist.h>
++
++#include <kapplication.h>
++
++#if OSL_DEBUG_LEVEL > 1
++#include <iostream>
++#endif
++
++//////////////////////////////////////////////////////////////////////////
++// CommandEvent
++//////////////////////////////////////////////////////////////////////////
++
++TDECommandEvent::TDECommandEvent( const TQString &qCommand, TQStringList *pStringList )
++ : TQCustomEvent( 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( TQWidget *pObject )
++ : m_pObject( pObject )
++{
++}
++
++TDECommandThread::~TDECommandThread()
++{
++}
++
++void TDECommandThread::run()
++{
++ TQTextIStream qStream( stdin );
++ qStream.setEncoding( TQTextStream::UnicodeUTF8 );
++
++ TQString qLine;
++ bool bQuit = false;
++ while ( !bQuit && !qStream.atEnd() )
++ {
++ qLine = qStream.readLine();
++ handleCommand( qLine, bQuit );
++ }
++}
++
++void TDECommandThread::handleCommand( const TQString &rString, bool &bQuit )
++{
++ TQMutexLocker qMutexLocker( &m_aMutex );
++
++#if OSL_DEBUG_LEVEL > 1
++ ::std::cerr << "tdefilepicker received: " << rString.latin1() << ::std::endl;
++#endif
++
++ bQuit = false;
++ TQStringList *pTokens = tokenize( rString );
++
++ if ( !pTokens )
++ return;
++ if ( pTokens->empty() )
++ {
++ delete pTokens, pTokens = NULL;
++ return;
++ }
++
++ TQString qCommand = pTokens->front();
++ pTokens->pop_front();
++
++ if ( qCommand == "exit" )
++ {
++ bQuit = true;
++ kapp->exit();
++ kapp->wakeUpGuiThread();
++ _exit(0); // FIXME This prevents a SIGABRT on some systems Why?
++ }
++ else
++ kapp->postEvent( m_pObject, new TDECommandEvent( qCommand, pTokens ) );
++}
++
++TQStringList* TDECommandThread::tokenize( const TQString &rString )
++{
++ // Commands look like:
++ // command arg1 arg2 arg3 ...
++ // Args may be enclosed in '"', if they contain spaces.
++
++ TQStringList *pList = new TQStringList();
++
++ TQString qBuffer;
++ qBuffer.reserve( 1024 );
++
++ const TQChar *pUnicode = rString.unicode();
++ const TQChar *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 --git a/fpicker/source/unx/tde/tdecommandthread.hxx b/fpicker/source/unx/tde/tdecommandthread.hxx
+new file mode 100644
+index 0000000..8697de9
+--- /dev/null
++++ b/fpicker/source/unx/tde/tdecommandthread.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _TDECOMMANDTHREAD_HXX_
++#define _TDECOMMANDTHREAD_HXX_
++
++#include <tqevent.h>
++#include <tqmutex.h>
++#include <tqthread.h>
++
++class TDECommandEvent : public TQCustomEvent
++{
++public:
++ enum CommandEventType {
++ Unknown = 0,
++
++ AppendControl,
++ EnableControl,
++ GetValue,
++ SetValue,
++
++ AppendFilter,
++ AppendFilterGroup,
++ UpdateFilters,
++ GetCurrentFilter,
++ SetCurrentFilter,
++
++ GetDirectory,
++ SetDirectory,
++
++ GetFiles,
++
++ SetTitle,
++ SetType,
++ SetDefaultName,
++ SetMultiSelection,
++
++ Exec
++ };
++ static const TQEvent::Type TypeId = (TQEvent::Type) ( (int) TQEvent::User + 42 /*random magic value*/ );
++
++protected:
++ CommandEventType m_eCommand;
++
++public:
++ TDECommandEvent( const TQString &qCommand, TQStringList *pStringList );
++
++ CommandEventType command() const { return m_eCommand; }
++ TQStringList* stringList() { return static_cast< TQStringList* >( data() ); }
++};
++
++class TDECommandThread : public TQThread
++{
++protected:
++ TQObject *m_pObject;
++
++ TQMutex m_aMutex;
++
++public:
++ TDECommandThread( TQWidget *pObject );
++ virtual ~TDECommandThread();
++
++ virtual void run();
++
++protected:
++ void handleCommand( const TQString &rString, bool &bQuit );
++ TQStringList* tokenize( const TQString &rString );
++};
++
++#endif // _TDECOMMANDTHREAD_HXX_
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/fpicker/source/unx/tde/tdefilepicker.cxx b/fpicker/source/unx/tde/tdefilepicker.cxx
+new file mode 100644
+index 0000000..46ab20d
+--- /dev/null
++++ b/fpicker/source/unx/tde/tdefilepicker.cxx
+@@ -0,0 +1,735 @@
++/* -*- 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#include <cstddef>
++
++#include <tdecommandthread.hxx>
++#include <tdefilepicker.hxx>
++
++#include <tqcheckbox.h>
++#include <tqcombobox.h>
++#include <tqgrid.h>
++#include <tqhbox.h>
++#include <tqlabel.h>
++#include <tqlayout.h>
++#include <tqobjectlist.h>
++#include <tqpushbutton.h>
++#include <tqregexp.h>
++#include <tqvbox.h>
++
++#ifdef TQT_NO_EMIT
++#define emit
++#endif
++
++#include <kdeversion.h>
++#include <kdiroperator.h>
++#include <kfiledialog.h>
++#include <kfilefiltercombo.h>
++#include <kio/netaccess.h>
++#include <klocale.h>
++#include <kmessagebox.h>
++#include <ktempfile.h>
++
++#include <algorithm>
++#include <iostream>
++
++//////////////////////////////////////////////////////////////////////////
++// TDEFileDialog
++//////////////////////////////////////////////////////////////////////////
++
++TDEFileDialog::TDEFileDialog( const TQString &startDir, const TQString &filter,
++ TQWidget *parent, const char *name )
++ : KFileDialog( startDir, filter, parent, name, true, m_pCustomWidget = new TQVBox() ),
++ m_pCombosAndButtons( new TQHBox( m_pCustomWidget ) ),
++ m_pLabels( new TQVBox( m_pCombosAndButtons ) ),
++ m_pComboBoxes( new TQVBox( m_pCombosAndButtons ) ),
++ m_pPushButtons( new TQVBox( m_pCombosAndButtons ) ),
++ m_pCheckBoxes( new TQGrid( 2, m_pCustomWidget ) ),
++ m_bIsSave( false ),
++ m_bIsExecuting( false ),
++ m_bCanNotifySelection( true )
++{
++ connect( this, TQT_SIGNAL( fileHighlighted( const TQString & ) ),
++ this, TQT_SLOT( fileHighlightedCommand( const TQString & ) ) );
++
++ connect( this, TQT_SIGNAL( selectionChanged() ),
++ this, TQT_SLOT( selectionChangedCommand() ) );
++
++ m_pCustomWidget->setSpacing( KDialog::spacingHint() );
++ m_pCombosAndButtons->setSpacing( KDialog::spacingHint() );
++
++ updateCustomWidgetLayout();
++}
++
++TDEFileDialog::~TDEFileDialog()
++{
++}
++
++void TDEFileDialog::resizeEvent( TQResizeEvent *pEvent )
++{
++ KFileDialog::resizeEvent( pEvent );
++
++ updateCustomWidgetLayout();
++}
++
++void TDEFileDialog::showEvent( TQShowEvent *pEvent )
++{
++ KFileDialog::showEvent( pEvent );
++
++ updateCustomWidgetLayout();
++}
++
++void TDEFileDialog::updateCustomWidgetLayout()
++{
++ TQPoint qReferencePoint = filterWidget->mapTo( this, TQPoint( 0, 0 ) );
++ TQPoint qCustomPoint = m_pCustomWidget->mapTo( this, TQPoint( 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( TQCustomEvent *pEvent )
++{
++ if ( pEvent && pEvent->type() == TDECommandEvent::TypeId )
++ {
++ TDECommandEvent *pCommandEvent = static_cast< TDECommandEvent* >( pEvent );
++ TQStringList *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 )
++ {
++ TQStringList 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 )
++ {
++ TQStringList::const_iterator it = pStringList->begin();
++ ++it; // We ignore the filter group name
++
++ while ( it != pStringList->end() )
++ {
++ TQString qTitle = *it;
++ ++it;
++ if ( it != pStringList->end() )
++ {
++ appendFilter( qTitle, (*it) );
++ ++it;
++ }
++ }
++
++ // update the filters widget
++ setFilter( filters() );
++ }
++ break;
++ case TDECommandEvent::GetCurrentFilter:
++ {
++ TQString 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:
++ {
++ TQString 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:
++ {
++ TQString qString;
++ qString.reserve( 1024 );
++
++ qString.append( "files" );
++
++ if ( result() == TQDialog::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 )
++ {
++ TQString 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() );
++ TQString qProtocol( qLocalSelectedURL.protocol() );
++
++ if ( isSave() && result() == TQDialog::Accepted )
++ {
++ if ( qProtocol == "file" )
++ {
++ TQString 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() == TQDialog::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() == TQDialog::Accepted )
++ sendCommand( "accept" );
++ else
++ sendCommand( "reject" );
++ }
++ break;
++ default:
++ break;
++ }
++
++ // FIXME Some cleanup of pEvent? delete something, etc.?
++ }
++}
++
++void TDEFileDialog::appendControl( const TQString &rId, const TQString &rType, const TQString &rTitle )
++{
++ TQString qLabel( rTitle );
++ qLabel.replace( '~', '&' );
++
++ if ( rType == "checkbox" )
++ {
++ TQCheckBox *pCheckBox = new TQCheckBox( qLabel, m_pCheckBoxes, rId.utf8() );
++
++ pCheckBox->setEnabled( true );
++ pCheckBox->setChecked( false );
++ }
++ else if ( rType == "listbox" )
++ {
++ TQLabel *pComboLabel = new TQLabel( qLabel, m_pLabels );
++ TQComboBox *pComboBox = new TQComboBox( m_pComboBoxes, rId.utf8() );
++
++ pComboLabel->setBuddy( pComboBox );
++ pComboBox->setEnabled( true );
++ }
++ else if ( rType == "pushbutton" )
++ {
++ TQPushButton *pPushButton = new TQPushButton( qLabel, m_pPushButtons, rId.utf8() );
++ pPushButton->setEnabled( true );
++ }
++}
++
++TQWidget* TDEFileDialog::findControl( const TQString &rId ) const
++{
++ TQObjectList *pList = m_pCustomWidget->queryList();
++ TQCString qName( rId.utf8() );
++ TQObjectList::const_iterator it = pList->begin();
++
++ for ( ; it != pList->end() && qName != (*it)->name(); ++it )
++ ;
++
++ TQWidget *pWidget = NULL;
++ if ( it != pList->end() )
++ pWidget = static_cast< TQWidget* >( *it );
++
++ delete pList;
++
++ return pWidget;
++}
++
++void TDEFileDialog::enableControl( const TQString &rId, const TQString &rValue )
++{
++ TQWidget *pWidget = findControl( rId );
++
++ if ( pWidget )
++ pWidget->setEnabled( rValue.lower() == "true" );
++}
++
++void TDEFileDialog::getValue( const TQString &rId, const TQString &rAction )
++{
++ TQWidget *pWidget = findControl( rId );
++ TQString qString;
++ qString.reserve( 1024 );
++ qString.append( "value" );
++
++ if ( pWidget )
++ {
++ TQCString qClassName = pWidget->className();
++ if ( qClassName == TQCHECKBOX_OBJECT_NAME_STRING )
++ {
++ TQCheckBox *pCheckBox = static_cast< TQCheckBox* >( pWidget );
++
++ if ( pCheckBox->isChecked() )
++ qString.append( " bool true" );
++ else
++ qString.append( " bool false" );
++ }
++ else if ( qClassName == TQCOMBOBOX_OBJECT_NAME_STRING )
++ {
++ TQComboBox *pComboBox = static_cast< TQComboBox* >( 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( TQString().setNum( pComboBox->currentItem() ) );
++ }
++ // TODO getHelpURL
++ }
++ // TODO push button
++ }
++
++ sendCommand( qString );
++}
++
++void TDEFileDialog::setValue( const TQString &rId, const TQString &rAction, const TQStringList &rValue )
++{
++ TQWidget *pWidget = findControl( rId );
++
++ if ( pWidget )
++ {
++ TQCString qClassName = pWidget->className();
++ if ( qClassName == TQCHECKBOX_OBJECT_NAME_STRING )
++ {
++ TQCheckBox *pCheckBox = static_cast< TQCheckBox* >( pWidget );
++
++ bool bValue = ( !rValue.isEmpty() ) && ( rValue.front().lower() == "true" );
++ pCheckBox->setChecked( bValue );
++ }
++ else if ( qClassName == TQCOMBOBOX_OBJECT_NAME_STRING )
++ {
++ TQComboBox *pComboBox = static_cast< TQComboBox* >( 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 TQString &rTitle, const TQString &rFilter )
++{
++ // Filters are separated by ';'
++ TQString qFilter( rFilter );
++ qFilter.replace( TQChar( ';' ), TQChar( ' ' ) ).replace( "*.*", "*" );
++
++ // Workaround for too wide <All formats> (*.bmp;...) entry
++ TQString qTitle( rTitle );
++ qTitle.replace( TQRegExp( "^<([^>]*)> \\(.*" ), "<\\1>" );
++
++ m_aFilters.push_back( qMakePair( qTitle, qFilter ) );
++}
++
++TQString TDEFileDialog::filters() const
++{
++ TQString 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;
++}
++
++TQString TDEFileDialog::addExtension( const TQString &rFileName ) const
++{
++ if ( !isSave() )
++ return rFileName;
++
++ TQString qExtension;
++
++ TQWidget *pExtensionWidget = findControl( "100" ); // CHECKBOX_AUTOEXTENSION
++ TQCheckBox *pExtensionCB = pExtensionWidget? static_cast< TQCheckBox* >( pExtensionWidget->qt_cast( TQCHECKBOX_OBJECT_NAME_STRING ) ): NULL;
++ if ( pExtensionCB && pExtensionCB->isChecked() )
++ {
++ // FIXME: qFilter can be a MIME; we ignore it now...
++ TQStringList qFilterList = TQStringList::split( " ", currentFilter() );
++ for ( TQStringList::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 TQString &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<TDEFileDialog*>( 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<TDEFileDialog*>( this ) ) );
++ if ( qMostLocalPath.isLocalFile() )
++ {
++ qMostLocalPath.addPath( rURL.fileName() );
++ return qMostLocalPath;
++ }
++ }
++#endif
++
++ return rURL;
++}
++
++TQString TDEFileDialog::localCopy( const TQString &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( TQString::null, ( nExtensionPos < 0 )? TQString(): 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 TQString::null;
++ }
++
++ return qDestURL.url();
++}
++
++void TDEFileDialog::fileHighlightedCommand( const TQString & )
++{
++ if ( canNotifySelection() )
++ {
++ sendCommand( "fileSelectionChanged" );
++ setCanNotifySelection( false );
++ }
++}
++
++void TDEFileDialog::selectionChangedCommand()
++{
++ if ( canNotifySelection() )
++ {
++ sendCommand( "fileSelectionChanged" );
++ setCanNotifySelection( false );
++ }
++}
++
++void TDEFileDialog::sendCommand( const TQString &rCommand )
++{
++#if OSL_DEBUG_LEVEL > 1
++ ::std::cerr << "tdefilepicker sent: " << rCommand.latin1() << ::std::endl;
++#endif
++
++ //m_aOutputStream << rCommand << endl;
++ ::std::cout << rCommand.utf8() << ::std::endl;
++}
++
++void TDEFileDialog::appendURL( TQString &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
++ TQString 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( TQString &rBuffer, const TQString &rString )
++{
++ const TQChar *pUnicode = rString.unicode();
++ const TQChar *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( '"' );
++}
++
++TQString TDEFileDialog::escapeString( const TQString &rString )
++{
++ TQString qString;
++ qString.reserve( 2*rString.length() + 2 ); // every char escaped + quotes
++
++ appendEscaped( qString, rString );
++
++ return qString;
++}
++
++
++void TDEFileFilterComboHack::setCurrentFilter( const TQString& 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 --git a/fpicker/source/unx/tde/tdefilepicker.hxx b/fpicker/source/unx/tde/tdefilepicker.hxx
+new file mode 100644
+index 0000000..f411db5
+--- /dev/null
++++ b/fpicker/source/unx/tde/tdefilepicker.hxx
+@@ -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 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _TDEFILEPICKER_HXX_
++#define _TDEFILEPICKER_HXX_
++
++#include <cstddef>
++
++#include <kfiledialog.h>
++#include <kfilefiltercombo.h>
++
++class TQGrid;
++class TQHBox;
++class TQVBox;
++
++class TDEFileDialog : public KFileDialog
++{
++ Q_OBJECT
++
++protected:
++ typedef TQPair< TQString, TQString > FilterEntry;
++ typedef TQValueList< FilterEntry > FilterList;
++
++ TQVBox *m_pCustomWidget;
++ TQHBox *m_pCombosAndButtons;
++
++ TQVBox *m_pLabels;
++ TQVBox *m_pComboBoxes;
++ TQVBox *m_pPushButtons;
++
++ TQGrid *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 TQString &startDir, const TQString &filter,
++ TQWidget *parent, const char *name );
++ virtual ~TDEFileDialog();
++
++protected:
++ virtual void resizeEvent( TQResizeEvent *pEvent );
++ virtual void showEvent( TQShowEvent *pEvent );
++ void updateCustomWidgetLayout();
++
++ virtual void customEvent( TQCustomEvent *pEvent );
++
++protected:
++ void appendControl( const TQString &rId, const TQString &rType, const TQString &rTitle );
++ TQWidget* findControl( const TQString &rId ) const;
++ void enableControl( const TQString &rId, const TQString &rValue );
++ void getValue( const TQString &rId, const TQString &rAction );
++ void setValue( const TQString &rId, const TQString &rAction, const TQStringList &rValue );
++
++ void appendFilter( const TQString &rTitle, const TQString &rFilter );
++ TQString filters() const;
++ TQString addExtension( const TQString &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 TQString &rProtocol ) const;
++ KURL mostLocalURL( const KURL &rURL ) const;
++ TQString localCopy( const TQString &rFileName ) const;
++
++ void setCanNotifySelection( bool bCanNotifySelection ) { m_bCanNotifySelection = bCanNotifySelection; }
++ bool canNotifySelection( void ) const { return m_bCanNotifySelection; }
++
++protected slots:
++ void fileHighlightedCommand( const TQString & );
++ void selectionChangedCommand();
++
++protected:
++ void sendCommand( const TQString &rCommand );
++ void appendURL( TQString &rBuffer, const KURL &rURL );
++ void appendEscaped( TQString &rBuffer, const TQString &rString );
++ TQString escapeString( const TQString &rString );
++};
++
++class TDEFileFilterComboHack : public KFileFilterCombo
++{
++public:
++ void setCurrentFilter( const TQString& filter );
++};
++
++#endif // _TDEFILEPICKER_HXX_
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/fpicker/source/unx/tde/tdefpmain.cxx b/fpicker/source/unx/tde/tdefpmain.cxx
+new file mode 100644
+index 0000000..eb20aa3
+--- /dev/null
++++ b/fpicker/source/unx/tde/tdefpmain.cxx
+@@ -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 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#include <cstddef>
++
++#include <tdemodalityfilter.hxx>
++#include <tdefilepicker.hxx>
++#include <tdecommandthread.hxx>
++
++#include <kaboutdata.h>
++#include <kapplication.h>
++#include <kcmdlineargs.h>
++
++#include <iostream>
++#include <stdlib.h>
++
++//////////////////////////////////////////////////////////////////////////
++// Main
++//////////////////////////////////////////////////////////////////////////
++
++static KCmdLineOptions sOptions[] =
++{
++ { "winid <argument>", 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, TQString(), 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 --git a/fpicker/source/unx/tde/tdemodalityfilter.cxx b/fpicker/source/unx/tde/tdemodalityfilter.cxx
+new file mode 100644
+index 0000000..6ced314
+--- /dev/null
++++ b/fpicker/source/unx/tde/tdemodalityfilter.cxx
+@@ -0,0 +1,70 @@
++/* -*- 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#include <cstddef>
++
++#include <tdemodalityfilter.hxx>
++
++#include <kapplication.h>
++#include <kdialogbase.h>
++
++#include <netwm.h>
++#include <X11/Xlib.h>
++#include <X11/Xutil.h>
++
++//////////////////////////////////////////////////////////////////////////
++// Modality filter
++//////////////////////////////////////////////////////////////////////////
++
++TDEModalityFilter::TDEModalityFilter( WId nWinId )
++ : m_nWinId( nWinId )
++{
++ kapp->installEventFilter( this );
++}
++
++TDEModalityFilter::~TDEModalityFilter()
++{
++ kapp->removeEventFilter( this );
++}
++
++bool TDEModalityFilter::eventFilter( TQObject *pObject, TQEvent *pEvent )
++{
++ if ( pObject->isWidgetType() && pEvent->type() == TQEvent::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 --git a/fpicker/source/unx/tde/tdemodalityfilter.hxx b/fpicker/source/unx/tde/tdemodalityfilter.hxx
+new file mode 100644
+index 0000000..b00f9a3
+--- /dev/null
++++ b/fpicker/source/unx/tde/tdemodalityfilter.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _TDEMODALITYFILTER_HXX_
++#define _TDEMODALITYFILTER_HXX_
++
++#include <tqobject.h>
++
++class TDEModalityFilter : public TQObject
++{
++private:
++ WId m_nWinId;
++
++public:
++ TDEModalityFilter( WId nWinId );
++ virtual ~TDEModalityFilter();
++
++ virtual bool eventFilter( TQObject *pObject, TQEvent *pEvent );
++};
++
++#endif // _TDEMODALITYFILTER_HXX_
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/fpicker/source/unx/tde_unx/FPServiceInfo.hxx b/fpicker/source/unx/tde_unx/FPServiceInfo.hxx
+new file mode 100644
+index 0000000..2dcbe6d
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/FPServiceInfo.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * 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"
++// <Implementation-Name></UNO/SERVICES/><Service-Name>
++#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 --git a/fpicker/source/unx/tde_unx/UnxCommandThread.cxx b/fpicker/source/unx/tde_unx/UnxCommandThread.cxx
+new file mode 100644
+index 0000000..e6ae0bb
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/UnxCommandThread.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#include <UnxCommandThread.hxx>
++#include <UnxNotifyThread.hxx>
++
++#include <rtl/ustring.hxx>
++#include <rtl/ustrbuf.hxx>
++
++#include <unistd.h>
++#include <string.h>
++#include <iostream>
++
++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 --git a/fpicker/source/unx/tde_unx/UnxCommandThread.hxx b/fpicker/source/unx/tde_unx/UnxCommandThread.hxx
+new file mode 100644
+index 0000000..41b82bd
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/UnxCommandThread.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _UNXCOMMANDTHREAD_HXX_
++#define _UNXCOMMANDTHREAD_HXX_
++
++#include <com/sun/star/uno/Any.hxx>
++#include <com/sun/star/uno/Sequence.hxx>
++
++#include <osl/conditn.hxx>
++#include <osl/mutex.hxx>
++#include <osl/thread.hxx>
++#include <rtl/ustring.hxx>
++
++#include <vcl/svapp.hxx>
++
++#include <list>
++
++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 --git a/fpicker/source/unx/tde_unx/UnxFPentry.cxx b/fpicker/source/unx/tde_unx/UnxFPentry.cxx
+new file mode 100644
+index 0000000..bd4582d
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/UnxFPentry.cxx
+@@ -0,0 +1,112 @@
++/* -*- 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#include <com/sun/star/container/XSet.hpp>
++
++#include <cppuhelper/factory.hxx>
++#include <osl/diagnose.h>
++
++#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 ) ) );
++}
++
++extern "C"
++{
++
++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(RTL_CONSTASCII_USTRINGPARAM( FILE_PICKER_REGKEY_NAME ) ));
++ }
++ catch( InvalidRegistryException& )
++ {
++ OSL_FAIL( "InvalidRegistryException caught" );
++ bRetVal = sal_False;
++ }
++ }
++
++ return bRetVal;
++}
++
++//////////////////////////////////////////////////////////////////////////
++//
++//////////////////////////////////////////////////////////////////////////
++
++SAL_DLLPUBLIC_EXPORT 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 ) ) )
++// if ( pSrvManager && ( 0 == rtl_str_compare( pImplName, FILE_PICKER_SERVICE_NAME ) ) )
++ {
++ Sequence< OUString > aSNS( 1 );
++ aSNS.getArray( )[0] = OUString(RTL_CONSTASCII_USTRINGPARAM( 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 --git a/fpicker/source/unx/tde_unx/UnxFilePicker.cxx b/fpicker/source/unx/tde_unx/UnxFilePicker.cxx
+new file mode 100644
+index 0000000..c2a5ca8
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/UnxFilePicker.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#include <com/sun/star/lang/DisposedException.hpp>
++#include <com/sun/star/lang/XMultiServiceFactory.hpp>
++#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
++#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
++#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
++#include <com/sun/star/ui/dialogs/ControlActions.hpp>
++
++#include <FPServiceInfo.hxx>
++
++#include <cppuhelper/interfacecontainer.h>
++#include <osl/diagnose.h>
++#include <rtl/ustring.hxx>
++#include <rtl/ustrbuf.hxx>
++#include <tools/resmgr.hxx>
++
++#include <svtools/svtools.hrc>
++#include <UnxFilePicker.hxx>
++#include <UnxCommandThread.hxx>
++#include <UnxNotifyThread.hxx>
++
++#include <vcl/svapp.hxx>
++#include <vcl/sysdata.hxx>
++#include <vcl/syswin.hxx>
++#include <vcl/window.hxx>
++
++#include <sys/wait.h>
++#include <unistd.h>
++#include <fcntl.h>
++#include <stdio.h>
++
++#include <iostream>
++
++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<rtl::OUString> SAL_CALL FilePicker_getSupportedServiceNames()
++ {
++ uno::Sequence<rtl::OUString> 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<lang::XMultiServiceFactory>& 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<XFilePickerListener>& 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<XFilePickerListener>& 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<beans::StringPair> &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_Int16> 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<uno::Any> &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> 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
++ char pFname[1024]; snprintf(pFname, sizeof pFname, "%s/%s", getenv("OLDPWD"), "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 --git a/fpicker/source/unx/tde_unx/UnxFilePicker.hxx b/fpicker/source/unx/tde_unx/UnxFilePicker.hxx
+new file mode 100644
+index 0000000..4e0b526
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/UnxFilePicker.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _UNXFILEPICKER_HXX_
++#define _UNXFILEPICKER_HXX_
++
++#include <cppuhelper/compbase8.hxx>
++#include <osl/conditn.hxx>
++#include <osl/mutex.hxx>
++#include <rtl/ustrbuf.hxx>
++
++#include <com/sun/star/lang/XInitialization.hpp>
++#include <com/sun/star/lang/XServiceInfo.hpp>
++#include <com/sun/star/ui/dialogs/XFilePickerNotifier.hpp>
++#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
++#include <com/sun/star/ui/dialogs/XFilterGroupManager.hpp>
++#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
++#include <com/sun/star/ui/dialogs/XFilePreview.hpp>
++#include <com/sun/star/util/XCancellable.hpp>
++
++#include <list>
++
++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 --git a/fpicker/source/unx/tde_unx/UnxNotifyThread.cxx b/fpicker/source/unx/tde_unx/UnxNotifyThread.cxx
+new file mode 100644
+index 0000000..3bc96b1
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/UnxNotifyThread.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#include <UnxNotifyThread.hxx>
++#include <UnxFilePicker.hxx>
++
++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 --git a/fpicker/source/unx/tde_unx/UnxNotifyThread.hxx b/fpicker/source/unx/tde_unx/UnxNotifyThread.hxx
+new file mode 100644
+index 0000000..9f5d1a5
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/UnxNotifyThread.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _UNXNOTIFYTHREAD_HXX_
++#define _UNXNOTIFYTHREAD_HXX_
++
++#include <com/sun/star/ui/dialogs/XFilePickerListener.hpp>
++#include <com/sun/star/uno/Reference.hxx>
++
++#include <osl/conditn.hxx>
++#include <osl/mutex.hxx>
++#include <osl/thread.hxx>
++
++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 --git a/fpicker/source/unx/tde_unx/fps_tde.component b/fpicker/source/unx/tde_unx/fps_tde.component
+new file mode 100644
+index 0000000..e7a201d
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/fps_tde.component
+@@ -0,0 +1,35 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--**********************************************************************
++*
++* 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
++* <http://www.openoffice.org/license.html>
++* for a copy of the LGPLv3 License.
++*
++**********************************************************************-->
++
++<component loader="com.sun.star.loader.SharedLibrary"
++ xmlns="http://openoffice.org/2010/uno-components">
++ <implementation name="com.sun.star.ui.dialogs.UnxFilePicker">
++ <service name="com.sun.star.ui.dialogs.TDEFilePicker"/>
++ </implementation>
++</component>
+diff --git a/fpicker/source/unx/tde_unx/fps_tde.xml b/fpicker/source/unx/tde_unx/fps_tde.xml
+new file mode 100644
+index 0000000..fc1ed68
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/fps_tde.xml
+@@ -0,0 +1,51 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE module-description PUBLIC "-//StarOffice//DTD ComponentDescription 1.0//EN" "module-description.dtd">
++<module-description xmlns:xlink="http://www.w3.org/1999/xlink">
++ <module-name>fps_tde</module-name>
++ <component-description>
++ <author> Jan Holesovsky </author>
++ <name> com.sun.star.comp.ui.dialogs.FilePicker </name>
++ <description>
++ The TDE implementation of the FilePicker service.
++ </description>
++ <loader-name>com.sun.star.loader.SharedLibrary</loader-name>
++ <language> c++ </language>
++ <status value="beta"/>
++ <supported-service> com.sun.star.ui.dialogs.FilePicker </supported-service>
++ <service-dependency>...</service-dependency>
++ <type> com.sun.star.ui.dialogs.XExecutableDialog </type>
++ <type> com.sun.star.ui.dialogs.XFilePicker </type>
++ <type> com.sun.star.ui.dialogs.XFilterManager </type>
++ <type> com.sun.star.ui.dialogs.XFilterGroupManager </type>
++ <type> com.sun.star.ui.dialogs.XFilePickerListener </type>
++ <type> com.sun.star.ui.dialogs.ExecutableDialogException </type>
++ <type> com.sun.star.ui.dialogs.XFilePickerNotifier </type>
++ <type> com.sun.star.ui.dialogs.XFilePickerControlAccess </type>
++ <type> com.sun.star.ui.dialogs.XFilePreview </type>
++ <type> com.sun.star.ui.dialogs.ExtendedFilePickerElementIds </type>
++ <type> com.sun.star.ui.dialogs.ExecutableDialogResults </type>
++ <type> com.sun.star.ui.dialogs.FilePickerEvent </type>
++ <type> com.sun.star.ui.dialogs.CommonFilePickerElementIds </type>
++ <type> com.sun.star.ui.dialogs.ListboxControlActions </type>
++ <type> com.sun.star.ui.dialogs.TemplateDescription </type>
++ <type> com.sun.star.ui.dialogs.FilePreviewImageFormats </type>
++ <type> com.sun.star.util.XCancellable </type>
++ <type> com.sun.star.lang.XComponent </type>
++ <type> com.sun.star.lang.XMultiServiceFactory </type>
++ <type> com.sun.star.lang.XSingleServiceFactory </type>
++ <type> com.sun.star.lang.XServiceInfo </type>
++ <type> com.sun.star.lang.XTypeProvider </type>
++ <type> com.sun.star.lang.IllegalArgumentException </type>
++ <type> com.sun.star.uno.TypeClass </type>
++ <type> com.sun.star.uno.XWeak </type>
++ <type> com.sun.star.uno.XAggregation </type>
++ <type> com.sun.star.registry.XRegistryKey </type>
++ <type> com.sun.star.container.XSet </type>
++ </component-description>
++ <project-build-dependency> cppuhelper </project-build-dependency>
++ <project-build-dependency> cppu </project-build-dependency>
++ <project-build-dependency> sal </project-build-dependency>
++ <runtime-module-dependency> cppuhelper </runtime-module-dependency>
++ <runtime-module-dependency> cppu2 </runtime-module-dependency>
++ <runtime-module-dependency> sal2 </runtime-module-dependency>
++</module-description>
+diff --git a/fpicker/source/unx/tde_unx/makefile.mk b/fpicker/source/unx/tde_unx/makefile.mk
+new file mode 100644
+index 0000000..196c948
+--- /dev/null
++++ b/fpicker/source/unx/tde_unx/makefile.mk
+@@ -0,0 +1,86 @@
++#*************************************************************************
++#
++# 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
++# <http://www.openoffice.org/license.html>
++# 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
++
++ALLTAR : $(MISC)/fps_tde.component
++
++$(MISC)/fps_tde.component .ERRREMOVE : $(SOLARENV)/bin/createcomponent.xslt \
++ fps_tde.component
++ $(XSLTPROC) --nonet --stringparam uri \
++ '$(COMPONENTPREFIX_BASIS_NATIVE)$(SHL1TARGETN:f)' -o $@ \
++ $(SOLARENV)/bin/createcomponent.xslt fps_tde.component
+diff --git a/postprocess/packcomponents/makefile.mk b/postprocess/packcomponents/makefile.mk
+index b983928..a47e9c6 100644
+--- a/postprocess/packcomponents/makefile.mk
++++ b/postprocess/packcomponents/makefile.mk
+@@ -235,6 +235,10 @@ my_components += kab1
+ my_components += kdebe1
+ .END
+
++.IF "$(ENABLE_TDE)" != ""
++my_components += tdebe1
++.END
++
+ .IF "$(ENABLE_KDE4)" != ""
+ my_components += kde4be1
+ .END
+@@ -354,6 +358,10 @@ my_components += fps_gnome
+ my_components += fps_kde4
+ .END
+
++.IF "$(ENABLE_TDE)" != ""
++my_components += fps_tde
++.END
++
+ .IF "$(OS)" != "WNT"
+ my_components += cmdmail
+ .END
+diff --git a/postprocess/packregistry/makefile.mk b/postprocess/packregistry/makefile.mk
+index d82c9ef..a3a6de4 100644
+--- a/postprocess/packregistry/makefile.mk
++++ b/postprocess/packregistry/makefile.mk
+@@ -328,6 +328,9 @@ MY_FILES_main += \
+ .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 --git a/scp2/prj/build.lst b/scp2/prj/build.lst
+index f225c3e..41be4f3 100644
+--- a/scp2/prj/build.lst
++++ b/scp2/prj/build.lst
+@@ -14,6 +14,7 @@ cp scp2\source\graphicfilter nmake - all cp_graphicfilter cp_langm
+ 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\xsltfilter nmake - all cp_xsltfilter cp_langmacr
+ 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 --git a/scp2/source/ooo/file_library_ooo.scp b/scp2/source/ooo/file_library_ooo.scp
+index d83d6cf..fe378e1 100644
+--- a/scp2/source/ooo/file_library_ooo.scp
++++ b/scp2/source/ooo/file_library_ooo.scp
+@@ -425,6 +425,24 @@ End
+
+ #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;
+@@ -525,6 +543,23 @@ File gid_File_Bin_KdeFilePicker
+ End
+ #endif
+ #endif
++#ifdef ENABLE_TDE
++#ifndef MACOSX
++File gid_File_Lib_Fps_Tde
++ TXT_FILE_BODY;
++ Styles = (PACKED);
++ Dir = SCP2_OOO_BIN_DIR;
++ Name = SPECIAL_COMPONENT_LIB_NAME(fps_tde.uno);
++End
++File gid_File_Bin_TdeFilePicker
++ BIN_FILE_BODY;
++ Styles = (PACKED);
++ Dir = gid_Brand_Dir_Program;
++ Name = "tdefilepicker";
++End
++#endif
++#endif
++
+ #endif
+
+ #ifdef QUARTZ
+@@ -992,6 +1027,17 @@ File gid_File_Lib_Vclplug_Kde4
+ 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 --git a/scp2/source/ooo/file_ooo.scp b/scp2/source/ooo/file_ooo.scp
+index 34ed8a9..5291d0d 100644
+--- a/scp2/source/ooo/file_ooo.scp
++++ b/scp2/source/ooo/file_ooo.scp
+@@ -169,6 +169,13 @@ File gid_File_Bin_Kde_Open_Url
+ Styles = (PACKED);
+ End
+
++File gid_File_Bin_Tde_Open_Url
++ BIN_FILE_BODY;
++ Dir = gid_Brand_Dir_Program;
++ Name = "tde-open-url";
++ Styles = (PACKED);
++End
++
+ File gid_File_Bin_Cde_Open_Url
+ BIN_FILE_BODY;
+ Dir = gid_Brand_Dir_Program;
+diff --git a/scp2/source/ooo/makefile.mk b/scp2/source/ooo/makefile.mk
+index ce2ab52..0b8d12b 100644
+--- a/scp2/source/ooo/makefile.mk
++++ b/scp2/source/ooo/makefile.mk
+@@ -84,6 +84,14 @@ SCPDEFS+=-DENABLE_KDE4
+ 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 --git a/scp2/source/ooo/module_hidden_ooo.scp b/scp2/source/ooo/module_hidden_ooo.scp
+index 20d9b16..fce92ce 100644
+--- a/scp2/source/ooo/module_hidden_ooo.scp
++++ b/scp2/source/ooo/module_hidden_ooo.scp
+@@ -84,6 +84,7 @@ Module gid_Module_Root_Files_2
+ Styles = (HIDDEN_ROOT);
+ Files = (gid_File_Bin_Cde_Open_Url,
+ 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,
+@@ -277,6 +278,7 @@ Module gid_Module_Root_Files_4
+ gid_File_Lib_Vclplug_Gen,
+ 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,
+@@ -348,6 +350,8 @@ Module gid_Module_Root_Files_5
+ gid_File_Lib_Emboleobj,
+ 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 --git a/scp2/source/tde/file_tde.scp b/scp2/source/tde/file_tde.scp
+new file mode 100644
+index 0000000..6387a57
+--- /dev/null
++++ b/scp2/source/tde/file_tde.scp
+@@ -0,0 +1,37 @@
++/*************************************************************************
++ *
++ * 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
++ * <http://www.openoffice.org/license.html>
++ * 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));
++End
++#endif
+diff --git a/scp2/source/tde/makefile.mk b/scp2/source/tde/makefile.mk
+new file mode 100644
+index 0000000..78d5728
+--- /dev/null
++++ b/scp2/source/tde/makefile.mk
+@@ -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
++# <http://www.openoffice.org/license.html>
++# 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 --git a/scp2/source/tde/module_tde.scp b/scp2/source/tde/module_tde.scp
+new file mode 100644
+index 0000000..9fdfecd
+--- /dev/null
++++ b/scp2/source/tde/module_tde.scp
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * 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 --git a/scp2/source/tde/module_tde.ulf b/scp2/source/tde/module_tde.ulf
+new file mode 100644
+index 0000000..e55735f
+--- /dev/null
++++ b/scp2/source/tde/module_tde.ulf
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * 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 --git a/scp2/util/makefile.mk b/scp2/util/makefile.mk
+index 1d6d694..c59e04c 100644
+--- a/scp2/util/makefile.mk
++++ b/scp2/util/makefile.mk
+@@ -200,6 +200,12 @@ SCP1FILES += \
+ module_kde.par \
+ file_kde.par
+ .ENDIF
++
++.IF "$(ENABLE_TDE)" == "TRUE"
++SCP1FILES += \
++ module_tde.par \
++ file_tde.par
++.ENDIF
+ .ENDIF
+
+ .IF "$(ENABLE_CRASHDUMP)" != ""
+diff --git a/set_soenv.in b/set_soenv.in
+index dc2d996..e0d7c39 100755
+--- a/set_soenv.in
++++ b/set_soenv.in
+@@ -1546,6 +1546,10 @@ ToFile( "KDE_GLIB_CFLAGS", "@KDE_GLIB_CFLAGS@", "e" );
+ 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 --git a/setup_native/source/packinfo/packinfo_office.txt b/setup_native/source/packinfo/packinfo_office.txt
+index 63bb1fe..c5bb1d1 100644
+--- a/setup_native/source/packinfo/packinfo_office.txt
++++ b/setup_native/source/packinfo/packinfo_office.txt
+@@ -48,6 +48,21 @@ packageversion = "%OOOPACKAGEVERSION"
+ 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 --git a/shell/inc/tde_headers.h b/shell/inc/tde_headers.h
+new file mode 100644
+index 0000000..91f59f9
+--- /dev/null
++++ b/shell/inc/tde_headers.h
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * 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
++
++
++/* ********* TQt headers */
++#include <tqaccessible.h>
++#include <tqcheckbox.h>
++#include <tqcombobox.h>
++#include <tqfont.h>
++#include <tqframe.h>
++#include <tqlineedit.h>
++#include <tqlistview.h>
++#include <tqmainwindow.h>
++#include <tqmenudata.h>
++#include <tqpaintdevice.h>
++#include <tqpainter.h>
++#include <tqpushbutton.h>
++#include <tqradiobutton.h>
++#include <tqrangecontrol.h>
++#include <tqstring.h>
++#include <tqtabbar.h>
++#include <tqtabwidget.h>
++#include <tqtoolbar.h>
++#include <tqtoolbutton.h>
++#include <tqwidget.h>
++#include <tqprogressbar.h>
++
++/* ********* See hack on top of this file */
++#undef Region
++
++
++/* ********* TDE base headers */
++#include <kaboutdata.h>
++#include <kapplication.h>
++#include <kcmdlineargs.h>
++#include <kconfig.h>
++#include <kdeversion.h>
++#include <kemailsettings.h>
++#include <kglobal.h>
++#include <kglobalsettings.h>
++#include <klocale.h>
++#include <kmainwindow.h>
++#include <kmenubar.h>
++#include <kprotocolmanager.h>
++#include <kstartupinfo.h>
++#include <kstyle.h>
++
++
++/* ********* TDE address book connectivity headers */
++#include <kabc/addressbook.h>
++#include <kabc/addressee.h>
++#include <kabc/field.h>
++#include <kabc/stdaddressbook.h>
++
++
++#endif
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/shell/prj/build.lst b/shell/prj/build.lst
+index 6dc5270..700c989 100644
+--- a/shell/prj/build.lst
++++ b/shell/prj/build.lst
+@@ -25,5 +25,6 @@ sl shell\source\backends\macbe nmake - u sl_backends_m
+ 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_win32_zipfile.w sl_win32_ooofilereader.w sl_win32_shlxthandler_util.w sl_all sl_inc NULL
+diff --git a/shell/prj/d.lst b/shell/prj/d.lst
+index 62dfa80..7665b62 100644
+--- a/shell/prj/d.lst
++++ b/shell/prj/d.lst
+@@ -15,6 +15,7 @@
+ ..\%__SRC%\bin\open-url %_DEST%\bin\open-url
+ ..\%__SRC%\bin\cde-open-url %_DEST%\bin\cde-open-url
+ ..\%__SRC%\bin\kde-open-url %_DEST%\bin\kde-open-url
++..\%__SRC%\bin\tde-open-url %_DEST%\bin\tde-open-url
+ ..\%__SRC%\bin\gnome-open-url %_DEST%\bin\gnome-open-url
+ ..\%__SRC%\bin\gnome-open-url.bin %_DEST%\bin\gnome-open-url.bin
+ ..\%__SRC%\bin\senddoc %_DEST%\bin\senddoc
+@@ -27,7 +28,9 @@
+ ..\%__SRC%\misc\gconfbe1.component %_DEST%\xml\gconfbe1.component
+ ..\%__SRC%\misc\kde4be1.component %_DEST%\xml\kde4be1.component
+ ..\%__SRC%\misc\kdebe1.component %_DEST%\xml\kdebe1.component
++..\%__SRC%\misc\tdebe1.component %_DEST%\xml\tdebe1.component
+ ..\inc\kde_headers.h %_DEST%\inc\shell\kde_headers.h
++..\inc\tde_headers.h %_DEST%\inc\shell\tde_headers.h
+ ..\%__SRC%\misc\localebe1.component %_DEST%\xml\localebe1.component
+ ..\%__SRC%\misc\macbe1.component %_DEST%\xml\macbe1.component
+ ..\%__SRC%\misc\smplmail.component %_DEST%\xml\smplmail.component
+diff --git a/shell/source/backends/tdebe/makefile.mk b/shell/source/backends/tdebe/makefile.mk
+new file mode 100644
+index 0000000..5243da4
+--- /dev/null
++++ b/shell/source/backends/tdebe/makefile.mk
+@@ -0,0 +1,88 @@
++#*************************************************************************
++#
++# 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
++# <http://www.openoffice.org/license.html>
++# 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
++
++# 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
++
++ALLTAR : $(MISC)/tdebe1.component
++
++$(MISC)/tdebe1.component .ERRREMOVE : $(SOLARENV)/bin/createcomponent.xslt \
++ tdebe1.component
++ $(XSLTPROC) --nonet --stringparam uri \
++ '$(COMPONENTPREFIX_BASIS_NATIVE)$(SHL1TARGETN:f)' -o $@ \
++ $(SOLARENV)/bin/createcomponent.xslt tdebe1.component
+diff --git a/shell/source/backends/tdebe/tdeaccess.cxx b/shell/source/backends/tdebe/tdeaccess.cxx
+new file mode 100644
+index 0000000..1dbd64f
+--- /dev/null
++++ b/shell/source/backends/tdebe/tdeaccess.cxx
+@@ -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
++* <http://www.openoffice.org/license.html>
++* 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;
++ TQString 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")))
++ {
++ TQFont 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")))
++ {
++ TQFont aFixedFont;
++ TQString 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")))
++ {
++ TQString aDocumentsDir( KGlobalSettings::documentPath() );
++ rtl::OUString sDocumentsDir;
++ rtl::OUString sDocumentsURL;
++ if ( aDocumentsDir.endsWith(TQChar('/')) )
++ 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")))
++ {
++ TQString 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")))
++ {
++ TQString 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")))
++ {
++ TQString 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")))
++ {
++ TQString 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")))
++ {
++ TQString 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")))
++ {
++ TQString 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"))) {
++ TQString 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 --git a/shell/source/backends/tdebe/tdeaccess.hxx b/shell/source/backends/tdebe/tdeaccess.hxx
+new file mode 100644
+index 0000000..5029c12
+--- /dev/null
++++ b/shell/source/backends/tdebe/tdeaccess.hxx
+@@ -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
++* <http://www.openoffice.org/license.html>
++* 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 --git a/shell/source/backends/tdebe/tdebackend.cxx b/shell/source/backends/tdebe/tdebackend.cxx
+new file mode 100644
+index 0000000..19eaa60
+--- /dev/null
++++ b/shell/source/backends/tdebe/tdebackend.cxx
+@@ -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
++* <http://www.openoffice.org/license.html>
++* 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 --git a/shell/source/backends/tdebe/tdebe1.component b/shell/source/backends/tdebe/tdebe1.component
+new file mode 100755
+index 0000000..9eb7ca2
+--- /dev/null
++++ b/shell/source/backends/tdebe/tdebe1.component
+@@ -0,0 +1,35 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--**********************************************************************
++*
++* 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
++* <http://www.openoffice.org/license.html>
++* for a copy of the LGPLv3 License.
++*
++**********************************************************************-->
++
++<component loader="com.sun.star.loader.SharedLibrary"
++ xmlns="http://openoffice.org/2010/uno-components">
++ <implementation name="com.sun.star.comp.configuration.backend.TDEBackend">
++ <service name="com.sun.star.configuration.backend.TDEBackend"/>
++ </implementation>
++</component>
+diff --git a/shell/source/unix/misc/makefile.mk b/shell/source/unix/misc/makefile.mk
+index 840f372..df4efa8 100644
+--- a/shell/source/unix/misc/makefile.mk
++++ b/shell/source/unix/misc/makefile.mk
+@@ -45,7 +45,8 @@ SCRIPTFILES = \
+ $(BIN)$/open-url \
+ $(BIN)$/cde-open-url \
+ $(BIN)$/gnome-open-url \
+- $(BIN)$/kde-open-url
++ $(BIN)$/kde-open-url \
++ $(BIN)$/tde-open-url
+
+ APP1TARGET = gnome-open-url.bin
+ APP1OBJS = \
+diff --git a/shell/source/unix/misc/tde-open-url.sh b/shell/source/unix/misc/tde-open-url.sh
+new file mode 100644
+index 0000000..fa05bde
+--- /dev/null
++++ b/shell/source/unix/misc/tde-open-url.sh
+@@ -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 --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk
+index 4ff643a..d871b05 100644
+--- a/solenv/gbuild/gbuild.mk
++++ b/solenv/gbuild/gbuild.mk
+@@ -268,6 +268,10 @@ ifneq ($(strip $(ENABLE_KDE)),)
+ gb_GLOBALDEFS += -DENABLE_KDE
+ endif
+
++ifneq ($(strip $(ENABLE_TDE)),)
++gb_GLOBALDEFS += -DENABLE_TDE
++endif
++
+ ifneq ($(strip $(ENABLE_KDE4)),)
+ gb_GLOBALDEFS += -DENABLE_KDE4
+ endif
+diff --git a/solenv/inc/unx.mk b/solenv/inc/unx.mk
+index 74ed8d5..d6ce918 100644
+--- a/solenv/inc/unx.mk
++++ b/solenv/inc/unx.mk
+@@ -179,4 +179,13 @@ SOLARLIB+=-L$(KDE_ROOT)/lib64
+ .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 --git a/toolkit/source/layout/core/dialogbuttonhbox.cxx b/toolkit/source/layout/core/dialogbuttonhbox.cxx
+index 9c19306..741fc1c 100644
+--- a/toolkit/source/layout/core/dialogbuttonhbox.cxx
++++ b/toolkit/source/layout/core/dialogbuttonhbox.cxx
+@@ -48,6 +48,8 @@ DialogButtonHBox::Ordering const DialogButtonHBox::DEFAULT_ORDERING =
+ 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 */
+@@ -75,6 +77,8 @@ DialogButtonHBox::setOrdering( rtl::OUString const& ordering )
+ 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" ) )
+@@ -135,6 +139,8 @@ DialogButtonHBox::orderChildren()
+ macosOrdering();
+ else if ( mnOrdering == KDE )
+ kdeOrdering();
++ else if ( mnOrdering == TDE )
++ tdeOrdering();
+ else if ( 1 || mnOrdering == GNOME )
+ gnomeOrdering();
+ }
+@@ -229,6 +235,30 @@ DialogButtonHBox::kdeOrdering()
+ }
+
+ void
++DialogButtonHBox::tdeOrdering()
++{
++ 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::macosOrdering()
+ {
+ std::list< Box_Base::ChildData * > ordered;
+diff --git a/toolkit/source/layout/core/dialogbuttonhbox.hxx b/toolkit/source/layout/core/dialogbuttonhbox.hxx
+index aead7fc..67845a1 100644
+--- a/toolkit/source/layout/core/dialogbuttonhbox.hxx
++++ b/toolkit/source/layout/core/dialogbuttonhbox.hxx
+@@ -45,11 +45,12 @@ public:
+ 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 --git a/vcl/Library_vclplug_kde.mk b/vcl/Library_vclplug_kde.mk
+index 19c42e0..014a96e 100644
+--- a/vcl/Library_vclplug_kde.mk
++++ b/vcl/Library_vclplug_kde.mk
+@@ -4,6 +4,7 @@
+ # 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
+ #
+@@ -26,9 +27,9 @@
+ #
+ #*************************************************************************
+
+-$(eval $(call gb_Library_Library,vclplug_kde))
++$(eval $(call gb_Library_Library,vclplug_tde))
+
+-$(eval $(call gb_Library_set_include,vclplug_kde,\
++$(eval $(call gb_Library_set_include,vclplug_tde,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/vcl/inc \
+ -I$(SRCDIR)/vcl/inc/pch \
+@@ -36,25 +37,25 @@ $(eval $(call gb_Library_set_include,vclplug_kde,\
+ -I$(OUTDIR)/inc \
+ ))
+
+-$(eval $(call gb_Library_set_include,vclplug_kde,\
++$(eval $(call gb_Library_set_include,vclplug_tde,\
+ $$(INCLUDE) \
+- $$(KDE_CFLAGS) \
++ $$(TDE_CFLAGS) \
+ ))
+
+-$(eval $(call gb_Library_add_defs,vclplug_kde,\
+- -DVCLPLUG_KDE_IMPLEMENTATION \
++$(eval $(call gb_Library_add_defs,vclplug_tde,\
++ -DVCLPLUG_TDE_IMPLEMENTATION \
+ ))
+
+-$(eval $(call gb_Library_add_api,vclplug_kde,\
++$(eval $(call gb_Library_add_api,vclplug_tde,\
+ offapi \
+ udkapi \
+ ))
+
+-$(eval $(call gb_Library_add_libs,vclplug_kde,\
+- $$(KDE_LIBS) \
++$(eval $(call gb_Library_add_libs,vclplug_tde,\
++ $$(TDE_LIBS) \
+ ))
+
+-$(eval $(call gb_Library_add_linked_libs,vclplug_kde,\
++$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\
+ vclplug_gen \
+ vcl \
+ tl \
+@@ -76,18 +77,18 @@ $(eval $(call gb_Library_add_linked_libs,vclplug_kde,\
+ ICE \
+ ))
+
+-$(eval $(call gb_Library_use_externals,vclplug_kde,\
++$(eval $(call gb_Library_use_externals,vclplug_tde,\
+ icule \
+ icuuc \
+ ))
+
+-$(eval $(call gb_Library_add_exception_objects,vclplug_kde,\
+- vcl/unx/kde/kdedata \
+- vcl/unx/kde/salnativewidgets-kde \
++$(eval $(call gb_Library_add_exception_objects,vclplug_tde,\
++ vcl/unx/tde/tdedata \
++ vcl/unx/tde/salnativewidgets-tde \
+ ))
+
+ ifeq ($(OS),LINUX)
+-$(eval $(call gb_Library_add_linked_libs,vclplug_kde,\
++$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\
+ dl \
+ m \
+ pthread \
+diff --git a/vcl/Library_vclplug_tde.mk b/vcl/Library_vclplug_tde.mk
+new file mode 100644
+index 0000000..9a324a8
+--- /dev/null
++++ b/vcl/Library_vclplug_tde.mk
+@@ -0,0 +1,96 @@
++# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
++#*************************************************************************
++#
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# Copyright 2000, 2010 Oracle and/or its affiliates.
++#
++# OpenOffice.org - a multi-platform office productivity suite
++#
++# This file is part of OpenOffice.org.
++#
++# OpenOffice.org is free software: you can redistribute it and/or modify
++# it under the terms of the GNU Lesser General Public License version 3
++# only, as published by the Free Software Foundation.
++#
++# OpenOffice.org is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU Lesser General Public License version 3 for more details
++# (a copy is included in the LICENSE file that accompanied this code).
++#
++# You should have received a copy of the GNU Lesser General Public License
++# version 3 along with OpenOffice.org. If not, see
++# <http://www.openoffice.org/license.html>
++# for a copy of the LGPLv3 License.
++#
++#*************************************************************************
++
++$(eval $(call gb_Library_Library,vclplug_tde))
++
++$(eval $(call gb_Library_set_include,vclplug_tde,\
++ $$(INCLUDE) \
++ -I$(SRCDIR)/vcl/inc \
++ -I$(SRCDIR)/vcl/inc/pch \
++ -I$(SRCDIR)/solenv/inc \
++ -I$(OUTDIR)/inc \
++))
++
++$(eval $(call gb_Library_set_include,vclplug_tde,\
++ $$(INCLUDE) \
++ $$(TDE_CFLAGS) \
++))
++
++$(eval $(call gb_Library_add_defs,vclplug_tde,\
++ -DVCLPLUG_TDE_IMPLEMENTATION \
++))
++
++$(eval $(call gb_Library_add_api,vclplug_tde,\
++ offapi \
++ udkapi \
++))
++
++$(eval $(call gb_Library_add_libs,vclplug_tde,\
++ $$(TDE_LIBS) \
++))
++
++$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\
++ vclplug_gen \
++ vcl \
++ tl \
++ utl \
++ sot \
++ ucbhelper \
++ basegfx \
++ comphelper \
++ cppuhelper \
++ i18nisolang1 \
++ i18npaper \
++ i18nutil \
++ jvmaccess \
++ cppu \
++ sal \
++ X11 \
++ Xext \
++ SM \
++ ICE \
++))
++
++$(eval $(call gb_Library_use_externals,vclplug_tde,\
++ icule \
++ icuuc \
++))
++
++$(eval $(call gb_Library_add_exception_objects,vclplug_tde,\
++ vcl/unx/tde/tdedata \
++ vcl/unx/tde/salnativewidgets-tde \
++))
++
++ifeq ($(OS),LINUX)
++$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\
++ dl \
++ m \
++ pthread \
++))
++endif
++# vim: set noet sw=4 ts=4:
+diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk
+index 0a91f87..1de0022 100644
+--- a/vcl/Module_vcl.mk
++++ b/vcl/Module_vcl.mk
+@@ -59,6 +59,11 @@ $(eval $(call gb_Module_add_targets,vcl,\
+ Library_vclplug_kde \
+ ))
+ endif
++ifneq ($(ENABLE_TDE),)
++$(eval $(call gb_Module_add_targets,vcl,\
++ Library_vclplug_tde \
++))
++endif
+ ifneq ($(ENABLE_KDE4),)
+ $(eval $(call gb_Module_add_targets,vcl,\
+ Library_vclplug_kde4 \
+diff --git a/vcl/inc/generic/gendata.hxx b/vcl/inc/generic/gendata.hxx
+index c52e891..e5b7b25 100644
+--- a/vcl/inc/generic/gendata.hxx
++++ b/vcl/inc/generic/gendata.hxx
+@@ -38,7 +38,7 @@ class SalGenericDisplay;
+ class SalDisplay;
+ class GtkSalDisplay;
+ enum SalGenericDataType { SAL_DATA_GTK, SAL_DATA_GTK3,
+- SAL_DATA_KDE3, SAL_DATA_KDE4,
++ SAL_DATA_KDE3, SAL_DATA_TDE, SAL_DATA_KDE4,
+ SAL_DATA_UNX, SAL_DATA_SVP };
+
+ class VCL_DLLPUBLIC SalGenericData : public SalData
+diff --git a/vcl/inc/unx/desktops.hxx b/vcl/inc/unx/desktops.hxx
+index de4ebb8..1d29c7d 100644
+--- a/vcl/inc/unx/desktops.hxx
++++ b/vcl/inc/unx/desktops.hxx
+@@ -34,6 +34,7 @@ enum DesktopType {
+ DESKTOP_UNKNOWN, // unknown desktop, simple WM, etc.
+ DESKTOP_GNOME,
+ DESKTOP_KDE,
++ DESKTOP_TDE,
+ DESKTOP_KDE4,
+ DESKTOP_CDE
+ }; // keep in sync with desktop_strings[] in salplug.cxx
+diff --git a/vcl/inc/unx/tde/tde_headers.h b/vcl/inc/unx/tde/tde_headers.h
+new file mode 100644
+index 0000000..9c9f008
+--- /dev/null
++++ b/vcl/inc/unx/tde/tde_headers.h
+@@ -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.
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Lesser General Public License version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef INCLUDED_VCL_TDE_HEADERS_H
++#define INCLUDED_VCL_TDE_HEADERS_H
++
++/* ********* Suppress warnings if needed */
++#include "sal/config.h"
++
++#include <cstddef>
++
++#if defined __GNUC__
++#pragma GCC system_header
++#endif
++
++
++/* ********* Hack, but needed because of conflicting types... */
++#define Region TQtXRegion
++
++
++/* ********* TQt headers */
++#include <tqaccessible.h>
++#include <tqcheckbox.h>
++#include <tqcombobox.h>
++#include <tqfont.h>
++#include <tqframe.h>
++#include <tqlineedit.h>
++#include <tqlistview.h>
++#include <tqmainwindow.h>
++#include <tqmenudata.h>
++#include <tqpaintdevice.h>
++#include <tqpainter.h>
++#include <tqpushbutton.h>
++#include <tqradiobutton.h>
++#include <tqrangecontrol.h>
++#include <tqstring.h>
++#include <tqtabbar.h>
++#include <tqtabwidget.h>
++#include <tqtoolbar.h>
++#include <tqtoolbutton.h>
++#include <tqwidget.h>
++#include <tqprogressbar.h>
++
++/* ********* See hack on top of this file */
++#undef Region
++
++
++/* ********* TDE base headers */
++#include <kaboutdata.h>
++#include <kapplication.h>
++#include <kcmdlineargs.h>
++#include <kconfig.h>
++#include <kdeversion.h>
++#include <kemailsettings.h>
++#include <kglobal.h>
++#include <kglobalsettings.h>
++#include <klocale.h>
++#include <kmainwindow.h>
++#include <kmenubar.h>
++#include <kprotocolmanager.h>
++#include <kstartupinfo.h>
++#include <kstyle.h>
++
++
++/* ********* TDE address book connectivity headers */
++#include <kabc/addressbook.h>
++#include <kabc/addressee.h>
++#include <kabc/field.h>
++#include <kabc/stdaddressbook.h>
++
++#endif
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/vcl/inc/unx/tde/tdedata.hxx b/vcl/inc/unx/tde/tdedata.hxx
+new file mode 100644
+index 0000000..fccdb49
+--- /dev/null
++++ b/vcl/inc/unx/tde/tdedata.hxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _VCL_TDEDATA_HXX
++#define _VCL_TDEDATA_HXX
++
++#include <unx/saldisp.hxx>
++#include <unx/saldata.hxx>
++#include <unx/salframe.h>
++
++class TDEData : public X11SalData
++{
++public:
++ TDEData( SalInstance *pInstance ) : X11SalData( SAL_DATA_TDE, pInstance ) {}
++ 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, sal_uLong );
++ virtual ~TDESalFrame();
++
++ virtual SalGraphics* GetGraphics();
++ virtual void ReleaseGraphics( SalGraphics *pGraphics );
++ virtual void updateGraphics( bool bClear );
++ virtual void UpdateSettings( AllSettings& rSettings );
++ virtual void Show( sal_Bool bVisible, sal_Bool bNoActivate );
++};
++
++class TDESalInstance : public X11SalInstance
++{
++public:
++ TDESalInstance( SalYieldMutex* pMutex )
++ : X11SalInstance( pMutex ) {}
++ virtual ~TDESalInstance() {}
++ virtual SalFrame* CreateFrame( SalFrame* pParent, sal_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 --git a/vcl/inc/vclpluginapi.h b/vcl/inc/vclpluginapi.h
+index 462943b..ae4123e 100644
+--- a/vcl/inc/vclpluginapi.h
++++ b/vcl/inc/vclpluginapi.h
+@@ -50,6 +50,12 @@
+ #define VCLPLUG_KDE_PUBLIC SAL_DLLPUBLIC_IMPORT
+ #endif
+
++#if defined VCLPLUG_TDE_IMPLEMENTATION
++#define VCLPLUG_TDE_PUBLIC SAL_DLLPUBLIC_EXPORT
++#else
++#define VCLPLUG_TDE_PUBLIC SAL_DLLPUBLIC_IMPORT
++#endif
++
+ #if defined VCLPLUG_KDE4_IMPLEMENTATION
+ #define VCLPLUG_KDE4_PUBLIC SAL_DLLPUBLIC_EXPORT
+ #else
+diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx
+index 1795d5a..62ebffd 100644
+--- a/vcl/source/app/settings.cxx
++++ b/vcl/source/app/settings.cxx
+@@ -831,6 +831,8 @@ sal_uLong StyleSettings::GetAutoSymbolsStyle() const
+ 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 --git a/vcl/unx/generic/desktopdetect/desktopdetector.cxx b/vcl/unx/generic/desktopdetect/desktopdetector.cxx
+index 12ea4fc..2b9e2c9 100644
+--- a/vcl/unx/generic/desktopdetect/desktopdetector.cxx
++++ b/vcl/unx/generic/desktopdetect/desktopdetector.cxx
+@@ -210,6 +210,15 @@ static bool is_kde_desktop( Display* pDisplay )
+ 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" ) )
+@@ -238,6 +247,8 @@ DESKTOP_DETECTOR_PUBLIC DesktopType get_desktop_environment()
+ {
+ OString aOver( pOverride );
+
++ if ( aOver.equalsIgnoreAsciiCase( "tde" ) )
++ return DESKTOP_TDE;
+ if ( aOver.equalsIgnoreAsciiCase( "kde4" ) )
+ return DESKTOP_KDE4;
+ if ( aOver.equalsIgnoreAsciiCase( "gnome" ) )
+@@ -301,7 +312,9 @@ DESKTOP_DETECTOR_PUBLIC DesktopType get_desktop_environment()
+
+ XErrorHandler pOldHdl = XSetErrorHandler( autodect_error_handler );
+
+- if ( is_kde4_desktop( pDisplay ) )
++ if ( is_tde_desktop( pDisplay ) )
++ ret = DESKTOP_TDE;
++ else if ( is_kde4_desktop( pDisplay ) )
+ ret = DESKTOP_KDE4;
+ else if ( is_gnome_desktop( pDisplay ) )
+ ret = DESKTOP_GNOME;
+diff --git a/vcl/unx/generic/plugadapt/salplug.cxx b/vcl/unx/generic/plugadapt/salplug.cxx
+index 90f0d3e..875a9fb 100644
+--- a/vcl/unx/generic/plugadapt/salplug.cxx
++++ b/vcl/unx/generic/plugadapt/salplug.cxx
+@@ -148,7 +148,12 @@ static SalInstance* autodetect_plugin()
+ {
+ static const char* pKDEFallbackList[] =
+ {
+- "kde4", "kde", "gtk3", "gtk", "gen", 0
++ "kde4", "kde", "tde", "gtk3", "gtk", "gen", 0
++ };
++
++ static const char* pTDEFallbackList[] =
++ {
++ "tde", "gtk3", "gtk", "gen", 0
+ };
+
+ static const char* pStandardFallbackList[] =
+@@ -177,6 +182,8 @@ static SalInstance* autodetect_plugin()
+ }
+ else if( desktop == DESKTOP_KDE4 )
+ pList = pKDEFallbackList;
++ else if( desktop == DESKTOP_TDE )
++ pList = pTDEFallbackList;
+
+ SalInstance* pInst = NULL;
+ while( pList[nListEntry] && pInst == NULL )
+@@ -224,7 +231,7 @@ SalInstance *CreateSalInstance()
+ pInst = autodetect_plugin();
+
+ // fallback, try everything
+- const char* pPlugin[] = { "gtk3", "gtk", "kde4", "kde", "gen", 0 };
++ const char* pPlugin[] = { "gtk3", "gtk", "kde4", "kde", "tde", "gen", 0 };
+
+ for ( int i = 0; !pInst && pPlugin[ i ]; ++i )
+ pInst = tryInstance( OUString::createFromAscii( pPlugin[ i ] ) );
+@@ -279,7 +286,7 @@ void SalAbort( const XubString& rErrorText, bool bDumpCore )
+ _exit(1);
+ }
+
+-static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4" };
++static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "TDE", "KDE4" };
+
+ const OUString& SalGetDesktopEnvironment()
+ {
+diff --git a/vcl/unx/tde/salnativewidgets-tde.cxx b/vcl/unx/tde/salnativewidgets-tde.cxx
+new file mode 100644
+index 0000000..7c173cc
+--- /dev/null
++++ b/vcl/unx/tde/salnativewidgets-tde.cxx
+@@ -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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_vcl.hxx"
++
++#define _SV_SALNATIVEWIDGETS_TDE_CXX
++#include <shell/tde_headers.h>
++
++#include <unx/salunx.h>
++#include <unx/saldata.hxx>
++#include <unx/saldisp.hxx>
++#include <unx/salgdi.h>
++#include <unx/tde/tdedata.hxx>
++
++#include <vcl/settings.hxx>
++#include <vcl/fontmanager.hxx>
++#include <vcl/vclenum.hxx>
++#include <rtl/ustrbuf.hxx>
++
++#define USHORT unsigned short
++#define BYTE unsigned char
++
++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 TQStyle::drawControl(). The buttons are created
++ on demand and they are still hidden (no TQWidget::show() is called).
++ */
++ TQPushButton *m_pPushButton;
++
++ /** Cached radio button.
++
++ @see m_pPushButton
++ */
++ TQRadioButton *m_pRadioButton;
++
++ /** Cached check box.
++
++ @see m_pPushButton
++ */
++ TQCheckBox *m_pCheckBox;
++
++ /** Cached combo box.
++
++ @see m_pPushButton
++ */
++ TQComboBox *m_pComboBox;
++
++ /** Cached editable combo box.
++
++ Needed, because some styles do not like dynamic changes
++ (TQComboBox::setEditable()).
++
++ @see m_pPushButton
++ */
++ TQComboBox *m_pEditableComboBox;
++
++ /** Cached line edit box.
++
++ @see m_pPushButton
++ */
++ TQLineEdit *m_pLineEdit;
++
++ /** Cached spin box.
++
++ @see m_pPushButton
++ */
++ TQSpinWidget *m_pSpinWidget;
++
++ /** Cached spin box'es line edit.
++
++ @see m_pPushButton
++ */
++ TQLineEdit *m_pSpinEdit;
++
++ /** Cached tab.
++
++ Left, middle, right tab and a tab which is alone.
++
++ @see m_pPushButton
++ */
++ TQTab *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
++ */
++ TQWidget *m_pTabBarParent;
++
++ /** Cached tab bar widget.
++
++ @see m_pPushButton
++ */
++ TQTabBar *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
++ */
++ TQTabWidget *m_pTabWidget;
++
++ /** Cached list view.
++
++ @see m_pPushButton
++ */
++ TQListView *m_pListView;
++
++ /** Cached scroll bar.
++
++ @see m_pPushButton
++ */
++ TQScrollBar *m_pScrollBar;
++
++ /** Cached dock area. Needed for proper functionality of tool bars.
++
++ @see m_pPushButton
++ */
++ TQMainWindow *m_pMainWindow;
++
++ /** Cached tool bar.
++
++ @see m_pPushButton
++ */
++ TQToolBar *m_pToolBarHoriz, *m_pToolBarVert;
++
++ /** Cached tool button.
++
++ @see m_pPushButton
++ */
++ TQToolButton *m_pToolButton;
++
++ /** Cached menu bar.
++
++ @see m_pPushButton
++ */
++ TQMenuBar *m_pMenuBar;
++
++ /** Identifiers of menu bar items.
++ */
++ int m_nMenuBarEnabledItem, m_nMenuBarDisabledItem;
++
++ /** Cached popup menu.
++
++ @see m_pPushButton
++ */
++ TQPopupMenu *m_pPopupMenu;
++
++ /** Identifiers of popup menu items.
++ */
++ int m_nPopupMenuEnabledItem, m_nPopupMenuDisabledItem;
++
++ /** cached progress bar
++ */
++ TQProgressBar *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 TQWidget::show()), because they are needed just as a parameter for
++ TQStyle::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.
++ */
++ sal_Bool drawStyledWidget( TQWidget *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.
++ */
++ TQPushButton *pushButton( const Rectangle& rControlRegion, sal_Bool bDefault );
++
++ /** 'Get' method for radio button.
++
++ @see pushButton()
++ */
++ TQRadioButton *radioButton( const Rectangle& rControlRegion );
++
++ /** 'Get' method for check box.
++
++ @see pushButton()
++ */
++ TQCheckBox *checkBox( const Rectangle& rControlRegion );
++
++ /** 'Get' method for combo box.
++
++ It returns m_pComboBox or m_pEditableComboBox according to
++ bEditable.
++
++ @see pushButton(), m_pEditableComboBox
++ */
++ TQComboBox *comboBox( const Rectangle& rControlRegion, sal_Bool bEditable );
++
++ /** 'Get' method for line edit box.
++
++ @see pushButton()
++ */
++ TQLineEdit *lineEdit( const Rectangle& rControlRegion );
++
++ /** 'Get' method for spin box.
++
++ @see pushButton()
++ */
++ TQSpinWidget *spinWidget( const Rectangle& rControlRegion );
++
++ /** 'Get' method for tab bar.
++
++ @see pushButton()
++ */
++ TQTabBar *tabBar( const Rectangle& rControlRegion );
++
++ /** 'Get' method for tab widget.
++
++ @see pushButton()
++ */
++ TQTabWidget *tabWidget( const Rectangle& rControlRegion );
++
++ /** 'Get' method for list view.
++
++ @see pushButton()
++ */
++ TQListView *listView( const Rectangle& rControlRegion );
++
++ /** 'Get' method for scroll bar.
++
++ @see pushButton()
++ */
++ TQScrollBar *scrollBar( const Rectangle& rControlRegion,
++ sal_Bool bHorizontal, const ImplControlValue& aValue );
++
++ /** 'Get' method for tool bar.
++
++ @see pushButton()
++ */
++ TQToolBar *toolBar( const Rectangle& rControlRegion, sal_Bool bHorizontal );
++
++ /** 'Get' method for tool button.
++
++ @see pushButton()
++ */
++ TQToolButton *toolButton( const Rectangle& rControlRegion );
++
++ /** 'Get' method for menu bar.
++
++ @see pushButton()
++ */
++ TQMenuBar *menuBar( const Rectangle& rControlRegion );
++
++ /** 'Get' method for popup menu.
++
++ @see pushButton()
++ */
++ TQPopupMenu *popupMenu( const Rectangle& rControlRegion );
++
++ /** 'Get' method for progress bar
++
++ @see pushButton()
++ */
++ TQProgressBar *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, ...)
++ */
++ TQStyle::SFlags vclStateValue2SFlags( ControlState nState, const ImplControlValue& aValue );
++
++ public:
++ /** Convert VCL Rectangle to TQRect.
++
++ @param rControlRegion
++ The region to convert.
++
++ @return
++ The bounding box of the region.
++ */
++ static TQRect region2TQRect( 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;
++}
++
++sal_Bool WidgetPainter::drawStyledWidget( TQWidget *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
++ TQPoint qWidgetPos( pWidget->pos() );
++ pWidget->move( 0, 0 );
++
++ // Enable/disable the widget
++ pWidget->setEnabled( nState & CTRL_STATE_ENABLED );
++
++ // Create pixmap to paint to
++ TQPixmap qPixmap( pWidget->width(), pWidget->height() );
++ TQPainter qPainter( &qPixmap );
++ TQRect qRect( 0, 0, pWidget->width(), pWidget->height() );
++
++ // Use the background of the widget
++ qPixmap.fill( pWidget, TQPoint(0, 0) );
++
++ // Convert the flags
++ TQStyle::SFlags nStyle = vclStateValue2SFlags( nState, aValue );
++
++ // Store the widget class
++ const char *pClassName = pWidget->className();
++
++ // Draw the widget to the pixmap
++ if ( strcmp( TQPUSHBUTTON_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ // Workaround for the Platinum style.
++ // Platinum takes the state directly from the widget, not from SFlags.
++ TQPushButton *pPushButton = static_cast<TQPushButton *>( pWidget->qt_cast( TQPUSHBUTTON_OBJECT_NAME_STRING ) );
++ if ( pPushButton )
++ {
++ pPushButton->setDown ( nStyle & TQStyle::Style_Down );
++ pPushButton->setOn ( nStyle & TQStyle::Style_On );
++ pPushButton->setEnabled( nStyle & TQStyle::Style_Enabled );
++ }
++
++ kapp->style().drawControl( TQStyle::CE_PushButton,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle );
++ }
++ else if ( strcmp( TQRADIOBUTTON_OBJECT_NAME_STRING, 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( TQStyle::CE_RadioButton,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle );
++ }
++ else if ( strcmp( TQCHECKBOX_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ kapp->style().drawControl( TQStyle::CE_CheckBox,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle );
++ }
++ else if ( strcmp( TQCOMBOBOX_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ kapp->style().drawComplexControl( TQStyle::CC_ComboBox,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle );
++
++ // Editable combo box uses the background of the associated edit box
++ TQComboBox *pComboBox = static_cast<TQComboBox *>( pWidget->qt_cast( TQCOMBOBOX_OBJECT_NAME_STRING ) );
++ if ( pComboBox && pComboBox->editable() && pComboBox->lineEdit() )
++ {
++ TQColorGroup::ColorRole eColorRole = ( pComboBox->isEnabled() )?
++ TQColorGroup::Base: TQColorGroup::Background;
++ qPainter.fillRect(
++ kapp->style().querySubControlMetrics( TQStyle::CC_ComboBox,
++ pComboBox, TQStyle::SC_ComboBoxEditField ),
++ pComboBox->lineEdit()->colorGroup().brush( eColorRole ) );
++ }
++ }
++ else if ( strcmp( TQLINEEDIT_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ kapp->style().drawPrimitive( TQStyle::PE_PanelLineEdit,
++ &qPainter, qRect,
++ pWidget->colorGroup(), nStyle | TQStyle::Style_Sunken );
++ }
++ else if ( strcmp( TQSPINWIDGET_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ const SpinbuttonValue *pValue = static_cast<const SpinbuttonValue *> ( &aValue );
++
++ // Is any of the buttons pressed?
++ TQStyle::SCFlags eActive = TQStyle::SC_None;
++ if ( pValue )
++ {
++ if ( pValue->mnUpperState & CTRL_STATE_PRESSED )
++ eActive = TQStyle::SC_SpinWidgetUp;
++ else if ( pValue->mnLowerState & CTRL_STATE_PRESSED )
++ eActive = TQStyle::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 |= TQStyle::Style_Enabled;
++ }
++ else
++ pWidget->setEnabled( false );
++
++ // Mouse-over effect
++ if ( (pValue->mnUpperState & CTRL_STATE_ROLLOVER) ||
++ (pValue->mnLowerState & CTRL_STATE_ROLLOVER) )
++ nStyle |= TQStyle::Style_MouseOver;
++ }
++
++ // Spin widget uses the background of the associated edit box
++ TQSpinWidget *pSpinWidget = static_cast<TQSpinWidget *>( pWidget->qt_cast( TQSPINWIDGET_OBJECT_NAME_STRING ) );
++ if ( pSpinWidget && pSpinWidget->editWidget() )
++ {
++ TQColorGroup::ColorRole eColorRole = ( pSpinWidget->isEnabled() )?
++ TQColorGroup::Base: TQColorGroup::Background;
++ qPainter.fillRect(
++ kapp->style().querySubControlMetrics( TQStyle::CC_SpinWidget,
++ pSpinWidget, TQStyle::SC_SpinWidgetEditField ),
++ pSpinWidget->editWidget()->colorGroup().brush( eColorRole ) );
++ }
++
++ // Adjust the frame (needed for Motif Plus style)
++ TQRect qFrameRect = kapp->style().querySubControlMetrics( TQStyle::CC_SpinWidget,
++ pWidget, TQStyle::SC_SpinWidgetFrame );
++
++ kapp->style().drawComplexControl( TQStyle::CC_SpinWidget,
++ &qPainter, pWidget, qFrameRect,
++ pWidget->colorGroup(), nStyle,
++ TQStyle::SC_All, eActive );
++ }
++ else if ( strcmp( TQTABBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ const TabitemValue *pValue = static_cast<const TabitemValue *> ( &aValue );
++
++ TQTab *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( TQStyle::CE_TabBarTab,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle,
++ TQStyleOption( pTab ) );
++ }
++ else if ( strcmp( TQTABWIDGET_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ kapp->style().drawPrimitive( TQStyle::PE_PanelTabWidget,
++ &qPainter, qRect,
++ pWidget->colorGroup(), nStyle );
++ }
++ else if ( strcmp( TQLISTVIEW_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ kapp->style().drawPrimitive( TQStyle::PE_Panel,
++ &qPainter, qRect,
++ pWidget->colorGroup(), nStyle | TQStyle::Style_Sunken );
++ }
++ else if ( strcmp( TQSCROLLBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ const ScrollbarValue *pValue = static_cast<const ScrollbarValue *> ( &aValue );
++
++ TQStyle::SCFlags eActive = TQStyle::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 |= TQStyle::Style_MouseOver;
++ if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER )
++ eActive = TQStyle::SC_ScrollBarSlider;
++ }
++ else if ( strcmp( "QSGIStyle", pStyleName ) == 0 )
++ {
++ nStyle |= TQStyle::Style_MouseOver;
++ if ( pValue->mnButton1State & CTRL_STATE_ROLLOVER )
++ eActive = TQStyle::SC_ScrollBarSubLine;
++ else if ( pValue->mnButton2State & CTRL_STATE_ROLLOVER )
++ eActive = TQStyle::SC_ScrollBarAddLine;
++ else if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER )
++ eActive = TQStyle::SC_ScrollBarSlider;
++ }
++
++ if ( pValue->mnButton1State & CTRL_STATE_PRESSED )
++ eActive = TQStyle::SC_ScrollBarSubLine;
++ else if ( pValue->mnButton2State & CTRL_STATE_PRESSED )
++ eActive = TQStyle::SC_ScrollBarAddLine;
++ else if ( pValue->mnThumbState & CTRL_STATE_PRESSED )
++ eActive = TQStyle::SC_ScrollBarSlider;
++ else if ( pValue->mnPage1State & CTRL_STATE_PRESSED )
++ eActive = TQStyle::SC_ScrollBarSubPage;
++ else if ( pValue->mnPage2State & CTRL_STATE_PRESSED )
++ eActive = TQStyle::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 |= TQStyle::Style_Enabled;
++ }
++ else
++ pWidget->setEnabled( false );
++ }
++
++ // Is it a horizontal scroll bar?
++ TQScrollBar *pScrollBar = static_cast<TQScrollBar *> ( pWidget->qt_cast( TQSCROLLBAR_OBJECT_NAME_STRING ) );
++ TQStyle::StyleFlags eHoriz = TQStyle::Style_Default;
++ if ( pScrollBar && pScrollBar->orientation() == Qt::Horizontal )
++ eHoriz = TQStyle::Style_Horizontal;
++
++ kapp->style().drawComplexControl( TQStyle::CC_ScrollBar,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle | eHoriz,
++ TQStyle::SC_All, eActive );
++ }
++ else if ( strcmp( TQTOOLBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ TQToolBar *pToolBar = static_cast< TQToolBar * >( pWidget->qt_cast( TQTOOLBAR_OBJECT_NAME_STRING ) );
++ bool bIsHorizontal = false;
++ if ( pToolBar && pToolBar->orientation() == Qt::Horizontal )
++ {
++ nStyle |= TQStyle::Style_Horizontal;
++ bIsHorizontal = true;
++ }
++
++ kapp->style().drawControl( TQStyle::CE_DockWindowEmptyArea,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle );
++
++ kapp->style().drawPrimitive( TQStyle::PE_PanelDockWindow,
++ &qPainter, qRect, pWidget->colorGroup(), nStyle );
++
++ if ( nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT )
++ {
++ const ToolbarValue *pValue = static_cast< const ToolbarValue * >( &aValue );
++
++ TQRect qThumbRect = region2TQRect( 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( TQStyle::PE_DockWindowHandle,
++ &qPainter, qThumbRect, pWidget->colorGroup(), nStyle );
++ }
++ }
++ else if ( strcmp( TQTOOLBUTTON_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ if( (nStyle & TQStyle::Style_MouseOver) )
++ nStyle &= ~TQStyle::Style_Off;
++ kapp->style().drawComplexControl( TQStyle::CC_ToolButton,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle,
++ TQStyle::SC_ToolButton );
++ }
++ else if ( strcmp( TQMENUBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ if ( nPart == PART_ENTIRE_CONTROL )
++ {
++ kapp->style().drawControl( TQStyle::CE_MenuBarEmptyArea,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle );
++ }
++ else if ( nPart == PART_MENU_ITEM )
++ {
++ int nMenuItem = ( nStyle & TQStyle::Style_Enabled )? m_nMenuBarEnabledItem: m_nMenuBarDisabledItem;
++ TQMenuItem *pMenuItem = static_cast<TQMenuBar*>( pWidget )->findItem( nMenuItem );
++
++ if ( nStyle & TQStyle::Style_Selected )
++ nStyle |= TQStyle::Style_Active | TQStyle::Style_Down | TQStyle::Style_HasFocus;
++
++ kapp->style().drawControl( TQStyle::CE_MenuBarItem,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle,
++ TQStyleOption( pMenuItem ) );
++ }
++ }
++ else if ( strcmp( TQPOPUPMENU_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ int nMenuItem = ( nStyle & TQStyle::Style_Enabled )? m_nPopupMenuEnabledItem: m_nPopupMenuDisabledItem;
++ TQMenuItem *pMenuItem = static_cast<TQPopupMenu*>( pWidget )->findItem( nMenuItem );
++
++ if ( nStyle & TQStyle::Style_Selected )
++ nStyle |= TQStyle::Style_Active;
++
++ kapp->style().drawControl( TQStyle::CE_PopupMenuItem,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle,
++ TQStyleOption( pMenuItem, 0, 0 ) );
++ }
++ else if ( strcmp( TQPROGRESSBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
++ {
++ long nProgressWidth = aValue.getNumericVal();
++ TQProgressBar* pProgress = static_cast<TQProgressBar*>(pWidget);
++ pProgress->setProgress( nProgressWidth, qRect.width() );
++
++ kapp->style().drawControl( TQStyle::CE_ProgressBarGroove,
++ &qPainter, pWidget, qRect,
++ pWidget->colorGroup(), nStyle );
++ kapp->style().drawControl( TQStyle::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;
++}
++
++TQPushButton *WidgetPainter::pushButton( const Rectangle& rControlRegion,
++ sal_Bool bDefault )
++{
++ if ( !m_pPushButton )
++ m_pPushButton = new TQPushButton( NULL, "push_button" );
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ // Workaround for broken styles which do not add
++ // TQStyle::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 )
++ {
++ TQSize qContentsSize( 50, 50 );
++ m_pPushButton->setDefault( false );
++ TQSize qNormalSize = kapp->style().sizeFromContents( TQStyle::CT_PushButton,
++ m_pPushButton, qContentsSize );
++ m_pPushButton->setDefault( true );
++ TQSize qDefSize = kapp->style().sizeFromContents( TQStyle::CT_PushButton,
++ m_pPushButton, qContentsSize );
++
++ int nIndicatorSize = kapp->style().pixelMetric(
++ TQStyle::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;
++}
++
++TQRadioButton *WidgetPainter::radioButton( const Rectangle& rControlRegion )
++{
++ if ( !m_pRadioButton )
++ m_pRadioButton = new TQRadioButton( NULL, "radio_button" );
++
++ TQRect qRect = region2TQRect( 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 )
++ {
++ TQRect qOldRect( qRect );
++
++ qRect.setWidth( kapp->style().pixelMetric(
++ TQStyle::PM_ExclusiveIndicatorWidth, m_pRadioButton ) );
++ qRect.setHeight( kapp->style().pixelMetric(
++ TQStyle::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;
++}
++
++TQCheckBox *WidgetPainter::checkBox( const Rectangle& rControlRegion )
++{
++ if ( !m_pCheckBox )
++ m_pCheckBox = new TQCheckBox( NULL, "check_box" );
++
++ TQRect qRect = region2TQRect( 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 )
++ {
++ TQRect qOldRect( qRect );
++
++ qRect.setWidth( kapp->style().pixelMetric(
++ TQStyle::PM_IndicatorWidth, m_pCheckBox ) );
++ qRect.setHeight( kapp->style().pixelMetric(
++ TQStyle::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;
++}
++
++TQComboBox *WidgetPainter::comboBox( const Rectangle& rControlRegion,
++ sal_Bool bEditable )
++{
++ TQComboBox *pComboBox = NULL;
++ if ( bEditable )
++ {
++ if ( !m_pEditableComboBox )
++ m_pEditableComboBox = new TQComboBox( true, NULL, "combo_box_edit" );
++ pComboBox = m_pEditableComboBox;
++ }
++ else
++ {
++ if ( !m_pComboBox )
++ m_pComboBox = new TQComboBox( false, NULL, "combo_box" );
++ pComboBox = m_pComboBox;
++ }
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ pComboBox->move( qRect.topLeft() );
++ pComboBox->resize( qRect.size() );
++
++ return pComboBox;
++}
++
++TQLineEdit *WidgetPainter::lineEdit( const Rectangle& rControlRegion )
++{
++ if ( !m_pLineEdit )
++ m_pLineEdit = new TQLineEdit( NULL, "line_edit" );
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ m_pLineEdit->move( qRect.topLeft() );
++ m_pLineEdit->resize( qRect.size() );
++
++ return m_pLineEdit;
++}
++
++TQSpinWidget *WidgetPainter::spinWidget( const Rectangle& rControlRegion )
++{
++ if ( !m_pSpinWidget )
++ {
++ m_pSpinWidget = new TQSpinWidget( NULL, "spin_widget" );
++
++ m_pSpinEdit = new TQLineEdit( NULL, "line_edit_spin" );
++ m_pSpinWidget->setEditWidget( m_pSpinEdit );
++ }
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ m_pSpinWidget->move( qRect.topLeft() );
++ m_pSpinWidget->resize( qRect.size() );
++ m_pSpinWidget->arrange();
++
++ return m_pSpinWidget;
++}
++
++TQTabBar *WidgetPainter::tabBar( const Rectangle& rControlRegion )
++{
++ if ( !m_pTabBar )
++ {
++ if ( !m_pTabBarParent )
++ m_pTabBarParent = new TQWidget( NULL, "tab_bar_parent" );
++
++ m_pTabBar = new TQTabBar( m_pTabBarParent, "tab_bar" );
++
++ m_pTabLeft = new TQTab();
++ m_pTabMiddle = new TQTab();
++ m_pTabRight = new TQTab();
++ m_pTabAlone = new TQTab();
++
++ m_pTabBar->addTab( m_pTabLeft );
++ m_pTabBar->addTab( m_pTabMiddle );
++ m_pTabBar->addTab( m_pTabRight );
++ }
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ m_pTabBar->move( qRect.topLeft() );
++ m_pTabBar->resize( qRect.size() );
++
++ m_pTabBar->setShape( TQTabBar::RoundedAbove );
++
++ return m_pTabBar;
++}
++
++TQTabWidget *WidgetPainter::tabWidget( const Rectangle& rControlRegion )
++{
++ if ( !m_pTabWidget )
++ m_pTabWidget = new TQTabWidget( NULL, "tab_widget" );
++
++ TQRect qRect = region2TQRect( rControlRegion );
++ --qRect.rTop();
++
++ m_pTabWidget->move( qRect.topLeft() );
++ m_pTabWidget->resize( qRect.size() );
++
++ return m_pTabWidget;
++}
++
++TQListView *WidgetPainter::listView( const Rectangle& rControlRegion )
++{
++ if ( !m_pListView )
++ m_pListView = new TQListView( NULL, "list_view" );
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ m_pListView->move( qRect.topLeft() );
++ m_pListView->resize( qRect.size() );
++
++ return m_pListView;
++}
++
++TQScrollBar *WidgetPainter::scrollBar( const Rectangle& rControlRegion,
++ sal_Bool bHorizontal, const ImplControlValue& aValue )
++{
++ if ( !m_pScrollBar )
++ {
++ m_pScrollBar = new TQScrollBar( NULL, "scroll_bar" );
++ m_pScrollBar->setTracking( false );
++ m_pScrollBar->setLineStep( 1 );
++ }
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ m_pScrollBar->move( qRect.topLeft() );
++ m_pScrollBar->resize( qRect.size() );
++ m_pScrollBar->setOrientation( bHorizontal? Qt::Horizontal: Qt::Vertical );
++
++ const ScrollbarValue *pValue = static_cast<const ScrollbarValue *> ( &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;
++}
++
++TQToolBar *WidgetPainter::toolBar( const Rectangle& rControlRegion, sal_Bool bHorizontal )
++{
++ if ( !m_pMainWindow )
++ m_pMainWindow = new TQMainWindow( NULL, "main_window" );
++
++ TQToolBar *pToolBar;
++ if ( bHorizontal )
++ {
++ if ( !m_pToolBarHoriz )
++ {
++ m_pToolBarHoriz = new TQToolBar( m_pMainWindow, "tool_bar_horiz" );
++ m_pMainWindow->moveDockWindow( m_pToolBarHoriz, Qt::DockTop );
++ }
++ pToolBar = m_pToolBarHoriz;
++ }
++ else
++ {
++ if ( !m_pToolBarVert )
++ {
++ m_pToolBarVert = new TQToolBar( m_pMainWindow, "tool_bar_horiz" );
++ m_pMainWindow->moveDockWindow( m_pToolBarVert, Qt::DockLeft );
++ }
++ pToolBar = m_pToolBarVert;
++ }
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ pToolBar->move( qRect.topLeft() );
++ pToolBar->resize( qRect.size() );
++
++ return pToolBar;
++}
++
++TQToolButton *WidgetPainter::toolButton( const Rectangle& rControlRegion)
++{
++ if ( !m_pToolButton )
++ m_pToolButton = new TQToolButton( NULL, "tool_button" );
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ m_pToolButton->move( qRect.topLeft() );
++ m_pToolButton->resize( qRect.size() );
++
++ return m_pToolButton;
++}
++
++TQMenuBar *WidgetPainter::menuBar( const Rectangle& rControlRegion)
++{
++ if ( !m_pMenuBar )
++ {
++ m_pMenuBar = new TQMenuBar( 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 );
++ }
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ m_pMenuBar->move( qRect.topLeft() );
++ m_pMenuBar->resize( qRect.size() );
++
++ return m_pMenuBar;
++}
++
++TQPopupMenu *WidgetPainter::popupMenu( const Rectangle& rControlRegion)
++{
++ if ( !m_pPopupMenu )
++ {
++ m_pPopupMenu = new TQPopupMenu( 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 );
++ }
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ m_pPopupMenu->move( qRect.topLeft() );
++ m_pPopupMenu->resize( qRect.size() );
++
++ return m_pPopupMenu;
++}
++
++TQProgressBar *WidgetPainter::progressBar( const Rectangle& rControlRegion )
++{
++ if ( !m_pProgressBar )
++ m_pProgressBar = new TQProgressBar( NULL, "progress_bar" );
++
++ TQRect qRect = region2TQRect( rControlRegion );
++
++ m_pProgressBar->move( qRect.topLeft() );
++ m_pProgressBar->resize( qRect.size() );
++
++ return m_pProgressBar;
++}
++
++TQStyle::SFlags WidgetPainter::vclStateValue2SFlags( ControlState nState,
++ const ImplControlValue& aValue )
++{
++ TQStyle::SFlags nStyle =
++ ( (nState & CTRL_STATE_DEFAULT)? TQStyle::Style_ButtonDefault: TQStyle::Style_Default ) |
++ ( (nState & CTRL_STATE_ENABLED)? TQStyle::Style_Enabled: TQStyle::Style_Default ) |
++ ( (nState & CTRL_STATE_FOCUSED)? TQStyle::Style_HasFocus: TQStyle::Style_Default ) |
++ ( (nState & CTRL_STATE_PRESSED)? TQStyle::Style_Down: TQStyle::Style_Raised ) |
++ ( (nState & CTRL_STATE_SELECTED)? TQStyle::Style_Selected : TQStyle::Style_Default ) |
++ ( (nState & CTRL_STATE_ROLLOVER)? TQStyle::Style_MouseOver: TQStyle::Style_Default );
++ //TODO ( (nState & CTRL_STATE_HIDDEN)? TQStyle::Style_: TQStyle::Style_Default ) |
++
++ switch ( aValue.getTristateVal() )
++ {
++ case BUTTONVALUE_ON: nStyle |= TQStyle::Style_On; break;
++ case BUTTONVALUE_OFF: nStyle |= TQStyle::Style_Off; break;
++ case BUTTONVALUE_MIXED: nStyle |= TQStyle::Style_NoChange; break;
++ default: break;
++ }
++
++ return nStyle;
++}
++
++TQRect WidgetPainter::region2TQRect( const Rectangle& rControlRegion )
++{
++ return TQRect( TQPoint( rControlRegion.Left(), rControlRegion.Top() ),
++ TQPoint( 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 sal_Bool IsNativeControlSupported( ControlType nType, ControlPart nPart );
++ virtual sal_Bool hitTestNativeControl( ControlType nType, ControlPart nPart,
++ const Rectangle& rControlRegion, const Point& aPos,
++ sal_Bool& rIsInside );
++ virtual sal_Bool drawNativeControl( ControlType nType, ControlPart nPart,
++ const Rectangle& rControlRegion, ControlState nState,
++ const ImplControlValue& aValue,
++ const OUString& aCaption );
++ virtual sal_Bool drawNativeControlText( ControlType nType, ControlPart nPart,
++ const Rectangle& rControlRegion, ControlState nState,
++ const ImplControlValue& aValue,
++ const OUString& aCaption );
++ virtual sal_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.
++*/
++sal_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.
++*/
++sal_Bool TDESalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart,
++ const Rectangle& rControlRegion, const Point& rPos,
++ sal_Bool& rIsInside )
++{
++ if ( nType == CTRL_SCROLLBAR )
++ {
++ // make position relative to rControlRegion
++ Point aPos = rPos - rControlRegion.TopLeft();
++ rIsInside = FALSE;
++
++ sal_Bool bHorizontal = ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT );
++
++ TQScrollBar *pScrollBar = pWidgetPainter->scrollBar( rControlRegion,
++ bHorizontal, ImplControlValue() );
++ TQRect qRectSubLine = kapp->style().querySubControlMetrics(
++ TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarSubLine );
++ TQRect qRectAddLine = kapp->style().querySubControlMetrics(
++ TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarAddLine );
++
++ // There are 2 buttons on the right/bottom side of the scrollbar
++ sal_Bool bTwoSubButtons = FALSE;
++
++ // It is a Platinum style scroll bar
++ sal_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(
++ TQStyle::CC_ScrollBar, pScrollBar,
++ TQStyle::SC_ScrollBarAddPage ).right() + 1 );
++ if ( qRectAddLine.width() > qRectSubLine.width() )
++ bTwoSubButtons = TRUE;
++ if ( qRectSubLine.left() > kapp->style().querySubControlMetrics( TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarSubPage ).left() )
++ bPlatinumStyle = TRUE;
++ }
++ else
++ {
++ qRectAddLine.setTop( kapp->style().querySubControlMetrics(
++ TQStyle::CC_ScrollBar, pScrollBar,
++ TQStyle::SC_ScrollBarAddPage ).bottom() + 1 );
++ if ( qRectAddLine.height() > qRectSubLine.height() )
++ bTwoSubButtons = TRUE;
++ if ( qRectSubLine.top() > kapp->style().querySubControlMetrics( TQStyle::CC_ScrollBar, pScrollBar, TQStyle::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.)
++*/
++sal_Bool TDESalGraphics::drawNativeControl( ControlType nType, ControlPart nPart,
++ const Rectangle& rControlRegion, ControlState nState,
++ const ImplControlValue& aValue,
++ const OUString& )
++{
++ sal_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.)
++*/
++sal_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.)
++*/
++sal_Bool TDESalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart,
++ const Rectangle& rControlRegion, ControlState nState,
++ const ImplControlValue&,
++ const OUString&,
++ Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion )
++{
++ sal_Bool bReturn = FALSE;
++ TQRect qBoundingRect = WidgetPainter::region2TQRect( rControlRegion );
++ TQRect qRect;
++
++ TQWidget *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(
++ TQStyle::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( TQStyle::PM_ExclusiveIndicatorWidth, pWidget ) );
++ qRect.setHeight( kapp->style().pixelMetric( TQStyle::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( TQStyle::PM_IndicatorWidth, pWidget ) );
++ qRect.setHeight( kapp->style().pixelMetric( TQStyle::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(
++ TQStyle::CC_ComboBox, pWidget, TQStyle::SC_ComboBoxArrow );
++ qRect.setLeft( kapp->style().querySubControlMetrics(
++ TQStyle::CC_ComboBox, pWidget,
++ TQStyle::SC_ComboBoxEditField ).right() + 1 );
++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
++ bReturn = TRUE;
++ break;
++
++ case PART_SUB_EDIT:
++ qRect = kapp->style().querySubControlMetrics(
++ TQStyle::CC_ComboBox, pWidget, TQStyle::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(
++ TQStyle::CC_SpinWidget, pWidget, TQStyle::SC_SpinWidgetUp );
++ bReturn = TRUE;
++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
++ break;
++
++ case PART_BUTTON_DOWN:
++ qRect = kapp->style().querySubControlMetrics(
++ TQStyle::CC_SpinWidget, pWidget, TQStyle::SC_SpinWidgetDown );
++ bReturn = TRUE;
++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
++ break;
++
++ case PART_SUB_EDIT:
++ qRect = kapp->style().querySubControlMetrics(
++ TQStyle::CC_SpinWidget, pWidget, TQStyle::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(
++ TQStyle::CC_ScrollBar, pWidget, TQStyle::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(
++ TQStyle::CC_ScrollBar, pWidget,
++ TQStyle::SC_ScrollBarSubPage ).left() )
++ {
++ qRect.setLeft( 0 );
++ qRect.setRight( 0 );
++ }
++ }
++ else
++ {
++ if ( qRect.top() > kapp->style().querySubControlMetrics(
++ TQStyle::CC_ScrollBar, pWidget,
++ TQStyle::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(
++ TQStyle::CC_ScrollBar, pWidget, TQStyle::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(
++ TQStyle::CC_ScrollBar, pWidget,
++ TQStyle::SC_ScrollBarAddPage ).right() + 1 );
++ else
++ qRect.setTop( kapp->style().querySubControlMetrics(
++ TQStyle::CC_ScrollBar, pWidget,
++ TQStyle::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, sal_uLong nStyle ) :
++ X11SalFrame( pParent, nStyle )
++{
++}
++
++void TDESalFrame::Show( sal_Bool bVisible, sal_Bool bNoActivate )
++{
++ if ( !GetParent() && ! (GetStyle() & SAL_FRAME_STYLE_INTRO) )
++ {
++ TDEXLib* pXLib = static_cast<TDEXLib*>(GetDisplay()->GetXLib());
++ pXLib->doStartup();
++ }
++ X11SalFrame::Show( bVisible, bNoActivate );
++}
++
++/** Helper function to convert colors.
++*/
++static Color toColor( const TQColor &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 TQFont.
++
++ Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx).
++*/
++static Font toFont( const TQFont &rTQFont, const ::com::sun::star::lang::Locale& rLocale )
++{
++ psp::FastPrintFontInfo aInfo;
++ TQFontInfo qFontInfo( rTQFont );
++
++ // set family name
++ aInfo.m_aFamilyName = String( rTQFont.family().utf8(), RTL_TEXTENCODING_UTF8 );
++
++ // set italic
++ aInfo.m_eItalic = ( qFontInfo.italic()? ITALIC_NORMAL: ITALIC_NONE );
++
++ // set weight
++ int nWeight = qFontInfo.weight();
++ if ( nWeight <= TQFont::Light )
++ aInfo.m_eWeight = WEIGHT_LIGHT;
++ else if ( nWeight <= TQFont::Normal )
++ aInfo.m_eWeight = WEIGHT_NORMAL;
++ else if ( nWeight <= TQFont::DemiBold )
++ aInfo.m_eWeight = WEIGHT_SEMIBOLD;
++ else if ( nWeight <= TQFont::Bold )
++ aInfo.m_eWeight = WEIGHT_BOLD;
++ else
++ aInfo.m_eWeight = WEIGHT_ULTRABOLD;
++
++ // set width
++ int nStretch = rTQFont.stretch();
++ if ( nStretch <= TQFont::UltraCondensed )
++ aInfo.m_eWidth = WIDTH_ULTRA_CONDENSED;
++ else if ( nStretch <= TQFont::ExtraCondensed )
++ aInfo.m_eWidth = WIDTH_EXTRA_CONDENSED;
++ else if ( nStretch <= TQFont::Condensed )
++ aInfo.m_eWidth = WIDTH_CONDENSED;
++ else if ( nStretch <= TQFont::SemiCondensed )
++ aInfo.m_eWidth = WIDTH_SEMI_CONDENSED;
++ else if ( nStretch <= TQFont::Unstretched )
++ aInfo.m_eWidth = WIDTH_NORMAL;
++ else if ( nStretch <= TQFont::SemiExpanded )
++ aInfo.m_eWidth = WIDTH_SEMI_EXPANDED;
++ else if ( nStretch <= TQFont::Expanded )
++ aInfo.m_eWidth = WIDTH_EXPANDED;
++ else if ( nStretch <= TQFont::ExtraExpanded )
++ aInfo.m_eWidth = WIDTH_EXTRA_EXPANDED;
++ else
++ aInfo.m_eWidth = WIDTH_ULTRA_EXPANDED;
++
++#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 = rTQFont.pointSize();
++
++ // Create the font
++ Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) );
++ if( aInfo.m_eWeight != WEIGHT_DONTKNOW )
++ aFont.SetWeight( aInfo.m_eWeight );
++ if( aInfo.m_eWidth != WIDTH_DONTKNOW )
++ aFont.SetWidthType( aInfo.m_eWidth );
++ if( aInfo.m_eItalic != ITALIC_DONTKNOW )
++ aFont.SetItalic( aInfo.m_eItalic );
++ if( aInfo.m_ePitch != PITCH_DONTKNOW )
++ aFont.SetPitch( 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
++ TQColorGroup 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 = TQApplication::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
++ TQColorGroup 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( TQStyle::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, sal_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 --git a/vcl/unx/tde/tdedata.cxx b/vcl/unx/tde/tdedata.cxx
+new file mode 100644
+index 0000000..adeb628
+--- /dev/null
++++ b/vcl/unx/tde/tdedata.cxx
+@@ -0,0 +1,267 @@
++/* -*- 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_vcl.hxx"
++
++#define _SV_SALDATA_CXX
++#include <unx/tde/tde_headers.h>
++
++#include <unistd.h>
++#include <fcntl.h>
++
++#include <stdio.h>
++#include <string.h>
++#include <stdlib.h>
++#include <limits.h>
++#include <errno.h>
++#include <poll.h>
++#ifdef FREEBSD
++#include <sys/types.h>
++#include <sys/time.h>
++#include <unistd.h>
++#endif
++
++#include <osl/thread.h>
++#include <osl/process.h>
++#include <osl/module.h>
++#include <osl/mutex.hxx>
++
++#include <tools/debug.hxx>
++
++#include "unx/tde/tdedata.hxx"
++#include "unx/i18n_im.hxx"
++#include "unx/i18n_xkb.hxx"
++
++#include "vclpluginapi.h"
++
++/* #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<TDEXLib*>(GetXLib())->doStartup();
++ // clean up own members
++ doDestruct();
++ // prevent SalDisplay from closing KApplication's display
++ pDisp_ = NULL;
++}
++
++/***************************************************************************
++ * class TDEXLib *
++ ***************************************************************************/
++
++TDEXLib::~TDEXLib()
++{
++ // 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\n(c) 2010 Timothy Pearson",
++ 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;
++ sal_uInt16 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.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "-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();
++
++ SalX11Display *pSalDisplay = new SalTDEDisplay( pDisp );
++
++ pInputMethod->CreateMethod( pDisp );
++ pSalDisplay->SetupInput( pInputMethod );
++}
++
++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" {
++ VCLPLUG_TDE_PUBLIC 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( pInstance );
++ pSalData->Init();
++ pInstance->SetLib( pSalData->GetLib() );
++ pSalData->initNWF();
++
++ return pInstance;
++ }
++}
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */