From 5e630597954fc7225f5301868f9cd8ce3f7bd20c Mon Sep 17 00:00:00 2001
From: Timothy Pearson <kb9vqf@pearsoncomputing.net>
Date: Mon, 19 Sep 2011 19:42:22 -0500
Subject: Add LibreOffice 3.3.3 TDE patchset to GIT

---
 libreoffice/3.3.3/patches/NOTES                    |     3 +
 .../3.3.3/patches/libreoffice-trinity-debian.diff  |   368 +
 libreoffice/3.3.3/patches/libreoffice-trinity.diff | 15796 +++++++++++++++++++
 3 files changed, 16167 insertions(+)
 create mode 100644 libreoffice/3.3.3/patches/NOTES
 create mode 100644 libreoffice/3.3.3/patches/libreoffice-trinity-debian.diff
 create mode 100644 libreoffice/3.3.3/patches/libreoffice-trinity.diff

diff --git a/libreoffice/3.3.3/patches/NOTES b/libreoffice/3.3.3/patches/NOTES
new file mode 100644
index 0000000..15a4f25
--- /dev/null
+++ b/libreoffice/3.3.3/patches/NOTES
@@ -0,0 +1,3 @@
+This patchset is intended for Debian and has not been tested on other systems, however the patch libreoffice-trinity.diff should apply cleanly to a stock LibreOffice source tree and function properly if enabled.
+
+After patch application, you will need to rerun autoconf from within the libreoffice-build directory in order to apply the changes made to configure.in
diff --git a/libreoffice/3.3.3/patches/libreoffice-trinity-debian.diff b/libreoffice/3.3.3/patches/libreoffice-trinity-debian.diff
new file mode 100644
index 0000000..46b04d4
--- /dev/null
+++ b/libreoffice/3.3.3/patches/libreoffice-trinity-debian.diff
@@ -0,0 +1,368 @@
+diff -urN debian/changelog debian/changelog
+--- debian/changelog	2011-07-21 02:13:49.000000000 -0500
++++ debian/changelog	2011-09-19 11:37:12.650300701 -0500
+@@ -1,3 +1,9 @@
++libreoffice (1:3.3.3-1ubuntu2~build0~natty) natty; urgency=low
++
++  * Enable TDE module
++
++ -- Timothy Pearson <kb9vqf@pearsoncomputing.net>  Sat, 20 Aug 2011 15:14:00 -0600
++
+ libreoffice (1:3.3.3-1ubuntu2) natty-proposed; urgency=medium
+ 
+   * move icons back to 3.3 location after unpacking (LP: #813148)
+diff -urN debian/control debian/control
+--- debian/control	2011-07-21 02:15:18.000000000 -0500
++++ debian/control	2011-09-19 11:55:20.684872566 -0500
+@@ -4,9 +4,9 @@
+ Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+ XSBC-Original-Maintainer: Debian LibreOffice Maintainers <debian-openoffice@lists.debian.org>
+ Uploaders: Rene Engelhard <rene@debian.org>
+-Build-Depends: lsb-release, bzip2, bison, flex | flex-old, libxaw7-dev, unzip, zip, autoconf, automake, sharutils, pkg-config, libfontconfig1-dev, libc0.1 (>= 2.10.2-7) [kfreebsd-i386 kfreebsd-amd64], zlib1g-dev, libfreetype6-dev, libx11-dev, libsm-dev, libxt-dev, libxext-dev, libxtst-dev, libice-dev, libsane-dev, libxrender-dev, libcups2-dev, libarchive-zip-perl, libpng12-dev, libjpeg-dev, libxml2-dev, libexpat1-dev, fastjar, xsltproc, libxkbfile-dev, libxinerama-dev, x11proto-render-dev, unixodbc-dev (>= 2.2.11), libxml-parser-perl, gperf, libpq-dev, po-debconf, bc, wget | curl, dpkg-dev (>= 1.15.1), libgl1-mesa-dev [!armel !mips !mipsel], libglu1-mesa-dev [!armel !mips !mipsel], libpoppler-dev (>= 0.8.0), libgraphite-dev, libtextcat-dev (>= 2.2-8), libcurl4-gnutls-dev, libssl-dev, libdb-dev, python (>= 2.6.6-3+squeeze4), python-dev, debhelper (>= 7.2.3~), libcppunit-dev (>= 1.12), openjdk-6-jdk [alpha amd64 armel armhf i386 powerpc powerpcspe ppc64 s390 s390x sparc], gcj-native-helper [!powerpc !powerpcspe !ppc64], libgcj-common (>= 1:4.4.1) [!powerpc !powerpcspe !ppc64], ant (>= 1.7.0), ant-optional (>= 1.7.0), libcommons-codec-java, libcommons-httpclient-java, libcommons-lang-java, libcommons-logging-java, libservlet2.5-java, libbase-java-openoffice.org [!armel], libsac-java [!armel], libxml-java-openoffice.org [!armel], libflute-java-openoffice.org [!armel], libpentaho-reporting-flow-engine-java-openoffice.org [!armel], liblayout-java-openoffice.org [!armel], libloader-java-openoffice.org [!armel], libformula-java-openoffice.org [!armel], librepository-java-openoffice.org [!armel], libfonts-java-openoffice.org [!armel], libserializer-java-openoffice.org [!armel], libcommons-logging-java, libservlet2.5-java, javahelper, xulrunner-dev | firefox-dev, libnss3-dev (>= 3.12.3), dmake (>= 1:4.11), mono-devel (>= 2.4.2.3) [amd64 i386 ia64 kfreebsd-amd64 kfreebsd-i386], libmono-dev (>= 2.4.2.3) [amd64 i386 ia64 kfreebsd-amd64 kfreebsd-i386], mono-utils (>= 2.4.2.3) [amd64 i386 ia64 kfreebsd-amd64 kfreebsd-i386], cli-common-dev (>= 0.5.7) [amd64 i386 ia64 kfreebsd-amd64 kfreebsd-i386], libhunspell-dev (>= 1.1.5-2), libhyphen-dev (>= 2.4), libstlport4.6-dev (>= 4.6.2-3) [i386], libboost-dev (>= 1.38), libmdds-dev, libvigraimpex-dev, libwpd-dev (>= 0.9.0), libmythes-dev (>= 2:1.2), libwps-dev (>= 0.2.0), libwpg-dev (>= 0.2.0), libicu-dev (>= 4.0), libxslt1-dev, libcairo2-dev, kdelibs5-dev (>= 4:4.3.4), libqt4-dev (>= 4.5), libmysqlclient-dev, libmysqlcppconn-dev (>= 1.1.0~r791), libebook1.2-dev [!armel], libxrandr-dev, libhsqldb-java (>> 1.8.0.10), bsh (>= 2.0b4), liblpsolve55-dev (>= 5.5.0.13-5+b1), lp-solve (>= 5.5.0.13-5+b1), libsuitesparse-dev (>= 1:3.4.0), libdbus-glib-1-dev (>= 0.60), libgstreamer-plugins-base0.10-dev, libneon27-gnutls-dev, librdf0-dev (>= 1.0.8), libgtk2.0-dev (>= 2.10), libgnomevfs2-dev, libgconf2-dev, libldap2-dev
++Build-Depends: lsb-release, bzip2, bison, flex | flex-old, libxaw7-dev, unzip, zip, autoconf, automake, sharutils, pkg-config, libfontconfig1-dev, libc0.1 (>= 2.10.2-7) [kfreebsd-i386 kfreebsd-amd64], zlib1g-dev, libfreetype6-dev, libx11-dev, libsm-dev, libxt-dev, libxext-dev, libxtst-dev, libice-dev, libsane-dev, libxrender-dev, libcups2-dev, libarchive-zip-perl, libpng12-dev, libjpeg-dev, libxml2-dev, libexpat1-dev, fastjar, xsltproc, libxkbfile-dev, libxinerama-dev, x11proto-render-dev, unixodbc-dev (>= 2.2.11), libxml-parser-perl, gperf, libpq-dev, po-debconf, bc, wget | curl, dpkg-dev (>= 1.15.1), libgl1-mesa-dev [!armel !mips !mipsel], libglu1-mesa-dev [!armel !mips !mipsel], libpoppler-dev (>= 0.8.0), libgraphite-dev, libtextcat-dev (>= 2.2-8), libcurl4-gnutls-dev, libssl-dev, libdb-dev, python (>= 2.6.6-3+squeeze4), python-dev, debhelper (>= 7.2.3~), libcppunit-dev (>= 1.12), openjdk-6-jdk [alpha amd64 armel armhf i386 powerpc powerpcspe ppc64 s390 s390x sparc], gcj-native-helper [!powerpc !powerpcspe !ppc64], libgcj-common (>= 1:4.4.1) [!powerpc !powerpcspe !ppc64], ant (>= 1.7.0), ant-optional (>= 1.7.0), libcommons-codec-java, libcommons-httpclient-java, libcommons-lang-java, libcommons-logging-java, libservlet2.5-java, libbase-java-openoffice.org [!armel], libsac-java [!armel], libxml-java-openoffice.org [!armel], libflute-java-openoffice.org [!armel], libpentaho-reporting-flow-engine-java-openoffice.org [!armel], liblayout-java-openoffice.org [!armel], libloader-java-openoffice.org [!armel], libformula-java-openoffice.org [!armel], librepository-java-openoffice.org [!armel], libfonts-java-openoffice.org [!armel], libserializer-java-openoffice.org [!armel], libcommons-logging-java, libservlet2.5-java, javahelper, xulrunner-dev | firefox-dev, libnss3-dev (>= 3.12.3), dmake (>= 1:4.11), mono-devel (>= 2.4.2.3) [amd64 i386 ia64 kfreebsd-amd64 kfreebsd-i386], libmono-dev (>= 2.4.2.3) [amd64 i386 ia64 kfreebsd-amd64 kfreebsd-i386], mono-utils (>= 2.4.2.3) [amd64 i386 ia64 kfreebsd-amd64 kfreebsd-i386], cli-common-dev (>= 0.5.7) [amd64 i386 ia64 kfreebsd-amd64 kfreebsd-i386], libhunspell-dev (>= 1.1.5-2), libhyphen-dev (>= 2.4), libstlport4.6-dev (>= 4.6.2-3) [i386], libboost-dev (>= 1.38), libmdds-dev, libvigraimpex-dev, libwpd-dev (>= 0.9.0), libmythes-dev (>= 2:1.2), libwps-dev (>= 0.2.0), libwpg-dev (>= 0.2.0), libicu-dev (>= 4.0), libxslt1-dev, libcairo2-dev, kdelibs4-trinity-dev, libqt4-dev (>= 4.5), libmysqlclient-dev, libmysqlcppconn-dev (>= 1.1.0~r791), libebook1.2-dev [!armel], libxrandr-dev, libhsqldb-java (>> 1.8.0.10), bsh (>= 2.0b4), liblpsolve55-dev (>= 5.5.0.13-5+b1), lp-solve (>= 5.5.0.13-5+b1), libsuitesparse-dev (>= 1:3.4.0), libdbus-glib-1-dev (>= 0.60), libgstreamer-plugins-base0.10-dev, libneon27-gnutls-dev, librdf0-dev (>= 1.0.8), libgtk2.0-dev (>= 2.10), libgnomevfs2-dev, libgconf2-dev, libldap2-dev
+ Build-Depends-Indep: fdupes, xml-core, imagemagick, fontforge
+-Build-Conflicts: libcairo2 (= 1.4.8-1), libxul-dev (= 1.8.0.13~pre070720-0etch1), gjdoc (= 0.7.8-2), libc6-dev (= 2.6.1-3) [i386 amd64], libc6-dev (= 2.6.1-4) [i386 amd64], nvidia-glx-dev, nvidia-glx-legacy-dev, libmono-dev (= 1.2.6+dfsg-1), libmono-dev (= 1.2.6+dfsg-2), libmono-dev (= 1.2.6+dfsg-3), libmono-dev (= 1.2.6+dfsg-4), libmono-dev (= 2.4+dfsg-2) [sparc], gcj-4.2 (= 4.2.2-6), flex (= 2.5.34-1) [amd64], libboost1.39-dev (<< 1.39.0-2), graphicsmagick-imagemagick-compat (<< 1.3.9~), qt3-dev-tools, ant (= 1.8.0-1) [hppa ia64 kfreebsd-i386 kfreebsd-amd64 mips mipsel], ant (= 1.8.0-2) [hppa ia64 kfreebsd-i386 kfreebsd-amd64 mips mipsel], ant (= 1.8.0-3) [hppa ia64 kfreebsd-i386 kfreebsd-amd64 mips mipsel], libmdds-dev (>= 0.4.0), base-files (= 6.0), base-files (= 6.0squeeze1), libhsqldb-java (>= 1.8.1~)
++Build-Conflicts: libcairo2 (= 1.4.8-1), libxul-dev (= 1.8.0.13~pre070720-0etch1), gjdoc (= 0.7.8-2), libc6-dev (= 2.6.1-3) [i386 amd64], libc6-dev (= 2.6.1-4) [i386 amd64], nvidia-glx-dev, nvidia-glx-legacy-dev, libmono-dev (= 1.2.6+dfsg-1), libmono-dev (= 1.2.6+dfsg-2), libmono-dev (= 1.2.6+dfsg-3), libmono-dev (= 1.2.6+dfsg-4), libmono-dev (= 2.4+dfsg-2) [sparc], gcj-4.2 (= 4.2.2-6), flex (= 2.5.34-1) [amd64], libboost1.39-dev (<< 1.39.0-2), graphicsmagick-imagemagick-compat (<< 1.3.9~), ant (= 1.8.0-1) [hppa ia64 kfreebsd-i386 kfreebsd-amd64 mips mipsel], ant (= 1.8.0-2) [hppa ia64 kfreebsd-i386 kfreebsd-amd64 mips mipsel], ant (= 1.8.0-3) [hppa ia64 kfreebsd-i386 kfreebsd-amd64 mips mipsel], libmdds-dev (>= 0.4.0), base-files (= 6.0), base-files (= 6.0squeeze1), libhsqldb-java (>= 1.8.1~)
+ Standards-Version: 3.9.1
+ XS-Python-Version: current
+ Vcs-Git: https://alioth.debian.org/anonscm/git/pkg-openoffice/libreoffice.git
+@@ -18,7 +18,7 @@
+ Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc powerpcspe ppc64 s390 s390x sparc kfreebsd-amd64 kfreebsd-i386
+ Depends: libreoffice-core (= ${binary:Version}), libreoffice-writer, libreoffice-calc, libreoffice-impress, libreoffice-draw, libreoffice-math, libreoffice-base [!armel], libreoffice-report-builder-bin [!armel], ttf-dejavu, ttf-sil-gentium-basic, libreoffice-filter-mobiledev, ${lucene-depends}, ${java-common-depends}, ${misc:Depends}
+ Recommends: ttf-liberation | ttf-mscorefonts-installer
+-Suggests: hunspell-dictionary, myspell-dictionary, libreoffice-help-${help-l10n-virtual-version}, menu, unixodbc, cups-bsd, libsane, hyphen-hyphenation-patterns, mythes-thesaurus, libxrender1, libgl1, libreoffice-gnome | libreoffice-kde, iceweasel | firefox | icedove | thunderbird | iceape-browser | mozilla-browser, ${java-runtime-depends}, openclipart-libreoffice, pstoedit, imagemagick | graphicsmagick-imagemagick-compat, libpaper-utils, ${gstreamer-plugins-suggests}, ${libldap-suggests}, ${ooo-binfilter-dep}, ${ooo-officebean-dep}
++Suggests: hunspell-dictionary, myspell-dictionary, libreoffice-help-${help-l10n-virtual-version}, menu, unixodbc, cups-bsd, libsane, hyphen-hyphenation-patterns, mythes-thesaurus, libxrender1, libgl1, libreoffice-gnome | libreoffice-kde | libreoffice-trinity, iceweasel | firefox | icedove | thunderbird | iceape-browser | mozilla-browser, ${java-runtime-depends}, openclipart-libreoffice, pstoedit, imagemagick | graphicsmagick-imagemagick-compat, libpaper-utils, ${gstreamer-plugins-suggests}, ${libldap-suggests}, ${ooo-binfilter-dep}, ${ooo-officebean-dep}
+ Description: office productivity suite
+  LibreOffice is a full-featured office productivity suite that provides
+  a near drop-in replacement for Microsoft(R) Office.
+@@ -45,6 +45,7 @@
+     QuickStarter for GNOMEs notification are
+   * libreoffice-gnome: GNOME VFS, GConf backend
+   * libreoffice-kde: KDE UI Plugin and KDE File Picker support
++  * libreoffice-trinity: TDE UI Plugin and TDE File Picker support
+   * menu: Will add libreoffice menu entries for every Debian window manager.
+   * unixodbc: ODBC database support
+   * cups-bsd: Allows LibreOffice to detect your CUPS printer queues
+@@ -91,7 +92,7 @@
+ Package: libreoffice-core
+ Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc powerpcspe ppc64 s390 s390x sparc kfreebsd-amd64 kfreebsd-i386
+ Depends: libreoffice-common (>> ${base-version}), ttf-opensymbol (>= 1:3.0), ${shlibs:Depends}, ure (>= 1.5.1+OOo3.1.1-15), fontconfig, ${mozilla-nss-depends}, ${misc:Depends}
+-Conflicts: libreoffice-calc (<< ${binary:Version}), libreoffice-writer (<< ${binary:Version}), libreoffice-impress (<< ${binary:Version}), libreoffice-draw (<< ${binary:Version}), libreoffice-base (<< ${binary:Version}), libreoffice-gtk (<< ${binary:Version}), libreoffice-gnome (<< ${binary:Version}), libreoffice-kde (<< ${binary:Version}), libreoffice-evolution (<< ${binary:Version}), libreoffice-filter-so52 (<< ${binary:Version}), libreoffice-officebean (<< ${binary:Version}), libreoffice-dev (<< ${binary:Version}), libcairo2 (= 1.4.8-1), libicu38 (= 3.8~d01-1), cli-uno-bridge (<< 1:3.0.0~dev300m22), cacao-oj6-jre, mozilla-plugin-vlc (<< 1.0)
++Conflicts: libreoffice-calc (<< ${binary:Version}), libreoffice-writer (<< ${binary:Version}), libreoffice-impress (<< ${binary:Version}), libreoffice-draw (<< ${binary:Version}), libreoffice-base (<< ${binary:Version}), libreoffice-gtk (<< ${binary:Version}), libreoffice-gnome (<< ${binary:Version}), libreoffice-kde (<< ${binary:Version}), libreoffice-trinity (<< ${binary:Version}), libreoffice-evolution (<< ${binary:Version}), libreoffice-filter-so52 (<< ${binary:Version}), libreoffice-officebean (<< ${binary:Version}), libreoffice-dev (<< ${binary:Version}), libcairo2 (= 1.4.8-1), libicu38 (= 3.8~d01-1), cli-uno-bridge (<< 1:3.0.0~dev300m22), cacao-oj6-jre, mozilla-plugin-vlc (<< 1.0)
+ Breaks: myspell-ru (<< 0.99g5-8.1), myspell-lv (<< 0.7.3-3.1), myspell-et (<< 1:20030606-12.1), myspell-fi (<< 0.7-17.2), myspell-cs-cz (<< 20040229-4.1), myspell-el-gr (<< 0.3-1.1), myspell-nn (<< 2.0.10-3.1), myspell-nb (<< 2.0.10-3.1), hunspell-ar (<< 0.0.0+20080110-1.1), myspell-hu (<< 0.99.4-1.2), hunspell-gl-es (<< 2.2a-6), myspell-gv (<< 0.50-8), myspell-en-au (<< 2.1-5), myspell-fa (<< 0.20070816-2), hunspell-uz (<< 0.6-3.1), hunspell-ko (<< 0.3.3-1), hunspell-se (<< 1.0~beta6.20081222-1.1), hunspell-de-med (<< 20090825-1), hunspell-en-us (<< 20070829-3), myspell-sv-se (<< 1.3.8-6-2.2), myspell-sk (<< 0.5.5a-2.1), myspell-fo (<< 0.2.36-3), myspell-nl (<< 1:1.10-3), myspell-pt-br (<< 2009.03.30-1.1), myspell-pl (<< 20090830-1), myspell-pt-pt (<< 20090309-1.1), myspell-ga (<< 2.0-19), myspell-gd (<< 0.50-7), myspell-ku (<< 0.20.0-1.1), myspell-hr (<< 20060617-2), myspell-fr-gut (<< 1:1.0-26.1), myspell-eo (<< 2.1.2000.02.25-41), myspell-de-de-oldspell (<< 1:2-25.1), myspell-da (<< 1.6.18-1.1), myspell-es (<< 1.10-7), myspell-de-at (<< 20071211-2), myspell-de-ch (<< 20071211-2), myspell-de-de (<< 20071211-2), hunspell-de-at (<< 20071211-2), hunspell-de-ch (<< 20071211-2), hunspell-de-de (<< 20071211-2), myspell-ca (<< 0.6-8), myspell-tl (<< 0.4-0-5), myspell-ne (<< 1.0-4.1), myspell-fr (<< 1.4-25), myspell-hy (<< 0.10.1-1.1), myspell-en-us (<< 1:3.1.0-3), myspell-en-gb (<< 1:3.1.0-3), myspell-en-za (<< 1:3.1.0-3), myspell-af (<< 1:3.1.0-3), myspell-it (<< 1:3.1.0-3), myspell-sw (<< 1:3.1.0-3), myspell-th (<< 1:3.1.0-3), hunspell-en-ca (<< 1:3.1.0-3), hunspell-ne (<< 1:3.1.0-3), hunspell-da (<< 1:3.1.0-3), hunspell-fr (<< 1:3.1.0-3), hunspell-vi (<< 1:3.1.0-3), hunspell-hu (<< 1:3.1.0-3), hunspell-sr (<< 1:3.1.0-3), hunspell-sh (<< 1:3.1.0-3), myspell-lv (<< 0.7.3-3.1), myspell-et (<< 1:20030606-12.1), myspell-nn (<< 2.0.10-3.1), myspell-nb (<< 2.0.10-3.1)
+ Provides: libreoffice-bundled
+ Replaces: libreoffice-calc (<< 1:3.3.2-5)
+@@ -775,7 +776,7 @@
+ Section: debug
+ Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc powerpcspe ppc64 s390 s390x sparc kfreebsd-amd64 kfreebsd-i386
+ Priority: extra
+-Depends: libreoffice-core (= ${binary:Version}) | libreoffice-gcj (= ${binary:Version}) | libreoffice-dev (= ${binary:Version}) | libreoffice-gnome (= ${binary:Version}) | libreoffice-kde (= ${binary:Version}) | libreoffice-calc (= ${binary:Version}) | libreoffice-base-core (= ${binary:Version}) | libreoffice-base (= ${binary:Version}) | libreoffice-impress (= ${binary:Version}) | libreoffice-filter-binfilter (= ${binary:Version}) | libreoffice-draw (= ${binary:Version}) | libreoffice-writer (= ${binary:Version}) | python-uno (= ${binary:Version}) | cli-uno-bridge (= ${binary:Version}) | mozilla-libreoffice (= ${binary:Version}) | libreoffice-ogltrans (= ${binary:Version}), ${misc:Depends}
++Depends: libreoffice-core (= ${binary:Version}) | libreoffice-gcj (= ${binary:Version}) | libreoffice-dev (= ${binary:Version}) | libreoffice-gnome (= ${binary:Version}) | libreoffice-kde (= ${binary:Version}) | libreoffice-trinity (= ${binary:Version}) | libreoffice-calc (= ${binary:Version}) | libreoffice-base-core (= ${binary:Version}) | libreoffice-base (= ${binary:Version}) | libreoffice-impress (= ${binary:Version}) | libreoffice-filter-binfilter (= ${binary:Version}) | libreoffice-draw (= ${binary:Version}) | libreoffice-writer (= ${binary:Version}) | python-uno (= ${binary:Version}) | cli-uno-bridge (= ${binary:Version}) | mozilla-libreoffice (= ${binary:Version}) | libreoffice-ogltrans (= ${binary:Version}), ${misc:Depends}
+ Recommends: ure-dbg
+ Suggests: ${dbg-dbg-suggests}
+ Description: office productivity suite -- debug symbols
+@@ -837,6 +838,25 @@
+   * konqueror / kmail
+   * libreoffice-kab: KDE Addressbook support
+ 
++Package: libreoffice-trinity
++Architecture: alpha amd64 armel armhf hppa i386 ia64 mips mipsel powerpc powerpcspe ppc64 s390 s390x sparc kfreebsd-amd64 kfreebsd-i386
++Depends: libreoffice-core (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
++Recommends: ${tde-iconset-dep}
++Suggests: konqueror-trinity, kmail-trinity, libreoffice-kab-trinity
++Section: kde
++Enhances: libreoffice
++Replaces: openoffice.org-trinity (<< 1:3.3.0~)
++Description: office productivity suite -- TDE integration
++ LibreOffice is a full-featured office productivity suite that provides
++ a near drop-in replacement for Microsoft(R) Office.
++ .
++ This package contains the TDE plugin for drawing OOo's widgets with
++ TDE/Qt and a TDEish File Picker when running under TDE.
++ You can extend the functionality of this by installing these packages:
++ .
++  * konqueror-trinity / kmail-trinity
++  * libreoffice-kab-trinity: TDE Addressbook support
++
+ Package: libreoffice-sdbc-postgresql
+ Section: misc
+ Architecture: alpha amd64 armhf hppa i386 ia64 mips mipsel powerpc powerpcspe ppc64 s390 s390x sparc kfreebsd-amd64 kfreebsd-i386
+diff -urN debian/control.in debian/control.in
+--- debian/control.in	2011-07-21 02:13:49.000000000 -0500
++++ debian/control.in	2011-09-19 11:36:44.782768358 -0500
+@@ -180,6 +180,7 @@
+  libreofficeVER-gtk (<< ${binary:Version}),
+  libreofficeVER-gnome (<< ${binary:Version}),
+  libreofficeVER-kde (<< ${binary:Version}),
++ libreofficeVER-trinity (<< ${binary:Version}),
+  libreofficeVER-evolution (<< ${binary:Version}),
+  libreofficeVER-filter-so52 (<< ${binary:Version}),
+  libreofficeVER-officebean (<< ${binary:Version}),
+diff -urN debian/control.tdeab.in debian/control.tdeab.in
+--- debian/control.tdeab.in	1969-12-31 18:00:00.000000000 -0600
++++ debian/control.tdeab.in	2011-09-19 11:36:44.790768076 -0500
+@@ -0,0 +1,14 @@
++Package: libreofficeVER-kab-trinity
++Architecture: %OOO_BASE_ARCHS%
++Depends: libreofficeVER-core (= ${binary:Version}),
++ ${shlibs:Depends},
++ ${misc:Depends}
++Recommends: kaddressbook-trinity
++Conflicts: ure (<< 1.5.1+OOo3.1.1-15)
++Description: office productivity suite -- TDE adressbook support
++ LibreOffice is a full-featured office productivity suite that provides
++ a near drop-in replacement for Microsoft(R) Office.
++ .
++ This package allows LibreOffice to access the TDE Addressbook.
++ You need to install kaddressbook-trinity separately.
++
+diff -urN debian/control.tde.in debian/control.tde.in
+--- debian/control.tde.in	1969-12-31 18:00:00.000000000 -0600
++++ debian/control.tde.in	2011-09-19 11:36:44.794767989 -0500
+@@ -0,0 +1,23 @@
++Package: libreofficeVER-trinity
++Architecture: %OOO_ARCHS%
++Depends: libreofficeVER-core (= ${binary:Version}),
++ ${shlibs:Depends},
++ ${misc:Depends}
++Recommends: ${tde-iconset-dep}
++Suggests: konqueror-trinity,
++ kmail-trinity,
++ libreofficeVER-kab-trinity
++Section: kde
++Enhances: libreofficeVER
++Replaces: openoffice.org-trinity (<< 1:3.3.0~)
++Description: office productivity suite -- TDE integration
++ LibreOffice is a full-featured office productivity suite that provides
++ a near drop-in replacement for Microsoft(R) Office.
++ .
++ This package contains the TDE plugin for drawing OOo's widgets with
++ TDE/TQt and a TDEish File Picker when running under TDE.
++ You can extend the functionality of this by installing these packages:
++ .
++  * konqueror-trinity / kmail-trinity
++  * libreoffice-kab-trinity: TDE Addressbook support
++
+diff -urN debian/rules debian/rules
+--- debian/rules	2011-07-21 02:13:49.000000000 -0500
++++ debian/rules	2011-09-19 11:39:32.611849416 -0500
+@@ -175,11 +175,18 @@
+ BUILD_CAIROCANVAS=y
+ SYSTEM_STUFF += cairo
+ CAIRO_FONTS_PATCH=y
+-BUILD_KDE=y
++BUILD_KDE=n
++BUILD_TDE=y
+ # not ported to KDE 4
+ ENABLE_KDEAB=n
+ QT_MINVER= (>= 4.5)
+ KDELIBS_MINVER= (>= 4:4.3.4)
++ifeq "$(BUILD_TDE)" "y"
++  ENABLE_TDEAB=y
++endif
++ifeq "$(BUILD_TDE)" "y"
++  TDELIBS_MINVER= (>= 4:3.5.12)
++endif
+ BUILD_DBG_PACKAGE=y
+ SYSTEM_STUFF += beanshell
+ SYSTEM_STUFF += hsqldb
+@@ -376,6 +383,7 @@
+ 	ENABLE_MYSQLNATIVE=n
+ 	ENABLE_EVO2=n
+ 	ENABLE_KDEAB=n
++	ENABLE_TDEAB=n
+ 	ENABLE_REPORTDESIGN=n
+ 	DEBHELPER_OPTIONS += -Nlibreoffice$(VER)-base libreoffice$(VER)-base-core
+ 	DEBHELPER_OPTIONS += -Nlibreoffice$(VER)-evolution -Nlibreoffice$(VER)-kab
+@@ -1001,6 +1009,25 @@
+   endif
+ endif
+ 
++ifeq "$(BUILD_TDE)" "n"
++  CONFIGURE_FLAGS+= --disable-tde
++  CONFIGURE_FLAGS+= --with-images="$(IMAGES)"
++else
++  CONFIGURE_FLAGS+= --disable-kde
++  CONFIGURE_FLAGS+= --disable-kde4
++  CONFIGURE_FLAGS+= --enable-tde
++  TDE_ICONSET_DEP=libreoffice$(VER)-style-crystal
++  BUILD_DEPS += , kdelibs4-trinity-dev
++
++  DBG_DBG_SUGGESTS+= , kdelibs-trinity-dbg, libtqtinterface-dbg
++
++  ifeq "$(ENABLE_TDEAB)" "y"
++    BUILD_DEPS += , kdepim-trinity-dev
++  else
++    CONFIGURE_FLAGS+= --disable-tdeab
++  endif
++endif
++
+ ifeq "$(ENABLE_MYSQLNATIVE)" "y"
+ 	CONFIGURE_FLAGS += --enable-mysql-connector
+   ifneq (,$(filter mysql, $(SYSTEM_STUFF)))
+@@ -1542,6 +1569,11 @@
+ 		>> debian/control < debian/control.kde.in
+ 	  perl -pi -e 's/ libreoffice$(VER)-gnome,/ libreoffice-gnome | libreoffice$(VER)-kde,/' debian/control
+ endif
++ifeq "$(BUILD_TDE)" "y"
++	sed -e "s|libreofficeVER|libreoffice$(VER)|g" \
++		>> debian/control < debian/control.tde.in
++	  perl -pi -e 's/ libreoffice$(VER)-gnome,/ libreoffice-gnome | libreoffice$(VER)-trinity,/' debian/control
++endif
+ ifeq "$(ENABLE_SDBC_POSTGRESQL)" "y"
+ 	sed -e "s|libreofficeVER|libreoffice$(VER)|g" \
+ 		>> debian/control < debian/control.postgresql.in
+@@ -1558,6 +1590,10 @@
+ 	sed -e "s|libreofficeVER|libreoffice$(VER)|g" \
+ 		>> debian/control < debian/control.kab.in
+ endif
++ifeq "$(ENABLE_TDEAB)" "y"
++	sed -e "s|libreofficeVER|libreoffice$(VER)|g" \
++		>> debian/control < debian/control.tdeab.in
++endif
+ endif # ifeq "$(PKGSOURCE)" "libreoffice$(VER)"
+ 
+ 	perl -pi -e "s,%OOO_ARCHS%,$(OOO_ARCHS),g" debian/control
+@@ -1625,6 +1661,10 @@
+ 	perl -pi -e 's/GConf backend$$/GConf backend\n  * libreoffice$(VER)-kde: KDE UI Plugin and KDE File Picker support/' debian/control
+ endif
+ 
++ifeq "$(BUILD_TDE)" "y"
++	perl -pi -e 's/GConf backend$$/GConf backend\n  * libreoffice$(VER)-trinity: TDE UI Plugin and TDE File Picker support/' debian/control
++endif
++
+ ifeq "$(ENABLE_LDAP)" "y"
+ 	perl -pi -e 's/paperconf$$/paperconf\n  * $(LDAP_LIB): LDAP client library; needed for LibreOffice getting its\n    profiles from LDAP/' debian/control
+ endif
+@@ -1702,6 +1742,12 @@
+   endif
+ endif
+ 
++ifeq "$(BUILD_TDE)" "y"
++	# be sure we use the right moc, FIXME: Trinity uses its own moc
++	mkdir -p $(CURDIR)/debian/usr/bin
++	ln -sf /usr/bin/moc-qt$(KDE_VER) $(CURDIR)/debian/usr/bin/moc
++endif
++
+ ifeq "$(USE_STLPORT)" "y"
+   ifeq "$(USE_SYSTEM_STLPORT)" "y"
+ 	# stlport home
+@@ -1778,6 +1824,7 @@
+ 	dh_testdir
+ 
+ ifeq "$(BUILD_KDE)" "n"
++    ifeq "$(BUILD_TDE)" "n"
+ 	# hack to tell we want crystal icons nevertheless and they should be
+ 	# extracted...
+ 	if ! grep -q crystal $(OOO_BUILD_TREE)/bin/setup; then \
+@@ -1786,6 +1833,7 @@
+ 			| sed -e s/\'industrial/\'industrial\ crystal/ \
+ 			> $(OOO_BUILD_TREE)/bin/setup && rm $(OOO_BUILD_TREE)/bin/setup.bak; \
+ 	fi
++    endif
+ endif
+ 
+ 	cd $(OOO_BUILD_TREE) ; \
+@@ -2297,6 +2345,12 @@
+ 		-br $(PKGDIR)-core/$(OODIR)/program/services.rdb \
+ 		-c 'vnd.sun.star.expand:$$OOO_BASE_DIR/program/libkab1.so'
+ endif
++ifeq "$(ENABLE_TDEAB)" "y"
++	debian/ure/$(OOBRANDDIR)/ure/bin/regcomp -revoke \
++		-r $(PKGDIR)-core/$(OODIR)/program/services.rdb \
++		-br $(PKGDIR)-core/$(OODIR)/program/services.rdb \
++		-c 'vnd.sun.star.expand:$$OOO_BASE_DIR/program/libtdeab1.so'
++endif
+ ifeq "$(BUILD_BINFILTERS)" "y"
+ 	debian/ure/$(OOBRANDDIR)/ure/bin/regcomp -revoke \
+ 		-r $(PKGDIR)-core/$(OODIR)/program/services.rdb \
+@@ -2383,6 +2437,49 @@
+ 	done
+ endif
+ 
++ifeq "$(BUILD_TDE)" "y"
++	mkdir -p -m755 $(PKGDIR)-trinity/$(OODIR)/program
++	mkdir -p -m755 $(PKGDIR)-trinity/$(OOBRANDDIR)/program
++	for f in fps_tde*.uno.so libvclplug_tde*.so; do \
++	  mv $(PKGDIR)-core/$(OODIR)/program/$$f $(PKGDIR)-trinity/$(OODIR)/program || exit 1 ;\
++	done
++	mv $(PKGDIR)-common/$(OOBRANDDIR)/program/tdefilepicker \
++		$(PKGDIR)-trinity/$(OOBRANDDIR)/program
++
++	# install files for TDEs "create new" ...
++	mkdir -p $(PKGDIR)-trinity/usr/share/templates/.source
++	for i in $(SOURCE_TREE)/extras/source/shellnew/*; do \
++		cp $$i $(PKGDIR)-trinity/usr/share/templates/.source/`basename $$i`; \
++	done
++	cat debian/templates/soffice-template.desktop.in \
++		| sed -e "s/@APP@/Writer/" \
++		| sed -e "s/@EXT@/odt/" \
++		| sed -e "s/@TYPE@/text/" \
++		> $(PKGDIR)-trinity/usr/share/templates/soffice.odt.desktop
++	cat debian/templates/soffice-template.desktop.in \
++		| sed -e "s/@APP@/Calc/" \
++		| sed -e "s/@EXT@/ods/" \
++		| sed -e "s/@TYPE@/spreadsheet/" \
++		> $(PKGDIR)-trinity/usr/share/templates/soffice.ods.desktop
++	cat debian/templates/soffice-template.desktop.in \
++		| sed -e "s/@APP@/Impress/" \
++		| sed -e "s/@EXT@/odp/" \
++		| sed -e "s/@TYPE@/presentation/" \
++		> $(PKGDIR)-trinity/usr/share/templates/soffice.odp.desktop
++	cat debian/templates/soffice-template.desktop.in \
++		| sed -e "s/@APP@/Draw/" \
++		| sed -e "s/@EXT@/odg/" \
++		| sed -e "s/@TYPE@/drawing/" \
++		> $(PKGDIR)-trinity/usr/share/templates/soffice.odg.desktop
++endif
++ifeq "$(ENABLE_TDEAB)" "y"
++	rm -rf $(PKGDIR)-kab-trinity
++	mkdir -p -m755 $(PKGDIR)-kab-trinity/$(OODIR)/program
++	for f in libtdeab*so; do \
++	  mv $(PKGDIR)-core/$(OODIR)/program/$$f $(PKGDIR)-kab-trinity/$(OODIR)/program || exit 1 ;\
++	done
++endif
++
+ 	# move the GNOME stuff which are *not* in gid_Module_Optional_Gnome
+ 	# (which is moved into -gnome in package-ooo) into -gnome
+ 	mkdir -p -m755 $(PKGDIR)-gnome/$(OODIR)/program
+@@ -3473,6 +3570,7 @@
+ 		-V'ooo-binfilter-dep=$(OOO_BINFILTER_DEP)' \
+ 		-V'ooo-officebean-dep=$(OOO_OFFICEBEAN_DEP)' \
+ 		-V'kde-iconset-dep=$(KDE_ICONSET_DEP)' \
++		-V'tde-iconset-dep=$(TDE_ICONSET_DEP)' \
+ 		-V'lpsolve-dep=$(LPSOLVE_DEP)' \
+ 		-V'gstreamer-plugins-suggests=$(GSTREAMER_PLUGINS_SUGGESTS)' \
+ 		-V'libebook-dep=$(shell debian/scripts/get_libebook_dep.sh)' \
+diff -urN libreoffice-build/configure.in libreoffice-build/configure.in
+--- libreoffice-build/configure.in	2011-05-31 10:43:15.000000000 -0500
++++ libreoffice-build/configure.in	2011-09-19 11:36:44.850767094 -0500
+@@ -81,6 +81,11 @@
+   --disable-kde4          Disables KDE4 native widgets.],
+ ,)
+ 
++AC_ARG_ENABLE(tde,
++[
++  --disable-tde           Disables TDE native widgets.],
++,)
++
+ AC_ARG_ENABLE(mono,
+ [
+   --enable-mono           Enables the compilation of the Mono bindings.],
+@@ -928,6 +933,16 @@
+     OOO_WIDGET_FLAGS="$OOO_WIDGET_FLAGS --disable-kde4"
+ fi
+ 
++OOO_WIDGET_FLAGS=
++if test "$enable_tde" != "no"; then
++    if test "z$with_win32" = "z" -a "z`uname -s`" != "zDarwin" -a "z$with_distro" != "zCrossWin32"; then
++        OOO_WIDGET_FLAGS="--enable-tde"
++        widget_sets="tde"
++    fi
++else
++    OOO_WIDGET_FLAGS="--disable-tde"
++fi
++
+ if test "$enable_gtk" != "no"; then
+     if test "z$with_win32" = "z" -a "z`uname -s`" != "zDarwin" -a "z$with_distro" != "zCrossWin32"; then
+         OOO_WIDGET_FLAGS="--enable-gtk $OOO_WIDGET_FLAGS"
\ No newline at end of file
diff --git a/libreoffice/3.3.3/patches/libreoffice-trinity.diff b/libreoffice/3.3.3/patches/libreoffice-trinity.diff
new file mode 100644
index 0000000..65658e8
--- /dev/null
+++ b/libreoffice/3.3.3/patches/libreoffice-trinity.diff
@@ -0,0 +1,15796 @@
+diff -urN libreoffice-build/patches/dev300/apply libreoffice-build/patches/dev300/apply
+--- libreoffice-build/patches/dev300/apply	2011-09-19 11:41:11.000000000 -0500
++++ libreoffice-build/patches/dev300/apply	2011-09-19 11:36:17.051219826 -0500
+@@ -22,7 +22,7 @@
+ 
+ LinuxCommon : Common, Defaults, FontConfigTemporaryHacks, \
+ 	      FedoraLinuxOnlyFixes, LinuxOnly, msaccess, OpenGLTransitions, \
+-	      CliMonoCommon, Mono, MonoComp, AddressBooks, QuickStarter, KDE4, Netbook, \
++	      CliMonoCommon, Mono, MonoComp, AddressBooks, QuickStarter, KDE4, TDE, Netbook, \
+ 	      GlobalNSPluginSupport, Gcc46
+ MacOSXCommon : Common, Defaults
+ Win32Common : Common, Defaults, Win32Only, CliMonoCommon, CliComponent, NotDebian
+@@ -184,8 +184,6 @@
+ # pass $ORIGIN correctly to RPATH
+ icu-4.2.1-rpath.diff. pmladek
+ 
+-[ TemporaryHacks ]
+-
+ # add idl target to toplevel makefile
+ makefile-idl-build.diff, noelpwer
+ 
+@@ -1500,6 +1498,10 @@
+ # we need a good plan before, though ;-)
+ split-icons-search-usr-share.diff, n#296502, pmladek
+ 
++[ TDE ]
++# add trinity integration
++trinity-modules.diff
++
+ [ ArkOnly ]
+ SectionOwner => brosenk
+ 
+diff -urN libreoffice-build/patches/dev300/trinity-modules.diff libreoffice-build/patches/dev300/trinity-modules.diff
+--- libreoffice-build/patches/dev300/trinity-modules.diff	1969-12-31 18:00:00.000000000 -0600
++++ libreoffice-build/patches/dev300/trinity-modules.diff	2011-09-19 11:35:33.699926859 -0500
+@@ -0,0 +1,15748 @@
++diff -urN configure.in configure.in
++--- configure.in	2011-03-08 12:51:39.000000000 -0600
+++++ configure.in	2011-08-17 16:40:04.716144357 -0500
++@@ -233,6 +233,15 @@
++ [  --disable-kdeab         Disable the KDE3 address book support
++ ],,if test "$enable_kde" = "yes"; then enable_kdeab=yes; fi)
++ 
+++AC_ARG_ENABLE(tde,
+++[  --enable-tde            Determines whether to use TQt3/TDE vclplug on platforms
+++                          where TQt and TDE are available.
+++],,)
+++
+++AC_ARG_ENABLE(tdeab,
+++[  --disable-tdeab         Disable the TDE address book support
+++],,if test "$enable_tde" = "yes"; then enable_tdeab=yes; fi)
+++
++ AC_ARG_ENABLE(kde4,
++ [  --enable-kde4            Determines whether to use Qt4/KDE4 vclplug on platforms
++                           where Qt4 and KDE4 are available. May be used with --enable-kde
++@@ -1350,6 +1359,7 @@
++         test_cairo=yes
++         build_gstreamer=yes
++         test_kde=yes
+++        test_tde=yes
++         test_cups=yes
++         test_randr=yes
++         test_freetype=yes
++@@ -1385,6 +1395,7 @@
++         build_gstreamer=yes
++         test_kde=yes
++         test_kde4=yes
+++        test_tde=yes
++         test_cups=yes
++         test_randr=yes
++         test_freetype=yes
++@@ -1428,6 +1439,7 @@
++         build_gstreamer=yes
++         test_kde=yes
++         test_kde4=yes
+++        test_tde=yes
++         test_cups=yes
++         test_randr=yes
++         test_freetype=yes
++@@ -1463,6 +1475,7 @@
++         build_gstreamer=yes
++         test_kde=yes
++         test_kde4=yes
+++        test_tde=yes
++         test_cups=yes
++         test_randr=yes
++         test_freetype=yes
++@@ -1482,6 +1495,7 @@
++         test_gtk=yes
++         build_cairo=yes
++         test_kde=yes
+++        test_tde=yes
++         test_cups=yes
++         test_freetype=yes
++         test_randr=yes
++@@ -6141,6 +6155,13 @@
++ fi
++ AC_SUBST(ENABLE_KDE4)
++ 
+++ENABLE_TDE=""
+++if test "x$enable_tde" = "xyes"; then
+++    ENABLE_TDE="TRUE"
+++    R="$R tde"
+++fi
+++AC_SUBST(ENABLE_TDE)
+++
++ if test -z "$R"; then
++     AC_MSG_RESULT([none])
++ else
++@@ -7044,6 +7065,129 @@
++ AC_SUBST(KDE_HAVE_GLIB)
++ 
++ dnl ===================================================================
+++dnl Check whether the Qt3 and TDE libraries are available.
+++dnl ===================================================================
+++
+++TDE_CFLAGS=""
+++TDE_LIBS=""
+++if test "$_os" != "OpenBSD"; then
+++    MOC="moc"
+++fi
+++if test "$test_tde" = "yes" -a "$ENABLE_TDE" = "TRUE" ; then
+++    dnl Search paths for Qt3 and TDE
+++    if test "$build_cpu" != "x86_64" ; then
+++        qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib/qt3/include /usr/lib/qt/include /usr/share/qt3/include /usr/local/include/X11/qt3 $x_includes"
+++        qt_libdirs="$QTLIB /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries"
+++    else
+++        qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib64/qt3/include /usr/lib64/qt/include /usr/share/qt3/include /usr/lib/qt3/include /usr/lib/qt/include /usr/local/include/X11/qt3 $x_includes"
+++        qt_libdirs="$QTLIB /usr/local/qt/lib64 /usr/lib64/qt /usr/lib64 /usr/X11R6/lib64/X11/qt /usr/X11R6/lib64/qt /usr/lib64/qt3/lib64 /usr/lib64/qt/lib64 /usr/share/qt3/lib64 /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries"
+++    fi
+++    if test -n "$QTDIR" ; then
+++        qt_incdirs="$QTDIR/include $qt_incdirs"
+++        if test "$build_cpu" != "x86_64" ; then
+++            qt_libdirs="$QTDIR/lib $qt_libdirs"
+++        else
+++            qt_libdirs="$QTDIR/lib64 $QTDIR/lib $qt_libdirs"
+++        fi
+++    fi
+++    if test "$build_cpu" != "x86_64" ; then
+++        tde_incdirs="/opt/trinity/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes"
+++        tde_libdirs="/opt/trinity/lib /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib/kde4/lib /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries"
+++    else
+++        tde_incdirs="/opt/trinity/include /usr/lib64/kde/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes"
+++        tde_libdirs="/opt/trinity/lib /usr/lib64/kde/lib64 /usr/local/kde/lib64 /usr/kde/lib64 /usr/lib64/kde /usr/lib64/kde3 /usr/lib64 /usr/X11R6/lib64 /usr/local/lib64 /opt/trinity/lib64 /opt/kde/lib64 /usr/X11R6/kde/lib64 /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries"
+++    fi
+++    if test -n "$TDEDIR" ; then
+++        tde_incdirs="$TDEDIR/include $tde_incdirs"
+++        if test "$build_cpu" != "x86_64" ; then
+++            tde_libdirs="$TDEDIR/lib $tde_libdirs"
+++        else
+++            tde_libdirs="$TDEDIR/lib64 $TDEDIR/lib $tde_libdirs"
+++        fi
+++    fi
+++
+++    dnl What to test
+++    qt_test_include="qstyle.h"
+++    qt_test_library="libqt-mt.so*"
+++    tde_test_include="kapp.h"
+++    tde_test_library="libDCOP.so*"
+++
+++    dnl Check for Qt3 headers
+++    AC_MSG_CHECKING([for Qt3 headers])
+++    qt_incdir="no"
+++    for tde_check in $qt_incdirs ; do
+++        if test -r "$tde_check/$qt_test_include" ; then
+++            qt_incdir="$tde_check"
+++            break
+++        fi
+++    done
+++    AC_MSG_RESULT([$qt_incdir])
+++    if test "x$qt_incdir" = "xno" ; then
+++        AC_MSG_ERROR([Qt3 headers not found.  Please specify the root of
+++your Qt3 installation by exporting QTDIR before running "configure".])
+++    fi
+++
+++    dnl Check for Qt3 libraries
+++    AC_MSG_CHECKING([for Qt3 libraries])
+++    qt_libdir="no"
+++    for qt_check in $qt_libdirs ; do
+++        if test -r "`ls $qt_check/$qt_test_library 2>/dev/null | head -1`" ; then
+++            qt_libdir="$qt_check"
+++            break
+++        fi
+++    done
+++    AC_MSG_RESULT([$qt_libdir])
+++    if test "x$qt_libdir" = "xno" ; then
+++        AC_MSG_ERROR([Qt3 libraries not found.  Please specify the root of
+++your Qt3 installation by exporting QTDIR before running "configure".])
+++    fi
+++
+++    dnl Check for Meta Object Compiler
+++    AC_PATH_PROG( MOC, moc, no, [`dirname $qt_libdir`/bin:$QTDIR/bin:$PATH] )
+++    if test "$MOC" = "no" ; then
+++        AC_MSG_ERROR([Qt3 Meta Object Compiler not found.  Please specify
+++the root of your Qt3 installation by exporting QTDIR before running "configure".])
+++    fi
+++
+++    dnl Check for TDE headers
+++    AC_MSG_CHECKING([for TDE headers])
+++    tde_incdir="no"
+++    for tde_check in $tde_incdirs ; do
+++        if test -r "$tde_check/$tde_test_include" ; then
+++            tde_incdir="$tde_check"
+++            break
+++        fi
+++    done
+++    AC_MSG_RESULT([$tde_incdir])
+++    if test "x$tde_incdir" = "xno" ; then
+++        AC_MSG_ERROR([TDE headers not found.  Please specify the root of
+++your TDE installation by exporting TDEDIR before running "configure".])
+++    fi
+++
+++    dnl Check for TDE libraries
+++    AC_MSG_CHECKING([for TDE libraries])
+++    tde_libdir="no"
+++    for tde_check in $tde_libdirs ; do
+++        if test -r "`ls $tde_check/$tde_test_library 2>/dev/null | head -1`" ; then
+++            tde_libdir="$tde_check"
+++            break
+++        fi
+++    done
+++    AC_MSG_RESULT([$tde_libdir])
+++    if test "x$tde_libdir" = "xno" ; then
+++        AC_MSG_ERROR([TDE libraries not found.  Please specify the root of
+++your TDE installation by exporting TDEDIR before running "configure".])
+++    fi
+++
+++    dnl Set the variables
+++    TDE_CFLAGS="-I$qt_incdir -I$tde_incdir -I/usr/include/tqt -DQT_CLEAN_NAMESPACE -DQT_THREAD_SUPPORT"
+++    TDE_LIBS="-L$tde_libdir -L$qt_libdir -lkdeui -lkdecore -ltqt -lqt-mt"
+++fi
+++AC_SUBST(TDE_CFLAGS)
+++AC_SUBST(TDE_LIBS)
+++AC_SUBST(MOC)
+++
+++dnl ===================================================================
++ dnl Test for the enabling the lockdown pieces
++ dnl ===================================================================
++ AC_MSG_CHECKING([whether to enable the lockdown pieces])
++@@ -7100,6 +7244,33 @@
++ AC_SUBST(ENABLE_KAB)
++ 
++ dnl ===================================================================
+++dnl Test whether to include TDE AB support
+++dnl ===================================================================
+++AC_MSG_CHECKING([whether to enable TDE address book support])
+++if test "$enable_tdeab" = "yes" && test "$enable_tde" = "yes"; then
+++   AC_MSG_RESULT([yes])
+++   AC_LANG_PUSH([C++])
+++   save_CXXFLAGS=$CXXFLAGS
+++   CXXFLAGS="$CXXFLAGS $TDE_CFLAGS"
+++   AC_MSG_CHECKING([whether TDE is between 3.2 and 3.6])
+++       AC_TRY_RUN([
+++#include <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 -urN connectivity/source/drivers/tdeab/exports.dxp connectivity/source/drivers/tdeab/exports.dxp
++--- connectivity/source/drivers/tdeab/exports.dxp	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/exports.dxp	2011-08-17 14:23:01.735590880 -0500
++@@ -0,0 +1,3 @@
+++component_getImplementationEnvironment
+++component_writeInfo
+++component_getFactory
++diff -urN connectivity/source/drivers/tdeab/KCatalog.cxx connectivity/source/drivers/tdeab/KCatalog.cxx
++--- connectivity/source/drivers/tdeab/KCatalog.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KCatalog.cxx	2011-08-17 14:29:39.766199199 -0500
++@@ -0,0 +1,128 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KCatalog.hxx connectivity/source/drivers/tdeab/KCatalog.hxx
++--- connectivity/source/drivers/tdeab/KCatalog.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KCatalog.hxx	2011-08-17 14:29:32.345628247 -0500
++@@ -0,0 +1,68 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KColumns.cxx connectivity/source/drivers/tdeab/KColumns.cxx
++--- connectivity/source/drivers/tdeab/KColumns.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KColumns.cxx	2011-08-17 14:29:23.634958020 -0500
++@@ -0,0 +1,102 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KColumns.hxx connectivity/source/drivers/tdeab/KColumns.hxx
++--- connectivity/source/drivers/tdeab/KColumns.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KColumns.hxx	2011-08-17 14:29:13.974214692 -0500
++@@ -0,0 +1,58 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/kcondition.cxx connectivity/source/drivers/tdeab/kcondition.cxx
++--- connectivity/source/drivers/tdeab/kcondition.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/kcondition.cxx	2011-08-17 14:29:06.863667577 -0500
++@@ -0,0 +1,233 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/kcondition.hxx connectivity/source/drivers/tdeab/kcondition.hxx
++--- connectivity/source/drivers/tdeab/kcondition.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/kcondition.hxx	2011-08-17 14:28:59.403093526 -0500
++@@ -0,0 +1,164 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KConnection.cxx connectivity/source/drivers/tdeab/KConnection.cxx
++--- connectivity/source/drivers/tdeab/KConnection.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KConnection.cxx	2011-08-17 14:28:53.822664134 -0500
++@@ -0,0 +1,332 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KConnection.hxx connectivity/source/drivers/tdeab/KConnection.hxx
++--- connectivity/source/drivers/tdeab/KConnection.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KConnection.hxx	2011-08-17 14:28:47.592184720 -0500
++@@ -0,0 +1,142 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx
++--- connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx	2011-08-17 14:28:44.171921542 -0500
++@@ -0,0 +1,1084 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx
++--- connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx	2011-08-17 14:28:31.880975797 -0500
++@@ -0,0 +1,217 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KDriver.cxx connectivity/source/drivers/tdeab/KDriver.cxx
++--- connectivity/source/drivers/tdeab/KDriver.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KDriver.cxx	2011-08-17 14:28:05.938979574 -0500
++@@ -0,0 +1,476 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KDriver.hxx connectivity/source/drivers/tdeab/KDriver.hxx
++--- connectivity/source/drivers/tdeab/KDriver.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KDriver.hxx	2011-08-17 14:27:57.178305442 -0500
++@@ -0,0 +1,227 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/kfields.cxx connectivity/source/drivers/tdeab/kfields.cxx
++--- connectivity/source/drivers/tdeab/kfields.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/kfields.cxx	2011-08-17 14:27:40.557026383 -0500
++@@ -0,0 +1,98 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/kfields.hxx connectivity/source/drivers/tdeab/kfields.hxx
++--- connectivity/source/drivers/tdeab/kfields.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/kfields.hxx	2011-08-17 14:27:31.926362235 -0500
++@@ -0,0 +1,51 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/korder.cxx connectivity/source/drivers/tdeab/korder.cxx
++--- connectivity/source/drivers/tdeab/korder.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/korder.cxx	2011-08-17 14:27:22.785658823 -0500
++@@ -0,0 +1,92 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/korder.hxx connectivity/source/drivers/tdeab/korder.hxx
++--- connectivity/source/drivers/tdeab/korder.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/korder.hxx	2011-08-17 14:27:15.825123174 -0500
++@@ -0,0 +1,78 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KPreparedStatement.cxx connectivity/source/drivers/tdeab/KPreparedStatement.cxx
++--- connectivity/source/drivers/tdeab/KPreparedStatement.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KPreparedStatement.cxx	2011-08-17 14:27:09.434631390 -0500
++@@ -0,0 +1,394 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KPreparedStatement.hxx connectivity/source/drivers/tdeab/KPreparedStatement.hxx
++--- connectivity/source/drivers/tdeab/KPreparedStatement.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KPreparedStatement.hxx	2011-08-17 14:27:04.434246577 -0500
++@@ -0,0 +1,123 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KResultSet.cxx connectivity/source/drivers/tdeab/KResultSet.cxx
++--- connectivity/source/drivers/tdeab/KResultSet.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KResultSet.cxx	2011-08-17 14:26:57.383703991 -0500
++@@ -0,0 +1,991 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KResultSet.hxx connectivity/source/drivers/tdeab/KResultSet.hxx
++--- connectivity/source/drivers/tdeab/KResultSet.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KResultSet.hxx	2011-08-17 14:26:47.312928966 -0500
++@@ -0,0 +1,228 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KResultSetMetaData.cxx connectivity/source/drivers/tdeab/KResultSetMetaData.cxx
++--- connectivity/source/drivers/tdeab/KResultSetMetaData.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KResultSetMetaData.cxx	2011-08-17 14:26:20.900896322 -0500
++@@ -0,0 +1,191 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KResultSetMetaData.hxx connectivity/source/drivers/tdeab/KResultSetMetaData.hxx
++--- connectivity/source/drivers/tdeab/KResultSetMetaData.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KResultSetMetaData.hxx	2011-08-17 14:26:13.350315217 -0500
++@@ -0,0 +1,95 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KServices.cxx connectivity/source/drivers/tdeab/KServices.cxx
++--- connectivity/source/drivers/tdeab/KServices.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KServices.cxx	2011-08-17 14:26:08.609950397 -0500
++@@ -0,0 +1,180 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KStatement.cxx connectivity/source/drivers/tdeab/KStatement.cxx
++--- connectivity/source/drivers/tdeab/KStatement.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KStatement.cxx	2011-08-17 14:26:01.429397755 -0500
++@@ -0,0 +1,588 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KStatement.hxx connectivity/source/drivers/tdeab/KStatement.hxx
++--- connectivity/source/drivers/tdeab/KStatement.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KStatement.hxx	2011-08-17 14:25:52.088678867 -0500
++@@ -0,0 +1,174 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KTable.cxx connectivity/source/drivers/tdeab/KTable.cxx
++--- connectivity/source/drivers/tdeab/KTable.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KTable.cxx	2011-08-17 14:25:28.396855433 -0500
++@@ -0,0 +1,100 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KTable.hxx connectivity/source/drivers/tdeab/KTable.hxx
++--- connectivity/source/drivers/tdeab/KTable.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KTable.hxx	2011-08-17 14:25:22.436396680 -0500
++@@ -0,0 +1,72 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KTables.cxx connectivity/source/drivers/tdeab/KTables.cxx
++--- connectivity/source/drivers/tdeab/KTables.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KTables.cxx	2011-08-17 14:25:16.415933304 -0500
++@@ -0,0 +1,94 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/KTables.hxx connectivity/source/drivers/tdeab/KTables.hxx
++--- connectivity/source/drivers/tdeab/KTables.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KTables.hxx	2011-08-17 14:24:50.933971998 -0500
++@@ -0,0 +1,65 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/makefile.mk connectivity/source/drivers/tdeab/makefile.mk
++--- connectivity/source/drivers/tdeab/makefile.mk	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/makefile.mk	2011-08-17 14:24:11.740955243 -0500
++@@ -0,0 +1,139 @@
+++#*************************************************************************
+++#
+++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++# 
+++# Copyright 2000, 2010 Oracle and/or its affiliates.
+++# Copyright 2011 Timothy Pearson
+++#
+++# OpenOffice.org - a multi-platform office productivity suite
+++#
+++# This file is part of OpenOffice.org.
+++#
+++# OpenOffice.org is free software: you can redistribute it and/or modify
+++# it under the terms of the GNU Lesser General Public License version 3
+++# only, as published by the Free Software Foundation.
+++#
+++# OpenOffice.org is distributed in the hope that it will be useful,
+++# but WITHOUT ANY WARRANTY; without even the implied warranty of
+++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++# GNU Lesser General Public License version 3 for more details
+++# (a copy is included in the LICENSE file that accompanied this code).
+++#
+++# You should have received a copy of the GNU Lesser General Public License
+++# version 3 along with OpenOffice.org.  If not, see
+++# <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 -urN connectivity/source/drivers/tdeab/tdeabdrv.map connectivity/source/drivers/tdeab/tdeabdrv.map
++--- connectivity/source/drivers/tdeab/tdeabdrv.map	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/tdeabdrv.map	2011-08-17 14:25:00.664720964 -0500
++@@ -0,0 +1,9 @@
+++UDK_3_0_0 {
+++    global:
+++        createKabConnection;
+++        initKApplication;
+++        shutdownKApplication;
+++        matchTDEVersion;
+++    local:
+++        *;
+++};
++diff -urN connectivity/source/drivers/tdeab/tdeab.xcu connectivity/source/drivers/tdeab/tdeab.xcu
++--- connectivity/source/drivers/tdeab/tdeab.xcu	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/tdeab.xcu	2011-08-17 14:29:58.077608095 -0500
++@@ -0,0 +1,47 @@
+++<?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 -urN connectivity/source/drivers/tdeab/tdeab.xml connectivity/source/drivers/tdeab/tdeab.xml
++--- connectivity/source/drivers/tdeab/tdeab.xml	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/tdeab.xml	2011-08-17 14:29:44.246543923 -0500
++@@ -0,0 +1,77 @@
+++<?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 -urN connectivity/source/drivers/tdeab/TDEInit.cxx connectivity/source/drivers/tdeab/TDEInit.cxx
++--- connectivity/source/drivers/tdeab/TDEInit.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/TDEInit.cxx	2011-08-17 14:28:21.700192397 -0500
++@@ -0,0 +1,158 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/drivers/tdeab/TDEInit.h connectivity/source/drivers/tdeab/TDEInit.h
++--- connectivity/source/drivers/tdeab/TDEInit.h	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/TDEInit.h	2011-08-17 14:28:13.719578294 -0500
++@@ -0,0 +1,47 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN fpicker/source/unx/tde/makefile.mk fpicker/source/unx/tde/makefile.mk
++--- fpicker/source/unx/tde/makefile.mk	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/makefile.mk	2011-08-17 14:08:00.486552458 -0500
++@@ -0,0 +1,75 @@
+++#*************************************************************************
+++#
+++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++#
+++# Copyright 2010 Novell, Inc.
+++# Copyright 2011 Timothy Pearson
+++#
+++# OpenOffice.org - a multi-platform office productivity suite
+++#
+++# This file is part of OpenOffice.org.
+++#
+++# OpenOffice.org is free software: you can redistribute it and/or modify
+++# it under the terms of the GNU Lesser General Public License version 3
+++# only, as published by the Free Software Foundation.
+++#
+++# OpenOffice.org is distributed in the hope that it will be useful,
+++# but WITHOUT ANY WARRANTY; without even the implied warranty of
+++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++# GNU Lesser General Public License version 3 for more details
+++# (a copy is included in the LICENSE file that accompanied this code).
+++#
+++# You should have received a copy of the GNU Lesser General Public License
+++# version 3 along with OpenOffice.org.  If not, see
+++# <http://www.openoffice.org/license.html>
+++# for a copy of the LGPLv3 License.
+++#
+++#*************************************************************************
+++
+++PRJ=..$/..$/..
+++
+++PRJNAME=fpicker
+++TARGET=tdefilepicker
+++LIBTARGET=NO
+++ENABLE_EXCEPTIONS=TRUE
+++#COMP1TYPELIST=$(TARGET)
+++#COMPRDB=$(SOLARBINDIR)$/types.rdb
+++
+++# --- Settings -----------------------------------------------------
+++
+++.INCLUDE :  settings.mk
+++
+++# ------------------------------------------------------------------
+++
+++.IF "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE"
+++
+++dummy:
+++    @echo "Nothing to build. GUIBASE == $(GUIBASE), ENABLE_TDE is not set"
+++
+++.ELSE # we build for TDE
+++
+++CFLAGS+= $(TDE_CFLAGS)
+++
+++# --- Files --------------------------------------------------------
+++
+++SLOFILES =\
+++        $(SLO)$/tdecommandthread.obj \
+++        $(SLO)$/tdefilepicker.obj \
+++        $(SLO)$/tdefilepicker.moc.obj \
+++        $(SLO)$/tdefpmain.obj \
+++        $(SLO)$/tdemodalityfilter.obj
+++
+++APP1TARGET=$(TARGET)
+++APP1OBJS=$(SLOFILES)
+++APP1RPATH=BRAND
+++APP1LINKFLAGS=$(TDE_LIBS) -lkio -lX11
+++APP1STDLIBS=$(SALLIB)
+++
+++.ENDIF # "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE"
+++
+++# --- Targets ------------------------------------------------------
+++
+++.INCLUDE :	target.mk
+++
+++$(MISC)$/tdefilepicker.moc.cxx : tdefilepicker.hxx
+++    $(MOC) $< -o $@
++diff -urN fpicker/source/unx/tde/tdecommandthread.cxx fpicker/source/unx/tde/tdecommandthread.cxx
++--- fpicker/source/unx/tde/tdecommandthread.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdecommandthread.cxx	2011-08-17 14:05:05.983187311 -0500
++@@ -0,0 +1,178 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <http://www.openoffice.org/license.html>
+++ * for a copy of the LGPLv3 License.
+++ *
+++ ************************************************************************/
+++
+++#include <tdecommandthread.hxx>
+++
+++#include <tqstringlist.h>
+++
+++#include <kapplication.h>
+++
+++#include <iostream>
+++
+++//////////////////////////////////////////////////////////////////////////
+++// 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 > 0
+++    ::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();
+++    }
+++    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 -urN fpicker/source/unx/tde/tdecommandthread.hxx fpicker/source/unx/tde/tdecommandthread.hxx
++--- fpicker/source/unx/tde/tdecommandthread.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdecommandthread.hxx	2011-08-17 14:04:34.560780976 -0500
++@@ -0,0 +1,98 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN fpicker/source/unx/tde/tdefilepicker.cxx fpicker/source/unx/tde/tdefilepicker.cxx
++--- fpicker/source/unx/tde/tdefilepicker.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdefilepicker.cxx	2011-08-17 14:05:04.073041030 -0500
++@@ -0,0 +1,733 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <http://www.openoffice.org/license.html>
+++ * for a copy of the LGPLv3 License.
+++ *
+++ ************************************************************************/
+++
+++#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, SIGNAL( fileHighlighted( const TQString & ) ),
+++             this, SLOT( fileHighlightedCommand( const TQString & ) ) );
+++
+++    connect( this, SIGNAL( selectionChanged() ),
+++             this, 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 > 0
+++    ::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 -urN fpicker/source/unx/tde/tdefilepicker.hxx fpicker/source/unx/tde/tdefilepicker.hxx
++--- fpicker/source/unx/tde/tdefilepicker.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdefilepicker.hxx	2011-08-17 14:05:02.262902414 -0500
++@@ -0,0 +1,126 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <http://www.openoffice.org/license.html>
+++ * for a copy of the LGPLv3 License.
+++ *
+++ ************************************************************************/
+++
+++#ifndef _TDEFILEPICKER_HXX_
+++#define _TDEFILEPICKER_HXX_
+++
+++#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 -urN fpicker/source/unx/tde/tdefpmain.cxx fpicker/source/unx/tde/tdefpmain.cxx
++--- fpicker/source/unx/tde/tdefpmain.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdefpmain.cxx	2011-08-17 14:04:58.622623640 -0500
++@@ -0,0 +1,93 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <http://www.openoffice.org/license.html>
+++ * for a copy of the LGPLv3 License.
+++ *
+++ ************************************************************************/
+++
+++#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 -urN fpicker/source/unx/tde/tdemodalityfilter.cxx fpicker/source/unx/tde/tdemodalityfilter.cxx
++--- fpicker/source/unx/tde/tdemodalityfilter.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdemodalityfilter.cxx	2011-08-17 14:04:44.121513143 -0500
++@@ -0,0 +1,68 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <http://www.openoffice.org/license.html>
+++ * for a copy of the LGPLv3 License.
+++ *
+++ ************************************************************************/
+++
+++#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 -urN fpicker/source/unx/tde/tdemodalityfilter.hxx fpicker/source/unx/tde/tdemodalityfilter.hxx
++--- fpicker/source/unx/tde/tdemodalityfilter.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdemodalityfilter.hxx	2011-08-17 14:04:27.940273979 -0500
++@@ -0,0 +1,49 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN fpicker/source/unx/tde_unx/FPServiceInfo.hxx fpicker/source/unx/tde_unx/FPServiceInfo.hxx
++--- fpicker/source/unx/tde_unx/FPServiceInfo.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/FPServiceInfo.hxx	2011-08-17 14:07:24.203772856 -0500
++@@ -0,0 +1,48 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN fpicker/source/unx/tde_unx/fps-tde-ucd.txt fpicker/source/unx/tde_unx/fps-tde-ucd.txt
++--- fpicker/source/unx/tde_unx/fps-tde-ucd.txt	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/fps-tde-ucd.txt	2011-08-17 14:06:16.168562070 -0500
++@@ -0,0 +1,6 @@
+++[ComponentDescriptor]
+++ImplementationName=com.sun.star.ui.dialogs.UnxFilePicker
+++ComponentName=fps_tde.uno.so
+++LoaderName=com.sun.star.loader.SharedLibrary
+++[SupportedServices]
+++com.sun.star.ui.dialogs.TDEFilePicker
++diff -urN fpicker/source/unx/tde_unx/fps_tde.xml fpicker/source/unx/tde_unx/fps_tde.xml
++--- fpicker/source/unx/tde_unx/fps_tde.xml	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/fps_tde.xml	2011-08-17 14:07:17.433254165 -0500
++@@ -0,0 +1,51 @@
+++<?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 -urN fpicker/source/unx/tde_unx/makefile.mk fpicker/source/unx/tde_unx/makefile.mk
++--- fpicker/source/unx/tde_unx/makefile.mk	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/makefile.mk	2011-08-17 14:07:11.152773020 -0500
++@@ -0,0 +1,78 @@
+++#*************************************************************************
+++#
+++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++#
+++# Copyright 2000, 2010 Oracle and/or its affiliates.
+++# Copyright 2010 Novell, Inc.
+++# Copyright 2011 Timothy Pearson
+++#
+++# OpenOffice.org - a multi-platform office productivity suite
+++#
+++# This file is part of OpenOffice.org.
+++#
+++# OpenOffice.org is free software: you can redistribute it and/or modify
+++# it under the terms of the GNU Lesser General Public License version 3
+++# only, as published by the Free Software Foundation.
+++#
+++# OpenOffice.org is distributed in the hope that it will be useful,
+++# but WITHOUT ANY WARRANTY; without even the implied warranty of
+++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++# GNU Lesser General Public License version 3 for more details
+++# (a copy is included in the LICENSE file that accompanied this code).
+++#
+++# You should have received a copy of the GNU Lesser General Public License
+++# version 3 along with OpenOffice.org.  If not, see
+++# <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
++diff -urN fpicker/source/unx/tde_unx/UnxCommandThread.cxx fpicker/source/unx/tde_unx/UnxCommandThread.cxx
++--- fpicker/source/unx/tde_unx/UnxCommandThread.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/UnxCommandThread.cxx	2011-08-17 14:06:59.001842171 -0500
++@@ -0,0 +1,315 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN fpicker/source/unx/tde_unx/UnxCommandThread.hxx fpicker/source/unx/tde_unx/UnxCommandThread.hxx
++--- fpicker/source/unx/tde_unx/UnxCommandThread.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/UnxCommandThread.hxx	2011-08-17 14:06:49.721131468 -0500
++@@ -0,0 +1,136 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN fpicker/source/unx/tde_unx/UnxFilePicker.cxx fpicker/source/unx/tde_unx/UnxFilePicker.cxx
++--- fpicker/source/unx/tde_unx/UnxFilePicker.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/UnxFilePicker.cxx	2011-08-17 14:07:44.765348071 -0500
++@@ -0,0 +1,932 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN fpicker/source/unx/tde_unx/UnxFilePicker.hxx fpicker/source/unx/tde_unx/UnxFilePicker.hxx
++--- fpicker/source/unx/tde_unx/UnxFilePicker.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/UnxFilePicker.hxx	2011-08-17 14:07:41.705113628 -0500
++@@ -0,0 +1,178 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN fpicker/source/unx/tde_unx/UnxFPentry.cxx fpicker/source/unx/tde_unx/UnxFPentry.cxx
++--- fpicker/source/unx/tde_unx/UnxFPentry.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/UnxFPentry.cxx	2011-08-17 14:06:26.059319485 -0500
++@@ -0,0 +1,128 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 ) ) );
+++}
+++
+++//////////////////////////////////////////////////////////////////////////
+++// the three uno functions that will be exported
+++//////////////////////////////////////////////////////////////////////////
+++
+++extern "C"
+++{
+++
+++//////////////////////////////////////////////////////////////////////////
+++// component_getImplementationEnvironment
+++//////////////////////////////////////////////////////////////////////////
+++
+++void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv )
+++{
+++    *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+++}
+++
+++//////////////////////////////////////////////////////////////////////////
+++//
+++//////////////////////////////////////////////////////////////////////////
+++
+++sal_Bool SAL_CALL component_writeInfo( void* pServiceManager, void* pRegistryKey )
+++{
+++    sal_Bool bRetVal = sal_True;
+++
+++    if ( pRegistryKey )
+++    {
+++        try
+++        {
+++            Reference< XRegistryKey > pXNewKey( static_cast< XRegistryKey* >( pRegistryKey ) );
+++            pXNewKey->createKey( OUString::createFromAscii( FILE_PICKER_REGKEY_NAME ) );
+++        }
+++        catch( InvalidRegistryException& )
+++        {
+++            OSL_ENSURE( sal_False, "InvalidRegistryException caught" );
+++            bRetVal = sal_False;
+++        }
+++    }
+++
+++    return bRetVal;
+++}
+++
+++//////////////////////////////////////////////////////////////////////////
+++//
+++//////////////////////////////////////////////////////////////////////////
+++
+++void* SAL_CALL component_getFactory( const sal_Char* pImplName, uno_Interface* pSrvManager, uno_Interface* pRegistryKey )
+++{
+++    void* pRet = 0;
+++
+++    if ( pSrvManager && ( 0 == rtl_str_compare( pImplName, FILE_PICKER_IMPL_NAME ) ) )
+++    {
+++        Sequence< OUString > aSNS( 1 );
+++        aSNS.getArray( )[0] = OUString::createFromAscii( FILE_PICKER_SERVICE_NAME );
+++
+++        Reference< XSingleServiceFactory > xFactory ( createSingleFactory(
+++                    reinterpret_cast< XMultiServiceFactory* > ( pSrvManager ),
+++                    OUString::createFromAscii( pImplName ),
+++                    createInstance,
+++                    aSNS ) );
+++        if ( xFactory.is() )
+++        {
+++            xFactory->acquire();
+++            pRet = xFactory.get();
+++        }
+++    }
+++
+++    return pRet;
+++}
+++
+++} // extern "C"
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN fpicker/source/unx/tde_unx/UnxNotifyThread.cxx fpicker/source/unx/tde_unx/UnxNotifyThread.cxx
++--- fpicker/source/unx/tde_unx/UnxNotifyThread.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/UnxNotifyThread.cxx	2011-08-17 14:06:06.307806939 -0500
++@@ -0,0 +1,116 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN fpicker/source/unx/tde_unx/UnxNotifyThread.hxx fpicker/source/unx/tde_unx/UnxNotifyThread.hxx
++--- fpicker/source/unx/tde_unx/UnxNotifyThread.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/UnxNotifyThread.hxx	2011-08-17 14:05:56.737074019 -0500
++@@ -0,0 +1,90 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN shell/source/backends/tdebe/makefile.mk shell/source/backends/tdebe/makefile.mk
++--- shell/source/backends/tdebe/makefile.mk	1969-12-31 18:00:00.000000000 -0600
+++++ shell/source/backends/tdebe/makefile.mk	2011-08-17 14:16:06.283767347 -0500
++@@ -0,0 +1,82 @@
+++#*************************************************************************
+++#
+++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++#
+++# Copyright 2000, 2010 Oracle and/or its affiliates.
+++# Copyright 2011 Timothy Pearson
+++#
+++# OpenOffice.org - a multi-platform office productivity suite
+++#
+++# This file is part of OpenOffice.org.
+++#
+++# OpenOffice.org is free software: you can redistribute it and/or modify
+++# it under the terms of the GNU Lesser General Public License version 3
+++# only, as published by the Free Software Foundation.
+++#
+++# OpenOffice.org is distributed in the hope that it will be useful,
+++# but WITHOUT ANY WARRANTY; without even the implied warranty of
+++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++# GNU Lesser General Public License version 3 for more details
+++# (a copy is included in the LICENSE file that accompanied this code).
+++#
+++# You should have received a copy of the GNU Lesser General Public License
+++# version 3 along with OpenOffice.org.  If not, see
+++# <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
+++
+++UNIXTEXT=$(MISC)/$(TARGET)1-ucd.txt
+++
+++# no "lib" prefix
+++DLLPRE =
+++
+++.IF "$(ENABLE_TDE)" == "TRUE"
+++
+++CFLAGS+=$(TDE_CFLAGS)
+++
+++# --- Files ---
+++
+++SLOFILES=\
+++    $(SLO)$/tdeaccess.obj \
+++    $(SLO)$/tdebackend.obj
+++
+++SHL1NOCHECK=TRUE
+++SHL1TARGET=$(TARGET)1.uno
+++SHL1OBJS=$(SLOFILES)
+++SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+++
+++SHL1IMPLIB=i$(SHL1TARGET)
+++SHL1LINKFLAGS+=$(TDE_LIBS) -lkio
+++SHL1STDLIBS=    \
+++        $(CPPUHELPERLIB) \
+++        $(CPPULIB) \
+++        $(SALLIB)
+++
+++SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+++DEF1NAME=$(SHL1TARGET)
+++
+++.ENDIF          # "$(ENABLE_TDE)" == "TRUE"
+++
+++# --- Targets ---
+++
+++.INCLUDE : target.mk
++diff -urN shell/source/backends/tdebe/tdeaccess.cxx shell/source/backends/tdebe/tdeaccess.cxx
++--- shell/source/backends/tdebe/tdeaccess.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ shell/source/backends/tdebe/tdeaccess.cxx	2011-08-17 14:16:46.426842396 -0500
++@@ -0,0 +1,319 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++*
+++* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++*
+++* Copyright 2000, 2010 Oracle and/or its affiliates.
+++* Copyright 2011 Timothy Pearson
+++*
+++* OpenOffice.org - a multi-platform office productivity suite
+++*
+++* This file is part of OpenOffice.org.
+++*
+++* OpenOffice.org is free software: you can redistribute it and/or modify
+++* it under the terms of the GNU Lesser General Public License version 3
+++* only, as published by the Free Software Foundation.
+++*
+++* OpenOffice.org is distributed in the hope that it will be useful,
+++* but WITHOUT ANY WARRANTY; without even the implied warranty of
+++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++* GNU Lesser General Public License version 3 for more details
+++* (a copy is included in the LICENSE file that accompanied this code).
+++*
+++* You should have received a copy of the GNU Lesser General Public License
+++* version 3 along with OpenOffice.org.  If not, see
+++* <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 -urN shell/source/backends/tdebe/tdeaccess.hxx shell/source/backends/tdebe/tdeaccess.hxx
++--- shell/source/backends/tdebe/tdeaccess.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ shell/source/backends/tdebe/tdeaccess.hxx	2011-08-17 14:16:31.565704001 -0500
++@@ -0,0 +1,51 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++*
+++* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++*
+++* Copyright 2000, 2010 Oracle and/or its affiliates.
+++* Copyright 2011 Timothy Pearson
+++*
+++* OpenOffice.org - a multi-platform office productivity suite
+++*
+++* This file is part of OpenOffice.org.
+++*
+++* OpenOffice.org is free software: you can redistribute it and/or modify
+++* it under the terms of the GNU Lesser General Public License version 3
+++* only, as published by the Free Software Foundation.
+++*
+++* OpenOffice.org is distributed in the hope that it will be useful,
+++* but WITHOUT ANY WARRANTY; without even the implied warranty of
+++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++* GNU Lesser General Public License version 3 for more details
+++* (a copy is included in the LICENSE file that accompanied this code).
+++*
+++* You should have received a copy of the GNU Lesser General Public License
+++* version 3 along with OpenOffice.org.  If not, see
+++* <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 -urN shell/source/backends/tdebe/tdebackend.cxx shell/source/backends/tdebe/tdebackend.cxx
++--- shell/source/backends/tdebe/tdebackend.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ shell/source/backends/tdebe/tdebackend.cxx	2011-08-17 14:16:42.136513747 -0500
++@@ -0,0 +1,262 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++*
+++* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++*
+++* Copyright 2000, 2010 Oracle and/or its affiliates.
+++* Copyright 2011 Timothy Pearson
+++*
+++* OpenOffice.org - a multi-platform office productivity suite
+++*
+++* This file is part of OpenOffice.org.
+++*
+++* OpenOffice.org is free software: you can redistribute it and/or modify
+++* it under the terms of the GNU Lesser General Public License version 3
+++* only, as published by the Free Software Foundation.
+++*
+++* OpenOffice.org is distributed in the hope that it will be useful,
+++* but WITHOUT ANY WARRANTY; without even the implied warranty of
+++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++* GNU Lesser General Public License version 3 for more details
+++* (a copy is included in the LICENSE file that accompanied this code).
+++*
+++* You should have received a copy of the GNU Lesser General Public License
+++* version 3 along with OpenOffice.org.  If not, see
+++* <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 -urN shell/source/backends/tdebe/tdebe1-ucd.txt shell/source/backends/tdebe/tdebe1-ucd.txt
++--- shell/source/backends/tdebe/tdebe1-ucd.txt	1969-12-31 18:00:00.000000000 -0600
+++++ shell/source/backends/tdebe/tdebe1-ucd.txt	2011-08-17 14:16:36.266064060 -0500
++@@ -0,0 +1,6 @@
+++[ComponentDescriptor]
+++ImplementationName=com.sun.star.comp.configuration.backend.TDEBackend
+++ComponentName=tdebe1.uno.so
+++LoaderName=com.sun.star.loader.SharedLibrary
+++[SupportedServices]
+++com.sun.star.configuration.backend.TDEBackend
++--- fpicker/prj/build.lst	2010-11-11 09:30:08.000000000 -0600
+++++ fpicker/prj/build.lst	2011-08-17 19:28:07.578452546 -0500
++@@ -7,8 +7,10 @@
++ fp	fpicker\source\unx\kde4			nmake	-	u	fp_kde4_filepicker fp_inc NULL
++ fp	fpicker\source\unx\kde_unx			nmake	-	u	fp_unx_common fp_inc NULL
++ fp	fpicker\source\unx\kde				nmake	-	u	fp_unx_kde_filepicker fp_inc NULL
+++fp	fpicker\source\unx\tde_unx			nmake	-	u	fp_unx_tdecommon fp_inc NULL
+++fp	fpicker\source\unx\tde				nmake	-	u	fp_unx_tde_filepicker fp_inc NULL
++ fp	fpicker\source\aqua					nmake	-	u	fp_macosx_filepicker NULL
++ fp	fpicker\source\win32\filepicker		nmake	-	w	fp_win32_filepicker fp_inc NULL
++ fp	fpicker\source\win32\folderpicker	nmake	-	w	fp_win32_folderpicker fp_inc NULL
++ fp  fpicker\source\win32\misc			nmake	-	w	fp_win32_misc fp_win32_filepicker.w fp_win32_folderpicker.w fp_inc NULL
++-fp	fpicker\util				nmake	-	all	fp_util fp_gnome_filepicker.u fp_unx_common.u fp_unx_kde_filepicker.u fp_win32_filepicker.w fp_win32_misc.w fp_win32_folderpicker.w NULL
+++fp	fpicker\util				nmake	-	all	fp_util fp_gnome_filepicker.u fp_unx_common.u fp_unx_kde_filepicker.u fp_unx_tdecommon.u fp_unx_tde_filepicker.u fp_win32_filepicker.w fp_win32_misc.w fp_win32_folderpicker.w NULL
++--- shell/prj/build.lst	2010-11-11 09:30:08.000000000 -0600
+++++ shell/prj/build.lst	2011-08-17 19:29:38.835371237 -0500
++@@ -30,5 +30,6 @@
++ sl    shell\source\backends\gconfbe                nmake   -   u   sl_backends_gconfbe sl_inc NULL
++ sl    shell\source\backends\kdebe                  nmake   -   u   sl_backends_kdebe sl_inc NULL
++ sl    shell\source\backends\kde4be                 nmake   -   u   sl_backends_kde4be sl_inc NULL
+++sl    shell\source\backends\tdebe                  nmake   -   u   sl_backends_tdebe sl_inc NULL
++ sl    shell\source\backends\desktopbe              nmake   -   u   sl_backends_desktopbe sl_inc NULL
++ sl    shell\source\win32\shlxthandler\ooofilt      nmake   -   w   sl_win32_shlxthandler_ooofilt sl_all_zipfile.w sl_all_ooofilereader.w sl_win32_shlxthandler_util.w sl_all sl_inc NULL
++--- connectivity/prj/build.lst	2010-11-11 13:08:58.000000000 -0600
+++++ connectivity/prj/build.lst	2011-08-17 19:31:47.795150674 -0500
++@@ -12,6 +12,7 @@
++ cn  connectivity\source\drivers\mozab\bootstrap     nmake   -   all cn_mozab_bootstrap cn_mozab_mozillasrc cn_inc NULL
++ cn  connectivity\source\drivers\mozab               nmake   -   all cn_mozab cn_mozab_bootstrap cn_dbtools cn_inc NULL
++ cn  connectivity\source\drivers\kab                 nmake   -   all cn_kab cn_dbtools cn_inc NULL
+++cn  connectivity\source\drivers\tdeab               nmake   -   all cn_tdeab cn_dbtools cn_inc NULL
++ cn  connectivity\source\drivers\macab               nmake   -   all cn_macab cn_dbtools cn_inc NULL
++ cn  connectivity\source\drivers\evoab2              nmake   -   all cn_evoab2 cn_dbtools cn_file cn_inc NULL
++ cn  connectivity\source\drivers\calc                nmake   -   all cn_calc cn_file cn_inc NULL
++@@ -28,5 +29,5 @@
++ cn  connectivity\source\simpledbt                   nmake   -   all cn_simpledbt cn_cmtools cn_inc NULL
++ cn  connectivity\source\dbtools                     nmake   -   all cn_dbtools cn_simpledbt cn_cmtools cn_parse cn_res cn_sdbcx cn_inc cn_res NULL
++ cn  connectivity\qa\connectivity\tools              nmake   -   all cn_qa_tools cn_inc NULL
++-cn  connectivity\util                               nmake   -   all cn_util cn_ado cn_mozab cn_kab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_adabas cn_flat cn_dbase cn_hsqldb cn_macab NULL
+++cn  connectivity\util                               nmake   -   all cn_util cn_ado cn_mozab cn_kab cn_tdeab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_adabas cn_flat cn_dbase cn_hsqldb cn_macab NULL
++ 
++--- set_soenv.in	2011-03-08 12:51:39.000000000 -0600
+++++ set_soenv.in	2011-08-17 22:19:40.994282148 -0500
++@@ -1732,6 +1732,10 @@
++ ToFile( "KDE_GLIB_LIBS",     "@KDE_GLIB_LIBS@",    "e" );
++ ToFile( "KDE_HAVE_GLIB",     "@KDE_HAVE_GLIB@",    "e" );
++ ToFile( "ENABLE_KAB",        "@ENABLE_KAB@",       "e" );
+++ToFile( "ENABLE_TDE",        "@ENABLE_TDE@",       "e" );
+++ToFile( "TDE_CFLAGS",        "@TDE_CFLAGS@",       "e" );
+++ToFile( "TDE_LIBS",          "@TDE_LIBS@",         "e" );
+++ToFile( "ENABLE_TDEAB",      "@ENABLE_TDEAB@",     "e" );
++ ToFile( "PSPRINT",           "TRUE",             "e" );
++ ToFile( "MKDEPENDSOLVER",    "TRUE",             "e" );
++ ToFile( "nodep",             "@nodep@",          "e" );
++diff -urN shell/inc/tde_headers.h shell/inc/tde_headers.h
++--- shell/inc/tde_headers.h	1969-12-31 18:00:00.000000000 -0600
+++++ shell/inc/tde_headers.h	2011-08-18 00:00:30.118955481 -0500
++@@ -0,0 +1,98 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN connectivity/source/inc/resource/tdeab_res.hrc connectivity/source/inc/resource/tdeab_res.hrc
++--- connectivity/source/inc/resource/tdeab_res.hrc	1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/inc/resource/tdeab_res.hrc	2011-08-18 00:42:41.185561810 -0500
++@@ -0,0 +1,44 @@
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ * 
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN shell/prj/d.lst shell/prj/d.lst
++--- shell/prj/d.lst	2010-11-11 09:30:08.000000000 -0600
+++++ shell/prj/d.lst	2011-08-18 00:54:55.072395417 -0500
++@@ -14,6 +14,7 @@
++ ..\%__SRC%\bin\open-url %_DEST%\bin%_EXT%\open-url
++ ..\%__SRC%\bin\cde-open-url %_DEST%\bin%_EXT%\cde-open-url
++ ..\%__SRC%\bin\kde-open-url %_DEST%\bin%_EXT%\kde-open-url
+++..\%__SRC%\bin\tde-open-url %_DEST%\bin%_EXT%\tde-open-url
++ ..\%__SRC%\bin\gnome-open-url %_DEST%\bin%_EXT%\gnome-open-url
++ ..\%__SRC%\bin\gnome-open-url.bin %_DEST%\bin%_EXT%\gnome-open-url.bin
++ ..\%__SRC%\bin\senddoc %_DEST%\bin%_EXT%\senddoc
++@@ -23,3 +24,4 @@
++ 
++ ..\%__SRC%\misc\*-ucd.txt  %_DEST%\bin%_EXT%\*-ucd.txt
++ ..\inc\kde_headers.h %_DEST%\inc%_EXT%\shell\kde_headers.h
+++..\inc\tde_headers.h %_DEST%\inc%_EXT%\shell\tde_headers.h
++diff -urN fpicker/prj/d.lst fpicker/prj/d.lst
++--- fpicker/prj/d.lst	2010-11-11 09:30:08.000000000 -0600
+++++ fpicker/prj/d.lst	2011-08-18 00:57:05.532528127 -0500
++@@ -5,6 +5,7 @@
++ ..\%__SRC%\bin\f*.res %_DEST%\bin%_EXT%\
++ ..\%__SRC%\bin\f*.dll %_DEST%\bin%_EXT%\
++ ..\%__SRC%\bin\kdefilepicker %_DEST%\bin%_EXT%\kdefilepicker
+++..\%__SRC%\bin\tdefilepicker %_DEST%\bin%_EXT%\tdefilepicker
++ ..\%__SRC%\lib\f*.so %_DEST%\lib%_EXT%\
++ ..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\*.dylib
++ 
++@@ -14,3 +15,4 @@
++ ..\source\unx\kde4\fps-kde4-ucd.txt %_DEST%\bin%_EXT%\fps-kde4-ucd.txt
++ ..\source\aqua\fps-aqua-ucd.txt %_DEST%\bin%_EXT%\fps-aqua-ucd.txt
++ ..\source\unx\kde_unx\fps-kde-ucd.txt %_DEST%\bin%_EXT%\fps-kde-ucd.txt
+++..\source\unx\tde_unx\fps-tde-ucd.txt %_DEST%\bin%_EXT%\fps-tde-ucd.txt
++diff -urN connectivity/prj/d.lst connectivity/prj/d.lst
++--- connectivity/prj/d.lst	2010-11-11 09:30:07.000000000 -0600
+++++ connectivity/prj/d.lst	2011-08-18 00:58:04.797146865 -0500
++@@ -8,6 +8,7 @@
++ ..\source\drivers\adabas\*.xml %_DEST%\xml%_EXT%\*.xml
++ ..\source\drivers\ado\*.xml %_DEST%\xml%_EXT%\*.xml
++ ..\source\drivers\kab\*.xml %_DEST%\xml%_EXT%\*.xml
+++..\source\drivers\tdeab\*.xml %_DEST%\xml%_EXT%\*.xml
++ ..\source\drivers\macab\*.xml %_DEST%\xml%_EXT%\*.xml
++ ..\source\drivers\file\*.xml %_DEST%\xml%_EXT%\*.xml
++ ..\source\drivers\flat\*.xml %_DEST%\xml%_EXT%\*.xml
++diff -urN scp2/prj/build.lst scp2/prj/build.lst
++--- scp2/prj/build.lst	2010-11-30 14:17:23.000000000 -0600
+++++ scp2/prj/build.lst	2011-08-18 11:36:10.411551109 -0500
++@@ -14,6 +14,7 @@
++ cp    scp2\source\impress         nmake    -    all    cp_impress cp_langmacros cp_langtemplates NULL
++ cp    scp2\source\javafilter      nmake    -    all    cp_javafilter cp_langmacros cp_langtemplates NULL
++ cp    scp2\source\kde             nmake    -    all    cp_kde cp_langmacros cp_langtemplates NULL
+++cp    scp2\source\tde             nmake    -    all    cp_tde cp_langmacros cp_langtemplates NULL
++ cp    scp2\source\layout          nmake    -    all    cp_layout cp_langmacros NULL
++ cp    scp2\source\math            nmake    -    all    cp_math cp_langmacros cp_langtemplates NULL
++ cp    scp2\source\ooo             nmake    -    all    cp_ooo cp_langmacros cp_langtemplates NULL
++@@ -27,4 +28,4 @@
++ cp    scp2\source\winexplorerext  nmake    -    all    cp_winexplorerext cp_langmacros cp_langtemplates NULL
++ cp    scp2\source\onlineupdate    nmake    -    all    cp_update cp_langmacros cp_langtemplates NULL
++ cp    scp2\source\accessories     nmake    -    all    cp_accessories cp_langmacros NULL
++-cp    scp2\util                   nmake    -    all    cp_util cp_activex cp_binfilter cp_calc cp_canvas cp_crashrep cp_draw cp_extensions cp_gnome cp_graphicfilter cp_impress cp_javafilter cp_kde cp_layout cp_math cp_ooo cp_python cp_quickstart cp_testtool cp_writer cp_base cp_xsltfilter cp_winexplorerext cp_sdkoo cp_update cp_accessories NULL
+++cp    scp2\util                   nmake    -    all    cp_util cp_activex cp_binfilter cp_calc cp_canvas cp_crashrep cp_draw cp_extensions cp_gnome cp_graphicfilter cp_impress cp_javafilter cp_kde cp_tde cp_layout cp_math cp_ooo cp_python cp_quickstart cp_testtool cp_writer cp_base cp_xsltfilter cp_winexplorerext cp_sdkoo cp_update cp_accessories NULL
++diff -urN scp2/source/ooo/file_library_ooo.scp scp2/source/ooo/file_library_ooo.scp
++--- scp2/source/ooo/file_library_ooo.scp	2010-11-11 09:08:07.000000000 -0600
+++++ scp2/source/ooo/file_library_ooo.scp	2011-08-18 11:42:28.890516734 -0500
++@@ -590,6 +590,25 @@
++ End
++ #endif
++ #endif
+++#ifdef ENABLE_TDE
+++#ifndef MACOSX
+++File gid_File_Lib_Fps_Tde
+++    TXT_FILE_BODY;
+++    Styles = (PACKED,UNO_COMPONENT);
+++    RegistryID = gid_Starregistry_Services_Rdb;
+++    Dir = gid_Dir_Program;
+++    Name = SPECIAL_COMPONENT_LIB_NAME(fps_tde.uno);
+++    Regmergefile = "fps-tde-ucd.txt";
+++End
+++File gid_File_Bin_TdeFilePicker
+++    BIN_FILE_BODY;
+++    Styles = (PACKED);
+++    Dir = gid_Brand_Dir_Program;
+++    Name = "tdefilepicker";
+++End
+++#endif
+++#endif
+++
++ #endif
++ 
++ #ifdef MACOSX
++@@ -1207,6 +1226,17 @@
++ End
++ #endif
++ #endif
+++#ifdef ENABLE_TDE
+++#ifndef MACOSX
+++File gid_File_Lib_Vclplug_Tde
+++    Name = LIBNAME(vclplug_tde);
+++    TXT_FILE_BODY;
+++    Styles = (PACKED);
+++    Dir = SCP2_OOO_BIN_DIR;
+++End
+++#endif
+++#endif
+++
++ #endif
++ 
++ #if defined(QUARTZ)
++diff -urN scp2/source/ooo/file_ooo.scp scp2/source/ooo/file_ooo.scp
++--- scp2/source/ooo/file_ooo.scp	2011-03-08 13:12:46.000000000 -0600
+++++ scp2/source/ooo/file_ooo.scp	2011-08-18 11:40:40.942257980 -0500
++@@ -209,6 +209,13 @@
++     Styles = (PACKED);
++ End
++ 
+++File gid_File_Bin_Tde_Open_Url
+++    BIN_FILE_BODY;
+++    Dir = gid_Dir_Program;
+++    Name = "tde-open-url";
+++    Styles = (PACKED);
+++End
+++
++ File gid_File_Bin_Cde_Open_Url
++     BIN_FILE_BODY;
++     Dir = gid_Dir_Program;
++diff -urN scp2/source/ooo/module_hidden_ooo.scp scp2/source/ooo/module_hidden_ooo.scp
++--- scp2/source/ooo/module_hidden_ooo.scp	2010-12-14 09:40:37.000000000 -0600
+++++ scp2/source/ooo/module_hidden_ooo.scp	2011-08-18 11:44:02.297661319 -0500
++@@ -40,6 +40,7 @@
++ 	gid_File_Bin_Gnome_Open_Url,
++ 	gid_File_Bin_Gnome_Open_Url_Bin,
++ 	gid_File_Bin_Kde_Open_Url,
+++	gid_File_Bin_Tde_Open_Url,
++ 	gid_File_Bin_Open_Url,
++ 	gid_File_Bin_Pagein,
++ 	gid_File_Bin_Pluginapp,
++@@ -239,6 +240,7 @@
++ 	gid_File_Lib_Vclplug_Gtk,
++ 	gid_File_Lib_Vclplug_Kde,
++ 	gid_File_Lib_Vclplug_Kde4,
+++	gid_File_Lib_Vclplug_Tde,
++ 	gid_File_Lib_Vclplug_Svp,
++ 	gid_File_Lib_Basctl,
++ 	gid_File_Lib_CanvasTools,
++diff -urN scp2/source/tde/file_tde.scp scp2/source/tde/file_tde.scp
++--- scp2/source/tde/file_tde.scp	1969-12-31 18:00:00.000000000 -0600
+++++ scp2/source/tde/file_tde.scp	2011-08-18 11:38:30.302260303 -0500
++@@ -0,0 +1,39 @@
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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));
+++    RegistryID = gid_Starregistry_Services_Rdb;
+++    Regmergefile = "tdebe1-ucd.txt";
+++End
+++#endif
++diff -urN scp2/source/tde/makefile.mk scp2/source/tde/makefile.mk
++--- scp2/source/tde/makefile.mk	1969-12-31 18:00:00.000000000 -0600
+++++ scp2/source/tde/makefile.mk	2011-08-18 11:37:33.667925169 -0500
++@@ -0,0 +1,59 @@
+++#*************************************************************************
+++#
+++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++#
+++# Copyright 2000, 2010 Oracle and/or its affiliates.
+++# Copyright 2011 Timothy Pearson
+++#
+++# OpenOffice.org - a multi-platform office productivity suite
+++#
+++# This file is part of OpenOffice.org.
+++#
+++# OpenOffice.org is free software: you can redistribute it and/or modify
+++# it under the terms of the GNU Lesser General Public License version 3
+++# only, as published by the Free Software Foundation.
+++#
+++# OpenOffice.org is distributed in the hope that it will be useful,
+++# but WITHOUT ANY WARRANTY; without even the implied warranty of
+++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++# GNU Lesser General Public License version 3 for more details
+++# (a copy is included in the LICENSE file that accompanied this code).
+++#
+++# You should have received a copy of the GNU Lesser General Public License
+++# version 3 along with OpenOffice.org.  If not, see
+++# <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 -urN scp2/source/tde/module_tde.scp scp2/source/tde/module_tde.scp
++--- scp2/source/tde/module_tde.scp	1969-12-31 18:00:00.000000000 -0600
+++++ scp2/source/tde/module_tde.scp	2011-08-18 11:38:07.870543319 -0500
++@@ -0,0 +1,45 @@
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN scp2/source/tde/module_tde.ulf scp2/source/tde/module_tde.ulf
++--- scp2/source/tde/module_tde.ulf	1969-12-31 18:00:00.000000000 -0600
+++++ scp2/source/tde/module_tde.ulf	2011-08-18 11:37:03.345603863 -0500
++@@ -0,0 +1,34 @@
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 -urN scp2/util/makefile.mk scp2/util/makefile.mk
++--- scp2/util/makefile.mk	2010-12-16 07:54:12.000000000 -0600
+++++ scp2/util/makefile.mk	2011-08-18 11:39:59.419080617 -0500
++@@ -197,6 +197,12 @@
++              module_kde.par     \
++              file_kde.par
++ .ENDIF
+++
+++.IF "$(ENABLE_TDE)" == "TRUE"
+++SCP1FILES += \
+++             module_tde.par     \
+++             file_tde.par
+++.ENDIF
++ .ENDIF
++ 
++ .IF "$(ENABLE_CRASHDUMP)" != ""
++@@ -380,6 +386,12 @@
++              module_kde.par     \
++              file_kde.par
++ .ENDIF
+++
+++.IF "$(ENABLE_TDE)" == "TRUE"
+++SCP2FILES += \
+++             module_tde.par     \
+++             file_tde.par
+++.ENDIF
++ .ENDIF
++ 
++ .IF "$(ENABLE_CRASHDUMP)" != ""
++diff -urN shell/source/unix/misc/makefile.mk shell/source/unix/misc/makefile.mk
++--- shell/source/unix/misc/makefile.mk	2010-11-11 09:30:08.000000000 -0600
+++++ shell/source/unix/misc/makefile.mk	2011-08-18 14:27:51.206440704 -0500
++@@ -45,7 +45,8 @@
++     $(BIN)$/open-url \
++     $(BIN)$/cde-open-url \
++     $(BIN)$/gnome-open-url \
++-    $(BIN)$/kde-open-url
+++    $(BIN)$/kde-open-url \
+++    $(BIN)$/tde-open-url
++ 
++ .IF "$(GUI)" == "OS2"
++ 
++diff -urN shell/source/unix/misc/tde-open-url.sh shell/source/unix/misc/tde-open-url.sh
++--- shell/source/unix/misc/tde-open-url.sh	1969-12-31 18:00:00.000000000 -0600
+++++ shell/source/unix/misc/tde-open-url.sh	2010-11-11 09:30:08.000000000 -0600
++@@ -0,0 +1,10 @@
+++#!/bin/sh
+++
+++# special handling for mailto: uris
+++if echo $1 | grep '^mailto:' > /dev/null; then
+++  kmailservice "$1" &
+++else
+++  kfmclient openURL "$1" &
+++fi
+++
+++exit 0
++diff -urN setup_native/source/packinfo/packinfo_office.txt setup_native/source/packinfo/packinfo_office.txt
++--- setup_native/source/packinfo/packinfo_office.txt	2011-03-08 13:12:46.000000000 -0600
+++++ setup_native/source/packinfo/packinfo_office.txt	2011-08-18 14:46:02.820250783 -0500
++@@ -48,6 +48,21 @@
++ End
++ 
++ Start
+++module = "gid_Module_Optional_Tde"
+++solarispackagename = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-tde-integration"
+++solarisrequires = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01"
+++packagename = "%BASISPACKAGEPREFIX%OOOBASEVERSION-tde-integration"
+++freebsdrequires = "%BASISPACKAGEPREFIX%OOOBASEVERSION-core01"
+++requires = "%BASISPACKAGEPREFIX%OOOBASEVERSION-core01"
+++copyright = "1999-2009 by OpenOffice.org"
+++solariscopyright = "solariscopyrightfile"
+++vendor = "The Document Foundation"
+++description = "TDE integration module for LibreOffice %OOOBASEVERSION"
+++destpath = "/opt"
+++packageversion = "%OOOPACKAGEVERSION"
+++End
+++
+++Start
++ module = "gid_Module_Root"
++ # script = "shellscripts_core01.txt"
++ solarispackagename = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01"
++diff -urN scp2/source/ooo/makefile.mk scp2/source/ooo/makefile.mk
++--- scp2/source/ooo/makefile.mk	2010-12-16 05:06:55.000000000 -0600
+++++ scp2/source/ooo/makefile.mk	2011-08-18 15:49:48.543071983 -0500
++@@ -88,6 +88,14 @@
++ SCPDEFS+=-DENABLE_KAB
++ .ENDIF
++ 
+++.IF "$(ENABLE_TDE)" != ""
+++SCPDEFS+=-DENABLE_TDE
+++.ENDIF
+++
+++.IF "$(ENABLE_TDEAB)" != ""
+++SCPDEFS+=-DENABLE_TDEAB
+++.ENDIF
+++
++ .IF "$(ENABLE_EVOAB2)" != ""
++ SCPDEFS+=-DENABLE_EVOAB2
++ .ENDIF
++diff -urN solenv/config/sooo330.ini solenv/config/sooo330.ini
++--- solenv/config/sooo330.ini	2010-11-11 09:08:07.000000000 -0600
+++++ solenv/config/sooo330.ini	2011-08-18 19:37:01.865529222 -0500
++@@ -646,6 +646,8 @@
++ 			CVER C432
++ 			ENABLE_KAB TRUE
++ 			ENABLE_KDE TRUE
+++			ENABLE_TDEAB TRUE
+++			ENABLE_TDE TRUE
++ 			ENABLE_EVOAB2 TRUE
++ 			ENV_TOOLS %SOLARROOT%/et_linux_libc2.5/%WORK_STAMP%/bin
++ 			GUI UNX
++@@ -656,6 +658,7 @@
++ 			JDK14PATH %SOLAR_JDK14PATH%
++ 			JDK15PATH %SOLAR_JDK15PATH%
++ 			KDE_ROOT /so/env/kde/linux/kde-3.2.2
+++			TDE_ROOT /so/env/tde/linux/tde-3.2.2
++             LIBMYSQL_PATH %SOLAR_ENV_ROOT%/mysql-connector-c-6.0.2/unxlngi6
++ 			NO_BSYMBOLIC True
++ 			OJDK16PATH %SOLAR_OJDK16PATH%
++@@ -921,6 +924,8 @@
++ 			CVER C341
++ 			ENABLE_KAB TRUE
++ 			ENABLE_KDE TRUE
+++			ENABLE_TDEAB TRUE
+++			ENABLE_TDE TRUE
++ 			ENV_TOOLS %SOLARROOT%/et_linux_libc2.32/%WORK_STAMP%/bin
++ 			GUI UNX
++ 			GUIBASE unx
++@@ -930,6 +935,7 @@
++ 			JDK14PATH %SOLAR_JDK14PATH%
++ 			JDK15PATH %SOLAR_JDK15PATH%
++ 			KDE_ROOT /so/env/kde/linux/kde-3.2.2
+++			TDE_ROOT /so/env/tde/linux/tde-3.2.2
++             LIBMYSQL_PATH %SOLAR_ENV_ROOT%/mysql-connector-c-6.0.2/unxlngx6
++ 			NO_BSYMBOLIC True
++ 			OJDK16PATH %SOLAR_OJDK16PATH%
++diff -urN solenv/config/ssolar.cmn solenv/config/ssolar.cmn
++--- solenv/config/ssolar.cmn	2010-11-11 09:08:07.000000000 -0600
+++++ solenv/config/ssolar.cmn	2011-08-18 19:37:26.207387814 -0500
++@@ -89,6 +89,7 @@
++         ENABLE_GCONF
++         ENABLE_GNOMEVFS
++         ENABLE_KDE
+++        ENABLE_TDE
++         ENABLE_MEDIAWIKI
++ 		ENABLE_MINIMIZER
++ 		ENABLE_NSS_MODULE
++diff -urN solenv/inc/unx.mk solenv/inc/unx.mk
++--- solenv/inc/unx.mk	2010-11-11 09:08:07.000000000 -0600
+++++ solenv/inc/unx.mk	2011-08-18 19:35:33.868809472 -0500
++@@ -206,4 +206,13 @@
++ .ENDIF          # "$(KDE_ROOT)"!=""
++ .ENDIF          # "$(ENABLE_KDE)" != ""
++ 
+++# enable building/linking TDE-dependent code in both OOo and SO build environment
+++.IF "$(ENABLE_TDE)" != ""
+++.IF "$(TDE_ROOT)"!=""
+++TDE_CFLAGS:=-I$(TDE_ROOT)/include -I/usr/include/tqt -DQT_CLEAN_NAMESPACE
+++TDE_LIBS:=-lkdeui -lkdecore -ltqt -lqt-mt
+++SOLARLIB+=-L$(TDE_ROOT)/lib
+++.ENDIF          # "$(TDE_ROOT)"!=""
+++.ENDIF          # "$(ENABLE_TDE)" != ""
+++
++ OOO_LIBRARY_PATH_VAR *= LD_LIBRARY_PATH
++diff -urN svx/util/makefile.pmk svx/util/makefile.pmk
++--- svx/util/makefile.pmk	2010-11-11 09:30:08.000000000 -0600
+++++ svx/util/makefile.pmk	2011-08-18 19:40:05.809571436 -0500
++@@ -40,4 +40,8 @@
++ CFLAGS+=-DENABLE_KDE4
++ .ENDIF
++ 
+++.IF "$(ENABLE_TDE)" != ""
+++CFLAGS+=-DENABLE_TDE
+++.ENDIF
+++
++ VISIBILITY_HIDDEN=TRUE
++diff -urN cui/source/options/optgdlg.cxx cui/source/options/optgdlg.cxx
++--- cui/source/options/optgdlg.cxx	2011-01-05 12:03:17.000000000 -0600
+++++ cui/source/options/optgdlg.cxx	2011-08-18 19:41:16.134938506 -0500
++@@ -157,6 +157,14 @@
++                 return rtl::OUString();
++                 #endif
++             }
+++            else if ( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "tde" ) )
+++            {
+++                #ifdef ENABLE_TDE
+++                return ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.TDEFilePicker" );
+++                #else
+++                return rtl::OUString();
+++                #endif
+++            }
++             #if defined WNT
++             return ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.SystemFilePicker" );
++             #elif (defined MACOSX && defined QUARTZ)
++diff -urN cui/util/makefile.pmk cui/util/makefile.pmk
++--- cui/util/makefile.pmk	2010-11-11 09:12:41.000000000 -0600
+++++ cui/util/makefile.pmk	2011-08-18 19:40:36.291897881 -0500
++@@ -37,4 +37,8 @@
++ CFLAGS+=-DENABLE_KDE4
++ .ENDIF
++ 
+++.IF "$(ENABLE_TDE)" != ""
+++CFLAGS+=-DENABLE_TDE
+++.ENDIF
+++
++ VISIBILITY_HIDDEN=TRUE
++diff -urN desktop/source/pagein/makefile.mk desktop/source/pagein/makefile.mk
++--- desktop/source/pagein/makefile.mk	2010-11-11 09:30:07.000000000 -0600
+++++ desktop/source/pagein/makefile.mk	2011-08-18 19:41:55.037907135 -0500
++@@ -129,6 +129,9 @@
++ .IF "$(ENABLE_KDE)" != ""
++     @-echo $(DLLPRE)vclplug_kde$(DFTDLLPOST) >> $@
++ .ENDIF # ENABLE_KDE
+++.IF "$(ENABLE_TDE)" != ""
+++    @-echo $(DLLPRE)vclplug_tde$(DFTDLLPOST) >> $@
+++.ENDIF # ENABLE_TDE
++ #
++     @-echo $(DLLPRE)basegfx$(DFTDLLPOST) >> $@
++     @-echo $(DLLPRE)sot$(DFTDLLPOST)     >> $@
++diff -urN toolkit/source/layout/core/dialogbuttonhbox.cxx toolkit/source/layout/core/dialogbuttonhbox.cxx
++--- toolkit/source/layout/core/dialogbuttonhbox.cxx	2010-11-11 09:22:48.000000000 -0600
+++++ toolkit/source/layout/core/dialogbuttonhbox.cxx	2011-08-18 19:46:04.396929494 -0500
++@@ -57,6 +57,8 @@
++ DialogButtonHBox::WINDOWS;
++ #elif defined( ENABLE_KDE )
++ DialogButtonHBox::KDE;
+++#elif defined( ENABLE_TDE )
+++DialogButtonHBox::TDE;
++ #else /* !MACOSX && !SAL_W32 && !ENABLE_KDE */
++ DialogButtonHBox::GNOME;
++ #endif /* !MACOSX && !SAL_W32 && !ENABLE_KDE */
++@@ -84,6 +86,8 @@
++         mnOrdering = GNOME;
++     else if ( ordering.equalsIgnoreAsciiCaseAscii( "KDE" ) )
++         mnOrdering = KDE;
+++    else if ( ordering.equalsIgnoreAsciiCaseAscii( "TDE" ) )
+++        mnOrdering = TDE;
++     else if ( ordering.equalsIgnoreAsciiCaseAscii( "MacOS" ) )
++         mnOrdering = MACOS;
++     else if ( ordering.equalsIgnoreAsciiCaseAscii( "Windows" ) )
++@@ -144,6 +148,8 @@
++         macosOrdering();
++     else if ( mnOrdering == KDE )
++         kdeOrdering();
+++    else if ( mnOrdering == TDE )
+++        tdeOrdering();
++     else if ( 1 || mnOrdering == GNOME )
++         gnomeOrdering();
++ }
++@@ -218,6 +224,30 @@
++ {
++     std::list< Box_Base::ChildData * > ordered;
++     if ( mpHelp )
+++        ordered.push_back( mpHelp );
+++    if ( mpReset )
+++        ordered.push_back( mpReset );
+++    if ( mpFlow && ( mpHelp || mpReset ) )
+++        ordered.push_back( mpFlow );
+++    ordered.insert( ordered.end(), maOther.begin(), maOther.end() );
+++    if ( mpAction )
+++        ordered.push_back( mpAction );
+++    if ( mpAffirmative )
+++        ordered.push_back( mpAffirmative );
+++    if ( mpApply )
+++        ordered.push_back( mpApply );
+++    if ( mpAlternate )
+++        ordered.push_back( mpAlternate );
+++    if ( mpCancel )
+++        ordered.push_back( mpCancel );
+++    maChildren = ordered;
+++}
+++
+++void
+++DialogButtonHBox::tdeOrdering()
+++{
+++    std::list< Box_Base::ChildData * > ordered;
+++    if ( mpHelp )
++         ordered.push_back( mpHelp );
++     if ( mpReset )
++         ordered.push_back( mpReset );
++diff -urN toolkit/source/layout/core/dialogbuttonhbox.hxx toolkit/source/layout/core/dialogbuttonhbox.hxx
++--- toolkit/source/layout/core/dialogbuttonhbox.hxx	2010-11-11 09:22:48.000000000 -0600
+++++ toolkit/source/layout/core/dialogbuttonhbox.hxx	2011-08-18 19:46:17.897959152 -0500
++@@ -45,11 +45,12 @@
++     void SAL_CALL removeChild( css::uno::Reference< css::awt::XLayoutConstrains > const& xChild ) throw ( css::uno::RuntimeException );
++ 
++ private:
++-    enum Ordering { PLATFORM, GNOME, KDE, MACOS, WINDOWS };
+++    enum Ordering { PLATFORM, GNOME, KDE, TDE, MACOS, WINDOWS };
++ 
++     void orderChildren();
++     void gnomeOrdering();
++     void kdeOrdering();
+++    void tdeOrdering();
++     void macosOrdering();
++     void windowsOrdering();
++ 
++diff -urN vcl/util/makefile.mk vcl/util/makefile.mk
++--- vcl/util/makefile.mk	2011-03-08 12:51:41.000000000 -0600
+++++ vcl/util/makefile.mk	2011-08-18 19:55:25.649710040 -0500
++@@ -420,6 +420,35 @@
++ 
++ .ENDIF # "$(ENABLE_KDE)" != ""
++ 
+++# TDE plugin
+++.IF "$(ENABLE_TDE)" != ""
+++.IF "$(TDE_ROOT)"!=""
+++EXTRALIBPATHS+=-L$(TDE_ROOT)$/lib
+++.ENDIF
+++LIB5TARGET=$(SLB)$/itde_plug_
+++LIB5FILES=$(SLB)$/tdeplug.lib
+++SHL5TARGET=vclplug_tde$(DLLPOSTFIX)
+++SHL5IMPLIB=itde_plug_
+++SHL5LIBS=$(LIB5TARGET)
+++SHL5DEPN=$(SHL2TARGETN)
+++# libs for TDE plugin
+++SHL5STDLIBS+=-l$(SHL2TARGET)
+++SHL5STDLIBS+=\
+++        $(VCLLIB)       \
+++        $(TOOLSLIB)     \
+++        $(SALLIB)       \
+++        $(X11LINK_DYNAMIC)
+++
+++.IF "$(ENABLE_RANDR)" != ""
+++.IF "$(XRANDR_DLOPEN)" == "FALSE"
+++SHL5STDLIBS+= $(XRANDR_LIBS)
+++.ENDIF
+++.ENDIF
+++
+++SHL5LINKFLAGS+=$(TDE_LIBS)
+++
+++.ENDIF # "$(ENABLE_TDE)" != ""
+++
++ # KDE4 plugin
++ .IF "$(ENABLE_KDE4)" != ""
++ .IF "$(KDE4_ROOT)"!=""
++diff -urN vcl/unx/tde/makefile.mk vcl/unx/tde/makefile.mk
++--- vcl/unx/tde/makefile.mk	1969-12-31 18:00:00.000000000 -0600
+++++ vcl/unx/tde/makefile.mk	2011-08-18 20:13:01.750097435 -0500
++@@ -0,0 +1,82 @@
+++#*************************************************************************
+++#
+++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++# 
+++# Copyright 2000, 2010 Oracle and/or its affiliates.
+++# Copyright 2011 Timothy Pearson
+++#
+++# OpenOffice.org - a multi-platform office productivity suite
+++#
+++# This file is part of OpenOffice.org.
+++#
+++# OpenOffice.org is free software: you can redistribute it and/or modify
+++# it under the terms of the GNU Lesser General Public License version 3
+++# only, as published by the Free Software Foundation.
+++#
+++# OpenOffice.org is distributed in the hope that it will be useful,
+++# but WITHOUT ANY WARRANTY; without even the implied warranty of
+++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++# GNU Lesser General Public License version 3 for more details
+++# (a copy is included in the LICENSE file that accompanied this code).
+++#
+++# You should have received a copy of the GNU Lesser General Public License
+++# version 3 along with OpenOffice.org.  If not, see
+++# <http://www.openoffice.org/license.html>
+++# for a copy of the LGPLv3 License.
+++#
+++#*************************************************************************
+++
+++PRJ=..$/..
+++
+++PRJNAME=vcl
+++TARGET=tdeplug
+++.INCLUDE :  $(PRJ)$/util$/makefile.pmk
+++
+++# workaround for makedepend hang
+++MTDEPENDSOLVER=
+++
+++# --- Settings -----------------------------------------------------
+++
+++.INCLUDE :  settings.mk
+++.INCLUDE :  $(PRJ)$/util$/makefile2.pmk
+++
+++# For some of the included external TDE headers, GCC complains about shadowed
+++# symbols in instantiated template code only at the end of a compilation unit,
+++# so the only solution is to disable that warning here:
+++.IF "$(COM)" == "GCC"
+++CFLAGSCXX+=-Wno-shadow
+++.ENDIF
+++
+++# --- Files --------------------------------------------------------
+++
+++.IF "$(GUIBASE)"!="unx"
+++
+++dummy:
+++    @echo "Nothing to build for GUIBASE $(GUIBASE)"
+++
+++.ELSE		# "$(GUIBASE)"!="unx"
+++
+++.IF "$(ENABLE_TDE)" != ""
+++
+++CFLAGS+=$(TDE_CFLAGS)
+++
+++.IF "$(ENABLE_RANDR)" != ""
+++CDEFS+=-DUSE_RANDR
+++.ENDIF
+++
+++SLOFILES=\
+++    $(SLO)$/tdedata.obj	\
+++    $(SLO)$/salnativewidgets-tde.obj
+++
+++.ELSE # "$(ENABLE_TDE)" != ""
+++
+++dummy:
+++    @echo TDE disabled - nothing to build
+++.ENDIF
+++.ENDIF		# "$(GUIBASE)"!="unx"
+++
+++# --- Targets ------------------------------------------------------
+++
+++.INCLUDE :  target.mk
+++
+++.INCLUDE :  $(PRJ)$/util$/target.pmk
++diff -urN vcl/unx/tde/salnativewidgets-tde.cxx vcl/unx/tde/salnativewidgets-tde.cxx
++--- vcl/unx/tde/salnativewidgets-tde.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ vcl/unx/tde/salnativewidgets-tde.cxx	2011-08-18 20:13:46.133472981 -0500
++@@ -0,0 +1,2119 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ * 
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 <salunx.h>
+++#include <saldata.hxx>
+++#include <saldisp.hxx>
+++
+++#include <salgdi.h>
+++
+++#include <salframe.h>
+++#include <vcl/settings.hxx>
+++#include <rtl/ustrbuf.hxx>
+++#include <plugins/tde/tdedata.hxx>
+++#include <iostream>
+++
+++#include <pspgraphics.h>
+++
+++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.
+++    */
+++        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, 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, 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,
+++        BOOL bHorizontal, const ImplControlValue& aValue );
+++
+++    /** 'Get' method for tool bar.
+++
+++      @see pushButton()
+++    */
+++    TQToolBar     *toolBar( const Rectangle& rControlRegion, 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;
+++}
+++
+++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,
+++    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,
+++    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,
+++    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, 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 BOOL IsNativeControlSupported( ControlType nType, ControlPart nPart );
+++    virtual BOOL hitTestNativeControl( ControlType nType, ControlPart nPart,
+++                                       const Rectangle& rControlRegion, const Point& aPos,
+++                                       BOOL& rIsInside );
+++    virtual BOOL drawNativeControl( ControlType nType, ControlPart nPart,
+++                                    const Rectangle& rControlRegion, ControlState nState,
+++                                    const ImplControlValue& aValue,
+++                                    const OUString& aCaption );
+++    virtual BOOL drawNativeControlText( ControlType nType, ControlPart nPart,
+++                                        const Rectangle& rControlRegion, ControlState nState,
+++                                        const ImplControlValue& aValue,
+++                                        const OUString& aCaption );
+++    virtual BOOL getNativeControlRegion( ControlType nType, ControlPart nPart,
+++                                         const Rectangle& rControlRegion, ControlState nState,
+++                                         const ImplControlValue& aValue,
+++                                         const OUString& aCaption,
+++                                         Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion );
+++};
+++
+++/** What widgets can be drawn the native way.
+++
+++    @param nType
+++    Type of the widget.
+++    
+++    @param nPart
+++    Specification of the widget's part if it consists of more than one.
+++  
+++    @return TRUE if the platform supports native drawing of the widget nType
+++    defined by nPart.
+++*/
+++BOOL TDESalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart )
+++{
+++    return
+++    ( (nType == CTRL_PUSHBUTTON)  && (nPart == PART_ENTIRE_CONTROL) ) ||
+++    ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) ||
+++    ( (nType == CTRL_CHECKBOX)    && (nPart == PART_ENTIRE_CONTROL) ) ||
+++    ( (nType == CTRL_COMBOBOX)    && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
+++    ( (nType == CTRL_EDITBOX)     && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
+++    ( (nType == CTRL_LISTBOX)     && (nPart == PART_ENTIRE_CONTROL || nPart == PART_WINDOW || nPart == HAS_BACKGROUND_TEXTURE ) ) ||
+++    ( (nType == CTRL_SPINBOX)     && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
+++    // no CTRL_SPINBUTTONS for TDE
+++    ( (nType == CTRL_TAB_ITEM)    && (nPart == PART_ENTIRE_CONTROL) ) ||
+++    ( (nType == CTRL_TAB_PANE)    && (nPart == PART_ENTIRE_CONTROL) ) ||
+++    // no CTRL_TAB_BODY for TDE
+++    ( (nType == CTRL_SCROLLBAR)   && (nPart == PART_ENTIRE_CONTROL || nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) ) ||
+++    ( (nType == CTRL_SCROLLBAR)   && (nPart == HAS_THREE_BUTTONS) ) || // TODO small optimization is possible here: return this only if the style really has 3 buttons
+++    // CTRL_GROUPBOX not supported
+++    // CTRL_FIXEDLINE not supported
+++    // CTRL_FIXEDBORDER not supported
+++    ( (nType == CTRL_TOOLBAR)     && (nPart == PART_ENTIRE_CONTROL ||
+++                                      nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT ||
+++                                      nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT ||
+++                                      nPart == PART_BUTTON) ) ||
+++    ( (nType == CTRL_MENUBAR)     && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ||
+++    ( (nType == CTRL_MENU_POPUP)  && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ||
+++    ( (nType == CTRL_PROGRESS)    && (nPart == PART_ENTIRE_CONTROL) )
+++        ;
+++}
+++
+++
+++/** Test whether the position is in the native widget.
+++
+++    If the return value is TRUE, bIsInside contains information whether
+++    aPos was or was not inside the native widget specified by the
+++    nType/nPart combination.
+++*/
+++BOOL TDESalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart,
+++                                           const Rectangle& rControlRegion, const Point& rPos,
+++                                           BOOL& rIsInside )
+++{
+++    if ( nType == CTRL_SCROLLBAR )
+++    {
+++    // make position relative to rControlRegion
+++    Point aPos = rPos - rControlRegion.TopLeft();
+++    rIsInside = FALSE;
+++
+++    BOOL bHorizontal = ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT );
+++    
+++    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
+++    BOOL bTwoSubButtons = FALSE;
+++
+++    // It is a Platinum style scroll bar
+++    BOOL bPlatinumStyle = FALSE;
+++
+++    // Workaround for Platinum and 3 button style scroll bars.
+++    // It makes the right/down button bigger.
+++    if ( bHorizontal )
+++    {
+++        qRectAddLine.setLeft( kapp->style().querySubControlMetrics(
+++            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.)
+++*/
+++BOOL TDESalGraphics::drawNativeControl( ControlType nType, ControlPart nPart,
+++                                        const Rectangle& rControlRegion, ControlState nState,
+++                                        const ImplControlValue& aValue,
+++                                        const OUString& )
+++{
+++    BOOL bReturn = FALSE;
+++
+++    Display *dpy = GetXDisplay();
+++    XLIB_Window drawable = GetDrawable();
+++    GC gc = SelectPen(); //SelectFont(); // GC with current clipping region set
+++    
+++    if ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->pushButton( rControlRegion, (nState & CTRL_STATE_DEFAULT) ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->radioButton( rControlRegion ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->checkBox( rControlRegion ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->comboBox( rControlRegion, TRUE ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->lineEdit( rControlRegion ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->comboBox( rControlRegion, FALSE ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_LISTBOX) && (nPart == PART_WINDOW) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->listView( rControlRegion ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->spinWidget( rControlRegion ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType==CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->tabBar( rControlRegion ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType==CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->tabWidget( rControlRegion ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_SCROLLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) )
+++    {
+++    bReturn = pWidgetPainter->drawStyledWidget(
+++        pWidgetPainter->scrollBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ, aValue ),
+++        nState, aValue,
+++        dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT || nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT) )
+++    {
+++        bReturn = pWidgetPainter->drawStyledWidget(
+++                pWidgetPainter->toolBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_THUMB_VERT ),
+++                nState, aValue,
+++                dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
+++    }
+++    else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_BUTTON) )
+++    {
+++        bReturn = pWidgetPainter->drawStyledWidget(
+++                pWidgetPainter->toolButton( rControlRegion ),
+++                nState, aValue,
+++                dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
+++    }
+++    else if ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) )
+++    {
+++        bReturn = pWidgetPainter->drawStyledWidget(
+++                pWidgetPainter->menuBar( rControlRegion ),
+++                nState, aValue,
+++                dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
+++    }
+++    else if ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) )
+++    {
+++        bReturn = pWidgetPainter->drawStyledWidget(
+++                pWidgetPainter->popupMenu( rControlRegion ),
+++                nState, aValue,
+++                dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++    else if ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) )
+++    {
+++        bReturn = pWidgetPainter->drawStyledWidget(
+++                pWidgetPainter->progressBar( rControlRegion ),
+++                nState, aValue,
+++                dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++    }
+++
+++    return bReturn;
+++}
+++
+++
+++/** Draw text on the widget.
+++ 
+++    OPTIONAL. Draws the requested text for the control described by nPart/nState.
+++    Used if text is not drawn by DrawNativeControl().
+++ 
+++    @param rControlRegion
+++    The bounding region of the complete control in VCL frame coordinates.
+++    
+++    @param aValue
+++    An optional value (tristate/numerical/string)
+++    
+++    @param aCaption
+++    A caption or title string (like button text etc.)
+++*/
+++BOOL TDESalGraphics::drawNativeControlText( ControlType, ControlPart,
+++                                            const Rectangle&, ControlState,
+++                                            const ImplControlValue&,
+++                                            const OUString& )
+++{
+++    return FALSE;
+++}
+++
+++/** Check if the bounding regions match.
+++
+++    If the return value is TRUE, rNativeBoundingRegion
+++    contains the true bounding region covered by the control
+++    including any adornment, while rNativeContentRegion contains the area
+++    within the control that can be safely drawn into without drawing over
+++    the borders of the control.
+++
+++    @param rControlRegion
+++    The bounding region of the control in VCL frame coordinates.
+++    
+++    @param aValue
+++    An optional value (tristate/numerical/string)
+++    
+++    @param aCaption
+++    A caption or title string (like button text etc.)
+++*/
+++BOOL TDESalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart,
+++                                             const Rectangle& rControlRegion, ControlState nState,
+++                                             const ImplControlValue&,
+++                                             const OUString&,
+++                                             Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion )
+++{
+++    BOOL bReturn = FALSE;
+++    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, ULONG nStyle ) :
+++    X11SalFrame( pParent, nStyle )
+++{
+++}
+++
+++void TDESalFrame::Show( BOOL bVisible, 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()? psp::italic::Italic: psp::italic::Upright );
+++    
+++    // set weight
+++    int nWeight = qFontInfo.weight();
+++    if ( nWeight <= TQFont::Light )
+++        aInfo.m_eWeight = psp::weight::Light;
+++    else if ( nWeight <= TQFont::Normal )
+++        aInfo.m_eWeight = psp::weight::Normal;
+++    else if ( nWeight <= TQFont::DemiBold )
+++        aInfo.m_eWeight = psp::weight::SemiBold;
+++    else if ( nWeight <= TQFont::Bold )
+++        aInfo.m_eWeight = psp::weight::Bold;
+++    else
+++        aInfo.m_eWeight = psp::weight::UltraBold;
+++    
+++    // set width
+++    int nStretch = rTQFont.stretch();
+++    if ( nStretch <= TQFont::UltraCondensed )
+++        aInfo.m_eWidth = psp::width::UltraCondensed;
+++    else if ( nStretch <= TQFont::ExtraCondensed )
+++        aInfo.m_eWidth = psp::width::ExtraCondensed;
+++    else if ( nStretch <= TQFont::Condensed )
+++        aInfo.m_eWidth = psp::width::Condensed;
+++    else if ( nStretch <= TQFont::SemiCondensed )
+++        aInfo.m_eWidth = psp::width::SemiCondensed;
+++    else if ( nStretch <= TQFont::Unstretched )
+++        aInfo.m_eWidth = psp::width::Normal;
+++    else if ( nStretch <= TQFont::SemiExpanded )
+++        aInfo.m_eWidth = psp::width::SemiExpanded;
+++    else if ( nStretch <= TQFont::Expanded )
+++        aInfo.m_eWidth = psp::width::Expanded;
+++    else if ( nStretch <= TQFont::ExtraExpanded )
+++        aInfo.m_eWidth = psp::width::ExtraExpanded;
+++    else
+++        aInfo.m_eWidth = psp::width::UltraExpanded;
+++    
+++#if OSL_DEBUG_LEVEL > 1
+++    fprintf( stderr, "font name BEFORE system match: \"%s\"\n", OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() );
+++#endif
+++
+++    // match font to e.g. resolve "Sans"
+++    psp::PrintFontManager::get().matchFont( aInfo, rLocale );
+++
+++#if OSL_DEBUG_LEVEL > 1
+++    fprintf( stderr, "font match %s, name AFTER: \"%s\"\n",
+++             aInfo.m_nID != 0 ? "succeeded" : "failed",
+++             OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() );
+++#endif
+++
+++    // font height
+++    int nPointHeight = qFontInfo.pointSize();
+++    if ( nPointHeight <= 0 )
+++        nPointHeight = rTQFont.pointSize();
+++    
+++    // Create the font
+++    Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) );
+++    if( aInfo.m_eWeight != psp::weight::Unknown )
+++        aFont.SetWeight( PspGraphics::ToFontWeight( aInfo.m_eWeight ) );
+++    if( aInfo.m_eWidth != psp::width::Unknown )
+++        aFont.SetWidthType( PspGraphics::ToFontWidth( aInfo.m_eWidth ) );
+++    if( aInfo.m_eItalic != psp::italic::Unknown )
+++        aFont.SetItalic( PspGraphics::ToFontItalic( aInfo.m_eItalic ) );
+++    if( aInfo.m_ePitch != psp::pitch::Unknown )
+++        aFont.SetPitch( PspGraphics::ToFontPitch( aInfo.m_ePitch ) );
+++
+++    return aFont;
+++}
+++
+++/** Implementation of TDE integration's main method.
+++*/
+++void TDESalFrame::UpdateSettings( AllSettings& rSettings )
+++{
+++    StyleSettings aStyleSettings( rSettings.GetStyleSettings() );
+++    bool bSetTitleFont = false;
+++
+++    aStyleSettings.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_LARGE );
+++
+++    // WM settings
+++    KConfig *pConfig = KGlobal::config();
+++    if ( pConfig )
+++    {
+++        pConfig->setGroup( "WM" );
+++        const char *pKey;
+++
+++        pKey = "activeBackground";
+++        if ( pConfig->hasKey( pKey ) )
+++            aStyleSettings.SetActiveColor( readColor( pConfig, pKey ) );
+++
+++        pKey = "activeBlend";
+++        if ( pConfig->hasKey( pKey ) )
+++            aStyleSettings.SetActiveColor2( readColor( pConfig, pKey ) );
+++
+++        pKey = "inactiveBackground";
+++        if ( pConfig->hasKey( pKey ) )
+++            aStyleSettings.SetDeactiveColor( readColor( pConfig, pKey ) );
+++
+++        pKey = "inactiveBlend";
+++        if ( pConfig->hasKey( pKey ) )
+++            aStyleSettings.SetDeactiveColor2( readColor( pConfig, pKey ) );
+++
+++        pKey = "inactiveForeground";
+++        if ( pConfig->hasKey( pKey ) )
+++            aStyleSettings.SetDeactiveTextColor( readColor( pConfig, pKey ) );
+++
+++        pKey = "activeForeground";
+++        if ( pConfig->hasKey( pKey ) )
+++            aStyleSettings.SetActiveTextColor( readColor( pConfig, pKey ) );
+++
+++        pKey = "titleFont";
+++        if ( pConfig->hasKey( pKey ) )
+++        {
+++            Font aFont = toFont( pConfig->readFontEntry( pKey ), rSettings.GetUILocale() );
+++            aStyleSettings.SetTitleFont( aFont );
+++            bSetTitleFont = true;
+++        }
+++
+++        pConfig->setGroup( "Icons" );
+++
+++        pKey = "Theme";
+++        if ( pConfig->hasKey( pKey ) )
+++            aStyleSettings.SetPreferredSymbolsStyleName( readEntryUntranslated( pConfig, pKey ) );
+++    }
+++
+++    // General settings
+++    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, ULONG nStyle )
+++{
+++    return new TDESalFrame( pParent, nStyle );
+++}
+++
+++// -----------------------------------------------------------------------
+++// TDESalData pieces
+++// -----------------------------------------------------------------------
+++
+++// Create the widget painter so we have some control over
+++// the destruction sequence, so Qt doesn't die in action.
+++
+++void TDEData::initNWF()
+++{
+++    ImplSVData *pSVData = ImplGetSVData();
+++    // draw toolbars on separate lines
+++    pSVData->maNWFData.mbDockingAreaSeparateTB = true;
+++
+++    pWidgetPainter = new WidgetPainter();
+++}
+++
+++void TDEData::deInitNWF()
+++{
+++    delete pWidgetPainter;
+++    pWidgetPainter = NULL;
+++
+++    // We have to destroy the style early
+++    kapp->setStyle( NULL );
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN vcl/unx/tde/tdedata.cxx vcl/unx/tde/tdedata.cxx
++--- vcl/unx/tde/tdedata.cxx	1969-12-31 18:00:00.000000000 -0600
+++++ vcl/unx/tde/tdedata.cxx	2011-08-18 20:14:26.186519004 -0500
++@@ -0,0 +1,274 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ * 
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <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 <shell/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 <plugins/tde/tdedata.hxx>
+++#include <osl/thread.h>
+++#include <osl/process.h>
+++#include <osl/module.h>
+++#include <osl/mutex.hxx>
+++
+++#include <tools/debug.hxx>
+++#include "i18n_im.hxx"
+++#include "i18n_xkb.hxx"
+++
+++/* #i59042# override KApplications method for session management
+++ * since it will interfere badly with our own.
+++ */
+++class VCLTDEApplication : public KApplication
+++{
+++    public:
+++    VCLTDEApplication() : KApplication() {}
+++    
+++    virtual void commitData(QSessionManager &sm);
+++};
+++
+++void VCLTDEApplication::commitData(QSessionManager&)
+++{
+++}
+++
+++/***************************************************************************
+++ * class SalTDEDisplay                                                     *
+++ ***************************************************************************/
+++
+++SalTDEDisplay::SalTDEDisplay( Display* pDisp )
+++    : SalX11Display( pDisp )
+++{
+++}
+++
+++SalTDEDisplay::~SalTDEDisplay()
+++{
+++    // in case never a frame opened
+++    static_cast<TDEXLib*>(GetXLib())->doStartup();
+++    // clean up own members
+++    doDestruct();
+++    // prevent SalDisplay from closing KApplication's display
+++    pDisp_ = NULL;
+++}
+++
+++/***************************************************************************
+++ * class TDEXLib                                                           *
+++ ***************************************************************************/
+++
+++TDEXLib::~TDEXLib()
+++{
+++    // #158056# on 64 bit linux using libXRandr.so.2 will crash in
+++    // XCloseDisplay when freeing extension data
+++    // no known work around, therefor currently leak. Hopefully
+++    // this does not make problems since we're shutting down anyway
+++    // should we ever get a real tde plugin that uses the TDE event loop
+++    // we should use tde's method to signal screen changes similar
+++    // to the gtk plugin
+++    #if ! defined USE_RANDR || ! (defined LINUX && defined X86_64)
+++    // properly deinitialize KApplication
+++    delete (VCLTDEApplication*)m_pApplication;
+++    #endif
+++    // free the faked cmdline arguments no longer needed by KApplication
+++    for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
+++        free( m_pFreeCmdLineArgs[i] );
+++    delete [] m_pFreeCmdLineArgs;
+++    delete [] m_pAppCmdLineArgs;
+++}
+++
+++void TDEXLib::Init()
+++{
+++    SalI18N_InputMethod* pInputMethod = new SalI18N_InputMethod;
+++    pInputMethod->SetLocale();
+++    XrmInitialize();
+++
+++    KAboutData *kAboutData = new KAboutData( "LibreOffice",
+++            I18N_NOOP( "LibreOffice" ),
+++            "1.1.0",
+++            I18N_NOOP( "LibreOffice with TDE Native Widget Support." ),
+++            KAboutData::License_LGPL,
+++            "(c) 2003, 2004 Novell, Inc",
+++            I18N_NOOP( "LibreOffice is an office suite.\n" ),
+++            "http://libreoffice.org",
+++            "libreoffice@lists.freedesktop.org");
+++    kAboutData->addAuthor( "Jan Holesovsky",
+++            I18N_NOOP( "Original author and maintainer of the TDE NWF." ),
+++            "kendy@artax.karlin.mff.cuni.cz",
+++            "http://artax.karlin.mff.cuni.cz/~kendy" );
+++
+++    m_nFakeCmdLineArgs = 1;
+++    USHORT nIdx;
+++    int nParams = osl_getCommandArgCount();
+++    rtl::OString aDisplay;
+++    rtl::OUString aParam, aBin;
+++
+++    for ( nIdx = 0; nIdx < nParams; ++nIdx )
+++    {
+++        osl_getCommandArg( nIdx, &aParam.pData );
+++        if ( !m_pFreeCmdLineArgs && aParam.equalsAscii( "-display" ) && nIdx + 1 < nParams )
+++        {
+++            osl_getCommandArg( nIdx + 1, &aParam.pData );
+++            aDisplay = rtl::OUStringToOString( aParam, osl_getThreadTextEncoding() );
+++
+++            m_nFakeCmdLineArgs = 3;
+++            m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
+++            m_pFreeCmdLineArgs[ 1 ] = strdup( "-display" );
+++            m_pFreeCmdLineArgs[ 2 ] = strdup( aDisplay.getStr() );
+++        }
+++    }
+++    if ( !m_pFreeCmdLineArgs )
+++        m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
+++
+++    osl_getExecutableFile( &aParam.pData );
+++    osl_getSystemPathFromFileURL( aParam.pData, &aBin.pData );
+++    rtl::OString aExec = rtl::OUStringToOString( aBin, osl_getThreadTextEncoding() );
+++    m_pFreeCmdLineArgs[0] = strdup( aExec.getStr() );
+++
+++    // make a copy of the string list for freeing it since
+++    // KApplication manipulates the pointers inside the argument vector
+++    // note: KApplication bad !
+++    m_pAppCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
+++    for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
+++        m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i];
+++
+++    KCmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs, kAboutData );
+++
+++    KApplication::disableAutoDcopRegistration();
+++    m_pApplication = new VCLTDEApplication();
+++    kapp->disableSessionManagement();
+++
+++    Display* pDisp = TQPaintDevice::x11AppDisplay();
+++
+++    SalDisplay *pSalDisplay = new SalTDEDisplay( pDisp );
+++
+++    pInputMethod->CreateMethod( pDisp );
+++    pInputMethod->AddConnectionWatch( pDisp, (void*)this );
+++    pSalDisplay->SetInputMethod( pInputMethod );
+++
+++    PushXErrorLevel( true );
+++    SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp );
+++    XSync( pDisp, False );
+++
+++    pKbdExtension->UseExtension( ! HasXErrorOccured() );
+++    PopXErrorLevel();
+++
+++    pSalDisplay->SetKbdExtension( pKbdExtension );
+++}
+++
+++void TDEXLib::doStartup()
+++{
+++    if( ! m_bStartupDone )
+++    {
+++        KStartupInfo::appStarted();
+++        m_bStartupDone = true;
+++        #if OSL_DEBUG_LEVEL > 1
+++        fprintf( stderr, "called KStartupInfo::appStarted()\n" );
+++        #endif
+++    }
+++}
+++
+++/**********************************************************************
+++ * class TDEData                                                      *
+++ **********************************************************************/
+++
+++TDEData::~TDEData()
+++{
+++}
+++
+++void TDEData::Init()
+++{
+++    pXLib_ = new TDEXLib();
+++    pXLib_->Init();
+++}
+++
+++/**********************************************************************
+++ * plugin entry point                                                 *
+++ **********************************************************************/
+++
+++extern "C" {
+++    VCL_DLLPUBLIC SalInstance* create_SalInstance( oslModule )
+++    {
+++        /* #i92121# workaround deadlocks in the X11 implementation
+++        */
+++        static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" );
+++        /* #i90094#
+++           from now on we know that an X connection will be
+++           established, so protect X against itself
+++        */
+++        if( ! ( pNoXInitThreads && *pNoXInitThreads ) )
+++            XInitThreads();
+++
+++        rtl::OString aVersion( qVersion() );
+++#if OSL_DEBUG_LEVEL > 1
+++        fprintf( stderr, "qt version string is \"%s\"\n", aVersion.getStr() );
+++#endif
+++        sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0, nMicro = 0;
+++        nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32();
+++        if( nIndex > 0 )
+++            nMinor = aVersion.getToken( 0, '.', nIndex ).toInt32();
+++        if( nIndex > 0 )
+++            nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32();
+++        if( nMajor != 3 || nMinor < 2 || (nMinor == 2 && nMicro < 2) )
+++        {
+++#if OSL_DEBUG_LEVEL > 1
+++            fprintf( stderr, "unsuitable qt version %d.%d.%d\n", (int)nMajor, (int)nMinor, (int)nMicro );
+++#endif
+++            return NULL;
+++        }
+++        
+++        TDESalInstance* pInstance = new TDESalInstance( new SalYieldMutex() );
+++#if OSL_DEBUG_LEVEL > 1
+++        fprintf( stderr, "created TDESalInstance 0x%p\n", pInstance );
+++#endif
+++
+++        // initialize SalData
+++        TDEData *pSalData = new TDEData();
+++        SetSalData( pSalData );
+++        pSalData->m_pInstance = pInstance;
+++        pSalData->Init();
+++        pSalData->initNWF();
+++
+++        return pInstance;
+++    }
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN vcl/prj/build.lst vcl/prj/build.lst
++--- vcl/prj/build.lst	2010-11-11 13:09:00.000000000 -0600
+++++ vcl/prj/build.lst	2011-08-18 20:31:51.496382806 -0500
++@@ -35,6 +35,7 @@
++ vc  vcl\unx\headless						nmake   -   u   vc__hl   vc_inc NULL
++ vc  vcl\unx\kde							nmake   -   u   vc__kde  vc_inc NULL
++ vc  vcl\unx\kde4							nmake   -   u   vc__kde4  vc_inc NULL
+++vc  vcl\unx\tde								nmake   -   u   vc__tde   vc_inc NULL
++ vc	vcl\aqua\source\a11y					nmake	-	u	vc__aquy vc_inc NULL
++ vc	vcl\aqua\source\app						nmake	-	u	vc__appa vc_inc NULL
++ vc	vcl\aqua\source\dtrans					nmake	-	u	vc__dtra vc_inc NULL
++@@ -45,6 +46,6 @@
++ vc	vcl\mac\source\gdi						nmake	-	m	vc__gdim vc_inc NULL
++ vc	vcl\mac\source\window					nmake	-	m	vc__winm vc_inc NULL
++ vc	vcl\mac\source\src						nmake	-	m	vc__srcm vc_inc NULL
++-vc	vcl\util								nmake	-	all	vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL
+++vc	vcl\util								nmake	-	all	vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__tde.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL
++ vc  vcl\util\linksvp                        nmake   -   u   vc_lsvp vc_util NULL
++ vc	vcl\workben								nmake	-	all	vc_wrkb vc_util vc_salmain NULL
++diff -urN vcl/prj/d.lst vcl/prj/d.lst
++--- vcl/prj/d.lst	2010-11-11 09:22:48.000000000 -0600
+++++ vcl/prj/d.lst	2011-08-18 20:30:59.772430360 -0500
++@@ -62,6 +62,7 @@
++ ..\inc\vcl\javachild.hxx %_DEST%\inc%_EXT%\vcl\javachild.hxx
++ ..\inc\vcl\jobset.hxx %_DEST%\inc%_EXT%\vcl\jobset.hxx
++ ..\unx\inc\kde_headers.h %_DEST%\inc%_EXT%\vcl\kde_headers.h
+++..\unx\inc\tde_headers.h %_DEST%\inc%_EXT%\vcl\tde_headers.h
++ ..\inc\vcl\keycod.hxx %_DEST%\inc%_EXT%\vcl\keycod.hxx
++ ..\inc\vcl\keycodes.hxx %_DEST%\inc%_EXT%\vcl\keycodes.hxx
++ ..\inc\vcl\lineinfo.hxx %_DEST%\inc%_EXT%\vcl\lineinfo.hxx
++diff -urN vcl/source/app/settings.cxx vcl/source/app/settings.cxx
++--- vcl/source/app/settings.cxx	2011-03-08 12:51:41.000000000 -0600
+++++ vcl/source/app/settings.cxx	2011-08-18 20:32:39.820075101 -0500
++@@ -830,6 +830,8 @@
++             nRet = STYLE_SYMBOLS_CRYSTAL;
++         else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "kde4" ) )
++             nRet = STYLE_SYMBOLS_OXYGEN;
+++        else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "tde" ) )
+++            nRet = STYLE_SYMBOLS_CRYSTAL;
++     }
++ 
++     // falback to any existing style
++diff -urN vcl/unx/source/gdi/dtint.cxx vcl/unx/source/gdi/dtint.cxx
++--- vcl/unx/source/gdi/dtint.cxx	2010-11-11 09:22:48.000000000 -0600
+++++ vcl/unx/source/gdi/dtint.cxx	2011-08-18 20:35:34.753448320 -0500
++@@ -96,7 +96,7 @@
++     /*
++      *  #i22061# override desktop detection
++      *  if environment variable OOO_FORCE_DESKTOP is set
++-     *  to one of "cde" "kde" "gnome" then autodetection
+++     *  to one of "cde" "kde" "tde" "gnome" then autodetection
++      *  is overridden.
++      */
++     static const char* pOverride = getenv( "OOO_FORCE_DESKTOP" );
++diff -urN vcl/unx/source/plugadapt/salplug.cxx vcl/unx/source/plugadapt/salplug.cxx
++--- vcl/unx/source/plugadapt/salplug.cxx	2010-11-11 13:09:00.000000000 -0600
+++++ vcl/unx/source/plugadapt/salplug.cxx	2011-08-18 20:35:23.512588295 -0500
++@@ -55,10 +55,11 @@
++     DESKTOP_GNOME,
++     DESKTOP_KDE,
++     DESKTOP_KDE4,
+++    DESKTOP_TDE,
++     DESKTOP_CDE
++ };
++ 
++-static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "CDE" };
+++static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "TDE", "CDE" };
++ 
++ static SalInstance* tryInstance( const OUString& rModuleBase )
++ {
++@@ -162,7 +166,7 @@
++ {
++     static const char* pKDEFallbackList[] =
++     {
++-        "kde4", "kde", "gtk", "gen", 0
+++        "kde4", "kde", "tde", "gtk", "gen", 0
++     };
++     
++     static const char* pStandardFallbackList[] =
++@@ -191,6 +195,11 @@
++     }
++     else if( desktop.equalsAscii( desktop_strings[DESKTOP_KDE4] ) )
++         pList = pKDEFallbackList;
+++    else if( desktop.equalsAscii( desktop_strings[DESKTOP_TDE] ) )
+++    {
+++        pList = pKDEFallbackList;
+++        nListEntry = 1;
+++    }
++     
++     SalInstance* pInst = NULL;
++     while( pList[nListEntry] && pInst == NULL )
++@@ -235,7 +244,7 @@
++         pInst = autodetect_plugin();
++     
++     // fallback, try everything
++-    const char* pPlugin[] = { "gtk", "kde", "gen", 0 };
+++    const char* pPlugin[] = { "gtk", "kde", "tde", "gen", 0 };
++ 
++     for ( int i = 0; !pInst && pPlugin[ i ]; ++i )
++         pInst = tryInstance( OUString::createFromAscii( pPlugin[ i ] ) );
++diff -urN vcl/unx/inc/plugins/tde/tdedata.hxx vcl/unx/inc/plugins/tde/tdedata.hxx
++--- vcl/unx/inc/plugins/tde/tdedata.hxx	1969-12-31 18:00:00.000000000 -0600
+++++ vcl/unx/inc/plugins/tde/tdedata.hxx	2011-08-18 20:45:32.009117227 -0500
++@@ -0,0 +1,114 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ * 
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org.  If not, see
+++ * <http://www.openoffice.org/license.html>
+++ * for a copy of the LGPLv3 License.
+++ *
+++ ************************************************************************/
+++
+++#ifndef _VCL_TDEDATA_HXX
+++#define _VCL_TDEDATA_HXX
+++
+++#include <saldisp.hxx>
+++#include <saldata.hxx>
+++#include <salframe.h>
+++
+++class TDEData : public X11SalData
+++{
+++public:
+++    TDEData() {}
+++    virtual ~TDEData();
+++    
+++    virtual void Init();
+++    virtual void initNWF();
+++    virtual void deInitNWF();
+++};
+++
+++class SalTDEDisplay : public SalX11Display
+++{
+++public:
+++    SalTDEDisplay( Display* pDisp );
+++    virtual ~SalTDEDisplay();
+++};
+++
+++class TDESalFrame : public X11SalFrame
+++{
+++    static const int nMaxGraphics = 2;
+++
+++    struct GraphicsHolder
+++    {
+++        X11SalGraphics*		pGraphics;
+++        bool				bInUse;
+++        GraphicsHolder() 
+++                : pGraphics( NULL ),
+++                  bInUse( false )
+++        {}
+++        ~GraphicsHolder();
+++    };
+++    GraphicsHolder m_aGraphics[ nMaxGraphics ];
+++
+++public:
+++    TDESalFrame( SalFrame* pParent, ULONG nStyle );
+++    virtual ~TDESalFrame();
+++
+++    virtual SalGraphics* GetGraphics();
+++    virtual void ReleaseGraphics( SalGraphics *pGraphics );
+++    virtual void updateGraphics( bool bClear );
+++    virtual void UpdateSettings( AllSettings& rSettings );
+++    virtual void Show( BOOL bVisible, BOOL bNoActivate );
+++};
+++
+++class TDESalInstance : public X11SalInstance
+++{
+++public:
+++    TDESalInstance( SalYieldMutex* pMutex ) 
+++            : X11SalInstance( pMutex ) {}
+++    virtual ~TDESalInstance() {}
+++    virtual SalFrame* CreateFrame( SalFrame* pParent, ULONG nStyle );
+++};
+++
+++class TDEXLib : public SalXLib
+++{
+++    bool            m_bStartupDone;
+++    void*           m_pApplication;
+++    char**          m_pFreeCmdLineArgs;
+++    char**          m_pAppCmdLineArgs;
+++    int             m_nFakeCmdLineArgs;
+++public:
+++    TDEXLib() : SalXLib(),
+++        m_bStartupDone( false ),
+++        m_pApplication( NULL ),
+++        m_pFreeCmdLineArgs( NULL ),
+++        m_pAppCmdLineArgs( NULL ),
+++        m_nFakeCmdLineArgs( 0 )
+++        {}
+++    virtual ~TDEXLib();
+++    virtual void Init();
+++    
+++    void doStartup();
+++};
+++
+++#endif // _VCL_TDEDATA_HXX
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN scp2/source/ooo/file_library_ooo.scp scp2/source/ooo/file_library_ooo.scp
++--- scp2/source/ooo/file_library_ooo.scp	2010-11-11 09:08:07.000000000 -0600
+++++ scp2/source/ooo/file_library_ooo.scp	2011-08-19 03:12:08.329491869 -0500
++@@ -463,6 +463,24 @@
++ 
++ #endif
++ 
+++#ifdef ENABLE_TDEAB
+++File gid_File_Lib_Tdeab_1
+++    TXT_FILE_BODY;
+++    Styles = (PACKED,UNO_COMPONENT);
+++    RegistryID = gid_Starregistry_Services_Rdb;
+++    Dir = SCP2_OOO_BIN_DIR;
+++    Name = STRING(CONCAT2(libtdeab1,UNXSUFFIX));
+++End
+++
+++File gid_File_Lib_Tdeab_Drv_1
+++    TXT_FILE_BODY;
+++    Styles = (PACKED);
+++    Dir = SCP2_OOO_BIN_DIR;
+++    Name = STRING(CONCAT2(libtdeabdrv1,UNXSUFFIX));
+++End
+++
+++#endif
+++
++ #ifdef MACOSX
++ File gid_File_Lib_Macab_1
++     TXT_FILE_BODY;
++diff -urN scp2/source/ooo/module_hidden_ooo.scp scp2/source/ooo/module_hidden_ooo.scp
++--- scp2/source/ooo/module_hidden_ooo.scp	2010-12-14 09:40:37.000000000 -0600
+++++ scp2/source/ooo/module_hidden_ooo.scp	2011-08-19 03:13:34.946155129 -0500
++@@ -285,6 +285,8 @@
++ 	gid_File_Lib_Evoab_2,
++ 	gid_File_Lib_Kab_1,
++     gid_File_Lib_Kab_Drv_1,
+++	gid_File_Lib_Tdeab_1,
+++    gid_File_Lib_Tdeab_Drv_1,
++ 	gid_File_Lib_Macab_1,
++     gid_File_Lib_Macab_Drv_1,
++ 	gid_File_Lib_Evtatt,
++diff -urN postprocess/packregistry/makefile.mk postprocess/packregistry/makefile.mk
++--- postprocess/packregistry/makefile.mk	2010-12-01 12:05:07.000000000 -0600
+++++ postprocess/packregistry/makefile.mk	2011-08-19 03:54:29.454469572 -0500
++@@ -336,6 +336,9 @@
++ .IF "$(ENABLE_KAB)" == "TRUE"
++ MY_FILES_main += $(MY_MOD)/DataAccess/kab.xcu
++ .END
+++.IF "$(ENABLE_TDEAB)" == "TRUE"
+++MY_FILES_main += $(MY_MOD)/DataAccess/tdeab.xcu
+++.END
++ .IF "$(SYSTEM_MOZILLA)" != "YES" && "$(WITH_MOZILLA)" != "NO" && \
++         "$(OS)" != "MACOSX"
++ .IF "$(OS)" == "WNT"
++diff -urN connectivity/version.mk connectivity/version.mk
++--- connectivity/version.mk	2010-11-11 09:30:07.000000000 -0600
+++++ connectivity/version.mk	2011-08-19 03:55:43.470147349 -0500
++@@ -101,6 +101,16 @@
++ # the micro 
++ KAB_MICRO=0
++ 
+++# ----------------------------Tdeab settings-------------------------------------#
+++# target
+++TDEAB_TARGET=tdeab
+++
+++# the major
+++TDEAB_MAJOR=1
+++# the minor
+++TDEAB_MINOR=0
+++# the micro
+++TDEAB_MICRO=0
++ 
++ # ----------------------------Macab settings-------------------------------------#
++ # target
++diff -urN fpicker/source/generic/fpicker.cxx fpicker/source/generic/fpicker.cxx
++--- fpicker/source/generic/fpicker.cxx	2010-11-11 09:30:08.000000000 -0600
+++++ fpicker/source/generic/fpicker.cxx	2011-08-19 19:55:13.344690587 -0500
++@@ -64,6 +64,8 @@
++         return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDEFilePicker"));
++     else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("kde4"))
++         return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDE4FilePicker"));
+++    else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("tde"))
+++        return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.TDEFilePicker"));
++     else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("macosx"))
++         return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.AquaFilePicker"));
++ #endif
++@@ -139,6 +141,8 @@
++         return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.GtkFolderPicker"));
++     else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("kde"))
++         return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDEFolderPicker"));
+++    else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("tde"))
+++        return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.TDEFolderPicker"));
++     else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("macosx"))
++         return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.AquaFolderPicker"));
++ #endif
++diff -urN vcl/unx/source/desktopdetect/desktopdetector.cxx vcl/unx/source/desktopdetect/desktopdetector.cxx
++--- vcl/unx/source/desktopdetect/desktopdetector.cxx	2010-11-11 09:22:48.000000000 -0600
+++++ vcl/unx/source/desktopdetect/desktopdetector.cxx	2011-08-19 21:10:45.481110576 -0500
++@@ -49,12 +49,13 @@
++     DESKTOP_NONE = 0,
++     DESKTOP_UNKNOWN,
++     DESKTOP_GNOME,
+++    DESKTOP_TDE,
++     DESKTOP_KDE,
++     DESKTOP_KDE4,
++     DESKTOP_CDE
++ };
++ 
++-static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "CDE" };
+++static const char * desktop_strings[] = { "none", "unknown", "GNOME", "TDE", "KDE", "KDE4", "CDE" };
++ 
++ static bool is_gnome_desktop( Display* pDisplay )
++ {
++@@ -218,6 +219,15 @@
++     return false;
++ }
++ 
+++static bool is_tde_desktop( Display* pDisplay )
+++{
+++    if ( NULL != getenv( "TDE_FULL_SESSION" ) )
+++    {
+++        return true;
+++    }
+++    return false;
+++}
+++
++ static bool is_kde4_desktop( Display* pDisplay )
++ {
++     if ( NULL != getenv( "KDE_FULL_SESSION" ) )
++@@ -265,6 +275,8 @@
++         
++         if ( aOver.equalsIgnoreAsciiCase( "cde" ) )
++             aRet.appendAscii( desktop_strings[DESKTOP_CDE] );
+++        if ( aOver.equalsIgnoreAsciiCase( "tde" ) )
+++            aRet.appendAscii( desktop_strings[DESKTOP_TDE] );
++         if ( aOver.equalsIgnoreAsciiCase( "kde4" ) )
++             aRet.appendAscii( desktop_strings[DESKTOP_KDE4] );
++         if ( aOver.equalsIgnoreAsciiCase( "gnome" ) )
++@@ -319,7 +331,9 @@
++             {
++                 XErrorHandler pOldHdl = XSetErrorHandler( autodect_error_handler );
++             
++-                if ( is_kde4_desktop( pDisplay ) )
+++                if ( is_tde_desktop( pDisplay ) )
+++                    aRet.appendAscii( desktop_strings[DESKTOP_TDE] );
+++                else if ( is_kde4_desktop( pDisplay ) )
++                     aRet.appendAscii( desktop_strings[DESKTOP_KDE4] );
++                 else if ( is_gnome_desktop( pDisplay ) )
++                     aRet.appendAscii( desktop_strings[DESKTOP_GNOME] );
+diff -urN libreoffice-build/patches/unittesting/unittesting-vcl.diff libreoffice-build/patches/unittesting/unittesting-vcl.diff
+--- libreoffice-build/patches/unittesting/unittesting-vcl.diff	2010-11-11 08:41:39.000000000 -0600
++++ libreoffice-build/patches/unittesting/unittesting-vcl.diff	2011-09-19 11:35:33.731926351 -0500
+@@ -10,7 +10,7 @@
+ +++ vcl/prj/build.lst
+ @@ -47,4 +47,3 @@ vc	vcl\mac\source\window					nmake	-	m	vc__winm vc_inc NULL
+  vc	vcl\mac\source\src						nmake	-	m	vc__srcm vc_inc NULL
+- vc	vcl\util								nmake	-	all	vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL
++ vc	vcl\util								nmake	-	all	vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__tde.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL
+  vc  vcl\util\linksvp                        nmake   -   u   vc_lsvp vc_util NULL
+ -vc	vcl\workben								nmake	-	all	vc_wrkb vc_util vc_salmain NULL
+ diff --git vcl/prj/tests.lst vcl/prj/tests.lst
-- 
cgit v1.2.3

