summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-08-20 00:49:05 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-08-20 00:49:05 -0500
commit9627687cd24ee26ac6f614207a312cfbb73c8f6d (patch)
treec5eea8f5e90c756e8fed55ef8f2f5ad4714fceec
parentab52bb043ee0f47030203501943d3e7a1f985db6 (diff)
downloadtde-9627687cd24ee26ac6f614207a312cfbb73c8f6d.tar.gz
tde-9627687cd24ee26ac6f614207a312cfbb73c8f6d.zip
Added initial version of Trinity integration for LibreOffice
Native widgets are known to work properly File picker may or may not function at this point
-rw-r--r--main/thirdparty/libreoffice/3.3.2/patches/libreoffice-trinity-debian.diff239
-rw-r--r--main/thirdparty/libreoffice/3.3.2/patches/libreoffice-trinity.diff15829
2 files changed, 16068 insertions, 0 deletions
diff --git a/main/thirdparty/libreoffice/3.3.2/patches/libreoffice-trinity-debian.diff b/main/thirdparty/libreoffice/3.3.2/patches/libreoffice-trinity-debian.diff
new file mode 100644
index 000000000..562157f61
--- /dev/null
+++ b/main/thirdparty/libreoffice/3.3.2/patches/libreoffice-trinity-debian.diff
@@ -0,0 +1,239 @@
+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-08-17 15:06:12.644738668 -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-08-19 16:39:45.660276026 -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-04-19 17:25:22.000000000 -0500
++++ debian/rules 2011-08-19 12:24:54.642994139 -0500
+@@ -175,7 +175,8 @@
+ BUILD_CAIROCANVAS=y
+ SYSTEM_STUFF += cairo
+ CAIRO_FONTS_PATCH=y
+-BUILD_KDE=y
++BUILD_KDE=n
++BUILD_TDE=y
+ KDE_VER=4
+ ifeq "$(BUILD_KDE)" "y"
+ ifeq "$(KDE_VER)" "3"
+@@ -191,6 +192,12 @@
+ QT_MINVER= (>= 4.5)
+ KDELIBS_MINVER= (>= 4:4.3.4)
+ endif
++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
+@@ -383,6 +390,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
+@@ -996,6 +1004,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)))
+@@ -1523,6 +1550,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
+@@ -1539,6 +1571,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
+@@ -1610,6 +1646,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
+@@ -1694,6 +1734,12 @@
+ ln -sf /usr/bin/moc-qt$(KDE_VER) $(CURDIR)/debian/usr/bin/moc
+ 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
+@@ -1770,6 +1816,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 \
+@@ -1778,6 +1825,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) ; \
+@@ -2276,6 +2324,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 \
+@@ -2362,6 +2416,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
+@@ -3455,6 +3552,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)' \ \ No newline at end of file
diff --git a/main/thirdparty/libreoffice/3.3.2/patches/libreoffice-trinity.diff b/main/thirdparty/libreoffice/3.3.2/patches/libreoffice-trinity.diff
new file mode 100644
index 000000000..7431c4c29
--- /dev/null
+++ b/main/thirdparty/libreoffice/3.3.2/patches/libreoffice-trinity.diff
@@ -0,0 +1,15829 @@
+diff -urN libreoffice-build/configure.in libreoffice-build/configure.in
+--- libreoffice-build/configure.in 2011-03-15 11:51:33.000000000 -0500
++++ libreoffice-build/configure.in 2011-08-17 15:49:14.302963959 -0500
+@@ -81,6 +81,11 @@
+ --disable-kde4 Disables KDE4 native widgets.],
+ ,)
+
++AC_ARG_ENABLE(tde,
++[
++ --disable-tde Disables TDE native widgets.],
++,)
++
+ AC_ARG_ENABLE(mono,
+ [
+ --enable-mono Enables the compilation of the Mono bindings.],
+@@ -928,6 +933,16 @@
+ OOO_WIDGET_FLAGS="$OOO_WIDGET_FLAGS --disable-kde4"
+ fi
+
++OOO_WIDGET_FLAGS=
++if test "$enable_tde" != "no"; then
++ if test "z$with_win32" = "z" -a "z`uname -s`" != "zDarwin" -a "z$with_distro" != "zCrossWin32"; then
++ OOO_WIDGET_FLAGS="--enable-tde"
++ widget_sets="tde"
++ fi
++else
++ OOO_WIDGET_FLAGS="--disable-tde"
++fi
++
+ if test "$enable_gtk" != "no"; then
+ if test "z$with_win32" = "z" -a "z`uname -s`" != "zDarwin" -a "z$with_distro" != "zCrossWin32"; then
+ OOO_WIDGET_FLAGS="--enable-gtk $OOO_WIDGET_FLAGS"
+diff -urN libreoffice-build/patches/dev300/apply libreoffice-build/patches/dev300/apply
+--- libreoffice-build/patches/dev300/apply 2011-08-19 15:12:59.000000000 -0500
++++ libreoffice-build/patches/dev300/apply 2011-08-18 22:23:26.037967292 -0500
+@@ -22,7 +22,7 @@
+
+ LinuxCommon : Common, Defaults, FontConfigTemporaryHacks, \
+ FedoraLinuxOnlyFixes, LinuxOnly, msaccess, OpenGLTransitions, \
+- CliMonoCommon, Mono, MonoComp, AddressBooks, QuickStarter, KDE4, Netbook, \
++ CliMonoCommon, Mono, MonoComp, AddressBooks, QuickStarter, KDE4, TDE, Netbook, \
+ GlobalNSPluginSupport
+ MacOSXCommon : Common, Defaults
+ Win32Common : Common, Defaults, Win32Only, CliMonoCommon, CliComponent, NotDebian
+@@ -184,8 +184,6 @@
+ # pass $ORIGIN correctly to RPATH
+ icu-4.2.1-rpath.diff. pmladek
+
+-[ TemporaryHacks ]
+-
+ # add idl target to toplevel makefile
+ makefile-idl-build.diff, noelpwer
+
+@@ -1493,6 +1491,10 @@
+ # we need a good plan before, though ;-)
+ split-icons-search-usr-share.diff, n#296502, pmladek
+
++[ TDE ]
++# add trinity integration
++trinity-modules.diff
++
+ [ ArkOnly ]
+ SectionOwner => brosenk
+
+diff -urN libreoffice-build/patches/dev300/trinity-modules.diff libreoffice-build/patches/dev300/trinity-modules.diff
+--- libreoffice-build/patches/dev300/trinity-modules.diff 1969-12-31 18:00:00.000000000 -0600
++++ libreoffice-build/patches/dev300/trinity-modules.diff 2011-08-19 21:12:01.176913404 -0500
+@@ -0,0 +1,15748 @@
++diff -urN configure.in configure.in
++--- configure.in 2011-03-08 12:51:39.000000000 -0600
+++++ configure.in 2011-08-17 16:40:04.716144357 -0500
++@@ -233,6 +233,15 @@
++ [ --disable-kdeab Disable the KDE3 address book support
++ ],,if test "$enable_kde" = "yes"; then enable_kdeab=yes; fi)
++
+++AC_ARG_ENABLE(tde,
+++[ --enable-tde Determines whether to use TQt3/TDE vclplug on platforms
+++ where TQt and TDE are available.
+++],,)
+++
+++AC_ARG_ENABLE(tdeab,
+++[ --disable-tdeab Disable the TDE address book support
+++],,if test "$enable_tde" = "yes"; then enable_tdeab=yes; fi)
+++
++ AC_ARG_ENABLE(kde4,
++ [ --enable-kde4 Determines whether to use Qt4/KDE4 vclplug on platforms
++ where Qt4 and KDE4 are available. May be used with --enable-kde
++@@ -1350,6 +1359,7 @@
++ test_cairo=yes
++ build_gstreamer=yes
++ test_kde=yes
+++ test_tde=yes
++ test_cups=yes
++ test_randr=yes
++ test_freetype=yes
++@@ -1385,6 +1395,7 @@
++ build_gstreamer=yes
++ test_kde=yes
++ test_kde4=yes
+++ test_tde=yes
++ test_cups=yes
++ test_randr=yes
++ test_freetype=yes
++@@ -1428,6 +1439,7 @@
++ build_gstreamer=yes
++ test_kde=yes
++ test_kde4=yes
+++ test_tde=yes
++ test_cups=yes
++ test_randr=yes
++ test_freetype=yes
++@@ -1463,6 +1475,7 @@
++ build_gstreamer=yes
++ test_kde=yes
++ test_kde4=yes
+++ test_tde=yes
++ test_cups=yes
++ test_randr=yes
++ test_freetype=yes
++@@ -1482,6 +1495,7 @@
++ test_gtk=yes
++ build_cairo=yes
++ test_kde=yes
+++ test_tde=yes
++ test_cups=yes
++ test_freetype=yes
++ test_randr=yes
++@@ -6141,6 +6155,13 @@
++ fi
++ AC_SUBST(ENABLE_KDE4)
++
+++ENABLE_TDE=""
+++if test "x$enable_tde" = "xyes"; then
+++ ENABLE_TDE="TRUE"
+++ R="$R tde"
+++fi
+++AC_SUBST(ENABLE_TDE)
+++
++ if test -z "$R"; then
++ AC_MSG_RESULT([none])
++ else
++@@ -7044,6 +7065,129 @@
++ AC_SUBST(KDE_HAVE_GLIB)
++
++ dnl ===================================================================
+++dnl Check whether the Qt3 and TDE libraries are available.
+++dnl ===================================================================
+++
+++TDE_CFLAGS=""
+++TDE_LIBS=""
+++if test "$_os" != "OpenBSD"; then
+++ MOC="moc"
+++fi
+++if test "$test_tde" = "yes" -a "$ENABLE_TDE" = "TRUE" ; then
+++ dnl Search paths for Qt3 and TDE
+++ if test "$build_cpu" != "x86_64" ; then
+++ qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib/qt3/include /usr/lib/qt/include /usr/share/qt3/include /usr/local/include/X11/qt3 $x_includes"
+++ qt_libdirs="$QTLIB /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries"
+++ else
+++ qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib64/qt3/include /usr/lib64/qt/include /usr/share/qt3/include /usr/lib/qt3/include /usr/lib/qt/include /usr/local/include/X11/qt3 $x_includes"
+++ qt_libdirs="$QTLIB /usr/local/qt/lib64 /usr/lib64/qt /usr/lib64 /usr/X11R6/lib64/X11/qt /usr/X11R6/lib64/qt /usr/lib64/qt3/lib64 /usr/lib64/qt/lib64 /usr/share/qt3/lib64 /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries"
+++ fi
+++ if test -n "$QTDIR" ; then
+++ qt_incdirs="$QTDIR/include $qt_incdirs"
+++ if test "$build_cpu" != "x86_64" ; then
+++ qt_libdirs="$QTDIR/lib $qt_libdirs"
+++ else
+++ qt_libdirs="$QTDIR/lib64 $QTDIR/lib $qt_libdirs"
+++ fi
+++ fi
+++ if test "$build_cpu" != "x86_64" ; then
+++ tde_incdirs="/opt/trinity/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes"
+++ tde_libdirs="/opt/trinity/lib /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib/kde4/lib /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries"
+++ else
+++ tde_incdirs="/opt/trinity/include /usr/lib64/kde/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes"
+++ tde_libdirs="/opt/trinity/lib /usr/lib64/kde/lib64 /usr/local/kde/lib64 /usr/kde/lib64 /usr/lib64/kde /usr/lib64/kde3 /usr/lib64 /usr/X11R6/lib64 /usr/local/lib64 /opt/trinity/lib64 /opt/kde/lib64 /usr/X11R6/kde/lib64 /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries"
+++ fi
+++ if test -n "$TDEDIR" ; then
+++ tde_incdirs="$TDEDIR/include $tde_incdirs"
+++ if test "$build_cpu" != "x86_64" ; then
+++ tde_libdirs="$TDEDIR/lib $tde_libdirs"
+++ else
+++ tde_libdirs="$TDEDIR/lib64 $TDEDIR/lib $tde_libdirs"
+++ fi
+++ fi
+++
+++ dnl What to test
+++ qt_test_include="qstyle.h"
+++ qt_test_library="libqt-mt.so*"
+++ tde_test_include="kapp.h"
+++ tde_test_library="libDCOP.so*"
+++
+++ dnl Check for Qt3 headers
+++ AC_MSG_CHECKING([for Qt3 headers])
+++ qt_incdir="no"
+++ for tde_check in $qt_incdirs ; do
+++ if test -r "$tde_check/$qt_test_include" ; then
+++ qt_incdir="$tde_check"
+++ break
+++ fi
+++ done
+++ AC_MSG_RESULT([$qt_incdir])
+++ if test "x$qt_incdir" = "xno" ; then
+++ AC_MSG_ERROR([Qt3 headers not found. Please specify the root of
+++your Qt3 installation by exporting QTDIR before running "configure".])
+++ fi
+++
+++ dnl Check for Qt3 libraries
+++ AC_MSG_CHECKING([for Qt3 libraries])
+++ qt_libdir="no"
+++ for qt_check in $qt_libdirs ; do
+++ if test -r "`ls $qt_check/$qt_test_library 2>/dev/null | head -1`" ; then
+++ qt_libdir="$qt_check"
+++ break
+++ fi
+++ done
+++ AC_MSG_RESULT([$qt_libdir])
+++ if test "x$qt_libdir" = "xno" ; then
+++ AC_MSG_ERROR([Qt3 libraries not found. Please specify the root of
+++your Qt3 installation by exporting QTDIR before running "configure".])
+++ fi
+++
+++ dnl Check for Meta Object Compiler
+++ AC_PATH_PROG( MOC, moc, no, [`dirname $qt_libdir`/bin:$QTDIR/bin:$PATH] )
+++ if test "$MOC" = "no" ; then
+++ AC_MSG_ERROR([Qt3 Meta Object Compiler not found. Please specify
+++the root of your Qt3 installation by exporting QTDIR before running "configure".])
+++ fi
+++
+++ dnl Check for TDE headers
+++ AC_MSG_CHECKING([for TDE headers])
+++ tde_incdir="no"
+++ for tde_check in $tde_incdirs ; do
+++ if test -r "$tde_check/$tde_test_include" ; then
+++ tde_incdir="$tde_check"
+++ break
+++ fi
+++ done
+++ AC_MSG_RESULT([$tde_incdir])
+++ if test "x$tde_incdir" = "xno" ; then
+++ AC_MSG_ERROR([TDE headers not found. Please specify the root of
+++your TDE installation by exporting TDEDIR before running "configure".])
+++ fi
+++
+++ dnl Check for TDE libraries
+++ AC_MSG_CHECKING([for TDE libraries])
+++ tde_libdir="no"
+++ for tde_check in $tde_libdirs ; do
+++ if test -r "`ls $tde_check/$tde_test_library 2>/dev/null | head -1`" ; then
+++ tde_libdir="$tde_check"
+++ break
+++ fi
+++ done
+++ AC_MSG_RESULT([$tde_libdir])
+++ if test "x$tde_libdir" = "xno" ; then
+++ AC_MSG_ERROR([TDE libraries not found. Please specify the root of
+++your TDE installation by exporting TDEDIR before running "configure".])
+++ fi
+++
+++ dnl Set the variables
+++ TDE_CFLAGS="-I$qt_incdir -I$tde_incdir -I/usr/include/tqt -DQT_CLEAN_NAMESPACE -DQT_THREAD_SUPPORT"
+++ TDE_LIBS="-L$tde_libdir -L$qt_libdir -lkdeui -lkdecore -ltqt -lqt-mt"
+++fi
+++AC_SUBST(TDE_CFLAGS)
+++AC_SUBST(TDE_LIBS)
+++AC_SUBST(MOC)
+++
+++dnl ===================================================================
++ dnl Test for the enabling the lockdown pieces
++ dnl ===================================================================
++ AC_MSG_CHECKING([whether to enable the lockdown pieces])
++@@ -7100,6 +7244,33 @@
++ AC_SUBST(ENABLE_KAB)
++
++ dnl ===================================================================
+++dnl Test whether to include TDE AB support
+++dnl ===================================================================
+++AC_MSG_CHECKING([whether to enable TDE address book support])
+++if test "$enable_tdeab" = "yes" && test "$enable_tde" = "yes"; then
+++ AC_MSG_RESULT([yes])
+++ AC_LANG_PUSH([C++])
+++ save_CXXFLAGS=$CXXFLAGS
+++ CXXFLAGS="$CXXFLAGS $TDE_CFLAGS"
+++ AC_MSG_CHECKING([whether TDE is between 3.2 and 3.6])
+++ AC_TRY_RUN([
+++#include <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
+++{
+++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+++
+++ return aQtName.isNull();
+++// TDE address book currently does not use NULL values.
+++// But it might do it someday
+++}
+++// -----------------------------------------------------------------------------
+++KabConditionNotNull::KabConditionNotNull(const ::rtl::OUString &sColumnName) throw(SQLException)
+++ : KabConditionColumn(sColumnName)
+++{
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionNotNull::eval(const ::KABC::Addressee &aAddressee) const
+++{
+++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+++
+++ return !aQtName.isNull();
+++// TDE address book currently does not use NULL values.
+++// But it might do it someday
+++}
+++// -----------------------------------------------------------------------------
+++KabConditionCompare::KabConditionCompare(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException)
+++ : KabConditionColumn(sColumnName),
+++ m_sMatchString(sMatchString)
+++{
+++}
+++// -----------------------------------------------------------------------------
+++KabConditionEqual::KabConditionEqual(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException)
+++ : KabConditionCompare(sColumnName, sMatchString)
+++{
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionEqual::eval(const ::KABC::Addressee &aAddressee) const
+++{
+++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+++// Timestamps should not be compared according to their string value
+++// The syntax for such queries should be like
+++// {ts '2004-03-29 12:55:00.000000'}
+++// They should also support operators like '<' or '>='
+++
+++ if (aQtName.isNull()) return sal_False;
+++
+++ ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2());
+++ return sValue == m_sMatchString;
+++}
+++// -----------------------------------------------------------------------------
+++KabConditionDifferent::KabConditionDifferent(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException)
+++ : KabConditionCompare(sColumnName, sMatchString)
+++{
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionDifferent::eval(const ::KABC::Addressee &aAddressee) const
+++{
+++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+++
+++ if (aQtName.isNull()) return sal_False;
+++
+++ ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2());
+++ return sValue != m_sMatchString;
+++}
+++// -----------------------------------------------------------------------------
+++KabConditionSimilar::KabConditionSimilar(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException)
+++ : KabConditionCompare(sColumnName, sMatchString)
+++{
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionSimilar::eval(const ::KABC::Addressee &aAddressee) const
+++{
+++ QString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+++
+++ if (aQtName.isNull()) return sal_False;
+++
+++ ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2());
+++ return match(m_sMatchString, sValue, '\0');
+++}
+++// -----------------------------------------------------------------------------
+++KabConditionBoolean::KabConditionBoolean(KabCondition *pLeft, KabCondition *pRight)
+++ : KabCondition(),
+++ m_pLeft(pLeft),
+++ m_pRight(pRight)
+++{
+++}
+++// -----------------------------------------------------------------------------
+++KabConditionBoolean::~KabConditionBoolean()
+++{
+++ delete m_pLeft;
+++ delete m_pRight;
+++}
+++// -----------------------------------------------------------------------------
+++KabConditionOr::KabConditionOr(KabCondition *pLeft, KabCondition *pRight)
+++ : KabConditionBoolean(pLeft, pRight)
+++{
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionOr::isAlwaysTrue() const
+++{
+++ return m_pLeft->isAlwaysTrue() || m_pRight->isAlwaysTrue();
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionOr::isAlwaysFalse() const
+++{
+++ return m_pLeft->isAlwaysFalse() && m_pRight->isAlwaysFalse();
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionOr::eval(const ::KABC::Addressee &aAddressee) const
+++{
+++ // We avoid evaluating terms as much as we can
+++ if (m_pLeft->isAlwaysTrue() || m_pRight->isAlwaysTrue()) return sal_True;
+++ if (m_pLeft->isAlwaysFalse() && m_pRight->isAlwaysFalse()) return sal_False;
+++
+++ if (m_pLeft->eval(aAddressee)) return sal_True;
+++ if (m_pRight->eval(aAddressee)) return sal_True;
+++
+++ return sal_False;
+++}
+++// -----------------------------------------------------------------------------
+++KabConditionAnd::KabConditionAnd(KabCondition *pLeft, KabCondition *pRight)
+++ : KabConditionBoolean(pLeft, pRight)
+++{
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionAnd::isAlwaysTrue() const
+++{
+++ return m_pLeft->isAlwaysTrue() && m_pRight->isAlwaysTrue();
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionAnd::isAlwaysFalse() const
+++{
+++ return m_pLeft->isAlwaysFalse() || m_pRight->isAlwaysFalse();
+++}
+++// -----------------------------------------------------------------------------
+++sal_Bool KabConditionAnd::eval(const ::KABC::Addressee &aAddressee) const
+++{
+++ // We avoid evaluating terms as much as we can
+++ if (m_pLeft->isAlwaysFalse() || m_pRight->isAlwaysFalse()) return sal_False;
+++ if (m_pLeft->isAlwaysTrue() && m_pRight->isAlwaysTrue()) return sal_True;
+++
+++ if (!m_pLeft->eval(aAddressee)) return sal_False;
+++ if (!m_pRight->eval(aAddressee)) return sal_False;
+++
+++ return sal_True;
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN connectivity/source/drivers/tdeab/kcondition.hxx connectivity/source/drivers/tdeab/kcondition.hxx
++--- connectivity/source/drivers/tdeab/kcondition.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/kcondition.hxx 2011-08-17 14:28:59.403093526 -0500
++@@ -0,0 +1,164 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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;
+++
+++ QString value(const ::KABC::Addressee &aAddressee) const;
+++
+++ public:
+++ KabConditionColumn(
+++ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException);
+++ virtual sal_Bool isAlwaysTrue() const;
+++ virtual sal_Bool isAlwaysFalse() const;
+++};
+++// -----------------------------------------------------------------------------
+++class KabConditionNull : public KabConditionColumn
+++{
+++ public:
+++ KabConditionNull(
+++ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException);
+++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+++};
+++// -----------------------------------------------------------------------------
+++class KabConditionNotNull : public KabConditionColumn
+++{
+++ public:
+++ KabConditionNotNull(
+++ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException);
+++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+++};
+++// -----------------------------------------------------------------------------
+++class KabConditionCompare : public KabConditionColumn
+++{
+++ protected:
+++ const ::rtl::OUString m_sMatchString;
+++
+++ public:
+++ KabConditionCompare(
+++ const ::rtl::OUString &sColumnName,
+++ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException);
+++};
+++// -----------------------------------------------------------------------------
+++class KabConditionEqual : public KabConditionCompare
+++{
+++ public:
+++ KabConditionEqual(
+++ const ::rtl::OUString &sColumnName,
+++ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException);
+++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+++};
+++// -----------------------------------------------------------------------------
+++class KabConditionDifferent : public KabConditionCompare
+++{
+++ public:
+++ KabConditionDifferent(
+++ const ::rtl::OUString &sColumnName,
+++ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException);
+++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+++};
+++// -----------------------------------------------------------------------------
+++class KabConditionSimilar : public KabConditionCompare
+++{
+++ public:
+++ KabConditionSimilar(
+++ const ::rtl::OUString &sColumnName,
+++ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException);
+++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+++};
+++// -----------------------------------------------------------------------------
+++class KabConditionBoolean : public KabCondition
+++{
+++ protected:
+++ KabCondition *m_pLeft, *m_pRight;
+++
+++ public:
+++ KabConditionBoolean(KabCondition *pLeft, KabCondition *pRight);
+++ virtual ~KabConditionBoolean();
+++};
+++// -----------------------------------------------------------------------------
+++class KabConditionOr : public KabConditionBoolean
+++{
+++ public:
+++ KabConditionOr(KabCondition *pLeft, KabCondition *pRight);
+++ virtual sal_Bool isAlwaysTrue() const;
+++ virtual sal_Bool isAlwaysFalse() const;
+++ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+++};
+++// -----------------------------------------------------------------------------
+++class KabConditionAnd : public KabConditionBoolean
+++{
+++ public:
+++ KabConditionAnd(KabCondition *pLeft, KabCondition *pRight);
+++ virtual sal_Bool isAlwaysTrue() const;
+++ virtual sal_Bool isAlwaysFalse() const;
+++ virtual sal_Bool eval(const ::KABC::Addressee &addressee) const;
+++};
+++// -----------------------------------------------------------------------------
+++ }
+++}
+++
+++#endif // _CONNECTIVITY_KAB_CONDITION_HXX_
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN connectivity/source/drivers/tdeab/KConnection.cxx connectivity/source/drivers/tdeab/KConnection.cxx
++--- connectivity/source/drivers/tdeab/KConnection.cxx 1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KConnection.cxx 2011-08-17 14:28:53.822664134 -0500
++@@ -0,0 +1,332 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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;
+++ QString aQtName;
+++ ::rtl::OUString sName;
+++
+++ aQtName = ::KABC::Addressee::revisionLabel();
+++ sName = (const sal_Unicode *) aQtName.ucs2();
+++ if (match(columnNamePattern, sName, '\0'))
+++ {
+++ aRow[4] = new ORowSetValueDecorator(sName);
+++ aRow[5] = new ORowSetValueDecorator(DataType::TIMESTAMP);
+++ aRow[6] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIMESTAMP"));
+++ aRow[17] = new ORowSetValueDecorator(nPosition++);
+++ aRows.push_back(aRow);
+++ }
+++
+++ ::KABC::Field::List aFields = ::KABC::Field::allFields();
+++ ::KABC::Field::List::iterator aField;
+++
+++ for ( aField = aFields.begin();
+++ aField != aFields.end();
+++ ++aField, ++nPosition)
+++ {
+++ aQtName = (*aField)->label();
+++ sName = (const sal_Unicode *) aQtName.ucs2();
+++ if (match(columnNamePattern, sName, '\0'))
+++ {
+++ aRow[4] = new ORowSetValueDecorator(sName);
+++ aRow[5] = new ORowSetValueDecorator(DataType::CHAR);
+++ aRow[6] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("CHAR"));
+++ aRow[7] = new ORowSetValueDecorator((sal_Int32) 256);
+++// Might be VARCHAR and not CHAR[256]...
+++ aRow[17] = new ORowSetValueDecorator(nPosition);
+++ aRows.push_back(aRow);
+++ }
+++ }
+++ }
+++ pResult->setRows(aRows);
+++ return xRef;
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTables(
+++ const Any&,
+++ const ::rtl::OUString&,
+++ const ::rtl::OUString&,
+++ const Sequence< ::rtl::OUString >& types) throw(SQLException, RuntimeException)
+++{
+++ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTables);
+++ Reference< XResultSet > xRef = pResult;
+++
+++ // check whether we have tables in the requested types
+++ // for the moment, we answer only the "TABLE" table type
+++ // when no types are given at all, we return all the tables
+++ static const ::rtl::OUString aTable(::rtl::OUString::createFromAscii("TABLE"));
+++ sal_Bool bTableFound = sal_False;
+++ const ::rtl::OUString* p = types.getConstArray(),
+++ * pEnd = p + types.getLength();
+++
+++ if (p == pEnd)
+++ {
+++ bTableFound = sal_True;
+++ }
+++ else while (p < pEnd)
+++ {
+++ if (match(*p, aTable, '\0'))
+++ {
+++ bTableFound = sal_True;
+++ break;
+++ }
+++ p++;
+++ }
+++ if (!bTableFound)
+++ return xRef;
+++
+++ static ODatabaseMetaDataResultSet::ORows aRows;
+++
+++ if (aRows.empty())
+++ {
+++ ODatabaseMetaDataResultSet::ORow aRow(6);
+++
+++ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
+++ aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue();
+++ aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue();
+++ aRow[3] = new ORowSetValueDecorator(getAddressBookTableName());
+++ aRow[4] = new ORowSetValueDecorator(aTable);
+++ aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue();
+++ aRows.push_back(aRow);
+++ }
+++ pResult->setRows(aRows);
+++ return xRef;
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getProcedureColumns(
+++ const Any&, const ::rtl::OUString&,
+++ const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+++{
+++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedureColumns );
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getProcedures(
+++ const Any&, const ::rtl::OUString&,
+++ const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+++{
+++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedures );
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getVersionColumns(
+++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
+++{
+++ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eVersionColumns);
+++
+++ Reference< XResultSet > xRef = pResult;
+++
+++ ODatabaseMetaDataResultSet::ORows aRows;
+++
+++ if (table == getAddressBookTableName())
+++ {
+++ ODatabaseMetaDataResultSet::ORow aRow( 9 );
+++ QString aQtName = ::KABC::Addressee::revisionLabel();
+++ ::rtl::OUString sName = (const sal_Unicode *) aQtName.ucs2();
+++
+++ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
+++ aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue();
+++
+++ aRow[2] = new ORowSetValueDecorator(sName);
+++ aRow[3] = new ORowSetValueDecorator(DataType::TIMESTAMP);
+++ aRow[4] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIMESTAMP"));
+++
+++ aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue();
+++ aRow[6] = ODatabaseMetaDataResultSet::getEmptyValue();
+++ aRow[7] = ODatabaseMetaDataResultSet::getEmptyValue();
+++ aRow[8] = ODatabaseMetaDataResultSet::getEmptyValue();
+++
+++ aRows.push_back(aRow);
+++ }
+++ pResult->setRows(aRows);
+++ return xRef;
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getExportedKeys(
+++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+++{
+++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eExportedKeys );
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getImportedKeys(
+++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+++{
+++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eImportedKeys );
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getPrimaryKeys(
+++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+++{
+++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::ePrimaryKeys );
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getIndexInfo(
+++ const Any&, const ::rtl::OUString&, const ::rtl::OUString&,
+++ sal_Bool, sal_Bool ) throw(SQLException, RuntimeException)
+++{
+++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eIndexInfo );
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getBestRowIdentifier(
+++ const Any&, const ::rtl::OUString&, const ::rtl::OUString&, sal_Int32,
+++ sal_Bool ) throw(SQLException, RuntimeException)
+++{
+++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eBestRowIdentifier );
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTablePrivileges(
+++ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+++{
+++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eTablePrivileges );
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getCrossReference(
+++ const Any&, const ::rtl::OUString&,
+++ const ::rtl::OUString&, const Any&,
+++ const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+++{
+++ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eCrossReference );
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getUDTs( const Any&, const ::rtl::OUString&, const ::rtl::OUString&, const Sequence< sal_Int32 >& ) throw(SQLException, RuntimeException)
+++{
+++ OSL_ENSURE(0,"Not implemented yet!");
+++ throw SQLException();
+++}
+++// -----------------------------------------------------------------------------
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx
++--- connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx 2011-08-17 14:28:31.880975797 -0500
++@@ -0,0 +1,217 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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
+++QString valueOfKabField(const ::KABC::Addressee &aAddressee, sal_Int32 nFieldNumber)
+++{
+++ switch (nFieldNumber)
+++ {
+++ case KAB_FIELD_REVISION:
+++ return aAddressee.revision().toString("yyyy-MM-dd hh:mm:ss");
+++ default:
+++ ::KABC::Field::List aFields = ::KABC::Field::allFields();
+++ return aFields[nFieldNumber - KAB_DATA_FIELDS]->value(aAddressee);
+++ }
+++}
+++// ------------------------------------------------------------------------------
+++// search the TDE address book field number of a given column name
+++sal_uInt32 findKabField(const ::rtl::OUString& columnName) throw(SQLException)
+++{
+++ QString aQtName;
+++ ::rtl::OUString aName;
+++
+++ aQtName = KABC::Addressee::revisionLabel();
+++ aName = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+++ if (columnName == aName)
+++ return KAB_FIELD_REVISION;
+++
+++ ::KABC::Field::List aFields = ::KABC::Field::allFields();
+++ ::KABC::Field::List::iterator aField;
+++ sal_uInt32 nResult;
+++
+++ for ( aField = aFields.begin(), nResult = KAB_DATA_FIELDS;
+++ aField != aFields.end();
+++ ++aField, ++nResult)
+++ {
+++ aQtName = (*aField)->label();
+++ aName = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+++
+++ if (columnName == aName)
+++ return nResult;
+++ }
+++
+++ ::connectivity::SharedResources aResources;
+++ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
+++ STR_INVALID_COLUMNNAME,
+++ "$columnname$",columnName
+++ ) );
+++ ::dbtools::throwGenericSQLException(sError,NULL);
+++ // Unreachable:
+++ OSL_ASSERT(false);
+++ return 0;
+++}
+++// ------------------------------------------------------------------------------
+++ }
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN connectivity/source/drivers/tdeab/kfields.hxx connectivity/source/drivers/tdeab/kfields.hxx
++--- connectivity/source/drivers/tdeab/kfields.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/kfields.hxx 2011-08-17 14:27:31.926362235 -0500
++@@ -0,0 +1,51 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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
+++ {
+++ QString valueOfKabField(const ::KABC::Addressee &aAddressee, sal_Int32 nFieldNumber);
+++ sal_uInt32 findKabField(const ::rtl::OUString& columnName) throw(::com::sun::star::sdbc::SQLException);
+++ }
+++}
+++
+++#endif
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN connectivity/source/drivers/tdeab/korder.cxx connectivity/source/drivers/tdeab/korder.cxx
++--- connectivity/source/drivers/tdeab/korder.cxx 1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/korder.cxx 2011-08-17 14:27:22.785658823 -0500
++@@ -0,0 +1,92 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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 = QString::compare(
+++ valueOfKabField(aAddressee1, m_nFieldNumber),
+++ valueOfKabField(aAddressee2, m_nFieldNumber));
+++// Timestamps should be compared differently than with their string value
+++
+++ if (!m_bAscending) result = -result;
+++
+++ return result;
+++}
+++// -----------------------------------------------------------------------------
+++KabComplexOrder::KabComplexOrder()
+++ : KabOrder(),
+++ m_aOrders()
+++{
+++}
+++// -----------------------------------------------------------------------------
+++KabComplexOrder::~KabComplexOrder()
+++{
+++ for (sal_uInt32 i = 0; i < m_aOrders.size(); i++)
+++ delete m_aOrders[i];
+++}
+++// -----------------------------------------------------------------------------
+++void KabComplexOrder::addOrder(KabOrder *pOrder)
+++{
+++ m_aOrders.push_back(pOrder);
+++}
+++// -----------------------------------------------------------------------------
+++sal_Int32 KabComplexOrder::compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const
+++{
+++ for (sal_uInt32 i = 0; i < m_aOrders.size(); i++)
+++ {
+++ const KabOrder *pOrder = m_aOrders[i];
+++ sal_Int32 result = pOrder->compare(aAddressee1, aAddressee2);
+++
+++ if (result) return result;
+++ }
+++ return 0;
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN connectivity/source/drivers/tdeab/korder.hxx connectivity/source/drivers/tdeab/korder.hxx
++--- connectivity/source/drivers/tdeab/korder.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/korder.hxx 2011-08-17 14:27:15.825123174 -0500
++@@ -0,0 +1,78 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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;
+++
+++ QString value(const ::KABC::Addressee &aAddressee) const;
+++ public:
+++ KabSimpleOrder(::rtl::OUString &sColumnName, sal_Bool bAscending);
+++
+++ virtual sal_Int32 compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const;
+++ };
+++
+++ class KabComplexOrder : public KabOrder
+++ {
+++ ::std::vector<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);
+++ QString aQtName;
+++
+++ switch (nFieldNumber)
+++ {
+++ case KAB_FIELD_REVISION:
+++// trigger an exception here
+++m_bWasNull = true;
+++return aRet;
+++ default:
+++ aQtName = aFields[nFieldNumber - KAB_DATA_FIELDS]->value(m_aKabAddressees[m_nRowPos]);
+++ }
+++// TDE address book currently does not use NULL values.
+++// But it might do it someday
+++ if (!aQtName.isNull())
+++ {
+++ m_bWasNull = false;
+++ aRet = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+++ return aRet;
+++ }
+++ }
+++// Trigger an exception ?
+++ m_bWasNull = true;
+++ return aRet;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::getBoolean(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getBoolean", NULL);
+++
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Int8 SAL_CALL KabResultSet::getByte(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getByte", NULL);
+++
+++ sal_Int8 nRet = 0;
+++ return nRet;
+++}
+++// -------------------------------------------------------------------------
+++sal_Int16 SAL_CALL KabResultSet::getShort(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getShort", NULL);
+++
+++ sal_Int16 nRet = 0;
+++ return nRet;
+++}
+++// -------------------------------------------------------------------------
+++sal_Int32 SAL_CALL KabResultSet::getInt(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getInt", NULL);
+++
+++ sal_Int32 nRet = 0;
+++ return nRet;
+++}
+++// -------------------------------------------------------------------------
+++sal_Int64 SAL_CALL KabResultSet::getLong(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getLong", NULL);
+++
+++ return sal_Int64();
+++}
+++// -------------------------------------------------------------------------
+++float SAL_CALL KabResultSet::getFloat(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getFloat", NULL);
+++
+++ float nVal(0);
+++ return nVal;
+++}
+++// -------------------------------------------------------------------------
+++double SAL_CALL KabResultSet::getDouble(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getDouble", NULL);
+++
+++ double nRet = 0;
+++ return nRet;
+++}
+++// -------------------------------------------------------------------------
+++Sequence< sal_Int8 > SAL_CALL KabResultSet::getBytes(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("", NULL);
+++
+++ return Sequence< sal_Int8 >();
+++}
+++// -------------------------------------------------------------------------
+++Date SAL_CALL KabResultSet::getDate(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getDate", NULL);
+++
+++ Date aRet;
+++ return aRet;
+++}
+++// -------------------------------------------------------------------------
+++Time SAL_CALL KabResultSet::getTime(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getTime", NULL);
+++
+++ Time nRet;
+++ return nRet;
+++}
+++// -------------------------------------------------------------------------
+++DateTime SAL_CALL KabResultSet::getTimestamp(sal_Int32 columnIndex) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ DateTime nRet;
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++
+++ if (m_nRowPos != -1 && m_nRowPos != nAddressees && m_xMetaData.is())
+++ {
+++ KabResultSetMetaData *pMeta = static_cast<KabResultSetMetaData *>(m_xMetaData.get());
+++ sal_Int32 nFieldNumber = pMeta->fieldAtColumn(columnIndex);
+++
+++ if (nFieldNumber == KAB_FIELD_REVISION)
+++ {
+++ QDateTime nRevision(m_aKabAddressees[m_nRowPos].revision());
+++
+++ if (!nRevision.isNull())
+++ {
+++ m_bWasNull = false;
+++ nRet.Year = nRevision.date().year();
+++ nRet.Month = nRevision.date().month();
+++ nRet.Day = nRevision.date().day();
+++ nRet.Hours = nRevision.time().hour();
+++ nRet.Minutes = nRevision.time().minute();
+++ nRet.Seconds = nRevision.time().second();
+++ nRet.HundredthSeconds = nRevision.time().msec() / 10;
+++ return nRet;
+++ }
+++ }
+++ else {
+++ ;
+++ }
+++// trigger an exception here
+++ }
+++// Trigger an exception ?
+++ m_bWasNull = true;
+++ return nRet;
+++}
+++// -------------------------------------------------------------------------
+++Reference< XInputStream > SAL_CALL KabResultSet::getBinaryStream(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getBinaryStream", NULL);
+++
+++ return NULL;
+++}
+++// -------------------------------------------------------------------------
+++Reference< XInputStream > SAL_CALL KabResultSet::getCharacterStream(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getCharacterStream", NULL);
+++
+++ return NULL;
+++}
+++// -------------------------------------------------------------------------
+++Any SAL_CALL KabResultSet::getObject(sal_Int32, const Reference< ::com::sun::star::container::XNameAccess >&) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getObject", NULL);
+++
+++ return Any();
+++}
+++// -------------------------------------------------------------------------
+++Reference< XRef > SAL_CALL KabResultSet::getRef(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getRef", NULL);
+++
+++ return NULL;
+++}
+++// -------------------------------------------------------------------------
+++Reference< XBlob > SAL_CALL KabResultSet::getBlob(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getBlob", NULL);
+++
+++ return NULL;
+++}
+++// -------------------------------------------------------------------------
+++Reference< XClob > SAL_CALL KabResultSet::getClob(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getClob", NULL);
+++
+++ return NULL;
+++}
+++// -------------------------------------------------------------------------
+++Reference< XArray > SAL_CALL KabResultSet::getArray(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++::dbtools::throwFunctionNotSupportedException("getArray", NULL);
+++
+++ return NULL;
+++}
+++// -------------------------------------------------------------------------
+++Reference< XResultSetMetaData > SAL_CALL KabResultSet::getMetaData() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ if (!m_xMetaData.is())
+++ m_xMetaData = new KabResultSetMetaData(m_xStatement->getOwnConnection());
+++
+++ Reference< XResultSetMetaData > xMetaData = m_xMetaData.get();
+++ return xMetaData;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::isBeforeFirst() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ if (m_nRowPos == -1)
+++ return sal_True;
+++
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::isAfterLast() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++ if (m_nRowPos == nAddressees)
+++ return sal_True;
+++
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::isFirst() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ if (m_nRowPos == 0)
+++ return sal_True;
+++
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::isLast() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++ if (m_nRowPos == nAddressees - 1)
+++ return sal_True;
+++
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::beforeFirst() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ // move before the first row
+++ m_nRowPos = -1;
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::afterLast() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ // move after the last row
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++ m_nRowPos = nAddressees;
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::close() throw(SQLException, RuntimeException)
+++{
+++ {
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++ }
+++ dispose();
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::first() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++ if (nAddressees == 0)
+++ return sal_False;
+++
+++ m_nRowPos = 0;
+++ return sal_True;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::last() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++ if (nAddressees == 0)
+++ return sal_False;
+++
+++ m_nRowPos = nAddressees - 1;
+++ return sal_True;
+++}
+++// -------------------------------------------------------------------------
+++sal_Int32 SAL_CALL KabResultSet::getRow() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ return m_nRowPos;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::absolute(sal_Int32 row) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++ if (row <= -1 ||
+++ row >= nAddressees)
+++ return sal_False;
+++
+++ m_nRowPos = row;
+++ return sal_True;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::relative(sal_Int32 row) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ return absolute(m_nRowPos + row);
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::next() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ return absolute(m_nRowPos + 1);
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::previous() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ return absolute(m_nRowPos - 1);
+++}
+++// -------------------------------------------------------------------------
+++Reference< XInterface > SAL_CALL KabResultSet::getStatement() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ Reference< XStatement > xStatement = m_xStatement.get();
+++ return xStatement;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::rowDeleted() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::rowInserted() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::rowUpdated() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::wasNull() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ return m_bWasNull;
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::cancel() throw(RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::clearWarnings() throw(SQLException, RuntimeException)
+++{
+++}
+++// -------------------------------------------------------------------------
+++Any SAL_CALL KabResultSet::getWarnings() throw(SQLException, RuntimeException)
+++{
+++ return Any();
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::insertRow() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ // you only have to implement this if you want to insert new rows
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateRow() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ // only when you allow updates
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::deleteRow() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::cancelRowUpdates() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::moveToInsertRow() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ // only when you allow inserts
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::moveToCurrentRow() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateNull(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateBoolean(sal_Int32, sal_Bool) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateByte(sal_Int32, sal_Int8) throw(SQLException, RuntimeException)
+++{
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateShort(sal_Int32, sal_Int16) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateInt(sal_Int32, sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateLong(sal_Int32, sal_Int64) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -----------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateFloat(sal_Int32, float) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateDouble(sal_Int32, double) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateString(sal_Int32, const ::rtl::OUString&) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateBytes(sal_Int32, const Sequence< sal_Int8 >&) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateDate(sal_Int32, const Date&) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateTime(sal_Int32, const Time&) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateTimestamp(sal_Int32, const DateTime&) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateBinaryStream(sal_Int32, const Reference< XInputStream >&, sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateCharacterStream(sal_Int32, const Reference< XInputStream >&, sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::refreshRow() throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateObject(sal_Int32, const Any&) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++void SAL_CALL KabResultSet::updateNumericObject(sal_Int32, const Any&, sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++}
+++// -------------------------------------------------------------------------
+++// XRowLocate
+++Any SAL_CALL KabResultSet::getBookmark() throw( SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++
+++ if (m_nRowPos != -1 && m_nRowPos != nAddressees)
+++ {
+++ QString aQtName = m_aKabAddressees[m_nRowPos].uid();
+++ ::rtl::OUString sUniqueIdentifier = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+++ return makeAny(sUniqueIdentifier);
+++ }
+++ return Any();
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::moveToBookmark(const Any& bookmark) throw( SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ ::rtl::OUString sBookmark = comphelper::getString(bookmark);
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++
+++ for (sal_Int32 nRow = 0; nRow < nAddressees; nRow++)
+++ {
+++ QString aQtName = m_aKabAddressees[nRow].uid();
+++ ::rtl::OUString sUniqueIdentifier = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+++
+++ if (sUniqueIdentifier == sBookmark)
+++ {
+++ m_nRowPos = nRow;
+++ return sal_True;
+++ }
+++ }
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::moveRelativeToBookmark(const Any& bookmark, sal_Int32 rows) throw( SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ sal_Int32 nRowSave = m_nRowPos;
+++
+++ if (moveToBookmark(bookmark))
+++ {
+++ sal_Int32 nAddressees = m_aKabAddressees.size();
+++
+++ m_nRowPos += rows;
+++
+++ if (-1 < m_nRowPos && m_nRowPos < nAddressees)
+++ return sal_True;
+++ }
+++
+++ m_nRowPos = nRowSave;
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Int32 SAL_CALL KabResultSet::compareBookmarks(const Any& firstItem, const Any& secondItem) throw( SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ ::rtl::OUString sFirst = comphelper::getString(firstItem);
+++ ::rtl::OUString sSecond = comphelper::getString(secondItem);
+++
+++ if (sFirst < sSecond)
+++ return CompareBookmark::LESS;
+++ if (sFirst > sSecond)
+++ return CompareBookmark::GREATER;
+++ return CompareBookmark::EQUAL;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSet::hasOrderedBookmarks() throw( SQLException, RuntimeException)
+++{
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Int32 SAL_CALL KabResultSet::hashBookmark(const Any& bookmark) throw( SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ ::rtl::OUString sBookmark = comphelper::getString(bookmark);
+++
+++ return sBookmark.hashCode();
+++}
+++// -------------------------------------------------------------------------
+++// XDeleteRows
+++Sequence< sal_Int32 > SAL_CALL KabResultSet::deleteRows(const Sequence< Any >&) throw( SQLException, RuntimeException)
+++{
+++ ::osl::MutexGuard aGuard( m_aMutex );
+++ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+++
+++ return Sequence< sal_Int32 >();
+++}
+++// -------------------------------------------------------------------------
+++IPropertyArrayHelper* KabResultSet::createArrayHelper() const
+++{
+++ Sequence< Property > aProps(6);
+++ Property* pProperties = aProps.getArray();
+++ sal_Int32 nPos = 0;
+++ DECL_PROP1IMPL(CURSORNAME, ::rtl::OUString) PropertyAttribute::READONLY);
+++ DECL_PROP0(FETCHDIRECTION, sal_Int32);
+++ DECL_PROP0(FETCHSIZE, sal_Int32);
+++ DECL_BOOL_PROP1IMPL(ISBOOKMARKABLE) PropertyAttribute::READONLY);
+++ DECL_PROP1IMPL(RESULTSETCONCURRENCY,sal_Int32) PropertyAttribute::READONLY);
+++ DECL_PROP1IMPL(RESULTSETTYPE, sal_Int32) PropertyAttribute::READONLY);
+++
+++ return new OPropertyArrayHelper(aProps);
+++}
+++// -------------------------------------------------------------------------
+++IPropertyArrayHelper & KabResultSet::getInfoHelper()
+++{
+++ return *static_cast<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();
+++ QString aQtName;
+++
+++ switch (nFieldNumber)
+++ {
+++ case KAB_FIELD_REVISION:
+++ aQtName = KABC::Addressee::revisionLabel();
+++ break;
+++ default:
+++ aQtName = aFields[nFieldNumber - KAB_DATA_FIELDS]->label();
+++ }
+++ ::rtl::OUString aName((const sal_Unicode *) aQtName.ucs2());
+++
+++ return aName;
+++}
+++// -------------------------------------------------------------------------
+++::rtl::OUString SAL_CALL KabResultSetMetaData::getTableName(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return KabDatabaseMetaData::getAddressBookTableName();
+++}
+++// -------------------------------------------------------------------------
+++::rtl::OUString SAL_CALL KabResultSetMetaData::getCatalogName(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return ::rtl::OUString();
+++}
+++// -------------------------------------------------------------------------
+++::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnTypeName(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return ::rtl::OUString();
+++}
+++// -------------------------------------------------------------------------
+++::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnLabel(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return ::rtl::OUString();
+++}
+++// -------------------------------------------------------------------------
+++::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnServiceName(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return ::rtl::OUString();
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSetMetaData::isCurrency(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSetMetaData::isAutoIncrement(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSetMetaData::isSigned(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Int32 SAL_CALL KabResultSetMetaData::getPrecision(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return 0;
+++}
+++// -----------------------------------------------------------------------------
+++sal_Int32 SAL_CALL KabResultSetMetaData::getScale(sal_Int32) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
+++{
+++ return 0;
+++}
+++// -------------------------------------------------------------------------
+++sal_Int32 SAL_CALL KabResultSetMetaData::isNullable(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return (sal_Int32) sal_True;
+++// TDE address book currently does not use NULL values.
+++// But it might do it someday
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSetMetaData::isSearchable(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return sal_True;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSetMetaData::isReadOnly(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return sal_True;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSetMetaData::isDefinitelyWritable(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++sal_Bool SAL_CALL KabResultSetMetaData::isWritable(sal_Int32) throw(SQLException, RuntimeException)
+++{
+++ return sal_False;
+++}
+++// -------------------------------------------------------------------------
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN connectivity/source/drivers/tdeab/KResultSetMetaData.hxx connectivity/source/drivers/tdeab/KResultSetMetaData.hxx
++--- connectivity/source/drivers/tdeab/KResultSetMetaData.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ connectivity/source/drivers/tdeab/KResultSetMetaData.hxx 2011-08-17 14:26:13.350315217 -0500
++@@ -0,0 +1,95 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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 QChar are (currently) both 16 bits characters
+++ QString aLanguage(
+++ (const QChar *) pProcessLocale->Language->buffer,
+++ (int) pProcessLocale->Language->length);
+++ KGlobal::locale()->setLanguage(aLanguage);
+++
+++ // load TDE address book's localized messages
+++ KGlobal::locale()->insertCatalogue("kaddressbook");
+++ s_bDidInsertCatalogue = true;
+++ }
+++
+++ // ---------------------------------------------------------------
+++ void TDEInit::Shutdown()
+++ {
+++ if ( s_bDidInsertCatalogue )
+++ // this guard is necessary, since TDE 3.3 seems to crash if we remove a catalogue
+++ // which we did not previously insert
+++ KGlobal::locale()->removeCatalogue("kaddressbook");
+++
+++ if ( s_pKApplication != NULL )
+++ {
+++ delete s_pKApplication;
+++ s_pKApplication = NULL;
+++ }
+++ }
+++ }
+++}
+++
+++// =======================================================================
+++namespace
+++{
+++ double normalizeVersion( unsigned int major, unsigned int minor )
+++ {
+++ return major + 1.0 * minor / 1000;
+++ }
+++}
+++
+++// -----------------------------------------------------------------------
+++extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL initKApplication()
+++{
+++ ::connectivity::kab::TDEInit::Init();
+++}
+++
+++// -----------------------------------------------------------------------
+++extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL shutdownKApplication()
+++{
+++ ::connectivity::kab::TDEInit::Shutdown();
+++}
+++// -----------------------------------------------------------------------
+++/** checks whether the TDE version on the system we're running at is supported
+++ by the driver
+++
+++ Has to be called before any other code from this library, in particular,
+++ it has to be called before initKApplication()
+++
+++ If this function returns <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 QString &qCommand, QStringList *pStringList )
+++ : QCustomEvent( TypeId, pStringList ),
+++ m_eCommand( Unknown )
+++{
+++ struct {
+++ const char *pName;
+++ CommandEventType eType;
+++ } *pIdx, pMapping[] =
+++ {
+++ { "appendControl", AppendControl },
+++ { "enableControl", EnableControl },
+++ { "getValue", GetValue },
+++ { "setValue", SetValue },
+++ { "appendFilter", AppendFilter },
+++ { "appendFilterGroup", AppendFilterGroup },
+++ { "getCurrentFilter", GetCurrentFilter },
+++ { "setCurrentFilter", SetCurrentFilter },
+++ { "getDirectory", GetDirectory },
+++ { "setDirectory", SetDirectory },
+++ { "getFiles", GetFiles },
+++ { "setTitle", SetTitle },
+++ { "setType", SetType },
+++ { "setDefaultName", SetDefaultName },
+++ { "setMultiSelection", SetMultiSelection },
+++ { "exec", Exec },
+++ { 0, Unknown }
+++ };
+++
+++ for ( pIdx = pMapping; pIdx->pName && qCommand != pIdx->pName; ++pIdx )
+++ ;
+++
+++ m_eCommand = pIdx->eType;
+++}
+++
+++//////////////////////////////////////////////////////////////////////////
+++// CommandThread
+++//////////////////////////////////////////////////////////////////////////
+++
+++TDECommandThread::TDECommandThread( QWidget *pObject )
+++ : m_pObject( pObject )
+++{
+++}
+++
+++TDECommandThread::~TDECommandThread()
+++{
+++}
+++
+++void TDECommandThread::run()
+++{
+++ QTextIStream qStream( stdin );
+++ qStream.setEncoding( QTextStream::UnicodeUTF8 );
+++
+++ QString qLine;
+++ bool bQuit = false;
+++ while ( !bQuit && !qStream.atEnd() )
+++ {
+++ qLine = qStream.readLine();
+++ handleCommand( qLine, bQuit );
+++ }
+++}
+++
+++void TDECommandThread::handleCommand( const QString &rString, bool &bQuit )
+++{
+++ QMutexLocker qMutexLocker( &m_aMutex );
+++
+++#if OSL_DEBUG_LEVEL > 0
+++ ::std::cerr << "tdefilepicker received: " << rString.latin1() << ::std::endl;
+++#endif
+++
+++ bQuit = false;
+++ QStringList *pTokens = tokenize( rString );
+++
+++ if ( !pTokens )
+++ return;
+++ if ( pTokens->empty() )
+++ {
+++ delete pTokens, pTokens = NULL;
+++ return;
+++ }
+++
+++ QString qCommand = pTokens->front();
+++ pTokens->pop_front();
+++
+++ if ( qCommand == "exit" )
+++ {
+++ bQuit = true;
+++ kapp->exit();
+++ kapp->wakeUpGuiThread();
+++ }
+++ else
+++ kapp->postEvent( m_pObject, new TDECommandEvent( qCommand, pTokens ) );
+++}
+++
+++QStringList* TDECommandThread::tokenize( const QString &rString )
+++{
+++ // Commands look like:
+++ // command arg1 arg2 arg3 ...
+++ // Args may be enclosed in '"', if they contain spaces.
+++
+++ QStringList *pList = new QStringList();
+++
+++ QString qBuffer;
+++ qBuffer.reserve( 1024 );
+++
+++ const QChar *pUnicode = rString.unicode();
+++ const QChar *pEnd = pUnicode + rString.length();
+++ bool bQuoted = false;
+++
+++ for ( ; pUnicode != pEnd; ++pUnicode )
+++ {
+++ if ( *pUnicode == '\\' )
+++ {
+++ ++pUnicode;
+++ if ( pUnicode != pEnd )
+++ {
+++ if ( *pUnicode == 'n' )
+++ qBuffer.append( '\n' );
+++ else
+++ qBuffer.append( *pUnicode );
+++ }
+++ }
+++ else if ( *pUnicode == '"' )
+++ bQuoted = !bQuoted;
+++ else if ( *pUnicode == ' ' && !bQuoted )
+++ {
+++ pList->push_back( qBuffer );
+++ qBuffer.setLength( 0 );
+++ }
+++ else
+++ qBuffer.append( *pUnicode );
+++ }
+++ pList->push_back( qBuffer );
+++
+++ return pList;
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN fpicker/source/unx/tde/tdecommandthread.hxx fpicker/source/unx/tde/tdecommandthread.hxx
++--- fpicker/source/unx/tde/tdecommandthread.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdecommandthread.hxx 2011-08-17 14:04:34.560780976 -0500
++@@ -0,0 +1,98 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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 QCustomEvent
+++{
+++public:
+++ enum CommandEventType {
+++ Unknown = 0,
+++
+++ AppendControl,
+++ EnableControl,
+++ GetValue,
+++ SetValue,
+++
+++ AppendFilter,
+++ AppendFilterGroup,
+++ UpdateFilters,
+++ GetCurrentFilter,
+++ SetCurrentFilter,
+++
+++ GetDirectory,
+++ SetDirectory,
+++
+++ GetFiles,
+++
+++ SetTitle,
+++ SetType,
+++ SetDefaultName,
+++ SetMultiSelection,
+++
+++ Exec
+++ };
+++ static const QEvent::Type TypeId = (QEvent::Type) ( (int) QEvent::User + 42 /*random magic value*/ );
+++
+++protected:
+++ CommandEventType m_eCommand;
+++
+++public:
+++ TDECommandEvent( const QString &qCommand, QStringList *pStringList );
+++
+++ CommandEventType command() const { return m_eCommand; }
+++ QStringList* stringList() { return static_cast< QStringList* >( data() ); }
+++};
+++
+++class TDECommandThread : public QThread
+++{
+++protected:
+++ QObject *m_pObject;
+++
+++ QMutex m_aMutex;
+++
+++public:
+++ TDECommandThread( QWidget *pObject );
+++ virtual ~TDECommandThread();
+++
+++ virtual void run();
+++
+++protected:
+++ void handleCommand( const QString &rString, bool &bQuit );
+++ QStringList* tokenize( const QString &rString );
+++};
+++
+++#endif // _TDECOMMANDTHREAD_HXX_
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN fpicker/source/unx/tde/tdefilepicker.cxx fpicker/source/unx/tde/tdefilepicker.cxx
++--- fpicker/source/unx/tde/tdefilepicker.cxx 1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdefilepicker.cxx 2011-08-17 14:05:04.073041030 -0500
++@@ -0,0 +1,733 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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 QT_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 QString &startDir, const QString &filter,
+++ QWidget *parent, const char *name )
+++ : KFileDialog( startDir, filter, parent, name, true, m_pCustomWidget = new QVBox() ),
+++ m_pCombosAndButtons( new QHBox( m_pCustomWidget ) ),
+++ m_pLabels( new QVBox( m_pCombosAndButtons ) ),
+++ m_pComboBoxes( new QVBox( m_pCombosAndButtons ) ),
+++ m_pPushButtons( new QVBox( m_pCombosAndButtons ) ),
+++ m_pCheckBoxes( new QGrid( 2, m_pCustomWidget ) ),
+++ m_bIsSave( false ),
+++ m_bIsExecuting( false ),
+++ m_bCanNotifySelection( true )
+++{
+++ connect( this, SIGNAL( fileHighlighted( const QString & ) ),
+++ this, SLOT( fileHighlightedCommand( const QString & ) ) );
+++
+++ connect( this, SIGNAL( selectionChanged() ),
+++ this, SLOT( selectionChangedCommand() ) );
+++
+++ m_pCustomWidget->setSpacing( KDialog::spacingHint() );
+++ m_pCombosAndButtons->setSpacing( KDialog::spacingHint() );
+++
+++ updateCustomWidgetLayout();
+++}
+++
+++TDEFileDialog::~TDEFileDialog()
+++{
+++}
+++
+++void TDEFileDialog::resizeEvent( QResizeEvent *pEvent )
+++{
+++ KFileDialog::resizeEvent( pEvent );
+++
+++ updateCustomWidgetLayout();
+++}
+++
+++void TDEFileDialog::showEvent( QShowEvent *pEvent )
+++{
+++ KFileDialog::showEvent( pEvent );
+++
+++ updateCustomWidgetLayout();
+++}
+++
+++void TDEFileDialog::updateCustomWidgetLayout()
+++{
+++ QPoint qReferencePoint = filterWidget->mapTo( this, QPoint( 0, 0 ) );
+++ QPoint qCustomPoint = m_pCustomWidget->mapTo( this, QPoint( 0, 0 ) );
+++
+++ int nLeft = qReferencePoint.x() - qCustomPoint.x();
+++ int nRight = m_pCustomWidget->width() - filterWidget->width() - nLeft;
+++
+++ nLeft -= KDialog::spacingHint();
+++ nRight -= KDialog::spacingHint();
+++ m_pLabels->setFixedWidth( ( nLeft > 0 )? nLeft: 80 );
+++ // FIXME The following call sets the width of m_pPushButtons all right,
+++ // but it also increases the width of m_pComboBoxes rapidly. Can we do
+++ // anything about it?
+++ m_pPushButtons->setFixedWidth( ( nRight > 0 )? nRight: 100 );
+++}
+++
+++void TDEFileDialog::customEvent( QCustomEvent *pEvent )
+++{
+++ if ( pEvent && pEvent->type() == TDECommandEvent::TypeId )
+++ {
+++ TDECommandEvent *pCommandEvent = static_cast< TDECommandEvent* >( pEvent );
+++ QStringList *pStringList = pCommandEvent->stringList();
+++
+++ int nListSize = -1;
+++ if ( pStringList )
+++ nListSize = pStringList->size();
+++
+++ switch ( pCommandEvent->command() )
+++ {
+++ case TDECommandEvent::AppendControl:
+++ if ( nListSize >= 3 )
+++ {
+++ appendControl( (*pStringList)[0], (*pStringList)[1], (*pStringList)[2] );
+++ }
+++ break;
+++ case TDECommandEvent::EnableControl:
+++ if ( nListSize >= 2 )
+++ {
+++ enableControl( (*pStringList)[0], (*pStringList)[1] );
+++ }
+++ break;
+++ case TDECommandEvent::GetValue:
+++ if ( nListSize >= 2 )
+++ {
+++ getValue( (*pStringList)[0], (*pStringList)[1] );
+++ }
+++ break;
+++ case TDECommandEvent::SetValue:
+++ if ( nListSize >= 2 )
+++ {
+++ QStringList qStringList = (*pStringList);
+++ qStringList.pop_front();
+++ qStringList.pop_front();
+++
+++ setValue( (*pStringList)[0], (*pStringList)[1], qStringList );
+++ }
+++ break;
+++ case TDECommandEvent::AppendFilter:
+++ if ( nListSize >= 2 )
+++ {
+++ appendFilter( (*pStringList)[0], (*pStringList)[1] );
+++
+++ // update the filters widget
+++ setFilter( filters() );
+++ }
+++ break;
+++ case TDECommandEvent::AppendFilterGroup:
+++ if ( nListSize >= 1 )
+++ {
+++ QStringList::const_iterator it = pStringList->begin();
+++ ++it; // We ignore the filter group name
+++
+++ while ( it != pStringList->end() )
+++ {
+++ QString qTitle = *it;
+++ ++it;
+++ if ( it != pStringList->end() )
+++ {
+++ appendFilter( qTitle, (*it) );
+++ ++it;
+++ }
+++ }
+++
+++ // update the filters widget
+++ setFilter( filters() );
+++ }
+++ break;
+++ case TDECommandEvent::GetCurrentFilter:
+++ {
+++ QString qCurrentFilter = filterWidget->currentText();
+++ sendCommand( "currentFilter " + escapeString( qCurrentFilter ) );
+++ }
+++ break;
+++ case TDECommandEvent::SetCurrentFilter:
+++ if ( nListSize >= 1 )
+++ {
+++ static_cast< TDEFileFilterComboHack* >( filterWidget )->setCurrentFilter( pStringList->front() );
+++ }
+++ break;
+++ case TDECommandEvent::GetDirectory:
+++ {
+++ QString qDirectory = baseURL().url();
+++ if ( qDirectory.startsWith( "file:/" ) && qDirectory.mid( 6, 1 ) != "/" )
+++ qDirectory.replace( "file:/", "file:///" );
+++ sendCommand( "currentDirectory " + escapeString( qDirectory ) );
+++ }
+++ break;
+++ case TDECommandEvent::SetDirectory:
+++ if ( nListSize >= 1 )
+++ {
+++ setURL( pStringList->front() );
+++ }
+++ break;
+++ case TDECommandEvent::GetFiles:
+++ {
+++ QString qString;
+++ qString.reserve( 1024 );
+++
+++ qString.append( "files" );
+++
+++ if ( result() == QDialog::Accepted )
+++ {
+++ KURL::List qList( selectedURLs() );
+++ for ( KURL::List::const_iterator it = qList.begin(); it != qList.end(); ++it )
+++ appendURL( qString, (*it) );
+++ }
+++ else
+++ {
+++ // we have to return the selected files anyway
+++ const KFileItemList *pItems = ops->selectedItems();
+++ for ( KFileItemListIterator it( *pItems ); it.current(); ++it )
+++ appendURL( qString, (*it)->url() );
+++ }
+++
+++ sendCommand( qString );
+++ setCanNotifySelection( true );
+++ }
+++ break;
+++ case TDECommandEvent::SetTitle:
+++ if ( nListSize >= 1 )
+++ {
+++ setCaption( pStringList->front() );
+++ }
+++ break;
+++ case TDECommandEvent::SetType:
+++ if ( nListSize >= 1 )
+++ {
+++ QString qType( pStringList->front() );
+++ if ( qType == "open" )
+++ {
+++ setIsSave( false );
+++ setCaption( i18n( "Open" ) );
+++ }
+++ else if ( qType == "save" )
+++ {
+++ setIsSave( true );
+++ setCaption( i18n( "Save As" ) );
+++ }
+++ }
+++ break;
+++ case TDECommandEvent::SetDefaultName:
+++ if ( nListSize >= 1 )
+++ {
+++ setKeepLocation( true );
+++ setSelection( pStringList->front() );
+++ }
+++ break;
+++ case TDECommandEvent::SetMultiSelection:
+++ if ( nListSize >= 1 )
+++ {
+++ if ( pStringList->front() == "true" )
+++ setMode( KFile::Files );
+++ else
+++ setMode( KFile::File );
+++ }
+++ break;
+++ case TDECommandEvent::Exec:
+++ {
+++ filterWidget->setEditable( false );
+++ setIsExecuting( true );
+++ bool bCanExit = false;
+++ do {
+++ setCanNotifySelection( true );
+++ exec();
+++
+++ KURL qLocalSelectedURL = mostLocalURL( selectedURL() );
+++ QString qProtocol( qLocalSelectedURL.protocol() );
+++
+++ if ( isSave() && result() == QDialog::Accepted )
+++ {
+++ if ( qProtocol == "file" )
+++ {
+++ QString qFileName( addExtension( qLocalSelectedURL.path() ) );
+++ bCanExit =
+++ !QFile::exists( qFileName ) ||
+++ ( KMessageBox::warningYesNo( 0,
+++ i18n( "A file named \"%1\" already exists. "
+++ "Are you sure you want to overwrite it?" ).arg( qFileName ),
+++ i18n( "Overwrite File?" ),
+++ i18n( "Overwrite" ), KStdGuiItem::cancel() ) == KMessageBox::Yes );
+++ }
+++ else if ( !isSupportedProtocol( qProtocol ) )
+++ {
+++ KMessageBox::sorry( 0,
+++ i18n( "Saving using protocol \"%1\" is not supported." ).arg( qProtocol ) );
+++ bCanExit = false;
+++ }
+++ else
+++ bCanExit = true;
+++ }
+++ else if ( !isSave() && result() == QDialog::Accepted && !isSupportedProtocol( qProtocol ) )
+++ {
+++ KMessageBox::information( 0,
+++ i18n( "Protocol \"%1\" is supported only partially. "
+++ "Local copy of the file will be created." ).arg( qProtocol ) );
+++ bCanExit = true;
+++ }
+++ else
+++ bCanExit = true;
+++ } while ( !bCanExit );
+++ setIsExecuting( false );
+++
+++ if ( result() == QDialog::Accepted )
+++ sendCommand( "accept" );
+++ else
+++ sendCommand( "reject" );
+++ }
+++ break;
+++ default:
+++ break;
+++ }
+++
+++ // FIXME Some cleanup of pEvent? delete something, etc.?
+++ }
+++}
+++
+++void TDEFileDialog::appendControl( const QString &rId, const QString &rType, const QString &rTitle )
+++{
+++ QString qLabel( rTitle );
+++ qLabel.replace( '~', '&' );
+++
+++ if ( rType == "checkbox" )
+++ {
+++ QCheckBox *pCheckBox = new QCheckBox( qLabel, m_pCheckBoxes, rId.utf8() );
+++
+++ pCheckBox->setEnabled( true );
+++ pCheckBox->setChecked( false );
+++ }
+++ else if ( rType == "listbox" )
+++ {
+++ QLabel *pComboLabel = new QLabel( qLabel, m_pLabels );
+++ QComboBox *pComboBox = new QComboBox( m_pComboBoxes, rId.utf8() );
+++
+++ pComboLabel->setBuddy( pComboBox );
+++ pComboBox->setEnabled( true );
+++ }
+++ else if ( rType == "pushbutton" )
+++ {
+++ QPushButton *pPushButton = new QPushButton( qLabel, m_pPushButtons, rId.utf8() );
+++ pPushButton->setEnabled( true );
+++ }
+++}
+++
+++QWidget* TDEFileDialog::findControl( const QString &rId ) const
+++{
+++ QObjectList *pList = m_pCustomWidget->queryList();
+++ QCString qName( rId.utf8() );
+++ QObjectList::const_iterator it = pList->begin();
+++
+++ for ( ; it != pList->end() && qName != (*it)->name(); ++it )
+++ ;
+++
+++ QWidget *pWidget = NULL;
+++ if ( it != pList->end() )
+++ pWidget = static_cast< QWidget* >( *it );
+++
+++ delete pList;
+++
+++ return pWidget;
+++}
+++
+++void TDEFileDialog::enableControl( const QString &rId, const QString &rValue )
+++{
+++ QWidget *pWidget = findControl( rId );
+++
+++ if ( pWidget )
+++ pWidget->setEnabled( rValue.lower() == "true" );
+++}
+++
+++void TDEFileDialog::getValue( const QString &rId, const QString &rAction )
+++{
+++ QWidget *pWidget = findControl( rId );
+++ QString qString;
+++ qString.reserve( 1024 );
+++ qString.append( "value" );
+++
+++ if ( pWidget )
+++ {
+++ QCString qClassName = pWidget->className();
+++ if ( qClassName == "QCheckBox" )
+++ {
+++ QCheckBox *pCheckBox = static_cast< QCheckBox* >( pWidget );
+++
+++ if ( pCheckBox->isChecked() )
+++ qString.append( " bool true" );
+++ else
+++ qString.append( " bool false" );
+++ }
+++ else if ( qClassName == "QComboBox" )
+++ {
+++ QComboBox *pComboBox = static_cast< QComboBox* >( pWidget );
+++ if ( rAction == "getItems" )
+++ {
+++ qString.append( " stringList" );
+++ for ( int nIdx = 0; nIdx < pComboBox->count(); ++nIdx )
+++ {
+++ qString.append( ' ' );
+++ appendEscaped( qString, pComboBox->text( nIdx ) );
+++ }
+++ }
+++ else if ( rAction == "getSelectedItem" )
+++ {
+++ qString.append( " string " );
+++ appendEscaped( qString, pComboBox->currentText() );
+++ }
+++ else if ( rAction == "getSelectedItemIndex" )
+++ {
+++ qString.append( " int " );
+++ qString.append( QString().setNum( pComboBox->currentItem() ) );
+++ }
+++ // TODO getHelpURL
+++ }
+++ // TODO push button
+++ }
+++
+++ sendCommand( qString );
+++}
+++
+++void TDEFileDialog::setValue( const QString &rId, const QString &rAction, const QStringList &rValue )
+++{
+++ QWidget *pWidget = findControl( rId );
+++
+++ if ( pWidget )
+++ {
+++ QCString qClassName = pWidget->className();
+++ if ( qClassName == "QCheckBox" )
+++ {
+++ QCheckBox *pCheckBox = static_cast< QCheckBox* >( pWidget );
+++
+++ bool bValue = ( !rValue.isEmpty() ) && ( rValue.front().lower() == "true" );
+++ pCheckBox->setChecked( bValue );
+++ }
+++ else if ( qClassName == "QComboBox" )
+++ {
+++ QComboBox *pComboBox = static_cast< QComboBox* >( pWidget );
+++ if ( rAction == "addItem" )
+++ {
+++ if ( !rValue.isEmpty() )
+++ pComboBox->insertItem( rValue.front() );
+++ }
+++ else if ( rAction == "addItems" )
+++ {
+++ pComboBox->insertStringList( rValue );
+++ }
+++ else if ( rAction == "deleteItem" )
+++ {
+++ if ( !rValue.isEmpty() )
+++ pComboBox->removeItem( rValue.front().toInt() );
+++ }
+++ else if ( rAction == "deleteItems" )
+++ {
+++ pComboBox->clear();
+++ }
+++ else if ( rAction == "setSelectedItem" )
+++ {
+++ if ( !rValue.isEmpty() )
+++ pComboBox->setCurrentItem( rValue.front().toInt() );
+++ }
+++ // FIXME setHelpURL is ignored
+++ }
+++ // TODO push button
+++ }
+++}
+++
+++void TDEFileDialog::appendFilter( const QString &rTitle, const QString &rFilter )
+++{
+++ // Filters are separated by ';'
+++ QString qFilter( rFilter );
+++ qFilter.replace( QChar( ';' ), QChar( ' ' ) ).replace( "*.*", "*" );
+++
+++ // Workaround for too wide <All formats> (*.bmp;...) entry
+++ QString qTitle( rTitle );
+++ qTitle.replace( QRegExp( "^<([^>]*)> \\(.*" ), "<\\1>" );
+++
+++ m_aFilters.push_back( qMakePair( qTitle, qFilter ) );
+++}
+++
+++QString TDEFileDialog::filters() const
+++{
+++ QString qString, qTmp;
+++ bool bFirstFilter = true;
+++
+++ for ( FilterList::const_iterator it = m_aFilters.begin(); it != m_aFilters.end(); ++it )
+++ {
+++ if ( bFirstFilter )
+++ bFirstFilter = false;
+++ else
+++ qString.append( '\n' );
+++
+++ qString.append( (*it).second );
+++ qString.append( '|' );
+++
+++ qTmp = (*it).first;
+++ qString.append( qTmp.replace( '/', "\\/" ) );
+++ }
+++
+++ return qString;
+++}
+++
+++QString TDEFileDialog::addExtension( const QString &rFileName ) const
+++{
+++ if ( !isSave() )
+++ return rFileName;
+++
+++ QString qExtension;
+++
+++ QWidget *pExtensionWidget = findControl( "100" ); // CHECKBOX_AUTOEXTENSION
+++ QCheckBox *pExtensionCB = pExtensionWidget? static_cast< QCheckBox* >( pExtensionWidget->qt_cast( "QCheckBox" ) ): NULL;
+++ if ( pExtensionCB && pExtensionCB->isChecked() )
+++ {
+++ // FIXME: qFilter can be a MIME; we ignore it now...
+++ QStringList qFilterList = QStringList::split( " ", currentFilter() );
+++ for ( QStringList::const_iterator it = qFilterList.begin();
+++ qExtension.isEmpty() && it != qFilterList.end();
+++ ++it )
+++ {
+++ int nUnwanted = (*it).findRev( '*' );
+++ if ( nUnwanted < 0 )
+++ nUnwanted = (*it).findRev( '?' );
+++ else
+++ nUnwanted = ::std::max( nUnwanted, (*it).find( '?', nUnwanted ) );
+++
+++ int nIdx = (*it).find( '.', ::std::max( nUnwanted, 0 ) );
+++ if ( nIdx >= 0 )
+++ qExtension = (*it).mid( nIdx ).lower();
+++ }
+++ }
+++
+++ if ( qExtension.isEmpty() || qExtension == "." || rFileName.endsWith( qExtension ) )
+++ return rFileName;
+++ else
+++ return rFileName + qExtension;
+++}
+++
+++bool TDEFileDialog::isSupportedProtocol( const QString &rProtocol ) const
+++{
+++ // TODO Get this information directly from OOo
+++ const char * pOOoProtocols[] = { "", "smb", "ftp", "http", "file", "mailto",
+++ "vnd.sun.star.webdav", "news", "private", "vnd.sun.star.help",
+++ "https", "slot", "macro", "javascript", "imap", "pop3", "data",
+++ "cid", "out", "vnd.sun.star.wfs", "vnd.sun.star.hier", "vim",
+++ ".uno", ".component", "vnd.sun.star.pkg", "ldap", "db",
+++ "vnd.sun.star.cmd", "vnd.sun.star.script", "vnd.sun.star.odma",
+++ "telnet",
+++ NULL };
+++
+++ for ( const char **pIndex = pOOoProtocols; *pIndex != NULL; ++pIndex )
+++ {
+++ if ( rProtocol == *pIndex )
+++ return true;
+++ }
+++
+++ // TODO gnome-vfs bits here
+++
+++ return false;
+++}
+++
+++KURL TDEFileDialog::mostLocalURL( const KURL &rURL ) const
+++{
+++#if KDE_IS_VERSION(3,5,0)
+++ KURL qMostLocalURL( KIO::NetAccess::mostLocalURL( rURL, const_cast<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;
+++}
+++
+++QString TDEFileDialog::localCopy( const QString &rFileName ) const
+++{
+++ // 106 == MIB enum for UTF-8
+++ KURL qLocalURL = mostLocalURL( KURL( rFileName, 106 ) );
+++ if ( qLocalURL.isLocalFile() )
+++ return qLocalURL.url();
+++
+++ int nExtensionPos = rFileName.findRev( '/' );
+++ if ( nExtensionPos >= 0 )
+++ nExtensionPos = rFileName.find( '.', nExtensionPos );
+++ else
+++ nExtensionPos = rFileName.find( '.' );
+++
+++ KTempFile qTempFile( QString::null, ( nExtensionPos < 0 )? QString(): rFileName.mid( nExtensionPos ) );
+++ KURL qDestURL;
+++ qDestURL.setPath( qTempFile.name() );
+++
+++ if ( !KIO::NetAccess::file_copy( rFileName, qDestURL, 0600, true, false, NULL ) )
+++ {
+++ KMessageBox::error( 0, KIO::NetAccess::lastErrorString() );
+++ return QString::null;
+++ }
+++
+++ return qDestURL.url();
+++}
+++
+++void TDEFileDialog::fileHighlightedCommand( const QString & )
+++{
+++ if ( canNotifySelection() )
+++ {
+++ sendCommand( "fileSelectionChanged" );
+++ setCanNotifySelection( false );
+++ }
+++}
+++
+++void TDEFileDialog::selectionChangedCommand()
+++{
+++ if ( canNotifySelection() )
+++ {
+++ sendCommand( "fileSelectionChanged" );
+++ setCanNotifySelection( false );
+++ }
+++}
+++
+++void TDEFileDialog::sendCommand( const QString &rCommand )
+++{
+++#if OSL_DEBUG_LEVEL > 0
+++ ::std::cerr << "tdefilepicker sent: " << rCommand.latin1() << ::std::endl;
+++#endif
+++
+++ //m_aOutputStream << rCommand << endl;
+++ ::std::cout << rCommand.utf8() << ::std::endl;
+++}
+++
+++void TDEFileDialog::appendURL( QString &rBuffer, const KURL &rURL )
+++{
+++ // From Martin Kretzschmar:
+++ // file:///path/to/test%E0.odt is not a valid URL from OOo's point of
+++ // view. (?Most modern parts of?) OOo assume(s) that the URL contains only
+++ // ASCII characters (which test%E0.odt does) and is UTF-8 after unescaping
+++ // (which file:///path/test%E0.odt is not).
+++ // Cf. the comment in sal/inc/osl/file.h.
+++ // 106 == MIB enum for UTF-8
+++ QString qUrlStr = addExtension( rURL.url( 0, 106 ) );
+++
+++ if ( !isExecuting() && !isSupportedProtocol( rURL.protocol() ) )
+++ qUrlStr = localCopy( qUrlStr );
+++
+++ if ( qUrlStr.startsWith( "file:/" ) && qUrlStr.mid( 6, 1 ) != "/" )
+++ qUrlStr.replace( "file:/", "file:///" );
+++
+++ rBuffer.append( " " );
+++ if ( !qUrlStr.isEmpty() )
+++ appendEscaped( rBuffer, qUrlStr );
+++}
+++
+++void TDEFileDialog::appendEscaped( QString &rBuffer, const QString &rString )
+++{
+++ const QChar *pUnicode = rString.unicode();
+++ const QChar *pEnd = pUnicode + rString.length();
+++
+++ rBuffer.append( '"' );
+++ for ( ; pUnicode != pEnd; ++pUnicode )
+++ {
+++ if ( *pUnicode == '\\' )
+++ rBuffer.append( "\\\\" );
+++ else if ( *pUnicode == '"' )
+++ rBuffer.append( "\\\"" );
+++ else if ( *pUnicode == '\n' )
+++ rBuffer.append( "\\\n" );
+++ else
+++ rBuffer.append( *pUnicode );
+++ }
+++ rBuffer.append( '"' );
+++}
+++
+++QString TDEFileDialog::escapeString( const QString &rString )
+++{
+++ QString qString;
+++ qString.reserve( 2*rString.length() + 2 ); // every char escaped + quotes
+++
+++ appendEscaped( qString, rString );
+++
+++ return qString;
+++}
+++
+++
+++void TDEFileFilterComboHack::setCurrentFilter( const QString& filter )
+++{
+++ setCurrentText( filter );
+++ filterChanged();
+++
+++ // Workaround for 'Filter name (*.blah)' vs. 'Filter name'
+++ if ( currentText() != text( currentItem() ) )
+++ {
+++ int nItem = 0;
+++ for ( ; nItem < count() && !text( nItem ).startsWith( filter ); ++nItem );
+++
+++ if ( nItem < count() )
+++ setCurrentItem( nItem );
+++ else
+++ setCurrentItem( 0 );
+++
+++ filterChanged();
+++ }
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN fpicker/source/unx/tde/tdefilepicker.hxx fpicker/source/unx/tde/tdefilepicker.hxx
++--- fpicker/source/unx/tde/tdefilepicker.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdefilepicker.hxx 2011-08-17 14:05:02.262902414 -0500
++@@ -0,0 +1,126 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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 QGrid;
+++class QHBox;
+++class QVBox;
+++
+++class TDEFileDialog : public KFileDialog
+++{
+++ Q_OBJECT
+++
+++protected:
+++ typedef QPair< QString, QString > FilterEntry;
+++ typedef QValueList< FilterEntry > FilterList;
+++
+++ QVBox *m_pCustomWidget;
+++ QHBox *m_pCombosAndButtons;
+++
+++ QVBox *m_pLabels;
+++ QVBox *m_pComboBoxes;
+++ QVBox *m_pPushButtons;
+++
+++ QGrid *m_pCheckBoxes;
+++
+++ FilterList m_aFilters;
+++
+++ /** Are we a "Save As" dialog?
+++ *
+++ * We cannot use KFileDialog::setOperationMode() here, because then
+++ * it automatically adds an "Automatically select filename extension"
+++ * check box, and completely destroys the dialog's layout
+++ * (custom list boxes are under this check box, which looks ugly).
+++ */
+++ bool m_bIsSave;
+++ bool m_bIsExecuting;
+++
+++ bool m_bCanNotifySelection;
+++
+++public:
+++ TDEFileDialog( const QString &startDir, const QString &filter,
+++ QWidget *parent, const char *name );
+++ virtual ~TDEFileDialog();
+++
+++protected:
+++ virtual void resizeEvent( QResizeEvent *pEvent );
+++ virtual void showEvent( QShowEvent *pEvent );
+++ void updateCustomWidgetLayout();
+++
+++ virtual void customEvent( QCustomEvent *pEvent );
+++
+++protected:
+++ void appendControl( const QString &rId, const QString &rType, const QString &rTitle );
+++ QWidget* findControl( const QString &rId ) const;
+++ void enableControl( const QString &rId, const QString &rValue );
+++ void getValue( const QString &rId, const QString &rAction );
+++ void setValue( const QString &rId, const QString &rAction, const QStringList &rValue );
+++
+++ void appendFilter( const QString &rTitle, const QString &rFilter );
+++ QString filters() const;
+++ QString addExtension( const QString &rFileName ) const;
+++
+++ void setIsSave( bool bIsSave ) { m_bIsSave = bIsSave; }
+++ bool isSave( void ) const { return m_bIsSave; }
+++
+++ void setIsExecuting( bool bIsExecuting ) { m_bIsExecuting = bIsExecuting; }
+++ bool isExecuting( void ) const { return m_bIsExecuting; }
+++
+++ bool isSupportedProtocol( const QString &rProtocol ) const;
+++ KURL mostLocalURL( const KURL &rURL ) const;
+++ QString localCopy( const QString &rFileName ) const;
+++
+++ void setCanNotifySelection( bool bCanNotifySelection ) { m_bCanNotifySelection = bCanNotifySelection; }
+++ bool canNotifySelection( void ) const { return m_bCanNotifySelection; }
+++
+++protected slots:
+++ void fileHighlightedCommand( const QString & );
+++ void selectionChangedCommand();
+++
+++protected:
+++ void sendCommand( const QString &rCommand );
+++ void appendURL( QString &rBuffer, const KURL &rURL );
+++ void appendEscaped( QString &rBuffer, const QString &rString );
+++ QString escapeString( const QString &rString );
+++};
+++
+++class TDEFileFilterComboHack : public KFileFilterCombo
+++{
+++public:
+++ void setCurrentFilter( const QString& filter );
+++};
+++
+++#endif // _TDEFILEPICKER_HXX_
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN fpicker/source/unx/tde/tdefpmain.cxx fpicker/source/unx/tde/tdefpmain.cxx
++--- fpicker/source/unx/tde/tdefpmain.cxx 1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdefpmain.cxx 2011-08-17 14:04:58.622623640 -0500
++@@ -0,0 +1,93 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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, QString(), NULL, "tdefiledialog" );
+++
+++ TDECommandThread qCommandThread( &aFileDialog );
+++ qCommandThread.start();
+++
+++ kApplication.exec();
+++
+++ qCommandThread.wait();
+++
+++ ::std::cout << "exited" << ::std::endl;
+++
+++ return 0;
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN fpicker/source/unx/tde/tdemodalityfilter.cxx fpicker/source/unx/tde/tdemodalityfilter.cxx
++--- fpicker/source/unx/tde/tdemodalityfilter.cxx 1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdemodalityfilter.cxx 2011-08-17 14:04:44.121513143 -0500
++@@ -0,0 +1,68 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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( QObject *pObject, QEvent *pEvent )
+++{
+++ if ( pObject->isWidgetType() && pEvent->type() == QEvent::Show )
+++ {
+++ KDialogBase* pDlg = ::qt_cast< KDialogBase* >( pObject );
+++ if ( pDlg != NULL && m_nWinId != 0 )
+++ {
+++ XSetTransientForHint( qt_xdisplay(), pDlg->winId(), m_nWinId );
+++ m_nWinId = 0;
+++ }
+++ }
+++ return false;
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN fpicker/source/unx/tde/tdemodalityfilter.hxx fpicker/source/unx/tde/tdemodalityfilter.hxx
++--- fpicker/source/unx/tde/tdemodalityfilter.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde/tdemodalityfilter.hxx 2011-08-17 14:04:27.940273979 -0500
++@@ -0,0 +1,49 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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 QObject
+++{
+++private:
+++ WId m_nWinId;
+++
+++public:
+++ TDEModalityFilter( WId nWinId );
+++ virtual ~TDEModalityFilter();
+++
+++ virtual bool eventFilter( QObject *pObject, QEvent *pEvent );
+++};
+++
+++#endif // _TDEMODALITYFILTER_HXX_
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN fpicker/source/unx/tde_unx/FPServiceInfo.hxx fpicker/source/unx/tde_unx/FPServiceInfo.hxx
++--- fpicker/source/unx/tde_unx/FPServiceInfo.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/FPServiceInfo.hxx 2011-08-17 14:07:24.203772856 -0500
++@@ -0,0 +1,48 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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
+++ const char *pFname = "tdefilepicker";
+++
+++ // ID of the main window
+++ const int nIdLen = 20;
+++ char pWinId[nIdLen] = "0";
+++
+++ // TODO pass here the real parent (not possible for system dialogs
+++ // yet), and default to GetDefDialogParent() only when the real parent
+++ // is NULL
+++ Window *pParentWin = Application::GetDefDialogParent();
+++ if ( pParentWin )
+++ {
+++ const SystemEnvData* pSysData = ((SystemWindow *)pParentWin)->GetSystemData();
+++ if ( pSysData )
+++ {
+++ snprintf( pWinId, nIdLen, "%ld", pSysData->aWindow ); // unx only
+++ pWinId[nIdLen-1] = 0;
+++ }
+++ }
+++
+++ // Execute the fpicker implementation
+++ execlp( pFname, pFname, "--winid", pWinId, NULL );
+++
+++ // Error, finish the child
+++ exit( -1 );
+++ }
+++
+++ // Parent continues
+++ close( aFiledesStdin[0] );
+++ m_nFilePickerWrite = aFiledesStdin[1];
+++
+++ close( aFiledesStdout[1] );
+++ m_nFilePickerRead = aFiledesStdout[0];
+++
+++ // Create the notify thread
+++ if ( !m_pNotifyThread )
+++ m_pNotifyThread = new UnxFilePickerNotifyThread( this );
+++
+++ // Create the command thread
+++ if ( !m_pCommandThread )
+++ m_pCommandThread = new UnxFilePickerCommandThread( m_pNotifyThread, m_nFilePickerRead );
+++
+++ // Start the threads
+++ m_pNotifyThread->create();
+++ m_pCommandThread->create();
+++
+++ return;
+++}
+++
+++void UnxFilePicker::checkFilePicker() throw( ::com::sun::star::uno::RuntimeException )
+++{
+++ if ( m_nFilePickerPid > 0 )
+++ {
+++ // TODO check if external file picker is runnning
+++ }
+++ else
+++ {
+++ throw uno::RuntimeException(
+++ ::rtl::OUString::createFromAscii( "the external file picker does not run" ),
+++ *this );
+++ }
+++}
+++
+++void UnxFilePicker::sendCommand( const ::rtl::OUString &rCommand )
+++{
+++ if ( m_nFilePickerWrite < 0 )
+++ return;
+++
+++ ::rtl::OString aUtfString = OUStringToOString( rCommand + ::rtl::OUString::createFromAscii( "\n" ), RTL_TEXTENCODING_UTF8 );
+++
+++#if OSL_DEBUG_LEVEL > 0
+++ ::std::cerr << "UnxFilePicker sent: \"" << aUtfString.getStr() << "\"" << ::std::endl;
+++#endif
+++
+++ write( m_nFilePickerWrite, aUtfString.getStr(), aUtfString.getLength() );
+++}
+++
+++void UnxFilePicker::sendCommand( const ::rtl::OUString &rCommand, ::osl::Condition &rCondition )
+++{
+++ rCondition.reset();
+++
+++ sendCommand( rCommand );
+++
+++ rCondition.wait();
+++}
+++
+++void UnxFilePicker::appendEscaped( ::rtl::OUStringBuffer &rBuffer, const ::rtl::OUString &rString )
+++{
+++ const sal_Unicode *pUnicode = rString.getStr();
+++ const sal_Unicode *pEnd = pUnicode + rString.getLength();
+++
+++ rBuffer.appendAscii( "\"" , 1 );
+++
+++ for ( ; pUnicode != pEnd; ++pUnicode )
+++ {
+++ if ( *pUnicode == '\\' )
+++ rBuffer.appendAscii( "\\\\", 2 );
+++ else if ( *pUnicode == '"' )
+++ rBuffer.appendAscii( "\\\"", 2 );
+++ else if ( *pUnicode == '\n' )
+++ rBuffer.appendAscii( "\\n", 2 );
+++ else
+++ rBuffer.append( *pUnicode );
+++ }
+++
+++ rBuffer.appendAscii( "\"", 1 );
+++}
+++
+++sal_Bool UnxFilePicker::controlIdInfo( sal_Int16 nControlId, ::rtl::OUString &rType, sal_Int32 &rTitleId )
+++{
+++ typedef struct {
+++ sal_Int16 nId;
+++ const ::rtl::OUString *pType;
+++ sal_Int32 nTitle;
+++ } ElementToName;
+++
+++ const ::rtl::OUString aCheckBox( RTL_CONSTASCII_USTRINGPARAM( "checkbox" ) );
+++ const ::rtl::OUString aControl( RTL_CONSTASCII_USTRINGPARAM( "control" ) );
+++ const ::rtl::OUString aEdit( RTL_CONSTASCII_USTRINGPARAM( "edit" ) );
+++ const ::rtl::OUString aLabel( RTL_CONSTASCII_USTRINGPARAM( "label" ) );
+++ const ::rtl::OUString aListBox( RTL_CONSTASCII_USTRINGPARAM( "listbox" ) );
+++ const ::rtl::OUString aPushButton( RTL_CONSTASCII_USTRINGPARAM( "pushbutton" ) );
+++
+++ const ElementToName *pPtr;
+++ const ElementToName pArray[] =
+++ {
+++ { CommonFilePickerElementIds::PUSHBUTTON_OK, &aPushButton, 0/*FIXME?*/ },
+++ { CommonFilePickerElementIds::PUSHBUTTON_CANCEL, &aPushButton, 0/*FIXME?*/ },
+++ { CommonFilePickerElementIds::LISTBOX_FILTER, &aListBox, 0/*FIXME?*/ },
+++ { CommonFilePickerElementIds::CONTROL_FILEVIEW, &aControl, 0/*FIXME?*/ },
+++ { CommonFilePickerElementIds::EDIT_FILEURL, &aEdit, 0/*FIXME?*/ },
+++ { CommonFilePickerElementIds::LISTBOX_FILTER_LABEL, &aLabel, 0/*FIXME?*/ },
+++ { CommonFilePickerElementIds::EDIT_FILEURL_LABEL, &aLabel, 0/*FIXME?*/ },
+++
+++ { ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, &aCheckBox, STR_SVT_FILEPICKER_AUTO_EXTENSION },
+++ { ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, &aCheckBox, STR_SVT_FILEPICKER_PASSWORD },
+++ { ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS, &aCheckBox, STR_SVT_FILEPICKER_FILTER_OPTIONS },
+++ { ExtendedFilePickerElementIds::CHECKBOX_READONLY, &aCheckBox, STR_SVT_FILEPICKER_READONLY },
+++ { ExtendedFilePickerElementIds::CHECKBOX_LINK, &aCheckBox, STR_SVT_FILEPICKER_INSERT_AS_LINK },
+++ { ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, &aCheckBox, STR_SVT_FILEPICKER_SHOW_PREVIEW },
+++ { ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, &aPushButton, STR_SVT_FILEPICKER_PLAY },
+++ { ExtendedFilePickerElementIds::LISTBOX_VERSION, &aListBox, STR_SVT_FILEPICKER_VERSION },
+++ { ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, &aListBox, STR_SVT_FILEPICKER_TEMPLATES },
+++ { ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE, &aListBox, STR_SVT_FILEPICKER_IMAGE_TEMPLATE },
+++ { ExtendedFilePickerElementIds::CHECKBOX_SELECTION, &aCheckBox, STR_SVT_FILEPICKER_SELECTION },
+++ { 0, 0, 0 }
+++ };
+++
+++ for ( pPtr = pArray; pPtr->nId && ( pPtr->nId != nControlId ); ++pPtr )
+++ ;
+++
+++ if ( pPtr->nId == nControlId )
+++ {
+++ rType = *(pPtr->pType);
+++ rTitleId = pPtr->nTitle;
+++
+++ return sal_True;
+++ }
+++
+++ return sal_False;
+++}
+++
+++sal_Bool UnxFilePicker::controlActionInfo( sal_Int16 nControlAction, ::rtl::OUString &rType )
+++{
+++ typedef struct {
+++ sal_Int16 nId;
+++ const ::rtl::OUString pType;
+++ } ElementToName;
+++
+++ const ElementToName *pPtr;
+++ const ElementToName pArray[] =
+++ {
+++ { ControlActions::ADD_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "addItem" ) ) },
+++ { ControlActions::ADD_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "addItems" ) ) },
+++ { ControlActions::DELETE_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "deleteItem" ) ) },
+++ { ControlActions::DELETE_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "deleteItems" ) ) },
+++ { ControlActions::SET_SELECT_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "setSelectedItem" ) ) },
+++ { ControlActions::GET_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getItems" ) ) },
+++ { ControlActions::GET_SELECTED_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getSelectedItem" ) ) },
+++ { ControlActions::GET_SELECTED_ITEM_INDEX, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getSelectedItemIndex" ) ) },
+++ { ControlActions::SET_HELP_URL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "setHelpURL" ) ) },
+++ { ControlActions::GET_HELP_URL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getHelpURL" ) ) },
+++ { 0, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "noAction" ) ) }
+++ };
+++
+++ for ( pPtr = pArray; pPtr->nId && ( pPtr->nId != nControlAction ); ++pPtr )
+++ ;
+++
+++ rType = pPtr->pType;
+++
+++ return sal_True;
+++}
+++
+++void UnxFilePicker::sendAppendControlCommand( sal_Int16 nControlId )
+++{
+++ ::rtl::OUString aType;
+++ sal_Int32 nTitleId;
+++
+++ if ( controlIdInfo( nControlId, aType, nTitleId ) )
+++ {
+++ ::rtl::OUStringBuffer aBuffer( 1024 );
+++
+++ aBuffer.appendAscii( "appendControl " );
+++ aBuffer.append( static_cast< sal_Int32 >( nControlId ) );
+++ aBuffer.appendAscii( " ", 1 );
+++ appendEscaped( aBuffer, aType );
+++ aBuffer.appendAscii( " ", 1 );
+++ appendEscaped( aBuffer, m_pResMgr? String( ResId( nTitleId, *m_pResMgr ) ): String() );
+++
+++ sendCommand( aBuffer.makeStringAndClear() );
+++ }
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN fpicker/source/unx/tde_unx/UnxFilePicker.hxx fpicker/source/unx/tde_unx/UnxFilePicker.hxx
++--- fpicker/source/unx/tde_unx/UnxFilePicker.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ fpicker/source/unx/tde_unx/UnxFilePicker.hxx 2011-08-17 14:07:41.705113628 -0500
++@@ -0,0 +1,178 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2010 Novell, Inc.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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;
+++ QString aClientProgram;
+++ ::rtl::OUString sClientProgram;
+++
+++ aClientProgram = aEmailSettings.getSetting( KEMailSettings::ClientProgram );
+++ if ( aClientProgram.isEmpty() )
+++ aClientProgram = "kmail";
+++ else
+++ aClientProgram = aClientProgram.section(SPACE, 0, 0);
+++ sClientProgram = (const sal_Unicode *) aClientProgram.ucs2();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( sClientProgram ) );
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("SourceViewFontHeight")))
+++ {
+++ QFont aFixedFont;
+++ short nFontHeight;
+++
+++ aFixedFont = KGlobalSettings::fixedFont();
+++ nFontHeight = aFixedFont.pointSize();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( nFontHeight ) );
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("SourceViewFontName")))
+++ {
+++ QFont aFixedFont;
+++ QString aFontName;
+++ :: rtl::OUString sFontName;
+++
+++ aFixedFont = KGlobalSettings::fixedFont();
+++ aFontName = aFixedFont.family();
+++ sFontName = (const sal_Unicode *) aFontName.ucs2();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( sFontName ) );
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("EnableATToolSupport")))
+++ {
+++ /* does not make much sense without an accessibility bridge */
+++ sal_Bool ATToolSupport = sal_False;
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( rtl::OUString::valueOf( ATToolSupport ) ) );
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("WorkPathVariable")))
+++ {
+++ QString aDocumentsDir( KGlobalSettings::documentPath() );
+++ rtl::OUString sDocumentsDir;
+++ rtl::OUString sDocumentsURL;
+++ if ( aDocumentsDir.endsWith(QChar('/')) )
+++ aDocumentsDir.truncate ( aDocumentsDir.length() - 1 );
+++ sDocumentsDir = (const sal_Unicode *) aDocumentsDir.ucs2();
+++ osl_getFileURLFromSystemPath( sDocumentsDir.pData, &sDocumentsURL.pData );
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( sDocumentsURL ) );
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName")))
+++ {
+++ QString aFTPProxy;
+++ switch ( KProtocolManager::proxyType() )
+++ {
+++ case KProtocolManager::ManualProxy: // Proxies are manually configured
+++ aFTPProxy = KProtocolManager::proxyFor( "FTP" );
+++ break;
+++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+++// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+++// The best we can do here is to ask the current value for a given address.
+++ aFTPProxy = KProtocolManager::proxyForURL( "ftp://ftp.openoffice.org" );
+++ break;
+++ default: // No proxy is used
+++ break;
+++ }
+++ if ( !aFTPProxy.isEmpty() )
+++ {
+++ KURL aProxy(aFTPProxy);
+++ ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( sProxy ) );
+++ }
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort")))
+++ {
+++ QString aFTPProxy;
+++ switch ( KProtocolManager::proxyType() )
+++ {
+++ case KProtocolManager::ManualProxy: // Proxies are manually configured
+++ aFTPProxy = KProtocolManager::proxyFor( "FTP" );
+++ break;
+++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+++// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+++// The best we can do here is to ask the current value for a given address.
+++ aFTPProxy = KProtocolManager::proxyForURL( "ftp://ftp.openoffice.org" );
+++ break;
+++ default: // No proxy is used
+++ break;
+++ }
+++ if ( !aFTPProxy.isEmpty() )
+++ {
+++ KURL aProxy(aFTPProxy);
+++ sal_Int32 nPort = aProxy.port();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( nPort ) );
+++ }
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName")))
+++ {
+++ QString aHTTPProxy;
+++ switch ( KProtocolManager::proxyType() )
+++ {
+++ case KProtocolManager::ManualProxy: // Proxies are manually configured
+++ aHTTPProxy = KProtocolManager::proxyFor( "HTTP" );
+++ break;
+++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+++// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+++// The best we can do here is to ask the current value for a given address.
+++ aHTTPProxy = KProtocolManager::proxyForURL( "http://http.openoffice.org" );
+++ break;
+++ default: // No proxy is used
+++ break;
+++ }
+++ if ( !aHTTPProxy.isEmpty() )
+++ {
+++ KURL aProxy(aHTTPProxy);
+++ ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( sProxy ) );
+++ }
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort")))
+++ {
+++ QString aHTTPProxy;
+++ switch ( KProtocolManager::proxyType() )
+++ {
+++ case KProtocolManager::ManualProxy: // Proxies are manually configured
+++ aHTTPProxy = KProtocolManager::proxyFor( "HTTP" );
+++ break;
+++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+++// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+++// The best we can do here is to ask the current value for a given address.
+++ aHTTPProxy = KProtocolManager::proxyForURL( "http://http.openoffice.org" );
+++ break;
+++ default: // No proxy is used
+++ break;
+++ }
+++ if ( !aHTTPProxy.isEmpty() )
+++ {
+++ KURL aProxy(aHTTPProxy);
+++ sal_Int32 nPort = aProxy.port();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( nPort ) );
+++ }
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName")))
+++ {
+++ QString aHTTPSProxy;
+++ switch ( KProtocolManager::proxyType() )
+++ {
+++ case KProtocolManager::ManualProxy: // Proxies are manually configured
+++ aHTTPSProxy = KProtocolManager::proxyFor( "HTTPS" );
+++ break;
+++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+++// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+++// The best we can do here is to ask the current value for a given address.
+++ aHTTPSProxy = KProtocolManager::proxyForURL( "https://https.openoffice.org" );
+++ break;
+++ default: // No proxy is used
+++ break;
+++ }
+++ if ( !aHTTPSProxy.isEmpty() )
+++ {
+++ KURL aProxy(aHTTPSProxy);
+++ ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( sProxy ) );
+++ }
+++ } else if (id.equalsAsciiL(
+++ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort")))
+++ {
+++ QString aHTTPSProxy;
+++ switch ( KProtocolManager::proxyType() )
+++ {
+++ case KProtocolManager::ManualProxy: // Proxies are manually configured
+++ aHTTPSProxy = KProtocolManager::proxyFor( "HTTPS" );
+++ break;
+++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+++// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+++// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+++// The best we can do here is to ask the current value for a given address.
+++ aHTTPSProxy = KProtocolManager::proxyForURL( "https://https.openoffice.org" );
+++ break;
+++ default: // No proxy is used
+++ break;
+++ }
+++ if ( !aHTTPSProxy.isEmpty() )
+++ {
+++ KURL aProxy(aHTTPSProxy);
+++ sal_Int32 nPort = aProxy.port();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( nPort ) );
+++ }
+++ } else if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy"))) {
+++ QString aNoProxyFor;
+++ switch ( KProtocolManager::proxyType() )
+++ {
+++ case KProtocolManager::ManualProxy: // Proxies are manually configured
+++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+++ aNoProxyFor = KProtocolManager::noProxyFor();
+++ break;
+++ default: // No proxy is used
+++ break;
+++ }
+++ if ( !aNoProxyFor.isEmpty() )
+++ {
+++ ::rtl::OUString sNoProxyFor;
+++
+++ aNoProxyFor = aNoProxyFor.replace( COMMA, SEMI_COLON );
+++ sNoProxyFor = (const sal_Unicode *) aNoProxyFor.ucs2();
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( sNoProxyFor ) );
+++ }
+++ } else if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetProxyType"))) {
+++ int nProxyType;
+++ switch ( KProtocolManager::proxyType() )
+++ {
+++ case KProtocolManager::ManualProxy: // Proxies are manually configured
+++ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+++ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+++ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+++ nProxyType = 1;
+++ break;
+++ default: // No proxy is used
+++ nProxyType = 0;
+++ }
+++ return css::beans::Optional< css::uno::Any >(
+++ true, uno::makeAny( (sal_Int32) nProxyType ) );
+++ } else {
+++ OSL_ASSERT(false); // this cannot happen
+++ }
+++ return css::beans::Optional< css::uno::Any >();
+++}
+++
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN shell/source/backends/tdebe/tdeaccess.hxx shell/source/backends/tdebe/tdeaccess.hxx
++--- shell/source/backends/tdebe/tdeaccess.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ shell/source/backends/tdebe/tdeaccess.hxx 2011-08-17 14:16:31.565704001 -0500
++@@ -0,0 +1,51 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++*
+++* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++*
+++* Copyright 2000, 2010 Oracle and/or its affiliates.
+++* Copyright 2011 Timothy Pearson
+++*
+++* OpenOffice.org - a multi-platform office productivity suite
+++*
+++* This file is part of OpenOffice.org.
+++*
+++* OpenOffice.org is free software: you can redistribute it and/or modify
+++* it under the terms of the GNU Lesser General Public License version 3
+++* only, as published by the Free Software Foundation.
+++*
+++* OpenOffice.org is distributed in the hope that it will be useful,
+++* but WITHOUT ANY WARRANTY; without even the implied warranty of
+++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++* GNU Lesser General Public License version 3 for more details
+++* (a copy is included in the LICENSE file that accompanied this code).
+++*
+++* You should have received a copy of the GNU Lesser General Public License
+++* version 3 along with OpenOffice.org. If not, see
+++* <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
+++
+++
+++/* ********* Qt 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 QStyle::drawControl(). The buttons are created
+++ on demand and they are still hidden (no QWidget::show() is called).
+++ */
+++ QPushButton *m_pPushButton;
+++
+++ /** Cached radio button.
+++
+++ @see m_pPushButton
+++ */
+++ QRadioButton *m_pRadioButton;
+++
+++ /** Cached check box.
+++
+++ @see m_pPushButton
+++ */
+++ QCheckBox *m_pCheckBox;
+++
+++ /** Cached combo box.
+++
+++ @see m_pPushButton
+++ */
+++ QComboBox *m_pComboBox;
+++
+++ /** Cached editable combo box.
+++
+++ Needed, because some styles do not like dynamic changes
+++ (QComboBox::setEditable()).
+++
+++ @see m_pPushButton
+++ */
+++ QComboBox *m_pEditableComboBox;
+++
+++ /** Cached line edit box.
+++
+++ @see m_pPushButton
+++ */
+++ QLineEdit *m_pLineEdit;
+++
+++ /** Cached spin box.
+++
+++ @see m_pPushButton
+++ */
+++ QSpinWidget *m_pSpinWidget;
+++
+++ /** Cached spin box'es line edit.
+++
+++ @see m_pPushButton
+++ */
+++ QLineEdit *m_pSpinEdit;
+++
+++ /** Cached tab.
+++
+++ Left, middle, right tab and a tab which is alone.
+++
+++ @see m_pPushButton
+++ */
+++ QTab *m_pTabLeft, *m_pTabMiddle, *m_pTabRight, *m_pTabAlone;
+++
+++ /** Cached tab bar's parent widget.
+++
+++ Needed, because the Qt windows style checks for the availability
+++ of tab bar's parent. We cannot use m_pTabWidget, because
+++ TabWidget::setTabBar() and TabWidget::tabBar() methods are
+++ protected.
+++
+++ @see m_pPushButton, m_pTabWidget
+++ */
+++ QWidget *m_pTabBarParent;
+++
+++ /** Cached tab bar widget.
+++
+++ @see m_pPushButton
+++ */
+++ QTabBar *m_pTabBar;
+++
+++ /** Cached tab widget.
+++
+++ We need it to draw the tab page. It cannot be used to draw the
+++ tabs themselves, because the drawing has to be tweaked a little
+++ due to not enough information from VCL.
+++
+++ @see m_pPushButton, m_pTabBarParent
+++ */
+++ QTabWidget *m_pTabWidget;
+++
+++ /** Cached list view.
+++
+++ @see m_pPushButton
+++ */
+++ QListView *m_pListView;
+++
+++ /** Cached scroll bar.
+++
+++ @see m_pPushButton
+++ */
+++ QScrollBar *m_pScrollBar;
+++
+++ /** Cached dock area. Needed for proper functionality of tool bars.
+++
+++ @see m_pPushButton
+++ */
+++ QMainWindow *m_pMainWindow;
+++
+++ /** Cached tool bar.
+++
+++ @see m_pPushButton
+++ */
+++ QToolBar *m_pToolBarHoriz, *m_pToolBarVert;
+++
+++ /** Cached tool button.
+++
+++ @see m_pPushButton
+++ */
+++ QToolButton *m_pToolButton;
+++
+++ /** Cached menu bar.
+++
+++ @see m_pPushButton
+++ */
+++ QMenuBar *m_pMenuBar;
+++
+++ /** Identifiers of menu bar items.
+++ */
+++ int m_nMenuBarEnabledItem, m_nMenuBarDisabledItem;
+++
+++ /** Cached popup menu.
+++
+++ @see m_pPushButton
+++ */
+++ QPopupMenu *m_pPopupMenu;
+++
+++ /** Identifiers of popup menu items.
+++ */
+++ int m_nPopupMenuEnabledItem, m_nPopupMenuDisabledItem;
+++
+++ /** cached progress bar
+++ */
+++ QProgressBar *m_pProgressBar;
+++
+++ // TODO other widgets
+++
+++ public:
+++ /** Implicit constructor.
+++
+++ It creates an empty WidgetPainter with all the cached widgets initialized
+++ to NULL. The widgets are created on demand and they are still hidden
+++ (no QWidget::show()), because they are needed just as a parameter for
+++ QStyle::drawControl().
+++
+++ @see m_pPushButton
+++ */
+++ WidgetPainter( void );
+++
+++ /** Destructor.
+++
+++ Destruct all the cached widgets.
+++ */
+++ virtual ~WidgetPainter( void );
+++
+++ /** Paints the specified widget to the X window.
+++
+++ Use X calls to bitblt (bit block transfer) the widget qWidget to
+++ the window specified by drawable with the style defined by nStyle.
+++
+++ @param qWidget
+++ A pointer to the cached widget.
+++
+++ @param nState
+++ The state of the control (focused, on/off, ...)
+++
+++ @param aValue
+++ The value (true/false, ...)
+++
+++ @param dpy
+++ The display to be used by the X calls.
+++
+++ @param drawable
+++ The destination X window.
+++
+++ @param gc
+++ The graphics context.
+++ */
+++ BOOL drawStyledWidget( QWidget *pWidget,
+++ ControlState nState, const ImplControlValue& aValue,
+++ Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc,
+++ ControlPart nPart = PART_ENTIRE_CONTROL );
+++
+++ /** 'Get' method for push button.
+++
+++ The method returns the cached push button. It is constructed if it
+++ does not exist. It has NULL as a parent and it stays hidden, but it
+++ is necessary for the drawStyledWidget() method.
+++
+++ @return valid push button.
+++ */
+++ QPushButton *pushButton( const Rectangle& rControlRegion, BOOL bDefault );
+++
+++ /** 'Get' method for radio button.
+++
+++ @see pushButton()
+++ */
+++ QRadioButton *radioButton( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for check box.
+++
+++ @see pushButton()
+++ */
+++ QCheckBox *checkBox( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for combo box.
+++
+++ It returns m_pComboBox or m_pEditableComboBox according to
+++ bEditable.
+++
+++ @see pushButton(), m_pEditableComboBox
+++ */
+++ QComboBox *comboBox( const Rectangle& rControlRegion, BOOL bEditable );
+++
+++ /** 'Get' method for line edit box.
+++
+++ @see pushButton()
+++ */
+++ QLineEdit *lineEdit( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for spin box.
+++
+++ @see pushButton()
+++ */
+++ QSpinWidget *spinWidget( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for tab bar.
+++
+++ @see pushButton()
+++ */
+++ QTabBar *tabBar( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for tab widget.
+++
+++ @see pushButton()
+++ */
+++ QTabWidget *tabWidget( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for list view.
+++
+++ @see pushButton()
+++ */
+++ QListView *listView( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for scroll bar.
+++
+++ @see pushButton()
+++ */
+++ QScrollBar *scrollBar( const Rectangle& rControlRegion,
+++ BOOL bHorizontal, const ImplControlValue& aValue );
+++
+++ /** 'Get' method for tool bar.
+++
+++ @see pushButton()
+++ */
+++ QToolBar *toolBar( const Rectangle& rControlRegion, BOOL bHorizontal );
+++
+++ /** 'Get' method for tool button.
+++
+++ @see pushButton()
+++ */
+++ QToolButton *toolButton( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for menu bar.
+++
+++ @see pushButton()
+++ */
+++ QMenuBar *menuBar( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for popup menu.
+++
+++ @see pushButton()
+++ */
+++ QPopupMenu *popupMenu( const Rectangle& rControlRegion );
+++
+++ /** 'Get' method for progress bar
+++
+++ @see pushButton()
+++ */
+++ QProgressBar *progressBar( const Rectangle& rControlRegion );
+++
+++ // TODO other widgets
+++
+++ protected:
+++ /** Style conversion function.
+++
+++ Conversion function between VCL ControlState together with
+++ ImplControlValue and Qt state flags.
+++
+++ @param nState
+++ State of the widget (default, focused, ...) as defined in Native
+++ Widget Framework.
+++
+++ @param aValue
+++ Value held by the widget (on, off, ...)
+++ */
+++ QStyle::SFlags vclStateValue2SFlags( ControlState nState, const ImplControlValue& aValue );
+++
+++ public:
+++ /** Convert VCL Rectangle to QRect.
+++
+++ @param rControlRegion
+++ The region to convert.
+++
+++ @return
+++ The bounding box of the region.
+++ */
+++ static QRect region2QRect( const Rectangle& rControlRegion );
+++};
+++
+++WidgetPainter::WidgetPainter( void )
+++ : m_pPushButton( NULL ),
+++ m_pRadioButton( NULL ),
+++ m_pCheckBox( NULL ),
+++ m_pComboBox( NULL ),
+++ m_pEditableComboBox( NULL ),
+++ m_pLineEdit( NULL ),
+++ m_pSpinWidget( NULL ),
+++ m_pSpinEdit( NULL ),
+++ m_pTabLeft( NULL ),
+++ m_pTabMiddle( NULL ),
+++ m_pTabRight( NULL ),
+++ m_pTabAlone( NULL ),
+++ m_pTabBarParent( NULL ),
+++ m_pTabBar( NULL ),
+++ m_pTabWidget( NULL ),
+++ m_pListView( NULL ),
+++ m_pScrollBar( NULL ),
+++ m_pMainWindow( NULL ),
+++ m_pToolBarHoriz( NULL ),
+++ m_pToolBarVert( NULL ),
+++ m_pToolButton( NULL ),
+++ m_pMenuBar( NULL ),
+++ m_pPopupMenu( NULL ),
+++ m_pProgressBar( NULL )
+++{
+++}
+++
+++WidgetPainter::~WidgetPainter( void )
+++{
+++ delete m_pPushButton, m_pPushButton = NULL;
+++ delete m_pRadioButton, m_pRadioButton = NULL;
+++ delete m_pCheckBox, m_pCheckBox = NULL;
+++ delete m_pComboBox, m_pComboBox = NULL;
+++ delete m_pEditableComboBox, m_pEditableComboBox = NULL;
+++ delete m_pLineEdit, m_pLineEdit = NULL;
+++ delete m_pSpinWidget, m_pSpinWidget = NULL;
+++ m_pSpinEdit = NULL; // Deleted in m_pSpinWidget's destructor
+++ delete m_pTabAlone, m_pTabAlone = NULL;
+++ delete m_pTabBarParent, m_pTabBarParent = NULL;
+++ m_pTabBar = NULL; // Deleted in m_pTabBarParent's destructor
+++ m_pTabLeft = NULL;
+++ m_pTabMiddle = NULL;
+++ m_pTabRight = NULL;
+++ delete m_pTabWidget, m_pTabWidget = NULL;
+++ delete m_pListView, m_pListView = NULL;
+++ delete m_pScrollBar, m_pScrollBar = NULL;
+++ delete m_pToolBarHoriz, m_pToolBarHoriz = NULL;
+++ delete m_pToolBarVert, m_pToolBarVert = NULL;
+++ delete m_pMainWindow, m_pMainWindow = NULL;
+++ delete m_pToolButton, m_pToolButton = NULL;
+++ delete m_pMenuBar, m_pMenuBar = NULL;
+++ delete m_pPopupMenu, m_pPopupMenu = NULL;
+++ delete m_pProgressBar, m_pProgressBar = NULL;
+++}
+++
+++BOOL WidgetPainter::drawStyledWidget( QWidget *pWidget,
+++ ControlState nState, const ImplControlValue& aValue,
+++ Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc,
+++ ControlPart nPart )
+++{
+++ if ( !pWidget )
+++ return FALSE;
+++
+++ // Normalize the widget
+++ QPoint qWidgetPos( pWidget->pos() );
+++ pWidget->move( 0, 0 );
+++
+++ // Enable/disable the widget
+++ pWidget->setEnabled( nState & CTRL_STATE_ENABLED );
+++
+++ // Create pixmap to paint to
+++ QPixmap qPixmap( pWidget->width(), pWidget->height() );
+++ QPainter qPainter( &qPixmap );
+++ QRect qRect( 0, 0, pWidget->width(), pWidget->height() );
+++
+++ // Use the background of the widget
+++ qPixmap.fill( pWidget, QPoint(0, 0) );
+++
+++ // Convert the flags
+++ QStyle::SFlags nStyle = vclStateValue2SFlags( nState, aValue );
+++
+++ // Store the widget class
+++ const char *pClassName = pWidget->className();
+++
+++ // Draw the widget to the pixmap
+++ if ( strcmp( "QPushButton", pClassName ) == 0 )
+++ {
+++ // Workaround for the Platinum style.
+++ // Platinum takes the state directly from the widget, not from SFlags.
+++ QPushButton *pPushButton = static_cast<QPushButton *>( pWidget->qt_cast( "QPushButton" ) );
+++ if ( pPushButton )
+++ {
+++ pPushButton->setDown ( nStyle & QStyle::Style_Down );
+++ pPushButton->setOn ( nStyle & QStyle::Style_On );
+++ pPushButton->setEnabled( nStyle & QStyle::Style_Enabled );
+++ }
+++
+++ kapp->style().drawControl( QStyle::CE_PushButton,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle );
+++ }
+++ else if ( strcmp( "QRadioButton", pClassName ) == 0 )
+++ {
+++ // Bitblt from the screen, because the radio buttons are usually not
+++ // rectangular, and there could be a bitmap under them
+++ GC aTmpGC = XCreateGC( dpy, qPixmap.handle(), 0, NULL );
+++ X11SalGraphics::CopyScreenArea( dpy,
+++ drawable, nScreen, nDepth,
+++ qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(),
+++ aTmpGC,
+++ qWidgetPos.x(), qWidgetPos.y(), qRect.width(), qRect.height(),
+++ 0, 0 );
+++ XFreeGC( dpy, aTmpGC );
+++
+++ kapp->style().drawControl( QStyle::CE_RadioButton,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle );
+++ }
+++ else if ( strcmp( "QCheckBox", pClassName ) == 0 )
+++ {
+++ kapp->style().drawControl( QStyle::CE_CheckBox,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle );
+++ }
+++ else if ( strcmp( "QComboBox", pClassName ) == 0 )
+++ {
+++ kapp->style().drawComplexControl( QStyle::CC_ComboBox,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle );
+++
+++ // Editable combo box uses the background of the associated edit box
+++ QComboBox *pComboBox = static_cast<QComboBox *>( pWidget->qt_cast( "QComboBox" ) );
+++ if ( pComboBox && pComboBox->editable() && pComboBox->lineEdit() )
+++ {
+++ QColorGroup::ColorRole eColorRole = ( pComboBox->isEnabled() )?
+++ QColorGroup::Base: QColorGroup::Background;
+++ qPainter.fillRect(
+++ kapp->style().querySubControlMetrics( QStyle::CC_ComboBox,
+++ pComboBox, QStyle::SC_ComboBoxEditField ),
+++ pComboBox->lineEdit()->colorGroup().brush( eColorRole ) );
+++ }
+++ }
+++ else if ( strcmp( "QLineEdit", pClassName ) == 0 )
+++ {
+++ kapp->style().drawPrimitive( QStyle::PE_PanelLineEdit,
+++ &qPainter, qRect,
+++ pWidget->colorGroup(), nStyle | QStyle::Style_Sunken );
+++ }
+++ else if ( strcmp( "QSpinWidget", pClassName ) == 0 )
+++ {
+++ const SpinbuttonValue *pValue = static_cast<const SpinbuttonValue *> ( &aValue );
+++
+++ // Is any of the buttons pressed?
+++ QStyle::SCFlags eActive = QStyle::SC_None;
+++ if ( pValue )
+++ {
+++ if ( pValue->mnUpperState & CTRL_STATE_PRESSED )
+++ eActive = QStyle::SC_SpinWidgetUp;
+++ else if ( pValue->mnLowerState & CTRL_STATE_PRESSED )
+++ eActive = QStyle::SC_SpinWidgetDown;
+++
+++ // Update the enable/disable state of the widget
+++ if ( ( nState & CTRL_STATE_ENABLED ) ||
+++ ( pValue->mnUpperState & CTRL_STATE_ENABLED ) ||
+++ ( pValue->mnLowerState & CTRL_STATE_ENABLED ) )
+++ {
+++ pWidget->setEnabled( true );
+++ nStyle |= QStyle::Style_Enabled;
+++ }
+++ else
+++ pWidget->setEnabled( false );
+++
+++ // Mouse-over effect
+++ if ( (pValue->mnUpperState & CTRL_STATE_ROLLOVER) ||
+++ (pValue->mnLowerState & CTRL_STATE_ROLLOVER) )
+++ nStyle |= QStyle::Style_MouseOver;
+++ }
+++
+++ // Spin widget uses the background of the associated edit box
+++ QSpinWidget *pSpinWidget = static_cast<QSpinWidget *>( pWidget->qt_cast( "QSpinWidget" ) );
+++ if ( pSpinWidget && pSpinWidget->editWidget() )
+++ {
+++ QColorGroup::ColorRole eColorRole = ( pSpinWidget->isEnabled() )?
+++ QColorGroup::Base: QColorGroup::Background;
+++ qPainter.fillRect(
+++ kapp->style().querySubControlMetrics( QStyle::CC_SpinWidget,
+++ pSpinWidget, QStyle::SC_SpinWidgetEditField ),
+++ pSpinWidget->editWidget()->colorGroup().brush( eColorRole ) );
+++ }
+++
+++ // Adjust the frame (needed for Motif Plus style)
+++ QRect qFrameRect = kapp->style().querySubControlMetrics( QStyle::CC_SpinWidget,
+++ pWidget, QStyle::SC_SpinWidgetFrame );
+++
+++ kapp->style().drawComplexControl( QStyle::CC_SpinWidget,
+++ &qPainter, pWidget, qFrameRect,
+++ pWidget->colorGroup(), nStyle,
+++ QStyle::SC_All, eActive );
+++ }
+++ else if ( strcmp( "QTabBar", pClassName ) == 0 )
+++ {
+++ const TabitemValue *pValue = static_cast<const TabitemValue *> ( &aValue );
+++
+++ QTab *pTab = NULL;
+++ if ( pValue )
+++ {
+++ if ( ( pValue->isFirst() || pValue->isLeftAligned() ) && ( pValue->isLast() || pValue->isRightAligned() ) )
+++ pTab = m_pTabAlone;
+++ else if ( pValue->isFirst() || pValue->isLeftAligned() )
+++ pTab = m_pTabLeft;
+++ else if ( pValue->isLast() || pValue->isRightAligned() )
+++ pTab = m_pTabRight;
+++ else
+++ pTab = m_pTabMiddle;
+++ }
+++ if ( !pTab )
+++ return FALSE;
+++
+++ pTab->setRect( qRect );
+++
+++ kapp->style().drawControl( QStyle::CE_TabBarTab,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle,
+++ QStyleOption( pTab ) );
+++ }
+++ else if ( strcmp( "QTabWidget", pClassName ) == 0 )
+++ {
+++ kapp->style().drawPrimitive( QStyle::PE_PanelTabWidget,
+++ &qPainter, qRect,
+++ pWidget->colorGroup(), nStyle );
+++ }
+++ else if ( strcmp( "QListView", pClassName ) == 0 )
+++ {
+++ kapp->style().drawPrimitive( QStyle::PE_Panel,
+++ &qPainter, qRect,
+++ pWidget->colorGroup(), nStyle | QStyle::Style_Sunken );
+++ }
+++ else if ( strcmp( "QScrollBar", pClassName ) == 0 )
+++ {
+++ const ScrollbarValue *pValue = static_cast<const ScrollbarValue *> ( &aValue );
+++
+++ QStyle::SCFlags eActive = QStyle::SC_None;
+++ if ( pValue )
+++ {
+++ // Workaround for Style_MouseOver-aware themes.
+++ // Quite ugly, but I do not know about a better solution.
+++ const char *pStyleName = kapp->style().className();
+++ if ( strcmp( "QMotifPlusStyle", pStyleName ) == 0 )
+++ {
+++ nStyle |= QStyle::Style_MouseOver;
+++ if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER )
+++ eActive = QStyle::SC_ScrollBarSlider;
+++ }
+++ else if ( strcmp( "QSGIStyle", pStyleName ) == 0 )
+++ {
+++ nStyle |= QStyle::Style_MouseOver;
+++ if ( pValue->mnButton1State & CTRL_STATE_ROLLOVER )
+++ eActive = QStyle::SC_ScrollBarSubLine;
+++ else if ( pValue->mnButton2State & CTRL_STATE_ROLLOVER )
+++ eActive = QStyle::SC_ScrollBarAddLine;
+++ else if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER )
+++ eActive = QStyle::SC_ScrollBarSlider;
+++ }
+++
+++ if ( pValue->mnButton1State & CTRL_STATE_PRESSED )
+++ eActive = QStyle::SC_ScrollBarSubLine;
+++ else if ( pValue->mnButton2State & CTRL_STATE_PRESSED )
+++ eActive = QStyle::SC_ScrollBarAddLine;
+++ else if ( pValue->mnThumbState & CTRL_STATE_PRESSED )
+++ eActive = QStyle::SC_ScrollBarSlider;
+++ else if ( pValue->mnPage1State & CTRL_STATE_PRESSED )
+++ eActive = QStyle::SC_ScrollBarSubPage;
+++ else if ( pValue->mnPage2State & CTRL_STATE_PRESSED )
+++ eActive = QStyle::SC_ScrollBarAddPage;
+++
+++ // Update the enable/disable state of the widget
+++ if ( ( nState & CTRL_STATE_ENABLED ) ||
+++ ( pValue->mnButton1State & CTRL_STATE_ENABLED ) ||
+++ ( pValue->mnButton2State & CTRL_STATE_ENABLED ) ||
+++ ( pValue->mnThumbState & CTRL_STATE_ENABLED ) ||
+++ ( pValue->mnPage1State & CTRL_STATE_ENABLED ) ||
+++ ( pValue->mnPage2State & CTRL_STATE_ENABLED ) )
+++ {
+++ pWidget->setEnabled( true );
+++ nStyle |= QStyle::Style_Enabled;
+++ }
+++ else
+++ pWidget->setEnabled( false );
+++ }
+++
+++ // Is it a horizontal scroll bar?
+++ QScrollBar *pScrollBar = static_cast<QScrollBar *> ( pWidget->qt_cast( "QScrollBar" ) );
+++ QStyle::StyleFlags eHoriz = QStyle::Style_Default;
+++ if ( pScrollBar && pScrollBar->orientation() == Qt::Horizontal )
+++ eHoriz = QStyle::Style_Horizontal;
+++
+++ kapp->style().drawComplexControl( QStyle::CC_ScrollBar,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle | eHoriz,
+++ QStyle::SC_All, eActive );
+++ }
+++ else if ( strcmp( "QToolBar", pClassName ) == 0 )
+++ {
+++ QToolBar *pToolBar = static_cast< QToolBar * >( pWidget->qt_cast( "QToolBar" ) );
+++ bool bIsHorizontal = false;
+++ if ( pToolBar && pToolBar->orientation() == Qt::Horizontal )
+++ {
+++ nStyle |= QStyle::Style_Horizontal;
+++ bIsHorizontal = true;
+++ }
+++
+++ kapp->style().drawControl( QStyle::CE_DockWindowEmptyArea,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle );
+++
+++ kapp->style().drawPrimitive( QStyle::PE_PanelDockWindow,
+++ &qPainter, qRect, pWidget->colorGroup(), nStyle );
+++
+++ if ( nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT )
+++ {
+++ const ToolbarValue *pValue = static_cast< const ToolbarValue * >( &aValue );
+++
+++ QRect qThumbRect = region2QRect( pValue->maGripRect );
+++ qThumbRect.moveBy( -qWidgetPos.x(), -qWidgetPos.y() );
+++ if ( bIsHorizontal )
+++ qThumbRect.addCoords( 0, 2, 0, -3 ); // make the thumb a bit nicer
+++ else
+++ qThumbRect.addCoords( 2, 0, -3, 0 ); // make the thumb a bit nicer
+++
+++ if ( kapp->style().inherits( "HighColorStyle" ) ||
+++ kapp->style().inherits( "HighContrastStyle" ) ||
+++ kapp->style().inherits( "KeramikStyle" ) ||
+++ kapp->style().inherits( "KThemeStyle" ) ||
+++ kapp->style().inherits( "ThinKeramikStyle" ) )
+++ {
+++ // Workaround for the workaround in KStyle::drawPrimitive()
+++ KStyle *pStyle = static_cast< KStyle * >( &kapp->style() );
+++ pStyle->drawKStylePrimitive( KStyle::KPE_ToolBarHandle,
+++ &qPainter, pToolBar, qThumbRect,
+++ pWidget->colorGroup(), nStyle );
+++ }
+++ else
+++ kapp->style().drawPrimitive( QStyle::PE_DockWindowHandle,
+++ &qPainter, qThumbRect, pWidget->colorGroup(), nStyle );
+++ }
+++ }
+++ else if ( strcmp( "QToolButton", pClassName ) == 0 )
+++ {
+++ if( (nStyle & QStyle::Style_MouseOver) )
+++ nStyle &= ~QStyle::Style_Off;
+++ kapp->style().drawComplexControl( QStyle::CC_ToolButton,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle,
+++ QStyle::SC_ToolButton );
+++ }
+++ else if ( strcmp( "QMenuBar", pClassName ) == 0 )
+++ {
+++ if ( nPart == PART_ENTIRE_CONTROL )
+++ {
+++ kapp->style().drawControl( QStyle::CE_MenuBarEmptyArea,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle );
+++ }
+++ else if ( nPart == PART_MENU_ITEM )
+++ {
+++ int nMenuItem = ( nStyle & QStyle::Style_Enabled )? m_nMenuBarEnabledItem: m_nMenuBarDisabledItem;
+++ QMenuItem *pMenuItem = static_cast<QMenuBar*>( pWidget )->findItem( nMenuItem );
+++
+++ if ( nStyle & QStyle::Style_Selected )
+++ nStyle |= QStyle::Style_Active | QStyle::Style_Down | QStyle::Style_HasFocus;
+++
+++ kapp->style().drawControl( QStyle::CE_MenuBarItem,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle,
+++ QStyleOption( pMenuItem ) );
+++ }
+++ }
+++ else if ( strcmp( "QPopupMenu", pClassName ) == 0 )
+++ {
+++ int nMenuItem = ( nStyle & QStyle::Style_Enabled )? m_nPopupMenuEnabledItem: m_nPopupMenuDisabledItem;
+++ QMenuItem *pMenuItem = static_cast<QPopupMenu*>( pWidget )->findItem( nMenuItem );
+++
+++ if ( nStyle & QStyle::Style_Selected )
+++ nStyle |= QStyle::Style_Active;
+++
+++ kapp->style().drawControl( QStyle::CE_PopupMenuItem,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle,
+++ QStyleOption( pMenuItem, 0, 0 ) );
+++ }
+++ else if ( strcmp( "QProgressBar", pClassName ) == 0 )
+++ {
+++ long nProgressWidth = aValue.getNumericVal();
+++ QProgressBar* pProgress = static_cast<QProgressBar*>(pWidget);
+++ pProgress->setProgress( nProgressWidth, qRect.width() );
+++
+++ kapp->style().drawControl( QStyle::CE_ProgressBarGroove,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle );
+++ kapp->style().drawControl( QStyle::CE_ProgressBarContents,
+++ &qPainter, pWidget, qRect,
+++ pWidget->colorGroup(), nStyle );
+++ }
+++ else
+++ return FALSE;
+++
+++ // Bitblt it to the screen
+++ X11SalGraphics::CopyScreenArea( dpy,
+++ qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(),
+++ drawable, nScreen, nDepth,
+++ gc,
+++ 0, 0, qRect.width(), qRect.height(),
+++ qWidgetPos.x(), qWidgetPos.y() );
+++
+++ // Restore widget's position
+++ pWidget->move( qWidgetPos );
+++
+++ return TRUE;
+++}
+++
+++QPushButton *WidgetPainter::pushButton( const Rectangle& rControlRegion,
+++ BOOL bDefault )
+++{
+++ if ( !m_pPushButton )
+++ m_pPushButton = new QPushButton( NULL, "push_button" );
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ // Workaround for broken styles which do not add
+++ // QStyle::PM_ButtonDefaultIndicator to the size of the default button
+++ // (for example Keramik)
+++ // FIXME Fix Keramik style to be consistant with Qt built-in styles. Aargh!
+++ if ( bDefault )
+++ {
+++ QSize qContentsSize( 50, 50 );
+++ m_pPushButton->setDefault( false );
+++ QSize qNormalSize = kapp->style().sizeFromContents( QStyle::CT_PushButton,
+++ m_pPushButton, qContentsSize );
+++ m_pPushButton->setDefault( true );
+++ QSize qDefSize = kapp->style().sizeFromContents( QStyle::CT_PushButton,
+++ m_pPushButton, qContentsSize );
+++
+++ int nIndicatorSize = kapp->style().pixelMetric(
+++ QStyle::PM_ButtonDefaultIndicator, m_pPushButton );
+++ if ( qNormalSize.width() == qDefSize.width() )
+++ qRect.addCoords( nIndicatorSize, 0, -nIndicatorSize, 0 );
+++ if ( qNormalSize.height() == qDefSize.height() )
+++ qRect.addCoords( 0, nIndicatorSize, 0, -nIndicatorSize );
+++ }
+++
+++ m_pPushButton->move( qRect.topLeft() );
+++ m_pPushButton->resize( qRect.size() );
+++ m_pPushButton->setDefault( bDefault );
+++
+++ return m_pPushButton;
+++}
+++
+++QRadioButton *WidgetPainter::radioButton( const Rectangle& rControlRegion )
+++{
+++ if ( !m_pRadioButton )
+++ m_pRadioButton = new QRadioButton( NULL, "radio_button" );
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ // Workaround for broken themes which do not honor the given size.
+++ // Quite ugly, but I do not know about a better solution.
+++ const char *pStyleName = kapp->style().className();
+++ if ( strcmp( "KThemeStyle", pStyleName ) == 0 )
+++ {
+++ QRect qOldRect( qRect );
+++
+++ qRect.setWidth( kapp->style().pixelMetric(
+++ QStyle::PM_ExclusiveIndicatorWidth, m_pRadioButton ) );
+++ qRect.setHeight( kapp->style().pixelMetric(
+++ QStyle::PM_ExclusiveIndicatorHeight, m_pRadioButton ) );
+++
+++ qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2,
+++ ( qOldRect.height() - qRect.height() ) / 2 );
+++ }
+++
+++ m_pRadioButton->move( qRect.topLeft() );
+++ m_pRadioButton->resize( qRect.size() );
+++
+++ return m_pRadioButton;
+++}
+++
+++QCheckBox *WidgetPainter::checkBox( const Rectangle& rControlRegion )
+++{
+++ if ( !m_pCheckBox )
+++ m_pCheckBox = new QCheckBox( NULL, "check_box" );
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ // Workaround for broken themes which do not honor the given size.
+++ // Quite ugly, but I do not know about a better solution.
+++ const char *pStyleName = kapp->style().className();
+++ if ( strcmp( "KThemeStyle", pStyleName ) == 0 )
+++ {
+++ QRect qOldRect( qRect );
+++
+++ qRect.setWidth( kapp->style().pixelMetric(
+++ QStyle::PM_IndicatorWidth, m_pCheckBox ) );
+++ qRect.setHeight( kapp->style().pixelMetric(
+++ QStyle::PM_IndicatorHeight, m_pCheckBox ) );
+++
+++ qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2,
+++ ( qOldRect.height() - qRect.height() ) / 2 );
+++ }
+++
+++ m_pCheckBox->move( qRect.topLeft() );
+++ m_pCheckBox->resize( qRect.size() );
+++
+++ return m_pCheckBox;
+++}
+++
+++QComboBox *WidgetPainter::comboBox( const Rectangle& rControlRegion,
+++ BOOL bEditable )
+++{
+++ QComboBox *pComboBox = NULL;
+++ if ( bEditable )
+++ {
+++ if ( !m_pEditableComboBox )
+++ m_pEditableComboBox = new QComboBox( true, NULL, "combo_box_edit" );
+++ pComboBox = m_pEditableComboBox;
+++ }
+++ else
+++ {
+++ if ( !m_pComboBox )
+++ m_pComboBox = new QComboBox( false, NULL, "combo_box" );
+++ pComboBox = m_pComboBox;
+++ }
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ pComboBox->move( qRect.topLeft() );
+++ pComboBox->resize( qRect.size() );
+++
+++ return pComboBox;
+++}
+++
+++QLineEdit *WidgetPainter::lineEdit( const Rectangle& rControlRegion )
+++{
+++ if ( !m_pLineEdit )
+++ m_pLineEdit = new QLineEdit( NULL, "line_edit" );
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ m_pLineEdit->move( qRect.topLeft() );
+++ m_pLineEdit->resize( qRect.size() );
+++
+++ return m_pLineEdit;
+++}
+++
+++QSpinWidget *WidgetPainter::spinWidget( const Rectangle& rControlRegion )
+++{
+++ if ( !m_pSpinWidget )
+++ {
+++ m_pSpinWidget = new QSpinWidget( NULL, "spin_widget" );
+++
+++ m_pSpinEdit = new QLineEdit( NULL, "line_edit_spin" );
+++ m_pSpinWidget->setEditWidget( m_pSpinEdit );
+++ }
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ m_pSpinWidget->move( qRect.topLeft() );
+++ m_pSpinWidget->resize( qRect.size() );
+++ m_pSpinWidget->arrange();
+++
+++ return m_pSpinWidget;
+++}
+++
+++QTabBar *WidgetPainter::tabBar( const Rectangle& rControlRegion )
+++{
+++ if ( !m_pTabBar )
+++ {
+++ if ( !m_pTabBarParent )
+++ m_pTabBarParent = new QWidget( NULL, "tab_bar_parent" );
+++
+++ m_pTabBar = new QTabBar( m_pTabBarParent, "tab_bar" );
+++
+++ m_pTabLeft = new QTab();
+++ m_pTabMiddle = new QTab();
+++ m_pTabRight = new QTab();
+++ m_pTabAlone = new QTab();
+++
+++ m_pTabBar->addTab( m_pTabLeft );
+++ m_pTabBar->addTab( m_pTabMiddle );
+++ m_pTabBar->addTab( m_pTabRight );
+++ }
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ m_pTabBar->move( qRect.topLeft() );
+++ m_pTabBar->resize( qRect.size() );
+++
+++ m_pTabBar->setShape( QTabBar::RoundedAbove );
+++
+++ return m_pTabBar;
+++}
+++
+++QTabWidget *WidgetPainter::tabWidget( const Rectangle& rControlRegion )
+++{
+++ if ( !m_pTabWidget )
+++ m_pTabWidget = new QTabWidget( NULL, "tab_widget" );
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++ --qRect.rTop();
+++
+++ m_pTabWidget->move( qRect.topLeft() );
+++ m_pTabWidget->resize( qRect.size() );
+++
+++ return m_pTabWidget;
+++}
+++
+++QListView *WidgetPainter::listView( const Rectangle& rControlRegion )
+++{
+++ if ( !m_pListView )
+++ m_pListView = new QListView( NULL, "list_view" );
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ m_pListView->move( qRect.topLeft() );
+++ m_pListView->resize( qRect.size() );
+++
+++ return m_pListView;
+++}
+++
+++QScrollBar *WidgetPainter::scrollBar( const Rectangle& rControlRegion,
+++ BOOL bHorizontal, const ImplControlValue& aValue )
+++{
+++ if ( !m_pScrollBar )
+++ {
+++ m_pScrollBar = new QScrollBar( NULL, "scroll_bar" );
+++ m_pScrollBar->setTracking( false );
+++ m_pScrollBar->setLineStep( 1 );
+++ }
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ m_pScrollBar->move( qRect.topLeft() );
+++ m_pScrollBar->resize( qRect.size() );
+++ m_pScrollBar->setOrientation( bHorizontal? Qt::Horizontal: Qt::Vertical );
+++
+++ const ScrollbarValue *pValue = static_cast<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;
+++}
+++
+++QToolBar *WidgetPainter::toolBar( const Rectangle& rControlRegion, BOOL bHorizontal )
+++{
+++ if ( !m_pMainWindow )
+++ m_pMainWindow = new QMainWindow( NULL, "main_window" );
+++
+++ QToolBar *pToolBar;
+++ if ( bHorizontal )
+++ {
+++ if ( !m_pToolBarHoriz )
+++ {
+++ m_pToolBarHoriz = new QToolBar( m_pMainWindow, "tool_bar_horiz" );
+++ m_pMainWindow->moveDockWindow( m_pToolBarHoriz, Qt::DockTop );
+++ }
+++ pToolBar = m_pToolBarHoriz;
+++ }
+++ else
+++ {
+++ if ( !m_pToolBarVert )
+++ {
+++ m_pToolBarVert = new QToolBar( m_pMainWindow, "tool_bar_horiz" );
+++ m_pMainWindow->moveDockWindow( m_pToolBarVert, Qt::DockLeft );
+++ }
+++ pToolBar = m_pToolBarVert;
+++ }
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ pToolBar->move( qRect.topLeft() );
+++ pToolBar->resize( qRect.size() );
+++
+++ return pToolBar;
+++}
+++
+++QToolButton *WidgetPainter::toolButton( const Rectangle& rControlRegion)
+++{
+++ if ( !m_pToolButton )
+++ m_pToolButton = new QToolButton( NULL, "tool_button" );
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ m_pToolButton->move( qRect.topLeft() );
+++ m_pToolButton->resize( qRect.size() );
+++
+++ return m_pToolButton;
+++}
+++
+++QMenuBar *WidgetPainter::menuBar( const Rectangle& rControlRegion)
+++{
+++ if ( !m_pMenuBar )
+++ {
+++ m_pMenuBar = new QMenuBar( NULL, "menu_bar" );
+++
+++ m_nMenuBarEnabledItem = m_pMenuBar->insertItem( "" );
+++ m_nMenuBarDisabledItem = m_pMenuBar->insertItem( "" );
+++
+++ m_pMenuBar->setItemEnabled( m_nMenuBarEnabledItem, true );
+++ m_pMenuBar->setItemEnabled( m_nMenuBarDisabledItem, false );
+++ }
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ m_pMenuBar->move( qRect.topLeft() );
+++ m_pMenuBar->resize( qRect.size() );
+++
+++ return m_pMenuBar;
+++}
+++
+++QPopupMenu *WidgetPainter::popupMenu( const Rectangle& rControlRegion)
+++{
+++ if ( !m_pPopupMenu )
+++ {
+++ m_pPopupMenu = new QPopupMenu( NULL, "popup_menu" );
+++
+++ m_nPopupMenuEnabledItem = m_pPopupMenu->insertItem( "" );
+++ m_nPopupMenuDisabledItem = m_pPopupMenu->insertItem( "" );
+++
+++ m_pPopupMenu->setItemEnabled( m_nPopupMenuEnabledItem, true );
+++ m_pPopupMenu->setItemEnabled( m_nPopupMenuDisabledItem, false );
+++ }
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ m_pPopupMenu->move( qRect.topLeft() );
+++ m_pPopupMenu->resize( qRect.size() );
+++
+++ return m_pPopupMenu;
+++}
+++
+++QProgressBar *WidgetPainter::progressBar( const Rectangle& rControlRegion )
+++{
+++ if ( !m_pProgressBar )
+++ m_pProgressBar = new QProgressBar( NULL, "progress_bar" );
+++
+++ QRect qRect = region2QRect( rControlRegion );
+++
+++ m_pProgressBar->move( qRect.topLeft() );
+++ m_pProgressBar->resize( qRect.size() );
+++
+++ return m_pProgressBar;
+++}
+++
+++QStyle::SFlags WidgetPainter::vclStateValue2SFlags( ControlState nState,
+++ const ImplControlValue& aValue )
+++{
+++ QStyle::SFlags nStyle =
+++ ( (nState & CTRL_STATE_DEFAULT)? QStyle::Style_ButtonDefault: QStyle::Style_Default ) |
+++ ( (nState & CTRL_STATE_ENABLED)? QStyle::Style_Enabled: QStyle::Style_Default ) |
+++ ( (nState & CTRL_STATE_FOCUSED)? QStyle::Style_HasFocus: QStyle::Style_Default ) |
+++ ( (nState & CTRL_STATE_PRESSED)? QStyle::Style_Down: QStyle::Style_Raised ) |
+++ ( (nState & CTRL_STATE_SELECTED)? QStyle::Style_Selected : QStyle::Style_Default ) |
+++ ( (nState & CTRL_STATE_ROLLOVER)? QStyle::Style_MouseOver: QStyle::Style_Default );
+++ //TODO ( (nState & CTRL_STATE_HIDDEN)? QStyle::Style_: QStyle::Style_Default ) |
+++
+++ switch ( aValue.getTristateVal() )
+++ {
+++ case BUTTONVALUE_ON: nStyle |= QStyle::Style_On; break;
+++ case BUTTONVALUE_OFF: nStyle |= QStyle::Style_Off; break;
+++ case BUTTONVALUE_MIXED: nStyle |= QStyle::Style_NoChange; break;
+++ default: break;
+++ }
+++
+++ return nStyle;
+++}
+++
+++QRect WidgetPainter::region2QRect( const Rectangle& rControlRegion )
+++{
+++ return QRect( QPoint( rControlRegion.Left(), rControlRegion.Top() ),
+++ QPoint( rControlRegion.Right(), rControlRegion.Bottom() ) );
+++}
+++
+++/** Instance of WidgetPainter.
+++
+++ It is used to paint the widgets requested by NWF.
+++*/
+++static WidgetPainter *pWidgetPainter;
+++
+++class TDESalGraphics : public X11SalGraphics
+++{
+++ public:
+++ TDESalGraphics() {}
+++ virtual ~TDESalGraphics() {}
+++ virtual BOOL IsNativeControlSupported( ControlType nType, ControlPart nPart );
+++ virtual BOOL hitTestNativeControl( ControlType nType, ControlPart nPart,
+++ const Rectangle& rControlRegion, const Point& aPos,
+++ BOOL& rIsInside );
+++ virtual BOOL drawNativeControl( ControlType nType, ControlPart nPart,
+++ const Rectangle& rControlRegion, ControlState nState,
+++ const ImplControlValue& aValue,
+++ const OUString& aCaption );
+++ virtual BOOL drawNativeControlText( ControlType nType, ControlPart nPart,
+++ const Rectangle& rControlRegion, ControlState nState,
+++ const ImplControlValue& aValue,
+++ const OUString& aCaption );
+++ virtual BOOL getNativeControlRegion( ControlType nType, ControlPart nPart,
+++ const Rectangle& rControlRegion, ControlState nState,
+++ const ImplControlValue& aValue,
+++ const OUString& aCaption,
+++ Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion );
+++};
+++
+++/** What widgets can be drawn the native way.
+++
+++ @param nType
+++ Type of the widget.
+++
+++ @param nPart
+++ Specification of the widget's part if it consists of more than one.
+++
+++ @return TRUE if the platform supports native drawing of the widget nType
+++ defined by nPart.
+++*/
+++BOOL TDESalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart )
+++{
+++ return
+++ ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) ||
+++ ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) ||
+++ ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) ) ||
+++ ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
+++ ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
+++ ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_WINDOW || nPart == HAS_BACKGROUND_TEXTURE ) ) ||
+++ ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
+++ // no CTRL_SPINBUTTONS for TDE
+++ ( (nType == CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) ) ||
+++ ( (nType == CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) ) ||
+++ // no CTRL_TAB_BODY for TDE
+++ ( (nType == CTRL_SCROLLBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) ) ||
+++ ( (nType == CTRL_SCROLLBAR) && (nPart == HAS_THREE_BUTTONS) ) || // TODO small optimization is possible here: return this only if the style really has 3 buttons
+++ // CTRL_GROUPBOX not supported
+++ // CTRL_FIXEDLINE not supported
+++ // CTRL_FIXEDBORDER not supported
+++ ( (nType == CTRL_TOOLBAR) && (nPart == PART_ENTIRE_CONTROL ||
+++ nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT ||
+++ nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT ||
+++ nPart == PART_BUTTON) ) ||
+++ ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ||
+++ ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ||
+++ ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) )
+++ ;
+++}
+++
+++
+++/** Test whether the position is in the native widget.
+++
+++ If the return value is TRUE, bIsInside contains information whether
+++ aPos was or was not inside the native widget specified by the
+++ nType/nPart combination.
+++*/
+++BOOL TDESalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart,
+++ const Rectangle& rControlRegion, const Point& rPos,
+++ BOOL& rIsInside )
+++{
+++ if ( nType == CTRL_SCROLLBAR )
+++ {
+++ // make position relative to rControlRegion
+++ Point aPos = rPos - rControlRegion.TopLeft();
+++ rIsInside = FALSE;
+++
+++ BOOL bHorizontal = ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT );
+++
+++ QScrollBar *pScrollBar = pWidgetPainter->scrollBar( rControlRegion,
+++ bHorizontal, ImplControlValue() );
+++ QRect qRectSubLine = kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarSubLine );
+++ QRect qRectAddLine = kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarAddLine );
+++
+++ // There are 2 buttons on the right/bottom side of the scrollbar
+++ BOOL bTwoSubButtons = FALSE;
+++
+++ // It is a Platinum style scroll bar
+++ BOOL bPlatinumStyle = FALSE;
+++
+++ // Workaround for Platinum and 3 button style scroll bars.
+++ // It makes the right/down button bigger.
+++ if ( bHorizontal )
+++ {
+++ qRectAddLine.setLeft( kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pScrollBar,
+++ QStyle::SC_ScrollBarAddPage ).right() + 1 );
+++ if ( qRectAddLine.width() > qRectSubLine.width() )
+++ bTwoSubButtons = TRUE;
+++ if ( qRectSubLine.left() > kapp->style().querySubControlMetrics( QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarSubPage ).left() )
+++ bPlatinumStyle = TRUE;
+++ }
+++ else
+++ {
+++ qRectAddLine.setTop( kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pScrollBar,
+++ QStyle::SC_ScrollBarAddPage ).bottom() + 1 );
+++ if ( qRectAddLine.height() > qRectSubLine.height() )
+++ bTwoSubButtons = TRUE;
+++ if ( qRectSubLine.top() > kapp->style().querySubControlMetrics( QStyle::CC_ScrollBar, pScrollBar, QStyle::SC_ScrollBarSubPage ).top() )
+++ bPlatinumStyle = TRUE;
+++ }
+++
+++ switch ( nPart )
+++ {
+++ case PART_BUTTON_LEFT:
+++ if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) )
+++ rIsInside = TRUE;
+++ else if ( bTwoSubButtons )
+++ {
+++ qRectAddLine.setWidth( qRectAddLine.width() / 2 );
+++ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
+++ }
+++ break;
+++
+++ case PART_BUTTON_UP:
+++ if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) )
+++ rIsInside = TRUE;
+++ else if ( bTwoSubButtons )
+++ {
+++ qRectAddLine.setHeight( qRectAddLine.height() / 2 );
+++ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
+++ }
+++ break;
+++
+++ case PART_BUTTON_RIGHT:
+++ if ( bTwoSubButtons )
+++ qRectAddLine.setLeft( qRectAddLine.left() + qRectAddLine.width() / 2 );
+++
+++ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
+++ break;
+++
+++ case PART_BUTTON_DOWN:
+++ if ( bTwoSubButtons )
+++ qRectAddLine.setTop( qRectAddLine.top() + qRectAddLine.height() / 2 );
+++
+++ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
+++ break;
+++
+++ // cases PART_TRACK_HORZ_AREA and PART_TRACK_VERT_AREA
+++ default:
+++ return FALSE;
+++ }
+++
+++ return TRUE;
+++ }
+++
+++ return FALSE;
+++}
+++
+++
+++/** Draw the requested control described by nPart/nState.
+++
+++ @param rControlRegion
+++ The bounding region of the complete control in VCL frame coordinates.
+++
+++ @param aValue
+++ An optional value (tristate/numerical/string).
+++
+++ @param aCaption
+++ A caption or title string (like button text etc.)
+++*/
+++BOOL TDESalGraphics::drawNativeControl( ControlType nType, ControlPart nPart,
+++ const Rectangle& rControlRegion, ControlState nState,
+++ const ImplControlValue& aValue,
+++ const OUString& )
+++{
+++ BOOL bReturn = FALSE;
+++
+++ Display *dpy = GetXDisplay();
+++ XLIB_Window drawable = GetDrawable();
+++ GC gc = SelectPen(); //SelectFont(); // GC with current clipping region set
+++
+++ if ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->pushButton( rControlRegion, (nState & CTRL_STATE_DEFAULT) ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->radioButton( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->checkBox( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->comboBox( rControlRegion, TRUE ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->lineEdit( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->comboBox( rControlRegion, FALSE ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_LISTBOX) && (nPart == PART_WINDOW) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->listView( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->spinWidget( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType==CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->tabBar( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType==CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->tabWidget( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_SCROLLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->scrollBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ, aValue ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT || nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->toolBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_THUMB_VERT ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
+++ }
+++ else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_BUTTON) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->toolButton( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
+++ }
+++ else if ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->menuBar( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
+++ }
+++ else if ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->popupMenu( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++ else if ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) )
+++ {
+++ bReturn = pWidgetPainter->drawStyledWidget(
+++ pWidgetPainter->progressBar( rControlRegion ),
+++ nState, aValue,
+++ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+++ }
+++
+++ return bReturn;
+++}
+++
+++
+++/** Draw text on the widget.
+++
+++ OPTIONAL. Draws the requested text for the control described by nPart/nState.
+++ Used if text is not drawn by DrawNativeControl().
+++
+++ @param rControlRegion
+++ The bounding region of the complete control in VCL frame coordinates.
+++
+++ @param aValue
+++ An optional value (tristate/numerical/string)
+++
+++ @param aCaption
+++ A caption or title string (like button text etc.)
+++*/
+++BOOL TDESalGraphics::drawNativeControlText( ControlType, ControlPart,
+++ const Rectangle&, ControlState,
+++ const ImplControlValue&,
+++ const OUString& )
+++{
+++ return FALSE;
+++}
+++
+++/** Check if the bounding regions match.
+++
+++ If the return value is TRUE, rNativeBoundingRegion
+++ contains the true bounding region covered by the control
+++ including any adornment, while rNativeContentRegion contains the area
+++ within the control that can be safely drawn into without drawing over
+++ the borders of the control.
+++
+++ @param rControlRegion
+++ The bounding region of the control in VCL frame coordinates.
+++
+++ @param aValue
+++ An optional value (tristate/numerical/string)
+++
+++ @param aCaption
+++ A caption or title string (like button text etc.)
+++*/
+++BOOL TDESalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart,
+++ const Rectangle& rControlRegion, ControlState nState,
+++ const ImplControlValue&,
+++ const OUString&,
+++ Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion )
+++{
+++ BOOL bReturn = FALSE;
+++ QRect qBoundingRect = WidgetPainter::region2QRect( rControlRegion );
+++ QRect qRect;
+++
+++ QWidget *pWidget = NULL;
+++ switch ( nType )
+++ {
+++ // Metrics of the push button
+++ case CTRL_PUSHBUTTON:
+++ pWidget = pWidgetPainter->pushButton( rControlRegion, ( nState & CTRL_STATE_DEFAULT ) );
+++
+++ switch ( nPart )
+++ {
+++ case PART_ENTIRE_CONTROL:
+++ qRect = qBoundingRect;
+++
+++ if ( nState & CTRL_STATE_DEFAULT )
+++ {
+++ int nIndicatorSize = kapp->style().pixelMetric(
+++ QStyle::PM_ButtonDefaultIndicator, pWidget );
+++ qBoundingRect.addCoords( -nIndicatorSize, -nIndicatorSize,
+++ nIndicatorSize, nIndicatorSize );
+++ bReturn = TRUE;
+++ }
+++ break;
+++ }
+++ break;
+++
+++ // Metrics of the radio button
+++ case CTRL_RADIOBUTTON:
+++ pWidget = pWidgetPainter->radioButton( rControlRegion );
+++
+++ if ( nPart == PART_ENTIRE_CONTROL )
+++ {
+++ qRect.setWidth( kapp->style().pixelMetric( QStyle::PM_ExclusiveIndicatorWidth, pWidget ) );
+++ qRect.setHeight( kapp->style().pixelMetric( QStyle::PM_ExclusiveIndicatorHeight, pWidget ) );
+++
+++ bReturn = TRUE;
+++ }
+++ break;
+++
+++ // Metrics of the check box
+++ case CTRL_CHECKBOX:
+++ pWidget = pWidgetPainter->checkBox( rControlRegion );
+++
+++ if ( nPart == PART_ENTIRE_CONTROL )
+++ {
+++ qRect.setWidth( kapp->style().pixelMetric( QStyle::PM_IndicatorWidth, pWidget ) );
+++ qRect.setHeight( kapp->style().pixelMetric( QStyle::PM_IndicatorHeight, pWidget ) );
+++
+++ bReturn = TRUE;
+++ }
+++ break;
+++
+++ // Metrics of the combo box
+++ case CTRL_COMBOBOX:
+++ case CTRL_LISTBOX:
+++ pWidget = pWidgetPainter->comboBox( rControlRegion, ( nType == CTRL_COMBOBOX ) );
+++ switch ( nPart )
+++ {
+++ case PART_BUTTON_DOWN:
+++ qRect = kapp->style().querySubControlMetrics(
+++ QStyle::CC_ComboBox, pWidget, QStyle::SC_ComboBoxArrow );
+++ qRect.setLeft( kapp->style().querySubControlMetrics(
+++ QStyle::CC_ComboBox, pWidget,
+++ QStyle::SC_ComboBoxEditField ).right() + 1 );
+++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+++ bReturn = TRUE;
+++ break;
+++
+++ case PART_SUB_EDIT:
+++ qRect = kapp->style().querySubControlMetrics(
+++ QStyle::CC_ComboBox, pWidget, QStyle::SC_ComboBoxEditField );
+++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+++ bReturn = TRUE;
+++ break;
+++ }
+++ break;
+++
+++ // Metrics of the spin box
+++ case CTRL_SPINBOX:
+++ pWidget = pWidgetPainter->spinWidget( rControlRegion );
+++ switch ( nPart )
+++ {
+++ case PART_BUTTON_UP:
+++ qRect = kapp->style().querySubControlMetrics(
+++ QStyle::CC_SpinWidget, pWidget, QStyle::SC_SpinWidgetUp );
+++ bReturn = TRUE;
+++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+++ break;
+++
+++ case PART_BUTTON_DOWN:
+++ qRect = kapp->style().querySubControlMetrics(
+++ QStyle::CC_SpinWidget, pWidget, QStyle::SC_SpinWidgetDown );
+++ bReturn = TRUE;
+++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+++ break;
+++
+++ case PART_SUB_EDIT:
+++ qRect = kapp->style().querySubControlMetrics(
+++ QStyle::CC_SpinWidget, pWidget, QStyle::SC_SpinWidgetEditField );
+++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+++ bReturn = TRUE;
+++ break;
+++ }
+++ break;
+++
+++ // Metrics of the scroll bar
+++ case CTRL_SCROLLBAR:
+++ pWidget = pWidgetPainter->scrollBar( rControlRegion,
+++ ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT ),
+++ ImplControlValue() );
+++ switch ( nPart )
+++ {
+++ case PART_BUTTON_LEFT:
+++ case PART_BUTTON_UP:
+++ qRect = kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pWidget, QStyle::SC_ScrollBarSubLine );
+++
+++ // Workaround for Platinum style scroll bars. It makes the
+++ // left/up button invisible.
+++ if ( nPart == PART_BUTTON_LEFT )
+++ {
+++ if ( qRect.left() > kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pWidget,
+++ QStyle::SC_ScrollBarSubPage ).left() )
+++ {
+++ qRect.setLeft( 0 );
+++ qRect.setRight( 0 );
+++ }
+++ }
+++ else
+++ {
+++ if ( qRect.top() > kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pWidget,
+++ QStyle::SC_ScrollBarSubPage ).top() )
+++ {
+++ qRect.setTop( 0 );
+++ qRect.setBottom( 0 );
+++ }
+++ }
+++
+++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+++
+++ bReturn = TRUE;
+++ break;
+++
+++ case PART_BUTTON_RIGHT:
+++ case PART_BUTTON_DOWN:
+++ qRect = kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pWidget, QStyle::SC_ScrollBarAddLine );
+++
+++ // Workaround for Platinum and 3 button style scroll bars.
+++ // It makes the right/down button bigger.
+++ if ( nPart == PART_BUTTON_RIGHT )
+++ qRect.setLeft( kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pWidget,
+++ QStyle::SC_ScrollBarAddPage ).right() + 1 );
+++ else
+++ qRect.setTop( kapp->style().querySubControlMetrics(
+++ QStyle::CC_ScrollBar, pWidget,
+++ QStyle::SC_ScrollBarAddPage ).bottom() + 1 );
+++
+++ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+++
+++ bReturn = TRUE;
+++ break;
+++ }
+++ break;
+++ }
+++
+++ // Fill rNativeBoundingRegion and rNativeContentRegion
+++ if ( bReturn )
+++ {
+++ // Bounding region
+++ Point aBPoint( qBoundingRect.x(), qBoundingRect.y() );
+++ Size aBSize( qBoundingRect.width(), qBoundingRect.height() );
+++ rNativeBoundingRegion = Rectangle( aBPoint, aBSize );
+++
+++ // Region of the content
+++ Point aPoint( qRect.x(), qRect.y() );
+++ Size aSize( qRect.width(), qRect.height() );
+++ rNativeContentRegion = Rectangle( aPoint, aSize );
+++ }
+++
+++ return bReturn;
+++}
+++
+++// -----------------------------------------------------------------------
+++// TDESalFrame implementation
+++// -----------------------------------------------------------------------
+++
+++TDESalFrame::TDESalFrame( SalFrame* pParent, ULONG nStyle ) :
+++ X11SalFrame( pParent, nStyle )
+++{
+++}
+++
+++void TDESalFrame::Show( BOOL bVisible, BOOL bNoActivate )
+++{
+++ if ( !GetParent() && ! (GetStyle() & SAL_FRAME_STYLE_INTRO) )
+++ {
+++ TDEXLib* pXLib = static_cast<TDEXLib*>(GetDisplay()->GetXLib());
+++ pXLib->doStartup();
+++ }
+++ X11SalFrame::Show( bVisible, bNoActivate );
+++}
+++
+++/** Helper function to convert colors.
+++*/
+++static Color toColor( const QColor &rColor )
+++{
+++ return Color( rColor.red(), rColor.green(), rColor.blue() );
+++}
+++
+++/** Helper function to read untranslated text entry from KConfig configuration repository.
+++*/
+++static OUString readEntryUntranslated( KConfig *pConfig, const char *pKey )
+++{
+++ return OUString::createFromAscii( pConfig->readEntryUntranslated( pKey ).ascii() );
+++}
+++
+++/** Helper function to read color from KConfig configuration repository.
+++*/
+++static Color readColor( KConfig *pConfig, const char *pKey )
+++{
+++ return toColor( pConfig->readColorEntry( pKey ) );
+++}
+++
+++/** Helper function to add information to Font from QFont.
+++
+++ Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx).
+++*/
+++static Font toFont( const QFont &rQFont, const ::com::sun::star::lang::Locale& rLocale )
+++{
+++ psp::FastPrintFontInfo aInfo;
+++ QFontInfo qFontInfo( rQFont );
+++
+++ // set family name
+++ aInfo.m_aFamilyName = String( rQFont.family().utf8(), RTL_TEXTENCODING_UTF8 );
+++
+++ // set italic
+++ aInfo.m_eItalic = ( qFontInfo.italic()? psp::italic::Italic: psp::italic::Upright );
+++
+++ // set weight
+++ int nWeight = qFontInfo.weight();
+++ if ( nWeight <= QFont::Light )
+++ aInfo.m_eWeight = psp::weight::Light;
+++ else if ( nWeight <= QFont::Normal )
+++ aInfo.m_eWeight = psp::weight::Normal;
+++ else if ( nWeight <= QFont::DemiBold )
+++ aInfo.m_eWeight = psp::weight::SemiBold;
+++ else if ( nWeight <= QFont::Bold )
+++ aInfo.m_eWeight = psp::weight::Bold;
+++ else
+++ aInfo.m_eWeight = psp::weight::UltraBold;
+++
+++ // set width
+++ int nStretch = rQFont.stretch();
+++ if ( nStretch <= QFont::UltraCondensed )
+++ aInfo.m_eWidth = psp::width::UltraCondensed;
+++ else if ( nStretch <= QFont::ExtraCondensed )
+++ aInfo.m_eWidth = psp::width::ExtraCondensed;
+++ else if ( nStretch <= QFont::Condensed )
+++ aInfo.m_eWidth = psp::width::Condensed;
+++ else if ( nStretch <= QFont::SemiCondensed )
+++ aInfo.m_eWidth = psp::width::SemiCondensed;
+++ else if ( nStretch <= QFont::Unstretched )
+++ aInfo.m_eWidth = psp::width::Normal;
+++ else if ( nStretch <= QFont::SemiExpanded )
+++ aInfo.m_eWidth = psp::width::SemiExpanded;
+++ else if ( nStretch <= QFont::Expanded )
+++ aInfo.m_eWidth = psp::width::Expanded;
+++ else if ( nStretch <= QFont::ExtraExpanded )
+++ aInfo.m_eWidth = psp::width::ExtraExpanded;
+++ else
+++ aInfo.m_eWidth = psp::width::UltraExpanded;
+++
+++#if OSL_DEBUG_LEVEL > 1
+++ fprintf( stderr, "font name BEFORE system match: \"%s\"\n", OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() );
+++#endif
+++
+++ // match font to e.g. resolve "Sans"
+++ psp::PrintFontManager::get().matchFont( aInfo, rLocale );
+++
+++#if OSL_DEBUG_LEVEL > 1
+++ fprintf( stderr, "font match %s, name AFTER: \"%s\"\n",
+++ aInfo.m_nID != 0 ? "succeeded" : "failed",
+++ OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() );
+++#endif
+++
+++ // font height
+++ int nPointHeight = qFontInfo.pointSize();
+++ if ( nPointHeight <= 0 )
+++ nPointHeight = rQFont.pointSize();
+++
+++ // Create the font
+++ Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) );
+++ if( aInfo.m_eWeight != psp::weight::Unknown )
+++ aFont.SetWeight( PspGraphics::ToFontWeight( aInfo.m_eWeight ) );
+++ if( aInfo.m_eWidth != psp::width::Unknown )
+++ aFont.SetWidthType( PspGraphics::ToFontWidth( aInfo.m_eWidth ) );
+++ if( aInfo.m_eItalic != psp::italic::Unknown )
+++ aFont.SetItalic( PspGraphics::ToFontItalic( aInfo.m_eItalic ) );
+++ if( aInfo.m_ePitch != psp::pitch::Unknown )
+++ aFont.SetPitch( PspGraphics::ToFontPitch( aInfo.m_ePitch ) );
+++
+++ return aFont;
+++}
+++
+++/** Implementation of TDE integration's main method.
+++*/
+++void TDESalFrame::UpdateSettings( AllSettings& rSettings )
+++{
+++ StyleSettings aStyleSettings( rSettings.GetStyleSettings() );
+++ bool bSetTitleFont = false;
+++
+++ aStyleSettings.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_LARGE );
+++
+++ // WM settings
+++ KConfig *pConfig = KGlobal::config();
+++ if ( pConfig )
+++ {
+++ pConfig->setGroup( "WM" );
+++ const char *pKey;
+++
+++ pKey = "activeBackground";
+++ if ( pConfig->hasKey( pKey ) )
+++ aStyleSettings.SetActiveColor( readColor( pConfig, pKey ) );
+++
+++ pKey = "activeBlend";
+++ if ( pConfig->hasKey( pKey ) )
+++ aStyleSettings.SetActiveColor2( readColor( pConfig, pKey ) );
+++
+++ pKey = "inactiveBackground";
+++ if ( pConfig->hasKey( pKey ) )
+++ aStyleSettings.SetDeactiveColor( readColor( pConfig, pKey ) );
+++
+++ pKey = "inactiveBlend";
+++ if ( pConfig->hasKey( pKey ) )
+++ aStyleSettings.SetDeactiveColor2( readColor( pConfig, pKey ) );
+++
+++ pKey = "inactiveForeground";
+++ if ( pConfig->hasKey( pKey ) )
+++ aStyleSettings.SetDeactiveTextColor( readColor( pConfig, pKey ) );
+++
+++ pKey = "activeForeground";
+++ if ( pConfig->hasKey( pKey ) )
+++ aStyleSettings.SetActiveTextColor( readColor( pConfig, pKey ) );
+++
+++ pKey = "titleFont";
+++ if ( pConfig->hasKey( pKey ) )
+++ {
+++ Font aFont = toFont( pConfig->readFontEntry( pKey ), rSettings.GetUILocale() );
+++ aStyleSettings.SetTitleFont( aFont );
+++ bSetTitleFont = true;
+++ }
+++
+++ pConfig->setGroup( "Icons" );
+++
+++ pKey = "Theme";
+++ if ( pConfig->hasKey( pKey ) )
+++ aStyleSettings.SetPreferredSymbolsStyleName( readEntryUntranslated( pConfig, pKey ) );
+++ }
+++
+++ // General settings
+++ QColorGroup qColorGroup = kapp->palette().active();
+++
+++ Color aFore = toColor( qColorGroup.foreground() );
+++ Color aBack = toColor( qColorGroup.background() );
+++ Color aText = toColor( qColorGroup.text() );
+++ Color aBase = toColor( qColorGroup.base() );
+++
+++ // Foreground
+++ aStyleSettings.SetRadioCheckTextColor( aFore );
+++ aStyleSettings.SetLabelTextColor( aFore );
+++ aStyleSettings.SetInfoTextColor( aFore );
+++ aStyleSettings.SetDialogTextColor( aFore );
+++ aStyleSettings.SetGroupTextColor( aFore );
+++
+++ // Text
+++ aStyleSettings.SetFieldTextColor( aText );
+++ aStyleSettings.SetFieldRolloverTextColor( aText );
+++ aStyleSettings.SetWindowTextColor( aText );
+++ aStyleSettings.SetHelpTextColor( aText );
+++
+++ // Base
+++ aStyleSettings.SetFieldColor( aBase );
+++ aStyleSettings.SetHelpColor( aBase );
+++ aStyleSettings.SetWindowColor( aBase );
+++ aStyleSettings.SetActiveTabColor( aBase );
+++
+++ // Buttons
+++ aStyleSettings.SetButtonTextColor( toColor( qColorGroup.buttonText() ) );
+++ aStyleSettings.SetButtonRolloverTextColor( toColor( qColorGroup.buttonText() ) );
+++
+++ // Disable color
+++ aStyleSettings.SetDisableColor( toColor( qColorGroup.mid() ) );
+++
+++ // Workspace
+++ aStyleSettings.SetWorkspaceColor( toColor( qColorGroup.mid() ) );
+++
+++ // Background
+++ aStyleSettings.Set3DColors( aBack );
+++ aStyleSettings.SetFaceColor( aBack );
+++ aStyleSettings.SetInactiveTabColor( aBack );
+++ aStyleSettings.SetDialogColor( aBack );
+++ if( aBack == COL_LIGHTGRAY )
+++ aStyleSettings.SetCheckedColor( Color( 0xCC, 0xCC, 0xCC ) );
+++ else
+++ {
+++ Color aColor2 = aStyleSettings.GetLightColor();
+++ aStyleSettings.
+++ SetCheckedColor( Color( (BYTE)(((USHORT)aBack.GetRed()+(USHORT)aColor2.GetRed())/2),
+++ (BYTE)(((USHORT)aBack.GetGreen()+(USHORT)aColor2.GetGreen())/2),
+++ (BYTE)(((USHORT)aBack.GetBlue()+(USHORT)aColor2.GetBlue())/2)
+++ ) );
+++ }
+++
+++ // Selection
+++ aStyleSettings.SetHighlightColor( toColor( qColorGroup.highlight() ) );
+++ aStyleSettings.SetHighlightTextColor( toColor( qColorGroup.highlightedText() ) );
+++
+++ // Font
+++ Font aFont = toFont( kapp->font(), rSettings.GetUILocale() );
+++
+++ aStyleSettings.SetAppFont( aFont );
+++ aStyleSettings.SetHelpFont( aFont );
+++ aStyleSettings.SetMenuFont( aFont ); // will be changed according to pMenuBar
+++ aStyleSettings.SetToolFont( aFont ); // will be changed according to pToolBar
+++ aStyleSettings.SetLabelFont( aFont );
+++ aStyleSettings.SetInfoFont( aFont );
+++ aStyleSettings.SetRadioCheckFont( aFont );
+++ aStyleSettings.SetPushButtonFont( aFont );
+++ aStyleSettings.SetFieldFont( aFont );
+++ aStyleSettings.SetIconFont( aFont );
+++ aStyleSettings.SetGroupFont( aFont );
+++
+++ aFont.SetWeight( WEIGHT_BOLD );
+++ if( !bSetTitleFont )
+++ aStyleSettings.SetTitleFont( aFont );
+++ aStyleSettings.SetFloatTitleFont( aFont );
+++
+++ int flash_time = QApplication::cursorFlashTime();
+++ aStyleSettings.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME );
+++
+++ KMainWindow qMainWindow;
+++ qMainWindow.createGUI( "/dev/null" ); // hack
+++
+++ // Menu
+++ aStyleSettings.SetSkipDisabledInMenus( TRUE );
+++ KMenuBar *pMenuBar = qMainWindow.menuBar();
+++ if ( pMenuBar )
+++ {
+++ // Color
+++ QColorGroup qMenuCG = pMenuBar->colorGroup();
+++
+++ // Menu text and background color, theme specific
+++ Color aMenuFore = toColor( qMenuCG.foreground() );
+++ Color aMenuBack = toColor( qMenuCG.background() );
+++ if ( kapp->style().inherits( "LightStyleV2" ) ||
+++ kapp->style().inherits( "LightStyleV3" ) ||
+++ ( kapp->style().inherits( "QMotifStyle" ) && !kapp->style().inherits( "QSGIStyle" ) ) ||
+++ kapp->style().inherits( "QWindowsStyle" ) )
+++ {
+++ aMenuFore = toColor( qMenuCG.buttonText() );
+++ aMenuBack = toColor( qMenuCG.button() );
+++ }
+++
+++ aStyleSettings.SetMenuTextColor( aMenuFore );
+++ aStyleSettings.SetMenuBarTextColor( aMenuFore );
+++ aStyleSettings.SetMenuColor( aMenuBack );
+++ aStyleSettings.SetMenuBarColor( aMenuBack );
+++
+++ aStyleSettings.SetMenuHighlightColor( toColor ( qMenuCG.highlight() ) );
+++
+++ // Menu items higlight text color, theme specific
+++ if ( kapp->style().inherits( "HighContrastStyle" ) ||
+++ kapp->style().inherits( "KeramikStyle" ) ||
+++ kapp->style().inherits( "QWindowsStyle" ) ||
+++ kapp->style().inherits( "ThinKeramikStyle" ) ||
+++ kapp->style().inherits( "PlastikStyle" ) )
+++ {
+++ aStyleSettings.SetMenuHighlightTextColor( toColor ( qMenuCG.highlightedText() ) );
+++ }
+++ else
+++ aStyleSettings.SetMenuHighlightTextColor( aMenuFore );
+++
+++ // set special menubar higlight text color
+++ if ( kapp->style().inherits( "HighContrastStyle" ) )
+++ ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.highlightedText() );
+++ else
+++ ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore;
+++
+++ // Font
+++ aFont = toFont( pMenuBar->font(), rSettings.GetUILocale() );
+++ aStyleSettings.SetMenuFont( aFont );
+++ }
+++
+++ // Tool bar
+++ KToolBar *pToolBar = qMainWindow.toolBar();
+++ if ( pToolBar )
+++ {
+++ aFont = toFont( pToolBar->font(), rSettings.GetUILocale() );
+++ aStyleSettings.SetToolFont( aFont );
+++ }
+++
+++ // Scroll bar size
+++ aStyleSettings.SetScrollBarSize( kapp->style().pixelMetric( QStyle::PM_ScrollBarExtent ) );
+++
+++ rSettings.SetStyleSettings( aStyleSettings );
+++}
+++
+++SalGraphics* TDESalFrame::GetGraphics()
+++{
+++ if( GetWindow() )
+++ {
+++ for( int i = 0; i < nMaxGraphics; i++ )
+++ {
+++ if( ! m_aGraphics[i].bInUse )
+++ {
+++ m_aGraphics[i].bInUse = true;
+++ if( ! m_aGraphics[i].pGraphics )
+++ {
+++ m_aGraphics[i].pGraphics = new TDESalGraphics();
+++ m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() );
+++ }
+++ return m_aGraphics[i].pGraphics;
+++ }
+++ }
+++ }
+++
+++ return NULL;
+++}
+++
+++void TDESalFrame::ReleaseGraphics( SalGraphics *pGraphics )
+++{
+++ for( int i = 0; i < nMaxGraphics; i++ )
+++ {
+++ if( m_aGraphics[i].pGraphics == pGraphics )
+++ {
+++ m_aGraphics[i].bInUse = false;
+++ break;
+++ }
+++ }
+++}
+++
+++void TDESalFrame::updateGraphics( bool bClear )
+++{
+++ Drawable aDrawable = bClear ? None : GetWindow();
+++ for( int i = 0; i < nMaxGraphics; i++ )
+++ {
+++ if( m_aGraphics[i].bInUse )
+++ m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() );
+++ }
+++}
+++
+++TDESalFrame::~TDESalFrame()
+++{
+++}
+++
+++TDESalFrame::GraphicsHolder::~GraphicsHolder()
+++{
+++ delete pGraphics;
+++}
+++
+++// -----------------------------------------------------------------------
+++// TDESalInstance implementation
+++// -----------------------------------------------------------------------
+++
+++SalFrame *
+++TDESalInstance::CreateFrame( SalFrame *pParent, ULONG nStyle )
+++{
+++ return new TDESalFrame( pParent, nStyle );
+++}
+++
+++// -----------------------------------------------------------------------
+++// TDESalData pieces
+++// -----------------------------------------------------------------------
+++
+++// Create the widget painter so we have some control over
+++// the destruction sequence, so Qt doesn't die in action.
+++
+++void TDEData::initNWF()
+++{
+++ ImplSVData *pSVData = ImplGetSVData();
+++ // draw toolbars on separate lines
+++ pSVData->maNWFData.mbDockingAreaSeparateTB = true;
+++
+++ pWidgetPainter = new WidgetPainter();
+++}
+++
+++void TDEData::deInitNWF()
+++{
+++ delete pWidgetPainter;
+++ pWidgetPainter = NULL;
+++
+++ // We have to destroy the style early
+++ kapp->setStyle( NULL );
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN vcl/unx/tde/tdedata.cxx vcl/unx/tde/tdedata.cxx
++--- vcl/unx/tde/tdedata.cxx 1969-12-31 18:00:00.000000000 -0600
+++++ vcl/unx/tde/tdedata.cxx 2011-08-18 20:14:26.186519004 -0500
++@@ -0,0 +1,274 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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 = QPaintDevice::x11AppDisplay();
+++
+++ SalDisplay *pSalDisplay = new SalTDEDisplay( pDisp );
+++
+++ pInputMethod->CreateMethod( pDisp );
+++ pInputMethod->AddConnectionWatch( pDisp, (void*)this );
+++ pSalDisplay->SetInputMethod( pInputMethod );
+++
+++ PushXErrorLevel( true );
+++ SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp );
+++ XSync( pDisp, False );
+++
+++ pKbdExtension->UseExtension( ! HasXErrorOccured() );
+++ PopXErrorLevel();
+++
+++ pSalDisplay->SetKbdExtension( pKbdExtension );
+++}
+++
+++void TDEXLib::doStartup()
+++{
+++ if( ! m_bStartupDone )
+++ {
+++ KStartupInfo::appStarted();
+++ m_bStartupDone = true;
+++ #if OSL_DEBUG_LEVEL > 1
+++ fprintf( stderr, "called KStartupInfo::appStarted()\n" );
+++ #endif
+++ }
+++}
+++
+++/**********************************************************************
+++ * class TDEData *
+++ **********************************************************************/
+++
+++TDEData::~TDEData()
+++{
+++}
+++
+++void TDEData::Init()
+++{
+++ pXLib_ = new TDEXLib();
+++ pXLib_->Init();
+++}
+++
+++/**********************************************************************
+++ * plugin entry point *
+++ **********************************************************************/
+++
+++extern "C" {
+++ VCL_DLLPUBLIC SalInstance* create_SalInstance( oslModule )
+++ {
+++ /* #i92121# workaround deadlocks in the X11 implementation
+++ */
+++ static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" );
+++ /* #i90094#
+++ from now on we know that an X connection will be
+++ established, so protect X against itself
+++ */
+++ if( ! ( pNoXInitThreads && *pNoXInitThreads ) )
+++ XInitThreads();
+++
+++ rtl::OString aVersion( qVersion() );
+++#if OSL_DEBUG_LEVEL > 1
+++ fprintf( stderr, "qt version string is \"%s\"\n", aVersion.getStr() );
+++#endif
+++ sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0, nMicro = 0;
+++ nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32();
+++ if( nIndex > 0 )
+++ nMinor = aVersion.getToken( 0, '.', nIndex ).toInt32();
+++ if( nIndex > 0 )
+++ nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32();
+++ if( nMajor != 3 || nMinor < 2 || (nMinor == 2 && nMicro < 2) )
+++ {
+++#if OSL_DEBUG_LEVEL > 1
+++ fprintf( stderr, "unsuitable qt version %d.%d.%d\n", (int)nMajor, (int)nMinor, (int)nMicro );
+++#endif
+++ return NULL;
+++ }
+++
+++ TDESalInstance* pInstance = new TDESalInstance( new SalYieldMutex() );
+++#if OSL_DEBUG_LEVEL > 1
+++ fprintf( stderr, "created TDESalInstance 0x%p\n", pInstance );
+++#endif
+++
+++ // initialize SalData
+++ TDEData *pSalData = new TDEData();
+++ SetSalData( pSalData );
+++ pSalData->m_pInstance = pInstance;
+++ pSalData->Init();
+++ pSalData->initNWF();
+++
+++ return pInstance;
+++ }
+++}
+++
+++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++diff -urN vcl/prj/build.lst vcl/prj/build.lst
++--- vcl/prj/build.lst 2010-11-11 13:09:00.000000000 -0600
+++++ vcl/prj/build.lst 2011-08-18 20:31:51.496382806 -0500
++@@ -35,6 +35,7 @@
++ vc vcl\unx\headless nmake - u vc__hl vc_inc NULL
++ vc vcl\unx\kde nmake - u vc__kde vc_inc NULL
++ vc vcl\unx\kde4 nmake - u vc__kde4 vc_inc NULL
+++vc vcl\unx\tde nmake - u vc__tde vc_inc NULL
++ vc vcl\aqua\source\a11y nmake - u vc__aquy vc_inc NULL
++ vc vcl\aqua\source\app nmake - u vc__appa vc_inc NULL
++ vc vcl\aqua\source\dtrans nmake - u vc__dtra vc_inc NULL
++@@ -45,6 +46,6 @@
++ vc vcl\mac\source\gdi nmake - m vc__gdim vc_inc NULL
++ vc vcl\mac\source\window nmake - m vc__winm vc_inc NULL
++ vc vcl\mac\source\src nmake - m vc__srcm vc_inc NULL
++-vc vcl\util nmake - all vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL
+++vc vcl\util nmake - all vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__tde.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL
++ vc vcl\util\linksvp nmake - u vc_lsvp vc_util NULL
++ vc vcl\workben nmake - all vc_wrkb vc_util vc_salmain NULL
++diff -urN vcl/prj/d.lst vcl/prj/d.lst
++--- vcl/prj/d.lst 2010-11-11 09:22:48.000000000 -0600
+++++ vcl/prj/d.lst 2011-08-18 20:30:59.772430360 -0500
++@@ -62,6 +62,7 @@
++ ..\inc\vcl\javachild.hxx %_DEST%\inc%_EXT%\vcl\javachild.hxx
++ ..\inc\vcl\jobset.hxx %_DEST%\inc%_EXT%\vcl\jobset.hxx
++ ..\unx\inc\kde_headers.h %_DEST%\inc%_EXT%\vcl\kde_headers.h
+++..\unx\inc\tde_headers.h %_DEST%\inc%_EXT%\vcl\tde_headers.h
++ ..\inc\vcl\keycod.hxx %_DEST%\inc%_EXT%\vcl\keycod.hxx
++ ..\inc\vcl\keycodes.hxx %_DEST%\inc%_EXT%\vcl\keycodes.hxx
++ ..\inc\vcl\lineinfo.hxx %_DEST%\inc%_EXT%\vcl\lineinfo.hxx
++diff -urN vcl/source/app/settings.cxx vcl/source/app/settings.cxx
++--- vcl/source/app/settings.cxx 2011-03-08 12:51:41.000000000 -0600
+++++ vcl/source/app/settings.cxx 2011-08-18 20:32:39.820075101 -0500
++@@ -830,6 +830,8 @@
++ nRet = STYLE_SYMBOLS_CRYSTAL;
++ else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "kde4" ) )
++ nRet = STYLE_SYMBOLS_OXYGEN;
+++ else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "tde" ) )
+++ nRet = STYLE_SYMBOLS_CRYSTAL;
++ }
++
++ // falback to any existing style
++diff -urN vcl/unx/source/gdi/dtint.cxx vcl/unx/source/gdi/dtint.cxx
++--- vcl/unx/source/gdi/dtint.cxx 2010-11-11 09:22:48.000000000 -0600
+++++ vcl/unx/source/gdi/dtint.cxx 2011-08-18 20:35:34.753448320 -0500
++@@ -96,7 +96,7 @@
++ /*
++ * #i22061# override desktop detection
++ * if environment variable OOO_FORCE_DESKTOP is set
++- * to one of "cde" "kde" "gnome" then autodetection
+++ * to one of "cde" "kde" "tde" "gnome" then autodetection
++ * is overridden.
++ */
++ static const char* pOverride = getenv( "OOO_FORCE_DESKTOP" );
++diff -urN vcl/unx/source/plugadapt/salplug.cxx vcl/unx/source/plugadapt/salplug.cxx
++--- vcl/unx/source/plugadapt/salplug.cxx 2010-11-11 13:09:00.000000000 -0600
+++++ vcl/unx/source/plugadapt/salplug.cxx 2011-08-18 20:35:23.512588295 -0500
++@@ -55,10 +55,11 @@
++ DESKTOP_GNOME,
++ DESKTOP_KDE,
++ DESKTOP_KDE4,
+++ DESKTOP_TDE,
++ DESKTOP_CDE
++ };
++
++-static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "CDE" };
+++static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "TDE", "CDE" };
++
++ static SalInstance* tryInstance( const OUString& rModuleBase )
++ {
++@@ -162,7 +166,7 @@
++ {
++ static const char* pKDEFallbackList[] =
++ {
++- "kde4", "kde", "gtk", "gen", 0
+++ "kde4", "kde", "tde", "gtk", "gen", 0
++ };
++
++ static const char* pStandardFallbackList[] =
++@@ -191,6 +195,11 @@
++ }
++ else if( desktop.equalsAscii( desktop_strings[DESKTOP_KDE4] ) )
++ pList = pKDEFallbackList;
+++ else if( desktop.equalsAscii( desktop_strings[DESKTOP_TDE] ) )
+++ {
+++ pList = pKDEFallbackList;
+++ nListEntry = 1;
+++ }
++
++ SalInstance* pInst = NULL;
++ while( pList[nListEntry] && pInst == NULL )
++@@ -235,7 +244,7 @@
++ pInst = autodetect_plugin();
++
++ // fallback, try everything
++- const char* pPlugin[] = { "gtk", "kde", "gen", 0 };
+++ const char* pPlugin[] = { "gtk", "kde", "tde", "gen", 0 };
++
++ for ( int i = 0; !pInst && pPlugin[ i ]; ++i )
++ pInst = tryInstance( OUString::createFromAscii( pPlugin[ i ] ) );
++diff -urN vcl/unx/inc/plugins/tde/tdedata.hxx vcl/unx/inc/plugins/tde/tdedata.hxx
++--- vcl/unx/inc/plugins/tde/tdedata.hxx 1969-12-31 18:00:00.000000000 -0600
+++++ vcl/unx/inc/plugins/tde/tdedata.hxx 2011-08-18 20:45:32.009117227 -0500
++@@ -0,0 +1,114 @@
+++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+++/*************************************************************************
+++ *
+++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+++ *
+++ * Copyright 2000, 2010 Oracle and/or its affiliates.
+++ * Copyright 2011 Timothy Pearson
+++ *
+++ * OpenOffice.org - a multi-platform office productivity suite
+++ *
+++ * This file is part of OpenOffice.org.
+++ *
+++ * OpenOffice.org is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU Lesser General Public License version 3
+++ * only, as published by the Free Software Foundation.
+++ *
+++ * OpenOffice.org is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU Lesser General Public License version 3 for more details
+++ * (a copy is included in the LICENSE file that accompanied this code).
+++ *
+++ * You should have received a copy of the GNU Lesser General Public License
+++ * version 3 along with OpenOffice.org. If not, see
+++ * <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-08-18 22:40:48.267879029 -0500
+@@ -10,7 +10,7 @@
+ +++ vcl/prj/build.lst
+ @@ -47,4 +47,3 @@ vc vcl\mac\source\window nmake - m vc__winm vc_inc NULL
+ vc vcl\mac\source\src nmake - m vc__srcm vc_inc NULL
+- vc vcl\util nmake - all vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL
++ vc vcl\util nmake - all vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__tde.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL
+ vc vcl\util\linksvp nmake - u vc_lsvp vc_util NULL
+ -vc vcl\workben nmake - all vc_wrkb vc_util vc_salmain NULL
+ diff --git vcl/prj/tests.lst vcl/prj/tests.lst
+Binary files new.ORIGINAL.FROMARCHIVE.UNTOUCHABLE/libreoffice_3.3.2-1ubuntu4.debian.tar.gz and new.trinity.latest/libreoffice_3.3.2-1ubuntu4.debian.tar.gz differ