diff options
| author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-08-20 00:49:05 -0500 | 
|---|---|---|
| committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-08-20 00:49:05 -0500 | 
| commit | c7c6615d7a0173184f64e80ee649c22726d0a872 (patch) | |
| tree | feed1a2667e550abca390d1a8d0e78066ebe3262 | |
| download | thirdparty-c7c6615d7a0173184f64e80ee649c22726d0a872.tar.gz thirdparty-c7c6615d7a0173184f64e80ee649c22726d0a872.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-- | libreoffice/3.3.2/patches/libreoffice-trinity-debian.diff | 239 | ||||
| -rw-r--r-- | libreoffice/3.3.2/patches/libreoffice-trinity.diff | 15829 | 
2 files changed, 16068 insertions, 0 deletions
| diff --git a/libreoffice/3.3.2/patches/libreoffice-trinity-debian.diff b/libreoffice/3.3.2/patches/libreoffice-trinity-debian.diff new file mode 100644 index 0000000..562157f --- /dev/null +++ b/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/libreoffice/3.3.2/patches/libreoffice-trinity.diff b/libreoffice/3.3.2/patches/libreoffice-trinity.diff new file mode 100644 index 0000000..7431c4c --- /dev/null +++ b/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 | 
