You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
thirdparty/libreoffice/git_10_28_2011/patches/libreoffice-trinity.diff

16172 lines
637 KiB

diff --git a/Repository.mk b/Repository.mk
index 5fab1b5..f123f3b 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -229,6 +229,7 @@ $(eval $(call gb_Helper_register_libraries,OOOLIBS, \
vclplug_gtk \
vclplug_gtk3 \
vclplug_kde \
+ vclplug_tde \
vclplug_kde4 \
vclplug_svp \
visioimport \
diff --git a/bin/distro-install-file-lists b/bin/distro-install-file-lists
index b233030..23f2504 100755
--- a/bin/distro-install-file-lists
+++ b/bin/distro-install-file-lists
@@ -211,6 +211,13 @@ if test "z$OOO_VENDOR" != "zDebian" ; then
mv_file_between_flists kde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libkabdrv1.so
add_used_directories kde_list.txt common_list.txt
+ # tde subpackage
+ test -f $DESTDIR/gid_Module_Optional_Tde && cp $DESTDIR/gid_Module_Optional_Tde tde_list.txt || :
+ mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/program/tdefilepicker
+ mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/fps_tde.uno.so
+ mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libvclplug_tdel..so
+ mv_file_between_flists tde_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libtdeabdrv1.so
+
# create kde4 subpackage
mv_file_between_flists kde4_list.txt kde_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/kde4be1.uno.so
mv_file_between_flists kde4_list.txt common_list.txt $INSTALLDIR/basis$PRODUCTVERSION/program/libvclplug_kde4l..so
@@ -416,6 +423,7 @@ else
create_package_directory gid_Module_Optional_Pyuno pkg/python-uno
create_package_directory gid_Module_Optional_Gnome pkg/libreoffice-gnome
create_package_directory gid_Module_Optional_Kde pkg/libreoffice-kde
+ create_package_directory gid_Module_Optional_Tde pkg/libreoffice-tde
create_package_directory gid_Module_Root_Files_2 pkg/libreoffice-common
create_package_directory gid_Module_Root_Files_3 pkg/libreoffice-common
@@ -494,7 +502,7 @@ else
fi &&
( cd pkg/libreoffice-common/$d
find -maxdepth 1 \
- -regex '\./\(.*\.so.*\|.*\.bin\|pagein\|nsplugin\|kdefilepicker\|msfontextract\|.*\.rdb\|javaldx\|uri-encode\)' \
+ -regex '\./\(.*\.so.*\|.*\.bin\|pagein\|nsplugin\|kdefilepicker\|tdefilepicker\|msfontextract\|.*\.rdb\|javaldx\|uri-encode\)' \
-exec mv {} $DESTDIR/pkg/libreoffice-core/$d \;
); \
done
diff --git a/configure.in b/configure.in
index 3b48331..2888cbb 100644
--- a/configure.in
+++ b/configure.in
@@ -381,6 +381,15 @@ AC_ARG_ENABLE(kdeab,
fi
)
+AC_ARG_ENABLE(tde,
+[ --enable-tde Determines whether to use TQt3/TDE vclplug on platforms
+ where TQt and TDE are available.
+],,)
+
+AC_ARG_ENABLE(tdeab,
+[ --disable-tdeab Disable the TDE address book support
+],,if test "$enable_tde" = "yes"; then enable_tdeab=yes; fi)
+
AC_ARG_ENABLE(kde4,
AS_HELP_STRING([--enable-kde4],
[Determines whether to use Qt4/KDE4 vclplug on platforms where Qt4 and
@@ -1554,6 +1563,7 @@ solaris*)
test_gtk=yes
build_gstreamer=yes
test_kde=yes
+ test_tde=yes
test_freetype=yes
test_gstreamer=yes
_os=SunOS
@@ -1587,6 +1597,7 @@ linux-gnu*|k*bsd*-gnu*)
test_gtk=yes
build_gstreamer=yes
test_kde=yes
+ test_tde=yes
test_kde4=yes
test_freetype=yes
test_unix_quickstarter=yes
@@ -1659,6 +1670,7 @@ freebsd*)
test_gtk=yes
build_gstreamer=yes
test_kde=yes
+ test_tde=yes
test_kde4=yes
test_freetype=yes
AC_MSG_CHECKING([the FreeBSD operating system release])
@@ -1703,6 +1715,7 @@ aix*)
openbsd*)
test_gtk=yes
test_kde=yes
+ test_tde=yes
test_freetype=yes
PTHREAD_CFLAGS="-D_THREAD_SAFE"
PTHREAD_LIBS="-pthread"
@@ -1713,6 +1726,7 @@ dragonfly*)
test_gtk=yes
build_gstreamer=yes
test_kde=yes
+ test_tde=yes
test_kde4=yes
test_freetype=yes
PTHREAD_LIBS="-pthread"
@@ -6941,6 +6955,13 @@ if test "x$enable_kde4" = "xyes"; then
fi
AC_SUBST(ENABLE_KDE4)
+ENABLE_TDE=""
+if test "x$enable_tde" = "xyes"; then
+ ENABLE_TDE="TRUE"
+ R="$R tde"
+fi
+AC_SUBST(ENABLE_TDE)
+
if test -z "$R"; then
AC_MSG_RESULT([none])
else
@@ -7852,6 +7873,129 @@ AC_SUBST(KDE_GLIB_LIBS)
AC_SUBST(KDE_HAVE_GLIB)
dnl ===================================================================
+dnl Check whether the Qt3 and TDE libraries are available.
+dnl ===================================================================
+
+TDE_CFLAGS=""
+TDE_LIBS=""
+if test "$_os" != "OpenBSD"; then
+ MOC="tmoc"
+fi
+if test "$test_tde" = "yes" -a "$ENABLE_TDE" = "TRUE" ; then
+ dnl Search paths for Qt3 and TDE
+ if test "$build_cpu" != "x86_64" ; then
+ qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib/qt3/include /usr/lib/qt/include /usr/share/qt3/include /usr/local/include/X11/qt3 $x_includes"
+ qt_libdirs="$QTLIB /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries"
+ else
+ qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib64/qt3/include /usr/lib64/qt/include /usr/share/qt3/include /usr/lib/qt3/include /usr/lib/qt/include /usr/local/include/X11/qt3 $x_includes"
+ qt_libdirs="$QTLIB /usr/local/qt/lib64 /usr/lib64/qt /usr/lib64 /usr/X11R6/lib64/X11/qt /usr/X11R6/lib64/qt /usr/lib64/qt3/lib64 /usr/lib64/qt/lib64 /usr/share/qt3/lib64 /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib /usr/local/lib/qt3 $x_libraries"
+ fi
+ if test -n "$QTDIR" ; then
+ qt_incdirs="$QTDIR/include $qt_incdirs"
+ if test "$build_cpu" != "x86_64" ; then
+ qt_libdirs="$QTDIR/lib $qt_libdirs"
+ else
+ qt_libdirs="$QTDIR/lib64 $QTDIR/lib $qt_libdirs"
+ fi
+ fi
+ if test "$build_cpu" != "x86_64" ; then
+ tde_incdirs="/opt/trinity/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes"
+ tde_libdirs="/opt/trinity/lib /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib/kde4/lib /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries"
+ else
+ tde_incdirs="/opt/trinity/include /usr/lib64/kde/include /usr/lib/kde/include /usr/lib/kde4/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde4/include /opt/kde/include $x_includes"
+ tde_libdirs="/opt/trinity/lib /usr/lib64/kde/lib64 /usr/local/kde/lib64 /usr/kde/lib64 /usr/lib64/kde /usr/lib64/kde3 /usr/lib64 /usr/X11R6/lib64 /usr/local/lib64 /opt/trinity/lib64 /opt/kde/lib64 /usr/X11R6/kde/lib64 /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde4 /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde4/lib /opt/kde/lib /usr/X11R6/kde/lib $x_libraries"
+ fi
+ if test -n "$TDEDIR" ; then
+ tde_incdirs="$TDEDIR/include $tde_incdirs"
+ if test "$build_cpu" != "x86_64" ; then
+ tde_libdirs="$TDEDIR/lib $tde_libdirs"
+ else
+ tde_libdirs="$TDEDIR/lib64 $TDEDIR/lib $tde_libdirs"
+ fi
+ fi
+
+ dnl What to test
+ qt_test_include="qstyle.h"
+ qt_test_library="libqt-mt.so*"
+ tde_test_include="kapp.h"
+ tde_test_library="libDCOP.so*"
+
+ dnl Check for Qt3 headers
+ AC_MSG_CHECKING([for Qt3 headers])
+ qt_incdir="no"
+ for tde_check in $qt_incdirs ; do
+ if test -r "$tde_check/$qt_test_include" ; then
+ qt_incdir="$tde_check"
+ break
+ fi
+ done
+ AC_MSG_RESULT([$qt_incdir])
+ if test "x$qt_incdir" = "xno" ; then
+ AC_MSG_ERROR([Qt3 headers not found. Please specify the root of
+your Qt3 installation by exporting QTDIR before running "configure".])
+ fi
+
+ dnl Check for Qt3 libraries
+ AC_MSG_CHECKING([for Qt3 libraries])
+ qt_libdir="no"
+ for qt_check in $qt_libdirs ; do
+ if test -r "`ls $qt_check/$qt_test_library 2>/dev/null | head -1`" ; then
+ qt_libdir="$qt_check"
+ break
+ fi
+ done
+ AC_MSG_RESULT([$qt_libdir])
+ if test "x$qt_libdir" = "xno" ; then
+ AC_MSG_ERROR([Qt3 libraries not found. Please specify the root of
+your Qt3 installation by exporting QTDIR before running "configure".])
+ fi
+
+ dnl Check for Meta Object Compiler
+ AC_PATH_PROG( MOC, tmoc, no, [`dirname $qt_libdir`/bin:$QTDIR/bin:$PATH] )
+ if test "$MOC" = "no" ; then
+ AC_MSG_ERROR([TQt3 Meta Object Compiler not found. Please specify
+the root of your Qt3 installation by exporting QTDIR before running "configure".])
+ fi
+
+ dnl Check for TDE headers
+ AC_MSG_CHECKING([for TDE headers])
+ tde_incdir="no"
+ for tde_check in $tde_incdirs ; do
+ if test -r "$tde_check/$tde_test_include" ; then
+ tde_incdir="$tde_check"
+ break
+ fi
+ done
+ AC_MSG_RESULT([$tde_incdir])
+ if test "x$tde_incdir" = "xno" ; then
+ AC_MSG_ERROR([TDE headers not found. Please specify the root of
+your TDE installation by exporting TDEDIR before running "configure".])
+ fi
+
+ dnl Check for TDE libraries
+ AC_MSG_CHECKING([for TDE libraries])
+ tde_libdir="no"
+ for tde_check in $tde_libdirs ; do
+ if test -r "`ls $tde_check/$tde_test_library 2>/dev/null | head -1`" ; then
+ tde_libdir="$tde_check"
+ break
+ fi
+ done
+ AC_MSG_RESULT([$tde_libdir])
+ if test "x$tde_libdir" = "xno" ; then
+ AC_MSG_ERROR([TDE libraries not found. Please specify the root of
+your TDE installation by exporting TDEDIR before running "configure".])
+ fi
+
+ dnl Set the variables
+ TDE_CFLAGS="-I$qt_incdir -I$tde_incdir -I/usr/include/tqt -DQT_CLEAN_NAMESPACE -DQT_THREAD_SUPPORT"
+ TDE_LIBS="-L$tde_libdir -L$qt_libdir -lkdeui -lkdecore -ltqt -lqt-mt"
+fi
+AC_SUBST(TDE_CFLAGS)
+AC_SUBST(TDE_LIBS)
+AC_SUBST(MOC)
+
+dnl ===================================================================
dnl Test for the enabling the lockdown pieces
dnl ===================================================================
AC_MSG_CHECKING([whether to enable the lockdown pieces])
@@ -7908,6 +8052,33 @@ fi
AC_SUBST(ENABLE_KAB)
dnl ===================================================================
+dnl Test whether to include TDE AB support
+dnl ===================================================================
+AC_MSG_CHECKING([whether to enable TDE address book support])
+if test "$enable_tdeab" = "yes" && test "$enable_tde" = "yes"; then
+ AC_MSG_RESULT([yes])
+ AC_LANG_PUSH([C++])
+ save_CXXFLAGS=$CXXFLAGS
+ CXXFLAGS="$CXXFLAGS $TDE_CFLAGS"
+ AC_MSG_CHECKING([whether TDE is between 3.2 and 3.6])
+ AC_TRY_RUN([
+#include <kdeversion.h>
+
+int main(int argc, char **argv) {
+ if (KDE_VERSION_MAJOR == 3 && 2 <= KDE_VERSION_MINOR && KDE_VERSION_MINOR <= 6) return 0;
+ else return 1;
+}
+ ], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([TDE version too old or too recent, please use another version of TDE or disable TDE address book support])])
+ CXXFLAGS=$save_CXXFLAGS
+ AC_LANG_POP([C++])
+ ENABLE_TDEAB=TRUE
+else
+ AC_MSG_RESULT([no])
+ ENABLE_TDEAB=
+fi
+AC_SUBST(ENABLE_TDEAB)
+
+dnl ===================================================================
dnl Test whether to include MathMLDTD
dnl ===================================================================
AC_MSG_CHECKING([whether to include MathMLDTD])
diff --git a/connectivity/prj/build.lst b/connectivity/prj/build.lst
index 9860897..be07edb 100644
--- a/connectivity/prj/build.lst
+++ b/connectivity/prj/build.lst
@@ -12,6 +12,7 @@ cn connectivity\source\drivers\mozab\mozillasrc nmake - all cn_mozab_moz
cn connectivity\source\drivers\mozab\bootstrap nmake - all cn_mozab_bootstrap cn_mozab_mozillasrc cn_inc NULL
cn connectivity\source\drivers\mozab nmake - all cn_mozab cn_mozab_bootstrap cn_dbtools cn_inc NULL
cn connectivity\source\drivers\kab nmake - all cn_kab cn_dbtools cn_inc NULL
+cn connectivity\source\drivers\tdeab nmake - all cn_tdeab cn_dbtools cn_inc NULL
cn connectivity\source\drivers\macab nmake - all cn_macab cn_dbtools cn_inc NULL
cn connectivity\source\drivers\evoab2 nmake - all cn_evoab2 cn_dbtools cn_file cn_inc NULL
cn connectivity\source\drivers\calc nmake - all cn_calc cn_file cn_inc NULL
@@ -28,4 +29,4 @@ cn connectivity\source\simpledbt nmake - all cn_simpledbt
cn connectivity\source\dbtools nmake - all cn_dbtools cn_simpledbt cn_cmtools cn_parse cn_res cn_sdbcx cn_inc cn_res NULL
cn connectivity\qa\connectivity\tools nmake - all cn_qa_tools cn_inc NULL
cn connectivity\qa nmake - all cn_qa cn_inc NULL
-cn connectivity\util nmake - all cn_util cn_ado cn_mozab cn_kab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_flat cn_dbase cn_hsqldb cn_macab NULL
+cn connectivity\util nmake - all cn_util cn_ado cn_mozab cn_kab cn_tdeab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_flat cn_dbase cn_hsqldb cn_macab NULL
diff --git a/connectivity/prj/d.lst b/connectivity/prj/d.lst
index 1387da4..400ecaa 100644
--- a/connectivity/prj/d.lst
+++ b/connectivity/prj/d.lst
@@ -11,6 +11,7 @@
..\source\drivers\adabas\*.xml %_DEST%\xml\*.xml
..\source\drivers\ado\*.xml %_DEST%\xml\*.xml
..\source\drivers\kab\*.xml %_DEST%\xml\*.xml
+..\source\drivers\tdeab\*.xml %_DEST%\xml\*.xml
..\source\drivers\macab\*.xml %_DEST%\xml\*.xml
..\source\drivers\file\*.xml %_DEST%\xml\*.xml
..\source\drivers\flat\*.xml %_DEST%\xml\*.xml
diff --git a/connectivity/source/drivers/tdeab/KCatalog.cxx b/connectivity/source/drivers/tdeab/KCatalog.cxx
new file mode 100644
index 0000000..262144e
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KCatalog.cxx
@@ -0,0 +1,128 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KCatalog.hxx"
+#include "KConnection.hxx"
+#include "KTables.hxx"
+
+using namespace connectivity::kab;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+using namespace ::cppu;
+
+// -------------------------------------------------------------------------
+KabCatalog::KabCatalog(KabConnection* _pCon)
+ : connectivity::sdbcx::OCatalog(_pCon),
+ m_pConnection(_pCon),
+ m_xMetaData(m_pConnection->getMetaData())
+{
+}
+// -------------------------------------------------------------------------
+void KabCatalog::refreshTables()
+{
+ TStringVector aVector;
+ Sequence< ::rtl::OUString > aTypes(1);
+ aTypes[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%"));
+ Reference< XResultSet > xResult = m_xMetaData->getTables(
+ Any(),
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")),
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%")),
+ aTypes);
+
+ if (xResult.is())
+ {
+ Reference< XRow > xRow(xResult,UNO_QUERY);
+ ::rtl::OUString aName;
+ // const ::rtl::OUString& sDot = KabCatalog::getDot();
+
+ while (xResult->next())
+ {
+ // aName = xRow->getString(2);
+ // aName += sDot;
+ aName = xRow->getString(3);
+ aVector.push_back(aName);
+ }
+ }
+ if (m_pTables)
+ m_pTables->reFill(aVector);
+ else
+ m_pTables = new KabTables(m_xMetaData,*this,m_aMutex,aVector);
+}
+// -------------------------------------------------------------------------
+void KabCatalog::refreshViews()
+{
+}
+// -------------------------------------------------------------------------
+void KabCatalog::refreshGroups()
+{
+}
+// -------------------------------------------------------------------------
+void KabCatalog::refreshUsers()
+{
+}
+// -------------------------------------------------------------------------
+const ::rtl::OUString& KabCatalog::getDot()
+{
+ static const ::rtl::OUString sDot = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("."));
+ return sDot;
+}
+// -----------------------------------------------------------------------------
+
+// XTablesSupplier
+Reference< XNameAccess > SAL_CALL KabCatalog::getTables( ) throw(RuntimeException)
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(rBHelper.bDisposed);
+
+ try
+ {
+ if (!m_pTables)
+ refreshTables();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_pTables;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KCatalog.hxx b/connectivity/source/drivers/tdeab/KCatalog.hxx
new file mode 100644
index 0000000..ddfe1e9
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KCatalog.hxx
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_CATALOG_HXX_
+#define _CONNECTIVITY_KAB_CATALOG_HXX_
+
+#include "connectivity/sdbcx/VCatalog.hxx"
+
+namespace connectivity
+{
+ namespace kab
+ {
+ class KabConnection;
+
+ class KabCatalog : public connectivity::sdbcx::OCatalog
+ {
+ KabConnection* m_pConnection; // used to get the metadata
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; // just to make things easier
+
+ public:
+ KabCatalog(KabConnection* _pCon);
+
+ inline KabConnection* getConnection() const { return m_pConnection; }
+
+ static const ::rtl::OUString& getDot();
+
+ // implementation of the pure virtual methods
+ virtual void refreshTables();
+ virtual void refreshViews();
+ virtual void refreshGroups();
+ virtual void refreshUsers();
+
+ // XTablesSupplier
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getTables(
+ ) throw(::com::sun::star::uno::RuntimeException);
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_CATALOG_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KColumns.cxx b/connectivity/source/drivers/tdeab/KColumns.cxx
new file mode 100644
index 0000000..e61e457
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KColumns.cxx
@@ -0,0 +1,102 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KColumns.hxx"
+#include "KTable.hxx"
+#include "KTables.hxx"
+#include "KCatalog.hxx"
+#include "connectivity/sdbcx/VColumn.hxx"
+
+using namespace connectivity::kab;
+using namespace connectivity::sdbcx;
+using namespace connectivity;
+using namespace ::comphelper;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+// -------------------------------------------------------------------------
+sdbcx::ObjectType KabColumns::createObject(const ::rtl::OUString& _rName)
+{
+ Reference< XResultSet > xResult = m_pTable->getConnection()->getMetaData()->getColumns(
+ Any(),
+ m_pTable->getSchema(),
+ m_pTable->getTableName(),
+ _rName);
+
+ sdbcx::ObjectType xRet = NULL;
+ if (xResult.is())
+ {
+ Reference< XRow > xRow(xResult,UNO_QUERY);
+
+ while (xResult->next())
+ {
+ if (xRow->getString(4) == _rName)
+ {
+ OColumn* pRet = new OColumn(
+ _rName,
+ xRow->getString(6),
+ xRow->getString(13),
+ xRow->getString(12),
+ xRow->getInt(11),
+ xRow->getInt(7),
+ xRow->getInt(9),
+ xRow->getInt(5),
+ sal_False,
+ sal_False,
+ sal_False,
+ sal_True);
+ xRet = pRet;
+ break;
+ }
+ }
+ }
+
+ return xRet;
+}
+// -------------------------------------------------------------------------
+void KabColumns::impl_refresh() throw(RuntimeException)
+{
+ m_pTable->refreshColumns();
+}
+// -------------------------------------------------------------------------
+KabColumns::KabColumns( KabTable* _pTable,
+ ::osl::Mutex& _rMutex,
+ const TStringVector &_rVector)
+ : sdbcx::OCollection(*_pTable, sal_True, _rMutex, _rVector),
+ m_pTable(_pTable)
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KColumns.hxx b/connectivity/source/drivers/tdeab/KColumns.hxx
new file mode 100644
index 0000000..1919747
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KColumns.hxx
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_COLUMNS_HXX_
+#define _CONNECTIVITY_KAB_COLUMNS_HXX_
+
+#include "KTable.hxx"
+#include "connectivity/sdbcx/VCollection.hxx"
+
+namespace connectivity
+{
+ namespace kab
+ {
+ class KabColumns : public sdbcx::OCollection
+ {
+ protected:
+ KabTable* m_pTable;
+
+ virtual sdbcx::ObjectType createObject(const ::rtl::OUString& _rName);
+ virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException);
+
+ public:
+ KabColumns( KabTable* _pTable,
+ ::osl::Mutex& _rMutex,
+ const TStringVector &_rVector);
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_COLUMNS_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KConnection.cxx b/connectivity/source/drivers/tdeab/KConnection.cxx
new file mode 100644
index 0000000..26824bf
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KConnection.cxx
@@ -0,0 +1,332 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KConnection.hxx"
+#include "KDatabaseMetaData.hxx"
+#include "KStatement.hxx"
+#include "KPreparedStatement.hxx"
+#include "KDriver.hxx"
+#include "KCatalog.hxx"
+#include <com/sun/star/sdbc/ColumnValue.hpp>
+#include <com/sun/star/sdbc/TransactionIsolation.hpp>
+#include <shell/tde_headers.h>
+
+using namespace connectivity::kab;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::sdbcx;
+
+IMPLEMENT_SERVICE_INFO(KabConnection, "com.sun.star.sdbc.drivers.KabConnection", "com.sun.star.sdbc.Connection")
+//-----------------------------------------------------------------------------
+KabConnection::KabConnection(KabDriver* _pDriver)
+ : OMetaConnection_BASE(m_aMutex),
+ OSubComponent<KabConnection, KabConnection_BASE>((::cppu::OWeakObject*)_pDriver, this),
+ m_xMetaData(NULL),
+ m_pAddressBook(NULL),
+ m_pDriver(_pDriver)
+{
+ m_pDriver->acquire();
+}
+//-----------------------------------------------------------------------------
+KabConnection::~KabConnection()
+{
+ if (!isClosed())
+ close();
+
+ m_pDriver->release();
+ m_pDriver = NULL;
+}
+//-----------------------------------------------------------------------------
+void SAL_CALL KabConnection::release() throw()
+{
+ relase_ChildImpl();
+}
+// -----------------------------------------------------------------------------
+void KabConnection::construct(const ::rtl::OUString&, const Sequence< PropertyValue >&) throw(SQLException)
+{
+ osl_incrementInterlockedCount( &m_refCount );
+
+ // create a TDE address book object
+ m_pAddressBook = KABC::StdAddressBook::self();
+ m_pAddressBook->setAutomaticSave(false);
+// perharps we should analyze the URL to know whether the addressbook is local, over LDAP, etc...
+// perharps we should get some user and password information from "info" properties
+
+ osl_decrementInterlockedCount( &m_refCount );
+}
+// XServiceInfo
+// --------------------------------------------------------------------------------
+Reference< XStatement > SAL_CALL KabConnection::createStatement( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // create a statement
+ // the statement can only be executed once
+ Reference< XStatement > xReturn = new KabStatement(this);
+ m_aStatements.push_back(WeakReferenceHelper(xReturn));
+ return xReturn;
+}
+// --------------------------------------------------------------------------------
+Reference< XPreparedStatement > SAL_CALL KabConnection::prepareStatement( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // create a statement
+ // the statement can only be executed more than once
+ Reference< XPreparedStatement > xReturn = new KabPreparedStatement(this, _sSql);
+ m_aStatements.push_back(WeakReferenceHelper(xReturn));
+ return xReturn;
+}
+// --------------------------------------------------------------------------------
+Reference< XPreparedStatement > SAL_CALL KabConnection::prepareCall( const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // not implemented yet :-) a task to do
+ return NULL;
+}
+// --------------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabConnection::nativeSQL( const ::rtl::OUString& _sSql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ // when you need to transform SQL92 to you driver specific you can do it here
+
+ return _sSql;
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabConnection::setAutoCommit( sal_Bool ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+ // here you have to set your commit mode please have a look at the jdbc documentation to get a clear explanation
+}
+// --------------------------------------------------------------------------------
+sal_Bool SAL_CALL KabConnection::getAutoCommit( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+ // you have to distinguish which if you are in autocommit mode or not
+ // at normal case true should be fine here
+
+ return sal_True;
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabConnection::commit( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // when you database does support transactions you should commit here
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabConnection::rollback( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // same as commit but for the other case
+}
+// --------------------------------------------------------------------------------
+sal_Bool SAL_CALL KabConnection::isClosed( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ // just simple -> we are closed when we are disposed, that means someone called dispose(); (XComponent)
+ return KabConnection_BASE::rBHelper.bDisposed;
+}
+// --------------------------------------------------------------------------------
+Reference< XDatabaseMetaData > SAL_CALL KabConnection::getMetaData( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // here we have to create the class with biggest interface
+ // The answer is 42 :-)
+ Reference< XDatabaseMetaData > xMetaData = m_xMetaData;
+ if (!xMetaData.is())
+ {
+ xMetaData = new KabDatabaseMetaData(this); // need the connection because it can return it
+ m_xMetaData = xMetaData;
+ }
+
+ return xMetaData;
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabConnection::setReadOnly( sal_Bool ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // set you connection to readonly
+}
+// --------------------------------------------------------------------------------
+sal_Bool SAL_CALL KabConnection::isReadOnly( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // return if your connection to readonly
+ return sal_False;
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabConnection::setCatalog( const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // if your database doesn't work with catalogs you go to next method otherwise you kjnow what to do
+}
+// --------------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabConnection::getCatalog( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+
+ // return your current catalog
+ return ::rtl::OUString();
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabConnection::setTransactionIsolation( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // set your isolation level
+ // please have a look at @see com.sun.star.sdbc.TransactionIsolation
+}
+// --------------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabConnection::getTransactionIsolation( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+
+ // please have a look at @see com.sun.star.sdbc.TransactionIsolation
+ return TransactionIsolation::NONE;
+}
+// --------------------------------------------------------------------------------
+Reference< ::com::sun::star::container::XNameAccess > SAL_CALL KabConnection::getTypeMap( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+
+ // if your driver has special database types you can return it here
+
+ return NULL;
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabConnection::setTypeMap( const Reference< ::com::sun::star::container::XNameAccess >& ) throw(SQLException, RuntimeException)
+{
+ // the other way around
+}
+// --------------------------------------------------------------------------------
+// XCloseable
+void SAL_CALL KabConnection::close( ) throw(SQLException, RuntimeException)
+{
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabConnection_BASE::rBHelper.bDisposed);
+ }
+ dispose();
+}
+// --------------------------------------------------------------------------------
+// XWarningsSupplier
+Any SAL_CALL KabConnection::getWarnings( ) throw(SQLException, RuntimeException)
+{
+ // when you collected some warnings -> return it
+ return Any();
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabConnection::clearWarnings( ) throw(SQLException, RuntimeException)
+{
+ // you should clear your collected warnings here
+}
+//------------------------------------------------------------------------------
+void KabConnection::disposing()
+{
+ // we noticed that we should be destroied in near future so we have to dispose our statements
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ for (OWeakRefArray::iterator i = m_aStatements.begin(); m_aStatements.end() != i; ++i)
+ {
+ Reference< XComponent > xComp(i->get(), UNO_QUERY);
+ if (xComp.is())
+ xComp->dispose();
+ }
+ m_aStatements.clear();
+
+ if (m_pAddressBook != NULL)
+ {
+ m_pAddressBook->close();
+ m_pAddressBook = NULL;
+ }
+
+ m_xMetaData = ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XDatabaseMetaData>();
+
+ dispose_ChildImpl();
+ KabConnection_BASE::disposing();
+}
+// -----------------------------------------------------------------------------
+Reference< XTablesSupplier > SAL_CALL KabConnection::createCatalog()
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ Reference< XTablesSupplier > xTab = m_xCatalog;
+ if (!m_xCatalog.is())
+ {
+ KabCatalog *pCat = new KabCatalog(this);
+ xTab = pCat;
+ m_xCatalog = xTab;
+ }
+ return xTab;
+}
+// -----------------------------------------------------------------------------
+::KABC::AddressBook* KabConnection::getAddressBook() const
+{
+ return m_pAddressBook;
+}
+// -----------------------------------------------------------------------------
+extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL createKabConnection( void* _pDriver )
+{
+ KabConnection* pConnection = new KabConnection( static_cast< KabDriver* >( _pDriver ) );
+ // by definition, the pointer crossing library boundaries as void ptr is acquired once
+ pConnection->acquire();
+ return pConnection;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KConnection.hxx b/connectivity/source/drivers/tdeab/KConnection.hxx
new file mode 100644
index 0000000..66b75d4
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KConnection.hxx
@@ -0,0 +1,142 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_CONNECTION_HXX_
+#define _CONNECTIVITY_KAB_CONNECTION_HXX_
+
+#include <map>
+#include "OSubComponent.hxx"
+#include "connectivity/CommonTools.hxx"
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/sdbc/SQLWarning.hpp>
+#include <com/sun/star/sdbc/XWarningsSupplier.hpp>
+#include <com/sun/star/sdbc/XConnection.hpp>
+#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
+#include <comphelper/broadcasthelper.hxx>
+#include <cppuhelper/compbase3.hxx>
+
+namespace KABC
+{
+ class StdAddressBook;
+ class AddressBook;
+}
+
+namespace connectivity
+{
+ namespace kab
+ {
+
+ typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::sdbc::XConnection,
+ ::com::sun::star::sdbc::XWarningsSupplier,
+ ::com::sun::star::lang::XServiceInfo
+ > OMetaConnection_BASE;
+
+ class KabStatement_Base;
+ class KabDriver;
+ class KabDatabaseMetaData;
+
+ typedef OMetaConnection_BASE KabConnection_BASE; // implements basics and text encoding
+ typedef std::vector< ::com::sun::star::uno::WeakReferenceHelper > OWeakRefArray;
+
+ class KabConnection : public comphelper::OBaseMutex,
+ public KabConnection_BASE,
+ public OSubComponent<KabConnection, KabConnection_BASE>
+ {
+ friend class OSubComponent<KabConnection, KabConnection_BASE>;
+
+ protected:
+ //====================================================================
+ // Data attributes
+ //====================================================================
+ ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData;
+
+ OWeakRefArray m_aStatements; // vector containing a list of all the Statement objects
+ // for this Connection
+
+ ::KABC::StdAddressBook* m_pAddressBook; // the address book
+ KabDriver* m_pDriver; // pointer to the owning driver object
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier>
+ m_xCatalog; // needed for the SQL interpreter
+
+ public:
+ virtual void construct( const ::rtl::OUString& url,const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info) throw(::com::sun::star::sdbc::SQLException);
+
+ KabConnection(KabDriver* _pDriver);
+ virtual ~KabConnection();
+
+ void closeAllStatements () throw( ::com::sun::star::sdbc::SQLException);
+
+ // OComponentHelper
+ virtual void SAL_CALL disposing(void);
+
+ // XInterface
+ virtual void SAL_CALL release() throw();
+
+ // XServiceInfo
+ DECLARE_SERVICE_INFO();
+
+ // XConnection
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XStatement > SAL_CALL createStatement( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > SAL_CALL prepareCall( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL nativeSQL( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setAutoCommit( sal_Bool autoCommit ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL getAutoCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL commit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL rollback( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isClosed( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setReadOnly( sal_Bool readOnly ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isReadOnly( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setCatalog( const ::rtl::OUString& catalog ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getCatalog( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setTransactionIsolation( sal_Int32 level ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getTransactionIsolation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getTypeMap( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setTypeMap( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XCloseable
+ virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XWarningsSupplier
+ virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL clearWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // needed for the SQL interpreter
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier > SAL_CALL createCatalog();
+
+ // accessors
+ inline KabDriver* getDriver() const { return m_pDriver;}
+ ::KABC::AddressBook* getAddressBook() const;
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_CONNECTION_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx b/connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx
new file mode 100644
index 0000000..1bff0ea
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KDatabaseMetaData.cxx
@@ -0,0 +1,1084 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KDatabaseMetaData.hxx"
+#include "kfields.hxx"
+#include "TDEInit.h"
+#include <shell/tde_headers.h>
+#include "FDatabaseMetaDataResultSet.hxx"
+#include "OTypeInfo.hxx"
+#include <com/sun/star/sdbc/ColumnValue.hpp>
+#include <com/sun/star/sdbc/ResultSetType.hpp>
+#include <com/sun/star/sdbc/TransactionIsolation.hpp>
+
+using namespace connectivity::kab;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+
+KabDatabaseMetaData::KabDatabaseMetaData(KabConnection* _pCon)
+ : m_xConnection(_pCon),
+ m_bUseCatalog(sal_True)
+{
+ OSL_ENSURE(_pCon,"KabDatabaseMetaData::KabDatabaseMetaData: No connection set!");
+
+ osl_incrementInterlockedCount( &m_refCount );
+ m_bUseCatalog = !(usesLocalFiles() || usesLocalFilePerTable());
+ osl_decrementInterlockedCount( &m_refCount );
+}
+// -------------------------------------------------------------------------
+KabDatabaseMetaData::~KabDatabaseMetaData()
+{
+}
+// -------------------------------------------------------------------------
+const ::rtl::OUString & KabDatabaseMetaData::getAddressBookTableName()
+{
+ static const ::rtl::OUString aAddressBookTableName
+ (::rtl::OUString::createFromAscii( i18n("Address Book") ));
+
+ return aAddressBookTableName;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getCatalogSeparator( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aVal;
+ if (m_bUseCatalog)
+ { // do some special here for you database
+ }
+
+ return aVal;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxBinaryLiteralLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxRowSize( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxCatalogNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxCharLiteralLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInIndex( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxCursorNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxConnections( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInTable( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxStatementLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxTableNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxTablesInSelect( ) throw(SQLException, RuntimeException)
+{
+ // MaxTablesInSelect describes how many tables can participate in the FROM part of a given SELECT statement,
+ // currently, the resultset/statement implementations can cope with one table only
+ sal_Int32 nValue = 1;
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::doesMaxRowSizeIncludeBlobs( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::storesLowerCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::storesLowerCaseIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::storesMixedCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::storesMixedCaseIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::storesUpperCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::storesUpperCaseIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsAlterTableWithAddColumn( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsAlterTableWithDropColumn( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxIndexLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsNonNullableColumns( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getCatalogTerm( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aVal;
+ if (m_bUseCatalog)
+ {
+ }
+ return aVal;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getIdentifierQuoteString( ) throw(SQLException, RuntimeException)
+{
+ // normally this is "
+ ::rtl::OUString aVal = ::rtl::OUString::createFromAscii("\"");
+ return aVal;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getExtraNameCharacters( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aVal;
+ return aVal;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsDifferentTableCorrelationNames( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::isCatalogAtStart( ) throw(SQLException, RuntimeException)
+{
+ sal_Bool bValue = sal_False;
+ if (m_bUseCatalog)
+ {
+ }
+ return bValue;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::dataDefinitionIgnoredInTransactions( ) throw(SQLException, RuntimeException)
+{
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::dataDefinitionCausesTransactionCommit( ) throw(SQLException, RuntimeException)
+{
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsDataManipulationTransactionsOnly( ) throw(SQLException, RuntimeException)
+{
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions( ) throw(SQLException, RuntimeException)
+{
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsPositionedDelete( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsPositionedUpdate( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenStatementsAcrossRollback( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenStatementsAcrossCommit( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenCursorsAcrossCommit( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsOpenCursorsAcrossRollback( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsTransactionIsolationLevel( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInDataManipulation( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsANSI92FullSQL( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsANSI92EntryLevelSQL( ) throw(SQLException, RuntimeException)
+{
+ return sal_True; // should be supported at least
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsIntegrityEnhancementFacility( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInIndexDefinitions( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInTableDefinitions( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInTableDefinitions( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInIndexDefinitions( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInDataManipulation( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsOuterJoins( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxStatements( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxProcedureNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxSchemaNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsTransactions( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::allProceduresAreCallable( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsStoredProcedures( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSelectForUpdate( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::allTablesAreSelectable( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::isReadOnly( ) throw(SQLException, RuntimeException)
+{
+ // for the moment, we have read-only addresses, but this might change in the future
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::usesLocalFiles( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::usesLocalFilePerTable( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsTypeConversion( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::nullPlusNonNullIsNull( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsColumnAliasing( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsTableCorrelationNames( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsConvert( sal_Int32, sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsExpressionsInOrderBy( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsGroupBy( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsGroupByBeyondSelect( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsGroupByUnrelated( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsMultipleTransactions( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsMultipleResultSets( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsLikeEscapeClause( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsOrderByUnrelated( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsUnion( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsUnionAll( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsMixedCaseIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsMixedCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedAtEnd( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedAtStart( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedHigh( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::nullsAreSortedLow( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInProcedureCalls( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSchemasInPrivilegeDefinitions( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInProcedureCalls( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsCatalogsInPrivilegeDefinitions( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsCorrelatedSubqueries( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInComparisons( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInExists( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInIns( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsSubqueriesInQuantifieds( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsANSI92IntermediateSQL( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getURL( ) throw(SQLException, RuntimeException)
+{
+ // if someday we support more than the default address book,
+ // this method should return the URL which was used to create it
+ ::rtl::OUString aValue = ::rtl::OUString::createFromAscii("sdbc:address:kab:");
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getUserName( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getDriverName( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue = ::rtl::OUString::createFromAscii("kab");
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getDriverVersion() throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue = ::rtl::OUString::createFromAscii(KAB_DRIVER_VERSION);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getDatabaseProductVersion( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getDatabaseProductName( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getProcedureTerm( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getSchemaTerm( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ return aValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getDriverMajorVersion( ) throw(RuntimeException)
+{
+ return KAB_DRIVER_VERSION_MAJOR;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getDefaultTransactionIsolation( ) throw(SQLException, RuntimeException)
+{
+ return TransactionIsolation::NONE;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getDriverMinorVersion( ) throw(RuntimeException)
+{
+ return KAB_DRIVER_VERSION_MINOR;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getSQLKeywords( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getSearchStringEscape( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getStringFunctions( ) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getTimeDateFunctions( ) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getSystemFunctions( ) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDatabaseMetaData::getNumericFunctions( ) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsExtendedSQLGrammar( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsCoreSQLGrammar( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsMinimumSQLGrammar( ) throw(SQLException, RuntimeException)
+{
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsFullOuterJoins( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsLimitedOuterJoins( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInGroupBy( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInOrderBy( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxColumnsInSelect( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDatabaseMetaData::getMaxUserNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue = 0; // 0 means no limit
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsResultSetType( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ switch (setType)
+ {
+ case ResultSetType::FORWARD_ONLY:
+ case ResultSetType::SCROLL_INSENSITIVE:
+ return sal_True;
+ }
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ switch (setType)
+ {
+ case ResultSetType::FORWARD_ONLY:
+ case ResultSetType::SCROLL_INSENSITIVE:
+ return sal_True;
+ }
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::ownUpdatesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::ownDeletesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::ownInsertsAreVisible( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::othersUpdatesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::othersDeletesAreVisible( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::othersInsertsAreVisible( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::updatesAreDetected( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::deletesAreDetected( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::insertsAreDetected( sal_Int32 ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDatabaseMetaData::supportsBatchUpdates( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+Reference< XConnection > SAL_CALL KabDatabaseMetaData::getConnection( ) throw(SQLException, RuntimeException)
+{
+ return (Reference< XConnection >) m_xConnection.get();
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTableTypes( ) throw(SQLException, RuntimeException)
+{
+ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTableTypes);
+ Reference< XResultSet > xRef = pResult;
+
+ static ODatabaseMetaDataResultSet::ORows aRows;
+ static const ::rtl::OUString aTable(::rtl::OUString::createFromAscii("TABLE"));
+
+ if (aRows.empty())
+ {
+ ODatabaseMetaDataResultSet::ORow aRow(2);
+ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[1] = new ORowSetValueDecorator(aTable);
+ aRows.push_back(aRow);
+ }
+ pResult->setRows(aRows);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTypeInfo( ) throw(SQLException, RuntimeException)
+{
+ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTypeInfo);
+ Reference< XResultSet > xRef = pResult;
+
+ static ODatabaseMetaDataResultSet::ORows aRows;
+ if (aRows.empty())
+ {
+ ODatabaseMetaDataResultSet::ORow aRow(19);
+
+ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("CHAR"));
+ aRow[2] = new ORowSetValueDecorator(DataType::CHAR);
+ aRow[3] = new ORowSetValueDecorator((sal_Int32) 254);
+ aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue();
+ aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue();
+ aRow[6] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[7] = new ORowSetValueDecorator((sal_Int32) ColumnValue::NULLABLE);
+ aRow[8] = ODatabaseMetaDataResultSet::get1Value();
+ aRow[9] = new ORowSetValueDecorator((sal_Int32) ColumnSearch::CHAR);
+ aRow[10] = ODatabaseMetaDataResultSet::get1Value();
+ aRow[11] = ODatabaseMetaDataResultSet::get0Value();
+ aRow[12] = ODatabaseMetaDataResultSet::get0Value();
+ aRow[13] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[14] = ODatabaseMetaDataResultSet::get0Value();
+ aRow[15] = ODatabaseMetaDataResultSet::get0Value();
+ aRow[16] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[17] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[18] = new ORowSetValueDecorator((sal_Int32) 10);
+ aRows.push_back(aRow);
+// Much more types might appear in TDE address books
+// To be completed
+ }
+ pResult->setRows(aRows);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getCatalogs( ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eCatalogs );
+}
+// -----------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getSchemas( ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eSchemas );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getColumnPrivileges(
+ const Any&, const ::rtl::OUString&, const ::rtl::OUString&,
+ const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eColumnPrivileges );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getColumns(
+ const Any&,
+ const ::rtl::OUString&,
+ const ::rtl::OUString& tableNamePattern,
+ const ::rtl::OUString& columnNamePattern) throw(SQLException, RuntimeException)
+{
+ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eColumns);
+ Reference< XResultSet > xRef = pResult;
+
+ ODatabaseMetaDataResultSet::ORows aRows;
+
+ if (match(tableNamePattern, getAddressBookTableName(), '\0'))
+ {
+ ODatabaseMetaDataResultSet::ORow aRow(19);
+
+ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[3] = new ORowSetValueDecorator(getAddressBookTableName());
+ aRow[8] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[9] = ODatabaseMetaDataResultSet::get0Value();
+ aRow[10] = new ORowSetValueDecorator((sal_Int32) 10);
+ aRow[11] = ODatabaseMetaDataResultSet::get1Value();
+ aRow[12] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[13] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[14] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[15] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[16] = new ORowSetValueDecorator((sal_Int32) 254);
+ aRow[18] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("YES"));
+
+ sal_Int32 nPosition = 1;
+ TQString aQtName;
+ ::rtl::OUString sName;
+
+ aQtName = ::KABC::Addressee::revisionLabel();
+ sName = (const sal_Unicode *) aQtName.ucs2();
+ if (match(columnNamePattern, sName, '\0'))
+ {
+ aRow[4] = new ORowSetValueDecorator(sName);
+ aRow[5] = new ORowSetValueDecorator(DataType::TIMESTAMP);
+ aRow[6] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIMESTAMP"));
+ aRow[17] = new ORowSetValueDecorator(nPosition++);
+ aRows.push_back(aRow);
+ }
+
+ ::KABC::Field::List aFields = ::KABC::Field::allFields();
+ ::KABC::Field::List::iterator aField;
+
+ for ( aField = aFields.begin();
+ aField != aFields.end();
+ ++aField, ++nPosition)
+ {
+ aQtName = (*aField)->label();
+ sName = (const sal_Unicode *) aQtName.ucs2();
+ if (match(columnNamePattern, sName, '\0'))
+ {
+ aRow[4] = new ORowSetValueDecorator(sName);
+ aRow[5] = new ORowSetValueDecorator(DataType::CHAR);
+ aRow[6] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("CHAR"));
+ aRow[7] = new ORowSetValueDecorator((sal_Int32) 256);
+// Might be VARCHAR and not CHAR[256]...
+ aRow[17] = new ORowSetValueDecorator(nPosition);
+ aRows.push_back(aRow);
+ }
+ }
+ }
+ pResult->setRows(aRows);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTables(
+ const Any&,
+ const ::rtl::OUString&,
+ const ::rtl::OUString&,
+ const Sequence< ::rtl::OUString >& types) throw(SQLException, RuntimeException)
+{
+ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTables);
+ Reference< XResultSet > xRef = pResult;
+
+ // check whether we have tables in the requested types
+ // for the moment, we answer only the "TABLE" table type
+ // when no types are given at all, we return all the tables
+ static const ::rtl::OUString aTable(::rtl::OUString::createFromAscii("TABLE"));
+ sal_Bool bTableFound = sal_False;
+ const ::rtl::OUString* p = types.getConstArray(),
+ * pEnd = p + types.getLength();
+
+ if (p == pEnd)
+ {
+ bTableFound = sal_True;
+ }
+ else while (p < pEnd)
+ {
+ if (match(*p, aTable, '\0'))
+ {
+ bTableFound = sal_True;
+ break;
+ }
+ p++;
+ }
+ if (!bTableFound)
+ return xRef;
+
+ static ODatabaseMetaDataResultSet::ORows aRows;
+
+ if (aRows.empty())
+ {
+ ODatabaseMetaDataResultSet::ORow aRow(6);
+
+ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[3] = new ORowSetValueDecorator(getAddressBookTableName());
+ aRow[4] = new ORowSetValueDecorator(aTable);
+ aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRows.push_back(aRow);
+ }
+ pResult->setRows(aRows);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getProcedureColumns(
+ const Any&, const ::rtl::OUString&,
+ const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedureColumns );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getProcedures(
+ const Any&, const ::rtl::OUString&,
+ const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eProcedures );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getVersionColumns(
+ const Any&, const ::rtl::OUString&, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
+{
+ ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eVersionColumns);
+
+ Reference< XResultSet > xRef = pResult;
+
+ ODatabaseMetaDataResultSet::ORows aRows;
+
+ if (table == getAddressBookTableName())
+ {
+ ODatabaseMetaDataResultSet::ORow aRow( 9 );
+ TQString aQtName = ::KABC::Addressee::revisionLabel();
+ ::rtl::OUString sName = (const sal_Unicode *) aQtName.ucs2();
+
+ aRow[0] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue();
+
+ aRow[2] = new ORowSetValueDecorator(sName);
+ aRow[3] = new ORowSetValueDecorator(DataType::TIMESTAMP);
+ aRow[4] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIMESTAMP"));
+
+ aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[6] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[7] = ODatabaseMetaDataResultSet::getEmptyValue();
+ aRow[8] = ODatabaseMetaDataResultSet::getEmptyValue();
+
+ aRows.push_back(aRow);
+ }
+ pResult->setRows(aRows);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getExportedKeys(
+ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eExportedKeys );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getImportedKeys(
+ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eImportedKeys );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getPrimaryKeys(
+ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::ePrimaryKeys );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getIndexInfo(
+ const Any&, const ::rtl::OUString&, const ::rtl::OUString&,
+ sal_Bool, sal_Bool ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eIndexInfo );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getBestRowIdentifier(
+ const Any&, const ::rtl::OUString&, const ::rtl::OUString&, sal_Int32,
+ sal_Bool ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eBestRowIdentifier );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getTablePrivileges(
+ const Any&, const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eTablePrivileges );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getCrossReference(
+ const Any&, const ::rtl::OUString&,
+ const ::rtl::OUString&, const Any&,
+ const ::rtl::OUString&, const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ return new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eCrossReference );
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabDatabaseMetaData::getUDTs( const Any&, const ::rtl::OUString&, const ::rtl::OUString&, const Sequence< sal_Int32 >& ) throw(SQLException, RuntimeException)
+{
+ OSL_ENSURE(0,"Not implemented yet!");
+ throw SQLException();
+}
+// -----------------------------------------------------------------------------
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx b/connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx
new file mode 100644
index 0000000..9ddc063
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KDatabaseMetaData.hxx
@@ -0,0 +1,217 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_
+#define _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_
+
+#include "KConnection.hxx"
+#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
+#include <cppuhelper/implbase1.hxx>
+
+namespace connectivity
+{
+ namespace kab
+ {
+ //**************************************************************
+ //************ Class: KabDatabaseMetaData
+ //**************************************************************
+
+ typedef ::cppu::WeakImplHelper1< ::com::sun::star::sdbc::XDatabaseMetaData> KabDatabaseMetaData_BASE;
+
+ class KabDatabaseMetaData : public KabDatabaseMetaData_BASE
+ {
+ ::com::sun::star::uno::Reference< KabConnection > m_xConnection;
+ sal_Bool m_bUseCatalog;
+
+ public:
+
+ inline KabConnection* getOwnConnection() const { return m_xConnection.get(); }
+
+ KabDatabaseMetaData(KabConnection* _pCon);
+ static const ::rtl::OUString & getAddressBookTableName();
+ virtual ~KabDatabaseMetaData();
+
+ // this interface is really BIG
+ // XDatabaseMetaData
+ virtual sal_Bool SAL_CALL allProceduresAreCallable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL allTablesAreSelectable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getURL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getUserName( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isReadOnly( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL nullsAreSortedHigh( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL nullsAreSortedLow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL nullsAreSortedAtStart( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL nullsAreSortedAtEnd( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getDatabaseProductName( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getDatabaseProductVersion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getDriverName( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getDriverVersion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getDriverMajorVersion( ) throw(::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getDriverMinorVersion( ) throw(::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL usesLocalFiles( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL usesLocalFilePerTable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsMixedCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL storesMixedCaseQuotedIdentifiers( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getIdentifierQuoteString( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getSQLKeywords( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getNumericFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getStringFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getSystemFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getTimeDateFunctions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getSearchStringEscape( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getExtraNameCharacters( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsAlterTableWithAddColumn( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsAlterTableWithDropColumn( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsColumnAliasing( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL nullPlusNonNullIsNull( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsTypeConversion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsConvert( sal_Int32 fromType, sal_Int32 toType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsTableCorrelationNames( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsOrderByUnrelated( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsGroupBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsGroupByUnrelated( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsLikeEscapeClause( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsMultipleResultSets( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsMultipleTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsNonNullableColumns( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsCoreSQLGrammar( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsANSI92FullSQL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsOuterJoins( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsFullOuterJoins( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsLimitedOuterJoins( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getSchemaTerm( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getProcedureTerm( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getCatalogTerm( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isCatalogAtStart( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getCatalogSeparator( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSchemasInDataManipulation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSchemasInTableDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsCatalogsInDataManipulation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsCatalogsInTableDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsPositionedDelete( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsPositionedUpdate( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSelectForUpdate( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsStoredProcedures( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSubqueriesInExists( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSubqueriesInIns( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsUnion( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsUnionAll( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxCharLiteralLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxColumnNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxColumnsInIndex( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxColumnsInSelect( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxColumnsInTable( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxConnections( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxCursorNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxIndexLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxSchemaNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxProcedureNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxCatalogNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxRowSize( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxStatementLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxStatements( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxTableNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxTablesInSelect( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMaxUserNameLength( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel( sal_Int32 level ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getProcedures( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& procedureNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getProcedureColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& procedureNamePattern, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTables( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& types ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getSchemas( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getCatalogs( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTableTypes( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getColumnPrivileges( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTablePrivileges( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getBestRowIdentifier( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, sal_Int32 scope, sal_Bool nullable ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getVersionColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getPrimaryKeys( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getImportedKeys( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getExportedKeys( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getCrossReference( const ::com::sun::star::uno::Any& primaryCatalog, const ::rtl::OUString& primarySchema, const ::rtl::OUString& primaryTable, const ::com::sun::star::uno::Any& foreignCatalog, const ::rtl::OUString& foreignSchema, const ::rtl::OUString& foreignTable ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTypeInfo( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getIndexInfo( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, sal_Bool unique, sal_Bool approximate ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsResultSetType( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL ownUpdatesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL ownDeletesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL ownInsertsAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL othersUpdatesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL othersDeletesAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL othersInsertsAreVisible( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL updatesAreDetected( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL deletesAreDetected( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL insertsAreDetected( sal_Int32 setType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsBatchUpdates( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getUDTs( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& typeNamePattern, const ::com::sun::star::uno::Sequence< sal_Int32 >& types ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_DATABASEMETADATA_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KDriver.cxx b/connectivity/source/drivers/tdeab/KDriver.cxx
new file mode 100644
index 0000000..cdf0463
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KDriver.cxx
@@ -0,0 +1,476 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KDriver.hxx"
+#include "TDEInit.h"
+#include "KConnection.hxx"
+
+/** === begin UNO includes === **/
+#include <com/sun/star/sdb/SQLContext.hpp>
+#include <com/sun/star/lang/NullPointerException.hpp>
+#include <com/sun/star/frame/XDesktop.hpp>
+/** === end UNO includes === **/
+#include <rtl/ustrbuf.hxx>
+#include <tools/diagnose_ex.h>
+#include "resource/tdeab_res.hrc"
+#include "resource/sharedresources.hxx"
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::sdb;
+using namespace com::sun::star::frame;
+using namespace connectivity::kab;
+
+// =======================================================================
+// = KabImplModule
+// =======================================================================
+// --------------------------------------------------------------------------------
+KabImplModule::KabImplModule( const Reference< XMultiServiceFactory >& _rxFactory )
+ :m_xORB(_rxFactory)
+ ,m_bAttemptedLoadModule(false)
+ ,m_bAttemptedInitialize(false)
+ ,m_hConnectorModule(NULL)
+ ,m_pConnectionFactoryFunc(NULL)
+ ,m_pApplicationInitFunc(NULL)
+ ,m_pApplicationShutdownFunc(NULL)
+ ,m_pTDEVersionCheckFunc(NULL)
+{
+ if ( !m_xORB.is() )
+ throw NullPointerException();
+}
+
+// --------------------------------------------------------------------------------
+bool KabImplModule::isTDEPresent()
+{
+ if ( !impl_loadModule() )
+ return false;
+
+ return true;
+}
+
+// --------------------------------------------------------------------------------
+KabImplModule::TDEVersionType KabImplModule::matchTDEVersion()
+{
+ OSL_PRECOND( m_pTDEVersionCheckFunc, "KabImplModule::matchTDEVersion: module not loaded!" );
+
+ int nVersionInfo = (*m_pTDEVersionCheckFunc)();
+ if ( nVersionInfo < 0 )
+ return eTooOld;
+ if ( nVersionInfo > 0 )
+ return eToNew;
+ return eSupported;
+}
+
+// --------------------------------------------------------------------------------
+namespace
+{
+ template< typename FUNCTION >
+ void lcl_getFunctionFromModuleOrUnload( oslModule& _rModule, const sal_Char* _pAsciiSymbolName, FUNCTION& _rFunction )
+ {
+ _rFunction = NULL;
+ if ( _rModule )
+ {
+ //
+ const ::rtl::OUString sSymbolName = ::rtl::OUString::createFromAscii( _pAsciiSymbolName );
+ _rFunction = (FUNCTION)( osl_getSymbol( _rModule, sSymbolName.pData ) );
+
+ if ( !_rFunction )
+ { // did not find the symbol
+ OSL_ENSURE( false, ::rtl::OString( "lcl_getFunctionFromModuleOrUnload: could not find the symbol " ) + ::rtl::OString( _pAsciiSymbolName ) );
+ osl_unloadModule( _rModule );
+ _rModule = NULL;
+ }
+ }
+ }
+}
+
+// --------------------------------------------------------------------------------
+extern "C" { void SAL_CALL thisModule() {} }
+
+bool KabImplModule::impl_loadModule()
+{
+ if ( m_bAttemptedLoadModule )
+ return ( m_hConnectorModule != NULL );
+ m_bAttemptedLoadModule = true;
+
+ OSL_ENSURE( !m_hConnectorModule && !m_pConnectionFactoryFunc && !m_pApplicationInitFunc && !m_pApplicationShutdownFunc && !m_pTDEVersionCheckFunc,
+ "KabImplModule::impl_loadModule: inconsistence: inconsistency (never attempted load before, but some values already set)!");
+
+ const ::rtl::OUString sModuleName = ::rtl::OUString::createFromAscii( SAL_MODULENAME( "kabdrv1" ) );
+ m_hConnectorModule = osl_loadModuleRelative( &thisModule, sModuleName.pData, SAL_LOADMODULE_NOW ); // LAZY! #i61335#
+ OSL_ENSURE( m_hConnectorModule, "KabImplModule::impl_loadModule: could not load the implementation library!" );
+ if ( !m_hConnectorModule )
+ return false;
+
+ lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "createKabConnection", m_pConnectionFactoryFunc );
+ lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "initKApplication", m_pApplicationInitFunc );
+ lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "shutdownKApplication", m_pApplicationShutdownFunc );
+ lcl_getFunctionFromModuleOrUnload( m_hConnectorModule, "matchTDEVersion", m_pTDEVersionCheckFunc );
+
+ if ( !m_hConnectorModule )
+ // one of the symbols did not exist
+ throw RuntimeException();
+
+ return true;
+}
+
+// --------------------------------------------------------------------------------
+void KabImplModule::impl_unloadModule()
+{
+ OSL_PRECOND( m_hConnectorModule != NULL, "KabImplModule::impl_unloadModule: no module!" );
+
+ osl_unloadModule( m_hConnectorModule );
+ m_hConnectorModule = NULL;
+
+ m_pConnectionFactoryFunc = NULL;
+ m_pApplicationInitFunc = NULL;
+ m_pApplicationShutdownFunc = NULL;
+ m_pTDEVersionCheckFunc = NULL;
+
+ m_bAttemptedLoadModule = false;
+}
+
+// --------------------------------------------------------------------------------
+void KabImplModule::init()
+{
+ if ( !impl_loadModule() )
+ impl_throwNoKdeException();
+
+ // if we're not running on a supported version, throw
+ KabImplModule::TDEVersionType eTDEVersion = matchTDEVersion();
+
+ if ( eTDEVersion == eTooOld )
+ impl_throwKdeTooOldException();
+
+ if ( ( eTDEVersion == eToNew ) && !impl_doAllowNewTDEVersion() )
+ impl_throwKdeTooNewException();
+
+ if ( !m_bAttemptedInitialize )
+ {
+ m_bAttemptedInitialize = true;
+ (*m_pApplicationInitFunc)();
+ }
+}
+
+// --------------------------------------------------------------------------------
+bool KabImplModule::impl_doAllowNewTDEVersion()
+{
+ try
+ {
+ Reference< XMultiServiceFactory > xConfigProvider(
+ m_xORB->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider" ) ) ),
+ UNO_QUERY_THROW );
+ Sequence< Any > aCreationArgs(1);
+ aCreationArgs[0] <<= PropertyValue(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) ),
+ 0,
+ makeAny( KabDriver::impl_getConfigurationSettingsPath() ),
+ PropertyState_DIRECT_VALUE );
+ Reference< XPropertySet > xSettings( xConfigProvider->createInstanceWithArguments(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" ) ),
+ aCreationArgs ),
+ UNO_QUERY_THROW );
+
+ sal_Bool bDisableCheck = sal_False;
+ xSettings->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableTDEMaximumVersionCheck" ) ) ) >>= bDisableCheck;
+
+ return bDisableCheck != sal_False;
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
+ return false;
+}
+
+// --------------------------------------------------------------------------------
+void KabImplModule::impl_throwNoKdeException()
+{
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceString(
+ STR_NO_TDE_INST
+ ) );
+ impl_throwGenericSQLException( sError );
+}
+
+// --------------------------------------------------------------------------------
+void KabImplModule::impl_throwKdeTooOldException()
+{
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
+ STR_TDE_VERSION_TOO_OLD,
+ "$major$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MAJOR),
+ "$minor$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MINOR)
+ ) );
+ impl_throwGenericSQLException( sError );
+}
+
+// --------------------------------------------------------------------------------
+void KabImplModule::impl_throwGenericSQLException( const ::rtl::OUString& _rMessage )
+{
+ SQLException aError;
+ aError.Message = _rMessage;
+ aError.SQLState = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "S1000" ) );
+ aError.ErrorCode = 0;
+ throw aError;
+}
+
+// --------------------------------------------------------------------------------
+void KabImplModule::impl_throwKdeTooNewException()
+{
+ ::connectivity::SharedResources aResources;
+
+ SQLException aError;
+ aError.Message = aResources.getResourceStringWithSubstitution(
+ STR_TDE_VERSION_TOO_NEW,
+ "$major$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MAJOR),
+ "$minor$",::rtl::OUString::valueOf((sal_Int32)MIN_TDE_VERSION_MINOR)
+ );
+ aError.SQLState = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "S1000" ) );
+ aError.ErrorCode = 0;
+
+ SQLContext aDetails;
+ ::rtl::OUStringBuffer aMessage;
+ aMessage.append( aResources.getResourceString(STR_TDE_VERSION_TOO_NEW_WORK_AROUND) );
+
+ aMessage.appendAscii( "Sub disableTDEMaxVersionCheck\n" );
+ aMessage.appendAscii( " BasicLibraries.LoadLibrary( \"Tools\" )\n" );
+
+ aMessage.appendAscii( " Dim configNode as Object\n" );
+ aMessage.appendAscii( " configNode = GetRegistryKeyContent( \"" );
+ aMessage.append( KabDriver::impl_getConfigurationSettingsPath() );
+ aMessage.appendAscii( "\", true )\n" );
+
+ aMessage.appendAscii( " configNode.DisableTDEMaximumVersionCheck = TRUE\n" );
+ aMessage.appendAscii( " configNode.commitChanges\n" );
+ aMessage.appendAscii( "End Sub\n" );
+
+ aDetails.Message = aMessage.makeStringAndClear();
+
+ aError.NextException <<= aDetails;
+
+ throw aError;
+}
+
+// --------------------------------------------------------------------------------
+KabConnection* KabImplModule::createConnection( KabDriver* _pDriver ) const
+{
+ OSL_PRECOND( m_hConnectorModule, "KabImplModule::createConnection: not initialized!" );
+
+ void* pUntypedConnection = (*m_pConnectionFactoryFunc)( _pDriver );
+ if ( !pUntypedConnection )
+ throw RuntimeException();
+
+ return static_cast< KabConnection* >( pUntypedConnection );
+}
+
+// --------------------------------------------------------------------------------
+void KabImplModule::shutdown()
+{
+ if ( !m_hConnectorModule )
+ return;
+
+ (*m_pApplicationShutdownFunc)();
+ m_bAttemptedInitialize = false;
+
+ impl_unloadModule();
+}
+
+// =======================================================================
+// = KabDriver
+// =======================================================================
+KabDriver::KabDriver(
+ const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory)
+ : KDriver_BASE(m_aMutex),
+ m_xMSFactory(_rxFactory),
+ m_aImplModule(_rxFactory)
+{
+ if ( !m_xMSFactory.is() )
+ throw NullPointerException();
+
+ osl_incrementInterlockedCount( &m_refCount );
+ try
+ {
+ Reference< XDesktop > xDesktop(
+ m_xMSFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ) ) ),
+ UNO_QUERY_THROW );
+ xDesktop->addTerminateListener( this );
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
+ osl_decrementInterlockedCount( &m_refCount );
+}
+// --------------------------------------------------------------------------------
+void KabDriver::disposing()
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ // when driver will be destroied so all our connections have to be destroied as well
+ for (OWeakRefArray::iterator i = m_xConnections.begin(); m_xConnections.end() != i; ++i)
+ {
+ Reference< XComponent > xComp(i->get(), UNO_QUERY);
+ if (xComp.is())
+ xComp->dispose();
+ }
+ m_xConnections.clear();
+
+ WeakComponentImplHelperBase::disposing();
+}
+// static ServiceInfo
+//------------------------------------------------------------------------------
+rtl::OUString KabDriver::getImplementationName_Static( ) throw(RuntimeException)
+{
+ return rtl::OUString::createFromAscii( impl_getAsciiImplementationName() );
+}
+//------------------------------------------------------------------------------
+Sequence< ::rtl::OUString > KabDriver::getSupportedServiceNames_Static( ) throw (RuntimeException)
+{
+ // which service is supported
+ // for more information @see com.sun.star.sdbc.Driver
+ Sequence< ::rtl::OUString > aSNS( 1 );
+ aSNS[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.Driver");
+
+ return aSNS;
+}
+//------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabDriver::getImplementationName( ) throw(RuntimeException)
+{
+ return getImplementationName_Static();
+}
+//------------------------------------------------------------------
+sal_Bool SAL_CALL KabDriver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
+{
+ Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
+ const ::rtl::OUString* pSupported = aSupported.getConstArray();
+ const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
+
+ while (pSupported != pEnd && !pSupported->equals(_rServiceName))
+ ++pSupported;
+ return pSupported != pEnd;
+}
+//------------------------------------------------------------------
+Sequence< ::rtl::OUString > SAL_CALL KabDriver::getSupportedServiceNames( ) throw(RuntimeException)
+{
+ return getSupportedServiceNames_Static();
+}
+// --------------------------------------------------------------------------------
+Reference< XConnection > SAL_CALL KabDriver::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ m_aImplModule.init();
+
+ // create a new connection with the given properties and append it to our vector
+ KabConnection* pConnection = m_aImplModule.createConnection( this );
+ OSL_POSTCOND( pConnection, "KabDriver::connect: no connection has been created by the factory!" );
+
+ // by definition, the factory function returned an object which was acquired once
+ Reference< XConnection > xConnection = pConnection;
+ pConnection->release();
+
+ // late constructor call which can throw exception and allows a correct dtor call when so
+ pConnection->construct( url, info );
+
+ // remember it
+ m_xConnections.push_back( WeakReferenceHelper( *pConnection ) );
+
+ return xConnection;
+}
+// --------------------------------------------------------------------------------
+sal_Bool SAL_CALL KabDriver::acceptsURL( const ::rtl::OUString& url )
+ throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ if ( !m_aImplModule.isTDEPresent() )
+ return sal_False;
+
+ // here we have to look whether we support this URL format
+ return (!url.compareTo(::rtl::OUString::createFromAscii("sdbc:address:kab:"), 16));
+}
+// --------------------------------------------------------------------------------
+Sequence< DriverPropertyInfo > SAL_CALL KabDriver::getPropertyInfo( const ::rtl::OUString&, const Sequence< PropertyValue >& ) throw(SQLException, RuntimeException)
+{
+ // if you have something special to say, return it here :-)
+ return Sequence< DriverPropertyInfo >();
+}
+// --------------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDriver::getMajorVersion( ) throw(RuntimeException)
+{
+ return KAB_DRIVER_VERSION_MAJOR;
+}
+// --------------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabDriver::getMinorVersion( ) throw(RuntimeException)
+{
+ return KAB_DRIVER_VERSION_MINOR;
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabDriver::queryTermination( const EventObject& ) throw (TerminationVetoException, RuntimeException)
+{
+ // nothing to do, nothing to veto
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabDriver::notifyTermination( const EventObject& ) throw (RuntimeException)
+{
+ m_aImplModule.shutdown();
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL KabDriver::disposing( const EventObject& ) throw (RuntimeException)
+{
+ // not interested in (this is the disposing of the desktop, if any)
+}
+// --------------------------------------------------------------------------------
+const sal_Char* KabDriver::impl_getAsciiImplementationName()
+{
+ return "com.sun.star.comp.sdbc.kab.Driver";
+ // this name is referenced in the configuration and in the kab.xml
+ // Please be careful when changing it.
+}
+// --------------------------------------------------------------------------------
+::rtl::OUString KabDriver::impl_getConfigurationSettingsPath()
+{
+ ::rtl::OUStringBuffer aPath;
+ aPath.appendAscii( "/org.openoffice.Office.DataAccess/DriverSettings/" );
+ aPath.appendAscii( "com.sun.star.comp.sdbc.kab.Driver" );
+ return aPath.makeStringAndClear();
+}
+// --------------------------------------------------------------------------------
+Reference< XInterface > SAL_CALL KabDriver::Create( const Reference< XMultiServiceFactory >& _rxFactory ) throw( Exception )
+{
+ return *(new KabDriver(_rxFactory));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KDriver.hxx b/connectivity/source/drivers/tdeab/KDriver.hxx
new file mode 100644
index 0000000..b09a7d2
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KDriver.hxx
@@ -0,0 +1,227 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_DRIVER_HXX_
+#define _CONNECTIVITY_KAB_DRIVER_HXX_
+
+/** === begin UNO includes === **/
+#include <com/sun/star/sdbc/XDriver.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/frame/XTerminateListener.hpp>
+/** === end UNO includes === **/
+#include <cppuhelper/compbase3.hxx>
+#include <osl/module.h>
+
+namespace connectivity
+{
+ namespace kab
+ {
+ class KabConnection;
+ class KabDriver;
+
+ typedef void* (SAL_CALL * ConnectionFactoryFunction)( void* _pDriver );
+ typedef void (SAL_CALL * ApplicationInitFunction)( void );
+ typedef void (SAL_CALL * ApplicationShutdownFunction)( void );
+ typedef int (SAL_CALL * TDEVersionCheckFunction)( void );
+
+ typedef std::vector< ::com::sun::star::uno::WeakReferenceHelper > OWeakRefArray;
+
+ // ===============================================================
+ // = KabImplModule
+ // ===============================================================
+ class KabImplModule
+ {
+ private:
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ m_xORB;
+
+ /// Did we already attempt to load the module and to retrieve the symbols?
+ bool m_bAttemptedLoadModule;
+ /// Did we already check the TDE version and initialize the impl module (or at least attempted to)?
+ bool m_bAttemptedInitialize;
+
+ oslModule m_hConnectorModule;
+ ConnectionFactoryFunction m_pConnectionFactoryFunc;
+ ApplicationInitFunction m_pApplicationInitFunc;
+ ApplicationShutdownFunction m_pApplicationShutdownFunc;
+ TDEVersionCheckFunction m_pTDEVersionCheckFunc;
+
+ public:
+ KabImplModule( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory );
+
+ /** determines whether there is a TDE present in the environment
+ */
+ bool isTDEPresent();
+
+ enum TDEVersionType
+ {
+ eTooOld,
+ eSupported,
+ eToNew
+ };
+ /** checks whether the TDE version we're running against is supported
+ @precond
+ the module is loaded, i.e impl_loadModule has successfully been called
+ */
+ TDEVersionType matchTDEVersion();
+
+ /** initializes the implementation module.
+
+ @raises ::com::sun::star::uno::RuntimeException
+ if the module could be loaded, but required symbols are missing
+ @raises ::com::sun::star::sdbc::SQLException
+ if the TDE version we're running against is not supported, or no TDE was found at all
+ */
+ void init();
+
+ /** shuts down the impl module (and the TDE application, if we own it)
+ */
+ void shutdown();
+
+ /** creates a new connection
+ @precond
+ <member>init</member> has been called before
+ @raises ::com::sun::star::uno::RuntimeException
+ if no connection object could be created (which is a severe error, normally impossible)
+ */
+ KabConnection* createConnection( KabDriver* _pDriver ) const;
+
+ private:
+ /** loads the implementation module and retrieves the needed symbols
+
+ Save against being called multiple times.
+
+ @return <TRUE/> if the module could be loaded successfully.
+
+ @raises ::com::sun::star::uno::RuntimeException
+ if the module could be loaded, but required symbols are missing
+ */
+ bool impl_loadModule();
+
+ /** unloads the implementation module, and resets all function pointers to <NULL/>
+ @precond m_hConnectorModule is not <NULL/>
+ */
+ void impl_unloadModule();
+
+ /** throws an SQLException saying than no TDE installation was found
+ */
+ void impl_throwNoKdeException();
+
+ /** throws an SQLException saying that the found TDE version is too old
+ */
+ void impl_throwKdeTooOldException();
+
+ /** throws an SQLException saying that the found TDE version is too new
+ */
+ void impl_throwKdeTooNewException();
+
+ /** throws a generic SQL exception with SQLState S1000 and error code 0
+ */
+ void impl_throwGenericSQLException( const ::rtl::OUString& _rMessage );
+
+ /** determines whether it's allowed to run on a too-new (not confirmed to work) version
+ */
+ bool impl_doAllowNewTDEVersion();
+ };
+
+ // ===============================================================
+ // = KabDriver
+ // ===============================================================
+ typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::sdbc::XDriver,
+ ::com::sun::star::lang::XServiceInfo,
+ ::com::sun::star::frame::XTerminateListener > KDriver_BASE;
+ class KabDriver : public KDriver_BASE
+ {
+ protected:
+ ::osl::Mutex m_aMutex; // mutex is need to control member access
+ OWeakRefArray m_xConnections; // vector containing a list of all the
+ // KabConnection objects for this Driver
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ m_xMSFactory; // the multi-service factory
+ KabImplModule m_aImplModule;
+
+ public:
+ static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception );
+
+ // XServiceInfo - static versions
+ static ::rtl::OUString getImplementationName_Static( ) throw(::com::sun::star::uno::RuntimeException);
+ static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static( ) throw (::com::sun::star::uno::RuntimeException);
+
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&
+ getMSFactory() const { return m_xMSFactory; }
+
+ /** returns the driver's implementation name (being pure ASCII) for reference in various places
+ */
+ static const sal_Char* impl_getAsciiImplementationName();
+
+ /** returns the path of our configuration settings
+ */
+ static ::rtl::OUString impl_getConfigurationSettingsPath();
+
+ protected:
+ KabDriver(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory);
+
+ // OComponentHelper
+ virtual void SAL_CALL disposing(void);
+
+ // XServiceInfo
+ virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException);
+
+ // XDriver
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL connect( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL acceptsURL( const ::rtl::OUString& url ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMajorVersion() throw(::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getMinorVersion() throw(::com::sun::star::uno::RuntimeException);
+
+ // XTerminateListener
+ virtual void SAL_CALL queryTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::frame::TerminationVetoException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL notifyTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::uno::RuntimeException);
+
+ // XEventListener
+ virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
+
+ private:
+ /** shuts down the library which contains the real implementations
+
+ This method is safe against being called multiple times
+
+ @precond our mutex is locked
+ */
+ void impl_shutdownImplementationModule();
+ };
+ }
+
+}
+
+#endif // _CONNECTIVITY_KAB_DRIVER_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KPreparedStatement.cxx b/connectivity/source/drivers/tdeab/KPreparedStatement.cxx
new file mode 100644
index 0000000..12816c2
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KPreparedStatement.cxx
@@ -0,0 +1,394 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KPreparedStatement.hxx"
+#include "propertyids.hxx"
+#include <connectivity/dbexception.hxx>
+#include <connectivity/dbtools.hxx>
+#include "resource/tdeab_res.hrc"
+#include "resource/sharedresources.hxx"
+
+using namespace connectivity::kab;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::util;
+
+IMPLEMENT_SERVICE_INFO(KabPreparedStatement, "com.sun.star.sdbc.drivers.KabPreparedStatement", "com.sun.star.sdbc.PreparedStatement");
+// -------------------------------------------------------------------------
+void KabPreparedStatement::checkAndResizeParameters(sal_Int32 nParams) throw(SQLException)
+{
+ if ( !m_aParameterRow.is() )
+ m_aParameterRow = new OValueVector();
+
+ if (nParams < 1)
+ ::dbtools::throwInvalidIndexException(*(KabPreparedStatement *) this,Any());
+
+ if (nParams >= (sal_Int32) (m_aParameterRow->get()).size())
+ (m_aParameterRow->get()).resize(nParams);
+}
+// -------------------------------------------------------------------------
+void KabPreparedStatement::setKabFields() const throw(SQLException)
+{
+ ::rtl::Reference<connectivity::OSQLColumns> xColumns; // selected columns
+
+ xColumns = m_aSQLIterator.getSelectColumns();
+ if (!xColumns.is())
+ {
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceString(
+ STR_INVALID_COLUMN_SELECTION
+ ) );
+ ::dbtools::throwGenericSQLException(sError,NULL);
+ }
+ m_xMetaData->setKabFields(xColumns);
+}
+// -------------------------------------------------------------------------
+void KabPreparedStatement::resetParameters() const throw(SQLException)
+{
+ m_nParameterIndex = 0;
+}
+// -------------------------------------------------------------------------
+void KabPreparedStatement::getNextParameter(::rtl::OUString &rParameter) const throw(SQLException)
+{
+ if (m_nParameterIndex >= (sal_Int32) (m_aParameterRow->get()).size())
+ {
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceString(
+ STR_INVALID_PARA_COUNT
+ ) );
+ ::dbtools::throwGenericSQLException(sError,*(KabPreparedStatement *) this);
+ } // if (m_nParameterIndex >= (sal_Int32) (*m_aParameterRow).size())
+
+ rParameter = (m_aParameterRow->get())[m_nParameterIndex];
+
+ m_nParameterIndex++;
+}
+// -------------------------------------------------------------------------
+KabPreparedStatement::KabPreparedStatement(
+ KabConnection* _pConnection,
+ const ::rtl::OUString& sql)
+ : KabPreparedStatement_BASE(_pConnection),
+ m_sSqlStatement(sql),
+ m_bPrepared(sal_False),
+ m_nParameterIndex(0),
+ m_aParameterRow()
+{
+}
+// -------------------------------------------------------------------------
+KabPreparedStatement::~KabPreparedStatement()
+{
+}
+// -------------------------------------------------------------------------
+void KabPreparedStatement::disposing()
+{
+ KabPreparedStatement_BASE::disposing();
+
+ if (m_aParameterRow.is())
+ {
+ m_aParameterRow->get().clear();
+ m_aParameterRow = NULL;
+ }
+}
+// -------------------------------------------------------------------------
+Reference< XResultSetMetaData > SAL_CALL KabPreparedStatement::getMetaData() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ if (!m_xMetaData.is())
+ {
+ m_xMetaData = new KabResultSetMetaData(getOwnConnection());
+ setKabFields();
+ }
+ Reference< XResultSetMetaData > xMetaData = m_xMetaData.get();
+ return xMetaData;
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::close() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ // Reset last warning message
+ try {
+ clearWarnings ();
+ KabCommonStatement::close();
+ }
+ catch (SQLException &) {
+ // If we get an error, ignore
+ }
+
+ // Remove this Statement object from the Connection object's
+ // list
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabPreparedStatement::execute() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ Reference< XResultSet> xRS = KabCommonStatement::executeQuery(m_sSqlStatement);
+
+ return xRS.is();
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabPreparedStatement::executeUpdate() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ // same as in statement with the difference that this statement also can contain parameter
+ return 0;
+}
+// -------------------------------------------------------------------------
+Reference< XConnection > SAL_CALL KabPreparedStatement::getConnection() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ return (Reference< XConnection >) m_pConnection;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabPreparedStatement::executeQuery() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ Reference< XResultSet > rs = KabCommonStatement::executeQuery(m_sSqlStatement);
+
+ return rs;
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setNull(sal_Int32 parameterIndex, sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ checkAndResizeParameters(parameterIndex);
+
+ (m_aParameterRow->get())[parameterIndex - 1].setNull();
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setObjectNull(sal_Int32, sal_Int32, const ::rtl::OUString&) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setObjectNull", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setBoolean(sal_Int32, sal_Bool) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setBoolean", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setByte(sal_Int32, sal_Int8) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setByte", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setShort(sal_Int32, sal_Int16) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setShort", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setInt(sal_Int32, sal_Int32) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setInt", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setLong(sal_Int32, sal_Int64) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setFloat(sal_Int32, float) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setFloat", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setDouble(sal_Int32, double) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setDouble", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setString(sal_Int32 parameterIndex, const ::rtl::OUString &x) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ checkAndResizeParameters(parameterIndex);
+
+ (m_aParameterRow->get())[parameterIndex - 1] = x;
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setBytes(sal_Int32, const Sequence< sal_Int8 >&) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setBytes", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setDate(sal_Int32, const Date&) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setDate", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setTime(sal_Int32, const Time&) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setTime", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setTimestamp(sal_Int32, const DateTime&) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setTimestamp", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setBinaryStream(sal_Int32, const Reference< ::com::sun::star::io::XInputStream >&, sal_Int32) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setBinaryStream", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setCharacterStream(sal_Int32, const Reference< ::com::sun::star::io::XInputStream >&, sal_Int32) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setCharacterStream", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setObject(sal_Int32 parameterIndex, const Any& x) throw(SQLException, RuntimeException)
+{
+ if(!::dbtools::implSetObject(this,parameterIndex,x))
+ {
+ throw SQLException();
+ }
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setObjectWithInfo(sal_Int32, const Any&, sal_Int32, sal_Int32) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setObjectWithInfo", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setRef(sal_Int32, const Reference< XRef >&) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setRef", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setBlob(sal_Int32, const Reference< XBlob >&) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setBlob", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setClob(sal_Int32, const Reference< XClob >&) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setClob", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::setArray(sal_Int32, const Reference< XArray >&) throw(SQLException, RuntimeException)
+{
+
+
+
+::dbtools::throwFunctionNotSupportedException("setArray", NULL);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabPreparedStatement::clearParameters() throw(SQLException, RuntimeException)
+{
+::dbtools::throwFunctionNotSupportedException("clearParameters", NULL);
+}
+// -------------------------------------------------------------------------
+void KabPreparedStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) throw (Exception)
+{
+ switch (nHandle)
+ {
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ break;
+ case PROPERTY_ID_RESULTSETTYPE:
+ break;
+ case PROPERTY_ID_FETCHDIRECTION:
+ break;
+ case PROPERTY_ID_USEBOOKMARKS:
+ break;
+ default:
+ KabCommonStatement::setFastPropertyValue_NoBroadcast(nHandle,rValue);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KPreparedStatement.hxx b/connectivity/source/drivers/tdeab/KPreparedStatement.hxx
new file mode 100644
index 0000000..25a7a01
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KPreparedStatement.hxx
@@ -0,0 +1,123 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_
+#define _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_
+
+#include "KStatement.hxx"
+#include "KResultSetMetaData.hxx"
+#include <connectivity/FValue.hxx>
+#include <com/sun/star/sdbc/XParameters.hpp>
+#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
+#include <cppuhelper/implbase4.hxx>
+
+namespace connectivity
+{
+ namespace kab
+ {
+
+ class OBoundParam;
+ typedef ::cppu::ImplInheritanceHelper4< KabCommonStatement,
+ ::com::sun::star::sdbc::XPreparedStatement,
+ ::com::sun::star::sdbc::XParameters,
+ ::com::sun::star::sdbc::XResultSetMetaDataSupplier,
+ ::com::sun::star::lang::XServiceInfo> KabPreparedStatement_BASE;
+
+ class KabPreparedStatement : public KabPreparedStatement_BASE
+ {
+ protected:
+ ::rtl::OUString m_sSqlStatement;
+ ::rtl::Reference< KabResultSetMetaData >
+ m_xMetaData;
+ sal_Bool m_bPrepared;
+ mutable sal_Int32 m_nParameterIndex;
+ OValueRow m_aParameterRow;
+
+ void checkAndResizeParameters(sal_Int32 nParams) throw(::com::sun::star::sdbc::SQLException);
+ void setKabFields() const throw(::com::sun::star::sdbc::SQLException);
+
+ protected:
+ virtual void SAL_CALL setFastPropertyValue_NoBroadcast(
+ sal_Int32 nHandle,
+ const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::uno::Exception);
+
+ virtual void resetParameters() const throw(::com::sun::star::sdbc::SQLException);
+ virtual void getNextParameter(::rtl::OUString &rParameter) const throw(::com::sun::star::sdbc::SQLException);
+ virtual ~KabPreparedStatement();
+
+ public:
+ DECLARE_SERVICE_INFO();
+ KabPreparedStatement(KabConnection* _pConnection, const ::rtl::OUString& sql);
+
+ // OComponentHelper
+ virtual void SAL_CALL disposing();
+
+ // XPreparedStatement
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL executeUpdate( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL execute( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XParameters
+ virtual void SAL_CALL setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const ::rtl::OUString& typeName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setBoolean( sal_Int32 parameterIndex, sal_Bool x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setByte( sal_Int32 parameterIndex, sal_Int8 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setShort( sal_Int32 parameterIndex, sal_Int16 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setInt( sal_Int32 parameterIndex, sal_Int32 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setLong( sal_Int32 parameterIndex, sal_Int64 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setFloat( sal_Int32 parameterIndex, float x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setDouble( sal_Int32 parameterIndex, double x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setString( sal_Int32 parameterIndex, const ::rtl::OUString& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setBytes( sal_Int32 parameterIndex, const ::com::sun::star::uno::Sequence< sal_Int8 >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setDate( sal_Int32 parameterIndex, const ::com::sun::star::util::Date& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setTime( sal_Int32 parameterIndex, const ::com::sun::star::util::Time& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setTimestamp( sal_Int32 parameterIndex, const ::com::sun::star::util::DateTime& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setBinaryStream( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setCharacterStream( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setObject( sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setObjectWithInfo( sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setRef( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setBlob( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL clearParameters( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XCloseable
+ virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XResultSetMetaDataSupplier
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_PREPAREDSTATEMENT_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KResultSet.cxx b/connectivity/source/drivers/tdeab/KResultSet.cxx
new file mode 100644
index 0000000..a0d6b07
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KResultSet.cxx
@@ -0,0 +1,991 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KResultSet.hxx"
+#include "KResultSetMetaData.hxx"
+#include "KConnection.hxx"
+#include "kcondition.hxx"
+#include "korder.hxx"
+#include "kfields.hxx"
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/sdbcx/CompareBookmark.hpp>
+#include "TConnection.hxx"
+#include <connectivity/dbexception.hxx>
+#include "resource/tdeab_res.hrc"
+#include "resource/sharedresources.hxx"
+
+using namespace connectivity::kab;
+using namespace cppu;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::sdbcx;
+using namespace com::sun::star::io;
+using namespace com::sun::star::util;
+
+IMPLEMENT_SERVICE_INFO(KabResultSet, "com.sun.star.sdbc.drivers.KabResultSet", "com.sun.star.sdbc.ResultSet");
+// -------------------------------------------------------------------------
+KabResultSet::KabResultSet(KabCommonStatement* pStmt)
+ : KabResultSet_BASE(m_aMutex),
+ OPropertySetHelper(KabResultSet_BASE::rBHelper),
+ m_xStatement(pStmt),
+ m_xMetaData(NULL),
+ m_aKabAddressees(),
+ m_nRowPos(-1),
+ m_bWasNull(sal_True)
+{
+}
+// -------------------------------------------------------------------------
+KabResultSet::~KabResultSet()
+{
+}
+// -------------------------------------------------------------------------
+void KabResultSet::allKabAddressees()
+{
+ KabConnection* pConnection = static_cast< KabConnection *>(m_xStatement->getConnection().get());
+ KABC::AddressBook* pAddressBook = pConnection->getAddressBook();
+
+ m_aKabAddressees = pAddressBook->allAddressees();
+}
+// -------------------------------------------------------------------------
+void KabResultSet::someKabAddressees(const KabCondition *pCondition)
+{
+ KabConnection* pConnection = static_cast< KabConnection *>(m_xStatement->getConnection().get());
+ KABC::AddressBook* pAddressBook = pConnection->getAddressBook();
+
+ KABC::AddressBook::Iterator iterator;
+
+ for (iterator = pAddressBook->begin();
+ iterator != pAddressBook->end();
+ ++iterator)
+ {
+ if (pCondition->eval(*iterator))
+ m_aKabAddressees.push_back(*iterator);
+ }
+}
+// -------------------------------------------------------------------------
+void KabResultSet::sortKabAddressees(const KabOrder *pOrder)
+{
+ // We do not use class KAddresseeList, which has a sorting algorithm in it, because
+ // it uses templates. It would expand to more or less the same code as the one
+ // which follows, but it would need not be called in a much less convenient way.
+
+ KABC::Addressee::List::Iterator
+ begin = m_aKabAddressees.begin(),
+ end = m_aKabAddressees.end(),
+ iterator;
+
+ // Bubble sort. Feel free to implement a better algorithm.
+ while (begin != end)
+ {
+ end--;
+ for (iterator = begin; iterator != end; ++iterator)
+ {
+ if (pOrder->compare(*iterator, *end) > 0)
+ qSwap(*iterator, *end);
+ }
+ }
+}
+// -------------------------------------------------------------------------
+void KabResultSet::disposing()
+{
+ OPropertySetHelper::disposing();
+
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+m_xStatement.clear();
+m_xMetaData.clear();
+}
+// -------------------------------------------------------------------------
+Any SAL_CALL KabResultSet::queryInterface(const Type & rType) throw(RuntimeException)
+{
+ Any aRet = OPropertySetHelper::queryInterface(rType);
+ if (!aRet.hasValue())
+ aRet = KabResultSet_BASE::queryInterface(rType);
+ return aRet;
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::acquire() throw()
+{
+ KabResultSet_BASE::acquire();
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::release() throw()
+{
+ KabResultSet_BASE::release();
+}
+// -------------------------------------------------------------------------
+Sequence< Type > SAL_CALL KabResultSet::getTypes() throw(RuntimeException)
+{
+ OTypeCollection aTypes(
+ ::getCppuType( (const Reference< ::com::sun::star::beans::XMultiPropertySet >*) 0),
+ ::getCppuType( (const Reference< ::com::sun::star::beans::XFastPropertySet >*) 0),
+ ::getCppuType( (const Reference< ::com::sun::star::beans::XPropertySet >*) 0));
+
+ return comphelper::concatSequences(aTypes.getTypes(), KabResultSet_BASE::getTypes());
+}
+// -------------------------------------------------------------------------
+::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL KabResultSet::getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException)
+{
+ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSet::findColumn(const ::rtl::OUString& columnName) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ // find the first column with the name columnName
+ Reference< XResultSetMetaData > xMeta = getMetaData();
+ sal_Int32 nLen = xMeta->getColumnCount();
+
+ for (sal_Int32 i = 1; i <= nLen; ++i)
+ if (xMeta->isCaseSensitive(i) ?
+ columnName == xMeta->getColumnName(i) :
+ columnName.equalsIgnoreAsciiCase(xMeta->getColumnName(i)))
+ return i;
+
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
+ STR_INVALID_COLUMNNAME,
+ "$columnname$",columnName
+ ) );
+ ::dbtools::throwGenericSQLException(sError,NULL);
+
+ // Unreachable:
+ OSL_ASSERT(false);
+ return 0;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabResultSet::getString(sal_Int32 columnIndex) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ ::rtl::OUString aRet;
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+ ::KABC::Field::List aFields = ::KABC::Field::allFields();
+
+ if (m_nRowPos != -1 && m_nRowPos != nAddressees && m_xMetaData.is())
+ {
+ sal_Int32 nFieldNumber = m_xMetaData->fieldAtColumn(columnIndex);
+ TQString aQtName;
+
+ switch (nFieldNumber)
+ {
+ case KAB_FIELD_REVISION:
+// trigger an exception here
+m_bWasNull = true;
+return aRet;
+ default:
+ aQtName = aFields[nFieldNumber - KAB_DATA_FIELDS]->value(m_aKabAddressees[m_nRowPos]);
+ }
+// TDE address book currently does not use NULL values.
+// But it might do it someday
+ if (!aQtName.isNull())
+ {
+ m_bWasNull = false;
+ aRet = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+ return aRet;
+ }
+ }
+// Trigger an exception ?
+ m_bWasNull = true;
+ return aRet;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::getBoolean(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getBoolean", NULL);
+
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Int8 SAL_CALL KabResultSet::getByte(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getByte", NULL);
+
+ sal_Int8 nRet = 0;
+ return nRet;
+}
+// -------------------------------------------------------------------------
+sal_Int16 SAL_CALL KabResultSet::getShort(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getShort", NULL);
+
+ sal_Int16 nRet = 0;
+ return nRet;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSet::getInt(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getInt", NULL);
+
+ sal_Int32 nRet = 0;
+ return nRet;
+}
+// -------------------------------------------------------------------------
+sal_Int64 SAL_CALL KabResultSet::getLong(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getLong", NULL);
+
+ return sal_Int64();
+}
+// -------------------------------------------------------------------------
+float SAL_CALL KabResultSet::getFloat(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getFloat", NULL);
+
+ float nVal(0);
+ return nVal;
+}
+// -------------------------------------------------------------------------
+double SAL_CALL KabResultSet::getDouble(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getDouble", NULL);
+
+ double nRet = 0;
+ return nRet;
+}
+// -------------------------------------------------------------------------
+Sequence< sal_Int8 > SAL_CALL KabResultSet::getBytes(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("", NULL);
+
+ return Sequence< sal_Int8 >();
+}
+// -------------------------------------------------------------------------
+Date SAL_CALL KabResultSet::getDate(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getDate", NULL);
+
+ Date aRet;
+ return aRet;
+}
+// -------------------------------------------------------------------------
+Time SAL_CALL KabResultSet::getTime(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getTime", NULL);
+
+ Time nRet;
+ return nRet;
+}
+// -------------------------------------------------------------------------
+DateTime SAL_CALL KabResultSet::getTimestamp(sal_Int32 columnIndex) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ DateTime nRet;
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+
+ if (m_nRowPos != -1 && m_nRowPos != nAddressees && m_xMetaData.is())
+ {
+ KabResultSetMetaData *pMeta = static_cast<KabResultSetMetaData *>(m_xMetaData.get());
+ sal_Int32 nFieldNumber = pMeta->fieldAtColumn(columnIndex);
+
+ if (nFieldNumber == KAB_FIELD_REVISION)
+ {
+ TQDateTime nRevision(m_aKabAddressees[m_nRowPos].revision());
+
+ if (!nRevision.isNull())
+ {
+ m_bWasNull = false;
+ nRet.Year = nRevision.date().year();
+ nRet.Month = nRevision.date().month();
+ nRet.Day = nRevision.date().day();
+ nRet.Hours = nRevision.time().hour();
+ nRet.Minutes = nRevision.time().minute();
+ nRet.Seconds = nRevision.time().second();
+ nRet.HundredthSeconds = nRevision.time().msec() / 10;
+ return nRet;
+ }
+ }
+ else {
+ ;
+ }
+// trigger an exception here
+ }
+// Trigger an exception ?
+ m_bWasNull = true;
+ return nRet;
+}
+// -------------------------------------------------------------------------
+Reference< XInputStream > SAL_CALL KabResultSet::getBinaryStream(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getBinaryStream", NULL);
+
+ return NULL;
+}
+// -------------------------------------------------------------------------
+Reference< XInputStream > SAL_CALL KabResultSet::getCharacterStream(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getCharacterStream", NULL);
+
+ return NULL;
+}
+// -------------------------------------------------------------------------
+Any SAL_CALL KabResultSet::getObject(sal_Int32, const Reference< ::com::sun::star::container::XNameAccess >&) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getObject", NULL);
+
+ return Any();
+}
+// -------------------------------------------------------------------------
+Reference< XRef > SAL_CALL KabResultSet::getRef(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getRef", NULL);
+
+ return NULL;
+}
+// -------------------------------------------------------------------------
+Reference< XBlob > SAL_CALL KabResultSet::getBlob(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getBlob", NULL);
+
+ return NULL;
+}
+// -------------------------------------------------------------------------
+Reference< XClob > SAL_CALL KabResultSet::getClob(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getClob", NULL);
+
+ return NULL;
+}
+// -------------------------------------------------------------------------
+Reference< XArray > SAL_CALL KabResultSet::getArray(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+::dbtools::throwFunctionNotSupportedException("getArray", NULL);
+
+ return NULL;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSetMetaData > SAL_CALL KabResultSet::getMetaData() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ if (!m_xMetaData.is())
+ m_xMetaData = new KabResultSetMetaData(m_xStatement->getOwnConnection());
+
+ Reference< XResultSetMetaData > xMetaData = m_xMetaData.get();
+ return xMetaData;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::isBeforeFirst() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ if (m_nRowPos == -1)
+ return sal_True;
+
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::isAfterLast() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+ if (m_nRowPos == nAddressees)
+ return sal_True;
+
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::isFirst() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ if (m_nRowPos == 0)
+ return sal_True;
+
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::isLast() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+ if (m_nRowPos == nAddressees - 1)
+ return sal_True;
+
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::beforeFirst() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ // move before the first row
+ m_nRowPos = -1;
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::afterLast() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ // move after the last row
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+ m_nRowPos = nAddressees;
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::close() throw(SQLException, RuntimeException)
+{
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+ }
+ dispose();
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::first() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+ if (nAddressees == 0)
+ return sal_False;
+
+ m_nRowPos = 0;
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::last() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+ if (nAddressees == 0)
+ return sal_False;
+
+ m_nRowPos = nAddressees - 1;
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSet::getRow() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ return m_nRowPos;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::absolute(sal_Int32 row) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+ if (row <= -1 ||
+ row >= nAddressees)
+ return sal_False;
+
+ m_nRowPos = row;
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::relative(sal_Int32 row) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ return absolute(m_nRowPos + row);
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::next() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ return absolute(m_nRowPos + 1);
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::previous() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ return absolute(m_nRowPos - 1);
+}
+// -------------------------------------------------------------------------
+Reference< XInterface > SAL_CALL KabResultSet::getStatement() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ Reference< XStatement > xStatement = m_xStatement.get();
+ return xStatement;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::rowDeleted() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::rowInserted() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::rowUpdated() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::wasNull() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ return m_bWasNull;
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::cancel() throw(RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::clearWarnings() throw(SQLException, RuntimeException)
+{
+}
+// -------------------------------------------------------------------------
+Any SAL_CALL KabResultSet::getWarnings() throw(SQLException, RuntimeException)
+{
+ return Any();
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::insertRow() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ // you only have to implement this if you want to insert new rows
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateRow() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ // only when you allow updates
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::deleteRow() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::cancelRowUpdates() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::moveToInsertRow() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ // only when you allow inserts
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::moveToCurrentRow() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateNull(sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateBoolean(sal_Int32, sal_Bool) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateByte(sal_Int32, sal_Int8) throw(SQLException, RuntimeException)
+{
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+ ::osl::MutexGuard aGuard( m_aMutex );
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateShort(sal_Int32, sal_Int16) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateInt(sal_Int32, sal_Int32) throw(SQLException, RuntimeException)
+{
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+ ::osl::MutexGuard aGuard( m_aMutex );
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateLong(sal_Int32, sal_Int64) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -----------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateFloat(sal_Int32, float) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateDouble(sal_Int32, double) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateString(sal_Int32, const ::rtl::OUString&) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateBytes(sal_Int32, const Sequence< sal_Int8 >&) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateDate(sal_Int32, const Date&) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateTime(sal_Int32, const Time&) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateTimestamp(sal_Int32, const DateTime&) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateBinaryStream(sal_Int32, const Reference< XInputStream >&, sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateCharacterStream(sal_Int32, const Reference< XInputStream >&, sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::refreshRow() throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateObject(sal_Int32, const Any&) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabResultSet::updateNumericObject(sal_Int32, const Any&, sal_Int32) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+}
+// -------------------------------------------------------------------------
+// XRowLocate
+Any SAL_CALL KabResultSet::getBookmark() throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+
+ if (m_nRowPos != -1 && m_nRowPos != nAddressees)
+ {
+ TQString aQtName = m_aKabAddressees[m_nRowPos].uid();
+ ::rtl::OUString sUniqueIdentifier = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+ return makeAny(sUniqueIdentifier);
+ }
+ return Any();
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::moveToBookmark(const Any& bookmark) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ ::rtl::OUString sBookmark = comphelper::getString(bookmark);
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+
+ for (sal_Int32 nRow = 0; nRow < nAddressees; nRow++)
+ {
+ TQString aQtName = m_aKabAddressees[nRow].uid();
+ ::rtl::OUString sUniqueIdentifier = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+
+ if (sUniqueIdentifier == sBookmark)
+ {
+ m_nRowPos = nRow;
+ return sal_True;
+ }
+ }
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::moveRelativeToBookmark(const Any& bookmark, sal_Int32 rows) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ sal_Int32 nRowSave = m_nRowPos;
+
+ if (moveToBookmark(bookmark))
+ {
+ sal_Int32 nAddressees = m_aKabAddressees.size();
+
+ m_nRowPos += rows;
+
+ if (-1 < m_nRowPos && m_nRowPos < nAddressees)
+ return sal_True;
+ }
+
+ m_nRowPos = nRowSave;
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSet::compareBookmarks(const Any& firstItem, const Any& secondItem) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ ::rtl::OUString sFirst = comphelper::getString(firstItem);
+ ::rtl::OUString sSecond = comphelper::getString(secondItem);
+
+ if (sFirst < sSecond)
+ return CompareBookmark::LESS;
+ if (sFirst > sSecond)
+ return CompareBookmark::GREATER;
+ return CompareBookmark::EQUAL;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSet::hasOrderedBookmarks() throw( SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSet::hashBookmark(const Any& bookmark) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ ::rtl::OUString sBookmark = comphelper::getString(bookmark);
+
+ return sBookmark.hashCode();
+}
+// -------------------------------------------------------------------------
+// XDeleteRows
+Sequence< sal_Int32 > SAL_CALL KabResultSet::deleteRows(const Sequence< Any >&) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabResultSet_BASE::rBHelper.bDisposed);
+
+ return Sequence< sal_Int32 >();
+}
+// -------------------------------------------------------------------------
+IPropertyArrayHelper* KabResultSet::createArrayHelper() const
+{
+ Sequence< Property > aProps(6);
+ Property* pProperties = aProps.getArray();
+ sal_Int32 nPos = 0;
+ DECL_PROP1IMPL(CURSORNAME, ::rtl::OUString) PropertyAttribute::READONLY);
+ DECL_PROP0(FETCHDIRECTION, sal_Int32);
+ DECL_PROP0(FETCHSIZE, sal_Int32);
+ DECL_BOOL_PROP1IMPL(ISBOOKMARKABLE) PropertyAttribute::READONLY);
+ DECL_PROP1IMPL(RESULTSETCONCURRENCY,sal_Int32) PropertyAttribute::READONLY);
+ DECL_PROP1IMPL(RESULTSETTYPE, sal_Int32) PropertyAttribute::READONLY);
+
+ return new OPropertyArrayHelper(aProps);
+}
+// -------------------------------------------------------------------------
+IPropertyArrayHelper & KabResultSet::getInfoHelper()
+{
+ return *static_cast<KabResultSet*>(this)->getArrayHelper();
+}
+// -------------------------------------------------------------------------
+sal_Bool KabResultSet::convertFastPropertyValue(
+ Any &,
+ Any &,
+ sal_Int32 nHandle,
+ const Any& )
+ throw (::com::sun::star::lang::IllegalArgumentException)
+{
+ switch (nHandle)
+ {
+ case PROPERTY_ID_ISBOOKMARKABLE:
+ case PROPERTY_ID_CURSORNAME:
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ case PROPERTY_ID_RESULTSETTYPE:
+ throw ::com::sun::star::lang::IllegalArgumentException();
+ break;
+ case PROPERTY_ID_FETCHDIRECTION:
+ case PROPERTY_ID_FETCHSIZE:
+ default:
+ ;
+ }
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+void KabResultSet::setFastPropertyValue_NoBroadcast(
+ sal_Int32 nHandle,
+ const Any& )
+ throw (Exception)
+{
+ switch (nHandle)
+ {
+ case PROPERTY_ID_ISBOOKMARKABLE:
+ case PROPERTY_ID_CURSORNAME:
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ case PROPERTY_ID_RESULTSETTYPE:
+ throw Exception();
+ break;
+ case PROPERTY_ID_FETCHDIRECTION:
+ break;
+ case PROPERTY_ID_FETCHSIZE:
+ break;
+ default:
+ ;
+ }
+}
+// -------------------------------------------------------------------------
+void KabResultSet::getFastPropertyValue(
+ Any& _rValue,
+ sal_Int32 nHandle) const
+{
+ switch (nHandle)
+ {
+ case PROPERTY_ID_ISBOOKMARKABLE:
+ _rValue <<= (sal_Bool)sal_False;
+ break;
+ case PROPERTY_ID_CURSORNAME:
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ case PROPERTY_ID_RESULTSETTYPE:
+ case PROPERTY_ID_FETCHDIRECTION:
+ case PROPERTY_ID_FETCHSIZE:
+ ;
+ }
+}
+// -----------------------------------------------------------------------------
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KResultSet.hxx b/connectivity/source/drivers/tdeab/KResultSet.hxx
new file mode 100644
index 0000000..d68f676
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KResultSet.hxx
@@ -0,0 +1,228 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_RESULTSET_HXX_
+#define _CONNECTIVITY_KAB_RESULTSET_HXX_
+
+#include "KStatement.hxx"
+#include "KResultSetMetaData.hxx"
+#include <shell/tde_headers.h>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
+#include <com/sun/star/sdbc/XColumnLocate.hpp>
+#include <com/sun/star/sdbc/XResultSetUpdate.hpp>
+#include <com/sun/star/sdbc/XRowUpdate.hpp>
+#include <com/sun/star/sdbcx/XRowLocate.hpp>
+#include <com/sun/star/sdbcx/XDeleteRows.hpp>
+#include <cppuhelper/compbase12.hxx>
+
+namespace connectivity
+{
+ namespace kab
+ {
+ /*
+ ** KabResultSet
+ */
+ typedef ::cppu::WeakComponentImplHelper12< ::com::sun::star::sdbc::XResultSet,
+ ::com::sun::star::sdbc::XRow,
+ ::com::sun::star::sdbc::XResultSetMetaDataSupplier,
+ ::com::sun::star::util::XCancellable,
+ ::com::sun::star::sdbc::XWarningsSupplier,
+ ::com::sun::star::sdbc::XResultSetUpdate,
+ ::com::sun::star::sdbc::XRowUpdate,
+ ::com::sun::star::sdbcx::XRowLocate,
+ ::com::sun::star::sdbcx::XDeleteRows,
+ ::com::sun::star::sdbc::XCloseable,
+ ::com::sun::star::sdbc::XColumnLocate,
+ ::com::sun::star::lang::XServiceInfo> KabResultSet_BASE;
+
+ class KabResultSet : public comphelper::OBaseMutex,
+ public KabResultSet_BASE,
+ public ::cppu::OPropertySetHelper,
+ public comphelper::OPropertyArrayUsageHelper<KabResultSet>
+ {
+ protected:
+ ::rtl::Reference< KabCommonStatement > m_xStatement; // the statement that has created this result set
+ ::rtl::Reference< KabResultSetMetaData > m_xMetaData; // the description of the columns in this result set
+ ::KABC::Addressee::List m_aKabAddressees; // address book entries matching the query
+ sal_Int32 m_nRowPos; // the current row within the result set
+ sal_Bool m_bWasNull; // last entry retrieved from this result set was NULL
+
+ // OPropertyArrayUsageHelper
+ virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const;
+
+ // OPropertySetHelper
+ virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper();
+
+ virtual sal_Bool SAL_CALL convertFastPropertyValue(
+ ::com::sun::star::uno::Any & rConvertedValue,
+ ::com::sun::star::uno::Any & rOldValue,
+ sal_Int32 nHandle,
+ const ::com::sun::star::uno::Any& rValue)
+ throw (::com::sun::star::lang::IllegalArgumentException);
+ virtual void SAL_CALL setFastPropertyValue_NoBroadcast(
+ sal_Int32 nHandle,
+ const ::com::sun::star::uno::Any& rValue)
+ throw (::com::sun::star::uno::Exception);
+ virtual void SAL_CALL getFastPropertyValue(
+ ::com::sun::star::uno::Any& rValue,
+ sal_Int32 nHandle) const;
+
+ // you can't delete objects of this type
+ virtual ~KabResultSet();
+
+ public:
+ DECLARE_SERVICE_INFO();
+
+ KabResultSet(KabCommonStatement *pStmt);
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > operator *()
+ {
+ return ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >(*(KabResultSet_BASE*) this);
+ }
+
+ void allKabAddressees();
+ void someKabAddressees(const class KabCondition *pCondition);
+ void sortKabAddressees(const class KabOrder *pOrder);
+
+ // ::cppu::OComponentHelper
+ virtual void SAL_CALL disposing(void);
+
+ // XInterface
+ virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL acquire() throw();
+ virtual void SAL_CALL release() throw();
+
+ // XTypeProvider
+ virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException);
+
+ // XPropertySet
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException);
+
+ // XResultSet
+ virtual sal_Bool SAL_CALL isBeforeFirst( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isAfterLast( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isFirst( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isLast( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL beforeFirst( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL afterLast( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL first( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL last( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL next( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL previous( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL refreshRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL rowUpdated( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL rowInserted( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL rowDeleted( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getStatement( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XRow
+ virtual sal_Bool SAL_CALL wasNull( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getString( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XResultSetMetaDataSupplier
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XCancellable
+ virtual void SAL_CALL cancel( ) throw(::com::sun::star::uno::RuntimeException);
+
+ // XCloseable
+ virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XWarningsSupplier
+ virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL clearWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XResultSetUpdate
+ virtual void SAL_CALL insertRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL deleteRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL cancelRowUpdates( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL moveToInsertRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL moveToCurrentRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ // XRowUpdate
+ virtual void SAL_CALL updateNull( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateBoolean( sal_Int32 columnIndex, sal_Bool x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateByte( sal_Int32 columnIndex, sal_Int8 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateShort( sal_Int32 columnIndex, sal_Int16 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateInt( sal_Int32 columnIndex, sal_Int32 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateLong( sal_Int32 columnIndex, sal_Int64 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateFloat( sal_Int32 columnIndex, float x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateDouble( sal_Int32 columnIndex, double x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateString( sal_Int32 columnIndex, const ::rtl::OUString& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateBytes( sal_Int32 columnIndex, const ::com::sun::star::uno::Sequence< sal_Int8 >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateDate( sal_Int32 columnIndex, const ::com::sun::star::util::Date& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateTime( sal_Int32 columnIndex, const ::com::sun::star::util::Time& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateTimestamp( sal_Int32 columnIndex, const ::com::sun::star::util::DateTime& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateBinaryStream( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateCharacterStream( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Any& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL updateNumericObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Any& x, sal_Int32 scale ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XColumnLocate
+ virtual sal_Int32 SAL_CALL findColumn( const ::rtl::OUString& columnName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XRowLocate
+ virtual ::com::sun::star::uno::Any SAL_CALL getBookmark( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL moveToBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL moveRelativeToBookmark( const ::com::sun::star::uno::Any& bookmark, sal_Int32 rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL compareBookmarks( const ::com::sun::star::uno::Any& firstItem, const ::com::sun::star::uno::Any& secondItem ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL hasOrderedBookmarks( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL hashBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XDeleteRows
+ virtual ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL deleteRows( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_RESULTSET_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KResultSetMetaData.cxx b/connectivity/source/drivers/tdeab/KResultSetMetaData.cxx
new file mode 100644
index 0000000..08dfb05
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KResultSetMetaData.cxx
@@ -0,0 +1,191 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KResultSetMetaData.hxx"
+#include "kfields.hxx"
+#include "KDatabaseMetaData.hxx"
+#include <com/sun/star/sdbc/DataType.hpp>
+
+using namespace connectivity::kab;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::sdbc;
+
+KabResultSetMetaData::KabResultSetMetaData(KabConnection* _pConnection)
+ : m_pConnection(_pConnection),
+ m_aKabFields()
+{
+}
+// -------------------------------------------------------------------------
+KabResultSetMetaData::~KabResultSetMetaData()
+{
+}
+// -------------------------------------------------------------------------
+void KabResultSetMetaData::setKabFields(const ::rtl::Reference<connectivity::OSQLColumns> &xColumns) throw(SQLException)
+{
+ OSQLColumns::Vector::const_iterator aIter;
+ static const ::rtl::OUString aName(::rtl::OUString::createFromAscii("Name"));
+
+ for (aIter = xColumns->get().begin(); aIter != xColumns->get().end(); ++aIter)
+ {
+ ::rtl::OUString aFieldName;
+ sal_uInt32 nFieldNumber;
+
+ (*aIter)->getPropertyValue(aName) >>= aFieldName;
+ nFieldNumber = findKabField(aFieldName);
+ m_aKabFields.push_back(nFieldNumber);
+ }
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSetMetaData::getColumnDisplaySize(sal_Int32 column) throw(SQLException, RuntimeException)
+{
+ return m_aKabFields[column - 1] < KAB_DATA_FIELDS? 20: 50;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSetMetaData::getColumnType(sal_Int32 column) throw(SQLException, RuntimeException)
+{
+ return m_aKabFields[column - 1] == KAB_FIELD_REVISION? DataType::TIMESTAMP: DataType::CHAR;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSetMetaData::getColumnCount() throw(SQLException, RuntimeException)
+{
+ return m_aKabFields.size();
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSetMetaData::isCaseSensitive(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabResultSetMetaData::getSchemaName(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnName(sal_Int32 column) throw(SQLException, RuntimeException)
+{
+ sal_uInt32 nFieldNumber = m_aKabFields[column - 1];
+ ::KABC::Field::List aFields = ::KABC::Field::allFields();
+ TQString aQtName;
+
+ switch (nFieldNumber)
+ {
+ case KAB_FIELD_REVISION:
+ aQtName = KABC::Addressee::revisionLabel();
+ break;
+ default:
+ aQtName = aFields[nFieldNumber - KAB_DATA_FIELDS]->label();
+ }
+ ::rtl::OUString aName((const sal_Unicode *) aQtName.ucs2());
+
+ return aName;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabResultSetMetaData::getTableName(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return KabDatabaseMetaData::getAddressBookTableName();
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabResultSetMetaData::getCatalogName(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnTypeName(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnLabel(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL KabResultSetMetaData::getColumnServiceName(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSetMetaData::isCurrency(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSetMetaData::isAutoIncrement(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSetMetaData::isSigned(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSetMetaData::getPrecision(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return 0;
+}
+// -----------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSetMetaData::getScale(sal_Int32) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
+{
+ return 0;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabResultSetMetaData::isNullable(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return (sal_Int32) sal_True;
+// TDE address book currently does not use NULL values.
+// But it might do it someday
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSetMetaData::isSearchable(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSetMetaData::isReadOnly(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSetMetaData::isDefinitelyWritable(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabResultSetMetaData::isWritable(sal_Int32) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KResultSetMetaData.hxx b/connectivity/source/drivers/tdeab/KResultSetMetaData.hxx
new file mode 100644
index 0000000..8a04fc0
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KResultSetMetaData.hxx
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_
+#define _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_
+
+#include "KConnection.hxx"
+#include <connectivity/CommonTools.hxx>
+#include <com/sun/star/sdbc/XResultSetMetaData.hpp>
+#include <cppuhelper/implbase1.hxx>
+#include <rtl/ref.hxx>
+
+namespace connectivity
+{
+ namespace kab
+ {
+ /*
+ ** KabResultSetMetaData
+ */
+ typedef ::cppu::WeakImplHelper1< ::com::sun::star::sdbc::XResultSetMetaData> KabResultSetMetaData_BASE;
+
+ class KabResultSetMetaData : public KabResultSetMetaData_BASE
+ {
+ KabConnection* m_pConnection;
+ ::std::vector<sal_Int32> m_aKabFields; // for each selected column, contains the number
+ // of the corresponding KAddressBook field
+
+ protected:
+ virtual ~KabResultSetMetaData();
+
+ public:
+ KabResultSetMetaData(KabConnection* _pConnection);
+
+ // avoid ambigous cast error from the compiler
+ inline operator ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > () throw()
+ { return this; }
+
+ void setKabFields(
+ const ::rtl::Reference<connectivity::OSQLColumns> &xColumns) throw(::com::sun::star::sdbc::SQLException);
+ inline sal_uInt32 fieldAtColumn(sal_Int32 columnIndex) const
+ { return m_aKabFields[columnIndex - 1]; }
+
+ virtual sal_Int32 SAL_CALL getColumnCount( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isAutoIncrement( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isCaseSensitive( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isSearchable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isCurrency( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL isNullable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isSigned( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getColumnDisplaySize( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getColumnLabel( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getColumnName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getSchemaName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getPrecision( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getScale( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getTableName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getCatalogName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getColumnType( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getColumnTypeName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isReadOnly( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isWritable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL isDefinitelyWritable( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getColumnServiceName( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_RESULTSETMETADATA_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KServices.cxx b/connectivity/source/drivers/tdeab/KServices.cxx
new file mode 100644
index 0000000..a82b756
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KServices.cxx
@@ -0,0 +1,180 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KDriver.hxx"
+#include <cppuhelper/factory.hxx>
+#include <osl/diagnose.h>
+
+using namespace connectivity::kab;
+using ::rtl::OUString;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::registry::XRegistryKey;
+using ::com::sun::star::lang::XSingleServiceFactory;
+using ::com::sun::star::lang::XMultiServiceFactory;
+
+typedef Reference< XSingleServiceFactory > (SAL_CALL *createFactoryFunc)
+ (
+ const Reference< XMultiServiceFactory > & rServiceManager,
+ const OUString & rComponentName,
+ ::cppu::ComponentInstantiation pCreateFunction,
+ const Sequence< OUString > & rServiceNames,
+ rtl_ModuleCount* _pTemp
+ );
+
+//***************************************************************************************
+//
+// The following C Api must be provided!
+// It consists in three functions that must be exported by the module
+//
+
+//---------------------------------------------------------------------------------------
+void REGISTER_PROVIDER(
+ const OUString& aServiceImplName,
+ const Sequence< OUString>& Services,
+ const Reference< ::com::sun::star::registry::XRegistryKey > & xKey)
+{
+ OUString aMainKeyName;
+ aMainKeyName = OUString::createFromAscii("/");
+ aMainKeyName += aServiceImplName;
+ aMainKeyName += OUString::createFromAscii("/UNO/SERVICES");
+
+ Reference< ::com::sun::star::registry::XRegistryKey > xNewKey( xKey->createKey(aMainKeyName) );
+ OSL_ENSURE(xNewKey.is(), "KAB::component_writeInfo : could not create a registry key !");
+
+ for (sal_Int32 i=0; i<Services.getLength(); ++i)
+ xNewKey->createKey(Services[i]);
+}
+
+
+//---------------------------------------------------------------------------------------
+struct ProviderRequest
+{
+ Reference< XSingleServiceFactory > xRet;
+ Reference< XMultiServiceFactory > const xServiceManager;
+ OUString const sImplementationName;
+
+ ProviderRequest(
+ void* pServiceManager,
+ sal_Char const* pImplementationName
+ )
+ : xServiceManager(reinterpret_cast<XMultiServiceFactory*>(pServiceManager))
+ , sImplementationName(OUString::createFromAscii(pImplementationName))
+ {
+ }
+
+ inline
+ sal_Bool CREATE_PROVIDER(
+ const OUString& Implname,
+ const Sequence< OUString > & Services,
+ ::cppu::ComponentInstantiation Factory,
+ createFactoryFunc creator
+ )
+ {
+ if (!xRet.is() && (Implname == sImplementationName))
+ try
+ {
+ xRet = creator( xServiceManager, sImplementationName,Factory, Services,0);
+ }
+ catch(...)
+ {
+ }
+ return xRet.is();
+ }
+
+ void* getProvider() const { return xRet.get(); }
+};
+
+//---------------------------------------------------------------------------------------
+
+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment(
+ const sal_Char **ppEnvTypeName,
+ uno_Environment **
+ )
+{
+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+
+//---------------------------------------------------------------------------------------
+extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(
+ void*,
+ void* pRegistryKey
+ )
+{
+ if (pRegistryKey)
+ try
+ {
+ Reference< ::com::sun::star::registry::XRegistryKey > xKey(reinterpret_cast< ::com::sun::star::registry::XRegistryKey*>(pRegistryKey));
+
+ REGISTER_PROVIDER(
+ KabDriver::getImplementationName_Static(),
+ KabDriver::getSupportedServiceNames_Static(), xKey);
+
+ return sal_True;
+ }
+ catch (::com::sun::star::registry::InvalidRegistryException& )
+ {
+ OSL_ENSURE(sal_False, "KAB::component_writeInfo : could not create a registry key ! ## InvalidRegistryException !");
+ }
+
+ return sal_False;
+}
+
+//---------------------------------------------------------------------------------------
+extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory(
+ const sal_Char* pImplementationName,
+ void* pServiceManager,
+ void*)
+{
+ void* pRet = 0;
+ if (pServiceManager)
+ {
+ ProviderRequest aReq(pServiceManager,pImplementationName);
+
+ aReq.CREATE_PROVIDER(
+ KabDriver::getImplementationName_Static(),
+ KabDriver::getSupportedServiceNames_Static(),
+ &KabDriver::Create,
+ ::cppu::createSingleFactory)
+ ;
+
+ if (aReq.xRet.is())
+ aReq.xRet->acquire();
+
+ pRet = aReq.getProvider();
+ }
+
+ return pRet;
+};
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KStatement.cxx b/connectivity/source/drivers/tdeab/KStatement.cxx
new file mode 100644
index 0000000..1301349
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KStatement.cxx
@@ -0,0 +1,588 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KStatement.hxx"
+#include "KConnection.hxx"
+#include "KDriver.hxx"
+#include "KResultSet.hxx"
+#include "KResultSetMetaData.hxx"
+#include "kcondition.hxx"
+#include "korder.hxx"
+#include "TConnection.hxx"
+#include <connectivity/dbexception.hxx>
+#include "resource/tdeab_res.hrc"
+#include "resource/sharedresources.hxx"
+
+
+#if OSL_DEBUG_LEVEL > 0
+# define OUtoCStr( x ) ( ::rtl::OUStringToOString ( (x), RTL_TEXTENCODING_ASCII_US).getStr())
+#else /* OSL_DEBUG_LEVEL */
+# define OUtoCStr( x ) ("dummy")
+#endif /* OSL_DEBUG_LEVEL */
+
+using namespace connectivity::kab;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::sdbcx;
+using namespace com::sun::star::container;
+using namespace com::sun::star::io;
+using namespace com::sun::star::util;
+
+namespace
+{
+ void lcl_throwError(sal_uInt16 _nErrorId)
+ {
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceString(_nErrorId) );
+ ::dbtools::throwGenericSQLException(sError,NULL);
+ }
+}
+
+IMPLEMENT_SERVICE_INFO(KabStatement, "com.sun.star.sdbc.drivers.KabStatement", "com.sun.star.sdbc.Statement");
+//------------------------------------------------------------------------------
+KabCommonStatement::KabCommonStatement(KabConnection* _pConnection )
+ : KabCommonStatement_BASE(m_aMutex),
+ OPropertySetHelper(KabCommonStatement_BASE::rBHelper),
+ m_aParser(_pConnection->getDriver()->getMSFactory()),
+ m_aSQLIterator(_pConnection, _pConnection->createCatalog()->getTables(), m_aParser, NULL ),
+ m_pParseTree(NULL),
+ m_pConnection(_pConnection),
+ rBHelper(KabCommonStatement_BASE::rBHelper)
+{
+ m_pConnection->acquire();
+}
+// -----------------------------------------------------------------------------
+KabCommonStatement::~KabCommonStatement()
+{
+}
+// -----------------------------------------------------------------------------
+void KabCommonStatement::disposing()
+{
+ KabCommonStatement_BASE::disposing();
+}
+// -----------------------------------------------------------------------------
+void KabCommonStatement::resetParameters() const throw(::com::sun::star::sdbc::SQLException)
+{
+ lcl_throwError(STR_PARA_ONLY_PREPARED);
+}
+// -----------------------------------------------------------------------------
+void KabCommonStatement::getNextParameter(::rtl::OUString &) const throw(::com::sun::star::sdbc::SQLException)
+{
+ lcl_throwError(STR_PARA_ONLY_PREPARED);
+}
+// -----------------------------------------------------------------------------
+KabCondition *KabCommonStatement::analyseWhereClause(const OSQLParseNode *pParseNode) const throw(SQLException)
+{
+ if (pParseNode->count() == 3)
+ {
+ const OSQLParseNode *pLeft = pParseNode->getChild(0),
+ *pMiddle = pParseNode->getChild(1),
+ *pRight = pParseNode->getChild(2);
+
+ // WHERE ( ... ) ?
+ if (SQL_ISPUNCTUATION(pLeft, "(") && SQL_ISPUNCTUATION(pRight, ")"))
+ {
+ return analyseWhereClause(pMiddle);
+ }
+ else if (SQL_ISRULE(pParseNode, comparison_predicate))
+ {
+ if (pLeft->isToken() && pRight->isToken())
+ {
+ switch (pMiddle->getNodeType())
+ {
+ case SQL_NODE_EQUAL:
+ // WHERE 0 = 1
+ return new KabConditionConstant(pLeft->getTokenValue() == pRight->getTokenValue());
+
+ case SQL_NODE_NOTEQUAL:
+ // WHERE 0 <> 1
+ // (might not be correct SQL... don't care, handling anyway)
+ return new KabConditionConstant(pLeft->getTokenValue() != pRight->getTokenValue());
+
+ default:
+ break;
+ }
+ }
+ else if (SQL_ISRULE(pLeft, column_ref))
+ {
+ ::rtl::OUString sColumnName,
+ sTableRange;
+
+ m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange);
+
+ if (pRight->isToken() || SQL_ISRULE(pRight, parameter))
+ {
+ ::rtl::OUString sMatchString;
+
+ if (pRight->isToken()) // WHERE Name = 'Doe'
+ sMatchString = pRight->getTokenValue();
+ else if (SQL_ISRULE(pRight, parameter)) // WHERE Name = ?
+ getNextParameter(sMatchString);
+
+ switch (pMiddle->getNodeType())
+ {
+ case SQL_NODE_EQUAL:
+ // WHERE Name = 'Smith'
+ return new KabConditionEqual(sColumnName, sMatchString);
+
+ case SQL_NODE_NOTEQUAL:
+ // WHERE Name <> 'Jones'
+ return new KabConditionDifferent(sColumnName, sMatchString);
+
+ default:
+ break;
+ }
+ }
+ }
+ }
+ else if (SQL_ISRULE(pParseNode, search_condition))
+ {
+ if (SQL_ISTOKEN(pMiddle, OR))
+ {
+ // WHERE Name = 'Smith' OR Name = 'Jones'
+ return new KabConditionOr(
+ analyseWhereClause(pLeft),
+ analyseWhereClause(pRight));
+ }
+ }
+ else if (SQL_ISRULE(pParseNode, boolean_term))
+ {
+ if (SQL_ISTOKEN(pMiddle, AND))
+ {
+ // WHERE Name = 'Smith' AND "Given Name" = 'Peter'
+ return new KabConditionAnd(
+ analyseWhereClause(pLeft),
+ analyseWhereClause(pRight));
+ }
+ }
+ }
+ else if (SQL_ISRULE(pParseNode, test_for_null) || SQL_ISRULE(pParseNode, like_predicate))
+ {
+ const OSQLParseNode *pLeft = pParseNode->getChild(0);
+ const OSQLParseNode* pPart2 = pParseNode->getChild(1);
+ const OSQLParseNode *pMiddleLeft = pPart2->getChild(0),
+ *pMiddleRight = pPart2->getChild(1),
+ *pRight = pPart2->getChild(2);
+
+ if (SQL_ISRULE(pParseNode, test_for_null))
+ {
+ if (SQL_ISRULE(pLeft, column_ref) &&
+ SQL_ISTOKEN(pMiddleLeft, IS) &&
+ SQL_ISTOKEN(pRight, NULL))
+ {
+ ::rtl::OUString sColumnName,
+ sTableRange;
+
+ m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange);
+
+ if (SQL_ISTOKEN(pMiddleRight, NOT))
+ {
+ // WHERE "Mobile Phone" IS NOT NULL
+ return new KabConditionNotNull(sColumnName);
+ }
+ else
+ {
+ // WHERE "Mobile Phone" IS NULL
+ return new KabConditionNull(sColumnName);
+ }
+ }
+ }
+ else if (SQL_ISRULE(pParseNode, like_predicate))
+ {
+ if (SQL_ISRULE(pLeft, column_ref))
+ {
+ ::rtl::OUString sColumnName,
+ sTableRange;
+
+ m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange);
+
+ if (pMiddleRight->isToken() || SQL_ISRULE(pMiddleRight, parameter))
+ {
+ ::rtl::OUString sMatchString;
+
+ if (pMiddleRight->isToken()) // WHERE Name LIKE 'Sm%'
+ sMatchString = pMiddleRight->getTokenValue();
+ else if (SQL_ISRULE(pMiddleRight, parameter)) // WHERE Name LIKE ?
+ getNextParameter(sMatchString);
+
+ return new KabConditionSimilar(sColumnName, sMatchString);
+ }
+ }
+ }
+ }
+
+ lcl_throwError(STR_QUERY_TOO_COMPLEX);
+
+ // Unreachable:
+ OSL_ASSERT(false);
+ return 0;
+}
+// -----------------------------------------------------------------------------
+KabOrder *KabCommonStatement::analyseOrderByClause(const OSQLParseNode *pParseNode) const throw(SQLException)
+{
+ if (SQL_ISRULE(pParseNode, ordering_spec_commalist))
+ {
+ KabComplexOrder *list = new KabComplexOrder();
+ sal_uInt32 n = pParseNode->count();
+
+ // Iterate through the ordering columns
+ for (sal_uInt32 i = 0; i < n; i++)
+ {
+ list->addOrder
+ (analyseOrderByClause(pParseNode->getChild(i)));
+ }
+
+ return list;
+ }
+ else if (SQL_ISRULE(pParseNode, ordering_spec))
+ {
+ if (pParseNode->count() == 2)
+ {
+ OSQLParseNode* pColumnRef = pParseNode->getChild(0);
+ OSQLParseNode* pAscendingDescending = pParseNode->getChild(1);
+
+ if (SQL_ISRULE(pColumnRef, column_ref))
+ {
+ if (pColumnRef->count() == 3)
+ pColumnRef = pColumnRef->getChild(2);
+
+ if (pColumnRef->count() == 1)
+ {
+ ::rtl::OUString sColumnName =
+ pColumnRef->getChild(0)->getTokenValue();
+ sal_Bool bAscending =
+ SQL_ISTOKEN(pAscendingDescending, DESC)?
+ sal_False:
+ sal_True;
+
+ return new KabSimpleOrder(sColumnName, bAscending);
+ }
+ }
+ }
+ }
+ lcl_throwError(STR_QUERY_TOO_COMPLEX);
+ // Unreachable:
+ OSL_ASSERT(false);
+ return 0;
+}
+//------------------------------------------------------------------------------
+sal_Bool KabCommonStatement::isTableKnown(KabResultSet *pResult) const
+{
+ // can handle requests like SELECT * FROM addresses addresses
+ // but cannot handle requests like SELECT * FROM addresses persons
+ if (m_aSQLIterator.getTables().size() != 1)
+ return sal_False;
+
+ if (m_aSQLIterator.getTables().begin()->first != pResult->getMetaData()->getTableName(0))
+ return sal_False;
+
+ return sal_True;
+}
+//------------------------------------------------------------------------------
+void KabCommonStatement::setKabFields(KabResultSet *pResult) const throw(SQLException)
+{
+ ::rtl::Reference<connectivity::OSQLColumns> xColumns; // selected columns
+ KabResultSetMetaData *pMeta; // meta information - holds the list of KAddressBook fields
+
+ xColumns = m_aSQLIterator.getSelectColumns();
+ if (!xColumns.is())
+ {
+ lcl_throwError(STR_INVALID_COLUMN_SELECTION);
+ }
+ pMeta = static_cast<KabResultSetMetaData *>(pResult->getMetaData().get());
+ pMeta->setKabFields(xColumns);
+}
+// -------------------------------------------------------------------------
+void KabCommonStatement::selectAddressees(KabResultSet *pResult) const throw(SQLException)
+{
+ const OSQLParseNode *pParseNode;
+ KabCondition *pCondition;
+
+ pParseNode = m_aSQLIterator.getWhereTree();
+ if (pParseNode != NULL)
+ {
+ if (SQL_ISRULE(pParseNode, where_clause))
+ {
+ resetParameters();
+ pParseNode = pParseNode->getChild(1);
+ pCondition = analyseWhereClause(pParseNode);
+ if (pCondition->isAlwaysTrue())
+ pResult->allKabAddressees();
+ else if (!pCondition->isAlwaysFalse())
+ pResult->someKabAddressees(pCondition);
+ delete pCondition;
+ return;
+ }
+ }
+
+ // no WHERE clause: get all rows
+ pResult->allKabAddressees();
+}
+// -------------------------------------------------------------------------
+void KabCommonStatement::sortAddressees(KabResultSet *pResult) const throw(SQLException)
+{
+ const OSQLParseNode *pParseNode;
+ KabOrder *pOrder;
+
+ pParseNode = m_aSQLIterator.getOrderTree();
+ if (pParseNode != NULL)
+ {
+ if (SQL_ISRULE(pParseNode, opt_order_by_clause))
+ {
+ pParseNode = pParseNode->getChild(2);
+ pOrder = analyseOrderByClause(pParseNode);
+ pResult->sortKabAddressees(pOrder);
+ delete pOrder;
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+Any SAL_CALL KabCommonStatement::queryInterface( const Type & rType ) throw(RuntimeException)
+{
+ Any aRet = KabCommonStatement_BASE::queryInterface(rType);
+ if (!aRet.hasValue())
+ aRet = OPropertySetHelper::queryInterface(rType);
+ return aRet;
+}
+// -------------------------------------------------------------------------
+Sequence< Type > SAL_CALL KabCommonStatement::getTypes( ) throw(RuntimeException)
+{
+ ::cppu::OTypeCollection aTypes( ::getCppuType( (const Reference< XMultiPropertySet > *)0 ),
+ ::getCppuType( (const Reference< XFastPropertySet > *)0 ),
+ ::getCppuType( (const Reference< XPropertySet > *)0 ));
+
+ return comphelper::concatSequences(aTypes.getTypes(),KabCommonStatement_BASE::getTypes());
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabCommonStatement::cancel( ) throw(RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+ // cancel the current sql statement
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabCommonStatement::close( ) throw(SQLException, RuntimeException)
+{
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ }
+ dispose();
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL KabCommonStatement::execute(
+ const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ Reference< XResultSet > xRS = executeQuery(sql);
+
+ return xRS.is();
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL KabCommonStatement::executeQuery(
+ const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+OSL_TRACE("TDE Address book - SQL Request: %s", OUtoCStr(sql));
+
+ KabResultSet* pResult = new KabResultSet(this);
+ Reference< XResultSet > xRS = pResult;
+ ::rtl::OUString aErr;
+
+ m_pParseTree = m_aParser.parseTree(aErr, sql);
+ if (m_pParseTree == NULL)
+ throw SQLException(aErr, *this, aErr, 0, Any());
+
+ m_aSQLIterator.setParseTree(m_pParseTree);
+ m_aSQLIterator.traverseAll();
+ switch (m_aSQLIterator.getStatementType())
+ {
+ case SQL_STATEMENT_SELECT:
+ if (isTableKnown(pResult)) // FROM which table ?
+ {
+ setKabFields(pResult); // SELECT which columns ?
+ selectAddressees(pResult); // WHERE which condition ?
+ sortAddressees(pResult); // ORDER BY which columns ?
+// To be continued: DISTINCT
+// etc...
+ }
+ break;
+
+ default:
+// To be continued: UPDATE
+// DELETE
+// etc...
+ lcl_throwError(STR_QUERY_TOO_COMPLEX);
+ }
+
+ return xRS;
+}
+// -------------------------------------------------------------------------
+Reference< XConnection > SAL_CALL KabCommonStatement::getConnection( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ // just return our connection here
+ return (Reference< XConnection >) m_pConnection;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL KabCommonStatement::executeUpdate( const ::rtl::OUString& ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ // the return values gives information about how many rows are affected by executing the sql statement
+ return 0;
+}
+// -------------------------------------------------------------------------
+Any SAL_CALL KabCommonStatement::getWarnings( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ return makeAny(m_aLastWarning);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL KabCommonStatement::clearWarnings( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed);
+
+ m_aLastWarning = SQLWarning();
+}
+// -------------------------------------------------------------------------
+::cppu::IPropertyArrayHelper* KabCommonStatement::createArrayHelper( ) const
+{
+ // this properties are defined by the service statement
+ // they must be in alphabetic order
+ Sequence< Property > aProps(10);
+ Property* pProperties = aProps.getArray();
+ sal_Int32 nPos = 0;
+ DECL_PROP0(CURSORNAME, ::rtl::OUString);
+ DECL_BOOL_PROP0(ESCAPEPROCESSING);
+ DECL_PROP0(FETCHDIRECTION,sal_Int32);
+ DECL_PROP0(FETCHSIZE, sal_Int32);
+ DECL_PROP0(MAXFIELDSIZE,sal_Int32);
+ DECL_PROP0(MAXROWS, sal_Int32);
+ DECL_PROP0(QUERYTIMEOUT,sal_Int32);
+ DECL_PROP0(RESULTSETCONCURRENCY,sal_Int32);
+ DECL_PROP0(RESULTSETTYPE,sal_Int32);
+ DECL_BOOL_PROP0(USEBOOKMARKS);
+
+ return new ::cppu::OPropertyArrayHelper(aProps);
+}
+// -------------------------------------------------------------------------
+::cppu::IPropertyArrayHelper & KabCommonStatement::getInfoHelper()
+{
+ return *const_cast<KabCommonStatement*>(this)->getArrayHelper();
+}
+// -------------------------------------------------------------------------
+sal_Bool KabCommonStatement::convertFastPropertyValue(
+ Any &,
+ Any &,
+ sal_Int32,
+ const Any&) throw (::com::sun::star::lang::IllegalArgumentException)
+{
+ sal_Bool bConverted = sal_False;
+ // here we have to try to convert
+ return bConverted;
+}
+// -------------------------------------------------------------------------
+void KabCommonStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any&) throw (Exception)
+{
+ // set the value to whatever is nescessary
+ switch (nHandle)
+ {
+ case PROPERTY_ID_QUERYTIMEOUT:
+ case PROPERTY_ID_MAXFIELDSIZE:
+ case PROPERTY_ID_MAXROWS:
+ case PROPERTY_ID_CURSORNAME:
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ case PROPERTY_ID_RESULTSETTYPE:
+ case PROPERTY_ID_FETCHDIRECTION:
+ case PROPERTY_ID_FETCHSIZE:
+ case PROPERTY_ID_ESCAPEPROCESSING:
+ case PROPERTY_ID_USEBOOKMARKS:
+ default:
+ ;
+ }
+}
+// -------------------------------------------------------------------------
+void KabCommonStatement::getFastPropertyValue(Any&,sal_Int32 nHandle) const
+{
+ switch (nHandle)
+ {
+ case PROPERTY_ID_QUERYTIMEOUT:
+ case PROPERTY_ID_MAXFIELDSIZE:
+ case PROPERTY_ID_MAXROWS:
+ case PROPERTY_ID_CURSORNAME:
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ case PROPERTY_ID_RESULTSETTYPE:
+ case PROPERTY_ID_FETCHDIRECTION:
+ case PROPERTY_ID_FETCHSIZE:
+ case PROPERTY_ID_ESCAPEPROCESSING:
+ case PROPERTY_ID_USEBOOKMARKS:
+ default:
+ ;
+ }
+}
+// -----------------------------------------------------------------------------
+void SAL_CALL KabCommonStatement::acquire() throw()
+{
+ KabCommonStatement_BASE::acquire();
+}
+// -----------------------------------------------------------------------------
+void SAL_CALL KabCommonStatement::release() throw()
+{
+ KabCommonStatement_BASE::release();
+}
+// -----------------------------------------------------------------------------
+Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL KabCommonStatement::getPropertySetInfo( ) throw(RuntimeException)
+{
+ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
+}
+// -----------------------------------------------------------------------------
+KabStatement::KabStatement(KabConnection* _pConnection)
+ : KabStatement_BASE(_pConnection)
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KStatement.hxx b/connectivity/source/drivers/tdeab/KStatement.hxx
new file mode 100644
index 0000000..c5f6564
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KStatement.hxx
@@ -0,0 +1,174 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_STATEMENT_HXX_
+#define _CONNECTIVITY_KAB_STATEMENT_HXX_
+
+#include "KConnection.hxx"
+#include <list>
+#include "connectivity/sqliterator.hxx"
+#include "connectivity/sqlparse.hxx"
+#include <com/sun/star/sdbc/XStatement.hpp>
+#include <com/sun/star/util/XCancellable.hpp>
+#include <cppuhelper/compbase4.hxx>
+#include <cppuhelper/implbase1.hxx>
+#include <comphelper/proparrhlp.hxx>
+
+namespace connectivity
+{
+ namespace kab
+ {
+ typedef ::cppu::WeakComponentImplHelper4< ::com::sun::star::sdbc::XStatement,
+ ::com::sun::star::sdbc::XWarningsSupplier,
+ ::com::sun::star::util::XCancellable,
+ ::com::sun::star::sdbc::XCloseable> KabCommonStatement_BASE;
+
+ //**************************************************************
+ // Class KabCommonStatement
+ // is a base class for the normal statement and for the prepared statement
+ //**************************************************************
+ class KabCommonStatement : public comphelper::OBaseMutex,
+ public KabCommonStatement_BASE,
+ public ::cppu::OPropertySetHelper,
+ public comphelper::OPropertyArrayUsageHelper<KabCommonStatement>
+
+ {
+ ::com::sun::star::sdbc::SQLWarning m_aLastWarning;
+
+ protected:
+ ::std::list< ::rtl::OUString> m_aBatchList;
+ connectivity::OSQLParser m_aParser;
+ connectivity::OSQLParseTreeIterator m_aSQLIterator;
+ connectivity::OSQLParseNode* m_pParseTree;
+ KabConnection* m_pConnection; // The owning Connection object
+
+ protected:
+ class KabCondition *analyseWhereClause(
+ const OSQLParseNode *pParseNode) const throw(::com::sun::star::sdbc::SQLException);
+ class KabOrder *analyseOrderByClause(
+ const OSQLParseNode *pParseNode) const throw(::com::sun::star::sdbc::SQLException);
+ sal_Bool isTableKnown(class KabResultSet *pResult) const;
+ void setKabFields(class KabResultSet *pResult) const throw(::com::sun::star::sdbc::SQLException);
+ void selectAddressees(KabResultSet *pResult) const throw(::com::sun::star::sdbc::SQLException);
+ void sortAddressees(KabResultSet *pResult) const throw(::com::sun::star::sdbc::SQLException);
+
+ // OPropertyArrayUsageHelper
+ virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const;
+
+ // OPropertySetHelper
+ virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper();
+ virtual sal_Bool SAL_CALL convertFastPropertyValue(
+ ::com::sun::star::uno::Any & rConvertedValue,
+ ::com::sun::star::uno::Any & rOldValue,
+ sal_Int32 nHandle,
+ const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::lang::IllegalArgumentException);
+ virtual void SAL_CALL setFastPropertyValue_NoBroadcast(
+ sal_Int32 nHandle,
+ const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::uno::Exception);
+ virtual void SAL_CALL getFastPropertyValue(
+ ::com::sun::star::uno::Any& rValue,
+ sal_Int32 nHandle) const;
+
+ virtual void resetParameters() const throw(::com::sun::star::sdbc::SQLException);
+ virtual void getNextParameter(::rtl::OUString &rParameter) const throw(::com::sun::star::sdbc::SQLException);
+ virtual ~KabCommonStatement();
+
+ public:
+ ::cppu::OBroadcastHelper& rBHelper;
+
+ KabCommonStatement(KabConnection *_pConnection);
+ using KabCommonStatement_BASE::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >;
+
+ // OComponentHelper
+ virtual void SAL_CALL disposing();
+
+ // XInterface
+ virtual void SAL_CALL release() throw();
+ virtual void SAL_CALL acquire() throw();
+ virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(
+ const ::com::sun::star::uno::Type & rType
+ ) throw(::com::sun::star::uno::RuntimeException);
+
+ // XTypeProvider
+ virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(
+ ) throw(::com::sun::star::uno::RuntimeException);
+
+ // XPropertySet
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(
+ ) throw(::com::sun::star::uno::RuntimeException);
+
+ // XStatement
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery(
+ const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL executeUpdate(
+ const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL execute(
+ const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection(
+ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XWarningsSupplier
+ virtual ::com::sun::star::uno::Any SAL_CALL getWarnings(
+ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL clearWarnings(
+ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // XCancellable
+ virtual void SAL_CALL cancel(
+ ) throw(::com::sun::star::uno::RuntimeException);
+
+ // XCloseable
+ virtual void SAL_CALL close(
+ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
+
+ // other methods
+ inline KabConnection* getOwnConnection() const { return m_pConnection; }
+ };
+
+ //**************************************************************
+ // Class KabStatement
+ //**************************************************************
+ typedef ::cppu::ImplInheritanceHelper1<
+ KabCommonStatement, ::com::sun::star::lang::XServiceInfo > KabStatement_BASE;
+
+ class KabStatement : public KabStatement_BASE
+ {
+ protected:
+ virtual ~KabStatement() { }
+
+ public:
+ KabStatement(KabConnection* _pConnection);
+ DECLARE_SERVICE_INFO();
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_STATEMENT_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KTable.cxx b/connectivity/source/drivers/tdeab/KTable.cxx
new file mode 100644
index 0000000..6103ce9
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KTable.cxx
@@ -0,0 +1,100 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KTable.hxx"
+#include "KTables.hxx"
+#include "KColumns.hxx"
+#include "KCatalog.hxx"
+
+using namespace connectivity::kab;
+using namespace connectivity;
+using namespace ::comphelper;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+// -------------------------------------------------------------------------
+KabTable::KabTable( sdbcx::OCollection* _pTables, KabConnection* _pConnection)
+ : KabTable_TYPEDEF(_pTables, sal_True),
+ m_pConnection(_pConnection)
+{
+ construct();
+}
+// -------------------------------------------------------------------------
+KabTable::KabTable( sdbcx::OCollection* _pTables,
+ KabConnection* _pConnection,
+ const ::rtl::OUString& _Name,
+ const ::rtl::OUString& _Type,
+ const ::rtl::OUString& _Description ,
+ const ::rtl::OUString& _SchemaName,
+ const ::rtl::OUString& _CatalogName
+ ) : KabTable_TYPEDEF(_pTables,sal_True,
+ _Name,
+ _Type,
+ _Description,
+ _SchemaName,
+ _CatalogName),
+ m_pConnection(_pConnection)
+{
+ construct();
+}
+// -------------------------------------------------------------------------
+void KabTable::refreshColumns()
+{
+ TStringVector aVector;
+
+ if (!isNew())
+ {
+ Reference< XResultSet > xResult = m_pConnection->getMetaData()->getColumns(
+ Any(),
+ m_SchemaName,
+ m_Name,
+ ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")));
+
+ if (xResult.is())
+ {
+ Reference< XRow > xRow(xResult, UNO_QUERY);
+ while (xResult->next())
+ aVector.push_back(xRow->getString(4));
+ }
+ }
+
+ if (m_pColumns)
+ m_pColumns->reFill(aVector);
+ else
+ m_pColumns = new KabColumns(this,m_aMutex,aVector);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KTable.hxx b/connectivity/source/drivers/tdeab/KTable.hxx
new file mode 100644
index 0000000..608cf18
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KTable.hxx
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_TABLE_HXX_
+#define _CONNECTIVITY_KAB_TABLE_HXX_
+
+#include "KConnection.hxx"
+#include "connectivity/sdbcx/VTable.hxx"
+
+namespace connectivity
+{
+ namespace kab
+ {
+ typedef connectivity::sdbcx::OTable KabTable_TYPEDEF;
+
+ ::rtl::OUString getTypeString(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xColProp);
+
+ class KabTable : public KabTable_TYPEDEF
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData;
+ KabConnection* m_pConnection;
+
+ public:
+ KabTable( sdbcx::OCollection* _pTables, KabConnection* _pConnection);
+ KabTable( sdbcx::OCollection* _pTables,
+ KabConnection* _pConnection,
+ const ::rtl::OUString& _Name,
+ const ::rtl::OUString& _Type,
+ const ::rtl::OUString& _Description = ::rtl::OUString(),
+ const ::rtl::OUString& _SchemaName = ::rtl::OUString(),
+ const ::rtl::OUString& _CatalogName = ::rtl::OUString()
+ );
+
+ KabConnection* getConnection() { return m_pConnection;}
+
+ virtual void refreshColumns();
+
+ ::rtl::OUString getTableName() const { return m_Name; }
+ ::rtl::OUString getSchema() const { return m_SchemaName; }
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_TABLE_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KTables.cxx b/connectivity/source/drivers/tdeab/KTables.cxx
new file mode 100644
index 0000000..f63aaa9
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KTables.cxx
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "KTables.hxx"
+#include "KTable.hxx"
+#include "KCatalog.hxx"
+#include "KConnection.hxx"
+#include <comphelper/types.hxx>
+
+using namespace connectivity::kab;
+using namespace connectivity;
+using namespace ::comphelper;
+using namespace ::cppu;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+sdbcx::ObjectType KabTables::createObject(const ::rtl::OUString& _rName)
+{
+ ::rtl::OUString aName,aSchema;
+ aSchema = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%"));
+ aName = _rName;
+
+ Sequence< ::rtl::OUString > aTypes(1);
+ aTypes[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("%"));
+ ::rtl::OUString sEmpty;
+
+ Reference< XResultSet > xResult = m_xMetaData->getTables(Any(), aSchema, aName, aTypes);
+
+ sdbcx::ObjectType xRet = NULL;
+ if (xResult.is())
+ {
+ Reference< XRow > xRow(xResult, UNO_QUERY);
+ if (xResult->next()) // there can be only one table with this name
+ {
+ KabTable* pRet = new KabTable(
+ this,
+ static_cast<KabCatalog&>(m_rParent).getConnection(),
+ aName,
+ xRow->getString(4),
+ xRow->getString(5),
+ sEmpty);
+ xRet = pRet;
+ }
+ }
+ ::comphelper::disposeComponent(xResult);
+
+ return xRet;
+}
+// -------------------------------------------------------------------------
+void KabTables::impl_refresh( ) throw(RuntimeException)
+{
+ static_cast<KabCatalog&>(m_rParent).refreshTables();
+}
+// -------------------------------------------------------------------------
+void KabTables::disposing(void)
+{
+m_xMetaData.clear();
+ OCollection::disposing();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/KTables.hxx b/connectivity/source/drivers/tdeab/KTables.hxx
new file mode 100644
index 0000000..8c1c036
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/KTables.hxx
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_TABLES_HXX_
+#define _CONNECTIVITY_KAB_TABLES_HXX_
+
+#include "connectivity/sdbcx/VCollection.hxx"
+#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
+
+namespace connectivity
+{
+ namespace kab
+ {
+ class KabTables : public sdbcx::OCollection
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData;
+
+ protected:
+ virtual sdbcx::ObjectType createObject(const ::rtl::OUString& _rName);
+ virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException);
+
+ public:
+ KabTables(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rMetaData,
+ ::cppu::OWeakObject& _rParent,
+ ::osl::Mutex& _rMutex,
+ const TStringVector &_rVector)
+ : sdbcx::OCollection(_rParent,sal_True,_rMutex,_rVector),
+ m_xMetaData(_rMetaData)
+ { }
+
+ virtual void SAL_CALL disposing(void);
+ };
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_TABLES_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/TDEInit.cxx b/connectivity/source/drivers/tdeab/TDEInit.cxx
new file mode 100644
index 0000000..375b158
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/TDEInit.cxx
@@ -0,0 +1,158 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+#include "TDEInit.h"
+#include <osl/diagnose.h>
+#include <osl/process.h>
+#include <shell/tde_headers.h>
+
+namespace connectivity
+{
+ namespace kab
+ {
+ // ===============================================================
+ // = TDEInit
+ // ===============================================================
+ class TDEInit
+ {
+ private:
+ /// TDE application if we own it
+ static KApplication* s_pKApplication;
+ static bool s_bDidInsertCatalogue;
+
+ public:
+ static void Init();
+ static void Shutdown();
+ };
+
+ // ---------------------------------------------------------------
+ KApplication* TDEInit::s_pKApplication = NULL;
+ bool TDEInit::s_bDidInsertCatalogue = false;
+
+ // ---------------------------------------------------------------
+ void TDEInit::Init()
+ {
+ // TODO: All this is not thread-safe
+
+ // we create a TDE application only if it is not already done
+ if (KApplication::kApplication() == NULL)
+ {
+ OSL_ENSURE(s_pKApplication == NULL, "TDEInit::Init: inconsistency in the application pointers!");
+
+ char *kabargs[1] = {(char*)"libkab1"};
+ KCmdLineArgs::init(1, kabargs, "KAddressBook", *kabargs, "Address Book driver", KAB_DRIVER_VERSION);
+
+ s_pKApplication = new KApplication(false, false);
+ }
+
+ // set language
+ rtl_Locale *pProcessLocale;
+ osl_getProcessLocale(&pProcessLocale);
+ // sal_Unicode and TQChar are (currently) both 16 bits characters
+ TQString aLanguage(
+ (const TQChar *) pProcessLocale->Language->buffer,
+ (int) pProcessLocale->Language->length);
+ KGlobal::locale()->setLanguage(aLanguage);
+
+ // load TDE address book's localized messages
+ KGlobal::locale()->insertCatalogue("kaddressbook");
+ s_bDidInsertCatalogue = true;
+ }
+
+ // ---------------------------------------------------------------
+ void TDEInit::Shutdown()
+ {
+ if ( s_bDidInsertCatalogue )
+ // this guard is necessary, since TDE 3.3 seems to crash if we remove a catalogue
+ // which we did not previously insert
+ KGlobal::locale()->removeCatalogue("kaddressbook");
+
+ if ( s_pKApplication != NULL )
+ {
+ delete s_pKApplication;
+ s_pKApplication = NULL;
+ }
+ }
+ }
+}
+
+// =======================================================================
+namespace
+{
+ double normalizeVersion( unsigned int major, unsigned int minor )
+ {
+ return major + 1.0 * minor / 1000;
+ }
+}
+
+// -----------------------------------------------------------------------
+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL initKApplication()
+{
+ ::connectivity::kab::TDEInit::Init();
+}
+
+// -----------------------------------------------------------------------
+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL shutdownKApplication()
+{
+ ::connectivity::kab::TDEInit::Shutdown();
+}
+// -----------------------------------------------------------------------
+/** checks whether the TDE version on the system we're running at is supported
+ by the driver
+
+ Has to be called before any other code from this library, in particular,
+ it has to be called before initKApplication()
+
+ If this function returns <code>0</code>, then no other code from this library
+ has to be called, else the results are unpredictable.
+
+ @return
+ <ul><li><code>0</code> if the TDE version is supportednon</li>
+ <li>a negative value if the version is too old</li>
+ <li>a positive value if the version is too new to know whether it works with this driver</li>
+ </ul>
+
+ #i60062# / 2006-01-06 / frank.schoenheit@sun.com
+*/
+extern "C" SAL_DLLPUBLIC_EXPORT int SAL_CALL matchTDEVersion()
+{
+ double nMinVersion = normalizeVersion( MIN_TDE_VERSION_MAJOR, MIN_TDE_VERSION_MINOR );
+ double nCurVersion = normalizeVersion( ::KDE::versionMajor(), ::KDE::versionMinor() );
+ double nMaxVersion = normalizeVersion( MAX_TDE_VERSION_MAJOR, MAX_TDE_VERSION_MINOR );
+
+ if ( nCurVersion < nMinVersion )
+ return -1;
+ if ( nCurVersion > nMaxVersion )
+ return 1;
+
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/TDEInit.h b/connectivity/source/drivers/tdeab/TDEInit.h
new file mode 100644
index 0000000..350502d
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/TDEInit.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef CONNECTIVITY_KAB_TDEINIT_H
+#define CONNECTIVITY_KAB_TDEINIT_H
+
+// the address book driver's version
+#define KAB_DRIVER_VERSION "0.2"
+#define KAB_DRIVER_VERSION_MAJOR 0
+#define KAB_DRIVER_VERSION_MINOR 2
+
+// the minimum TDE version which is required at runtime
+#define MIN_TDE_VERSION_MAJOR 3
+#define MIN_TDE_VERSION_MINOR 2
+
+#define MAX_TDE_VERSION_MAJOR 3
+#define MAX_TDE_VERSION_MINOR 6
+
+
+#endif // CONNECTIVITY_KAB_TDEINIT_H
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/exports.dxp b/connectivity/source/drivers/tdeab/exports.dxp
new file mode 100644
index 0000000..9630d7e
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/exports.dxp
@@ -0,0 +1,3 @@
+component_getImplementationEnvironment
+component_writeInfo
+component_getFactory
diff --git a/connectivity/source/drivers/tdeab/kcondition.cxx b/connectivity/source/drivers/tdeab/kcondition.cxx
new file mode 100644
index 0000000..57d2745
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/kcondition.cxx
@@ -0,0 +1,233 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "kcondition.hxx"
+#include "kfields.hxx"
+#include "connectivity/CommonTools.hxx"
+
+using namespace ::connectivity::kab;
+using namespace ::com::sun::star::sdbc;
+// -----------------------------------------------------------------------------
+KabCondition::~KabCondition()
+{
+}
+// -----------------------------------------------------------------------------
+KabConditionConstant::KabConditionConstant(const sal_Bool bValue)
+ : KabCondition(),
+ m_bValue(bValue)
+{
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionConstant::isAlwaysTrue() const
+{
+ return m_bValue;
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionConstant::isAlwaysFalse() const
+{
+ return !m_bValue;
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionConstant::eval(const ::KABC::Addressee &) const
+{
+ return m_bValue;
+}
+// -----------------------------------------------------------------------------
+KabConditionColumn::KabConditionColumn(const ::rtl::OUString &sColumnName) throw(SQLException)
+ : KabCondition(),
+ m_nFieldNumber(findKabField(sColumnName))
+{
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionColumn::isAlwaysTrue() const
+{
+ // Sometimes true, sometimes false
+ return sal_False;
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionColumn::isAlwaysFalse() const
+{
+ // Sometimes true, sometimes false
+ return sal_False;
+}
+// -----------------------------------------------------------------------------
+KabConditionNull::KabConditionNull(const ::rtl::OUString &sColumnName) throw(SQLException)
+ : KabConditionColumn(sColumnName)
+{
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionNull::eval(const ::KABC::Addressee &aAddressee) const
+{
+ TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+
+ return aQtName.isNull();
+// TDE address book currently does not use NULL values.
+// But it might do it someday
+}
+// -----------------------------------------------------------------------------
+KabConditionNotNull::KabConditionNotNull(const ::rtl::OUString &sColumnName) throw(SQLException)
+ : KabConditionColumn(sColumnName)
+{
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionNotNull::eval(const ::KABC::Addressee &aAddressee) const
+{
+ TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+
+ return !aQtName.isNull();
+// TDE address book currently does not use NULL values.
+// But it might do it someday
+}
+// -----------------------------------------------------------------------------
+KabConditionCompare::KabConditionCompare(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException)
+ : KabConditionColumn(sColumnName),
+ m_sMatchString(sMatchString)
+{
+}
+// -----------------------------------------------------------------------------
+KabConditionEqual::KabConditionEqual(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException)
+ : KabConditionCompare(sColumnName, sMatchString)
+{
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionEqual::eval(const ::KABC::Addressee &aAddressee) const
+{
+ TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+// Timestamps should not be compared according to their string value
+// The syntax for such queries should be like
+// {ts '2004-03-29 12:55:00.000000'}
+// They should also support operators like '<' or '>='
+
+ if (aQtName.isNull()) return sal_False;
+
+ ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2());
+ return sValue == m_sMatchString;
+}
+// -----------------------------------------------------------------------------
+KabConditionDifferent::KabConditionDifferent(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException)
+ : KabConditionCompare(sColumnName, sMatchString)
+{
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionDifferent::eval(const ::KABC::Addressee &aAddressee) const
+{
+ TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+
+ if (aQtName.isNull()) return sal_False;
+
+ ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2());
+ return sValue != m_sMatchString;
+}
+// -----------------------------------------------------------------------------
+KabConditionSimilar::KabConditionSimilar(const ::rtl::OUString &sColumnName, const ::rtl::OUString &sMatchString) throw(SQLException)
+ : KabConditionCompare(sColumnName, sMatchString)
+{
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionSimilar::eval(const ::KABC::Addressee &aAddressee) const
+{
+ TQString aQtName = valueOfKabField(aAddressee, m_nFieldNumber);
+
+ if (aQtName.isNull()) return sal_False;
+
+ ::rtl::OUString sValue((const sal_Unicode *) aQtName.ucs2());
+ return match(m_sMatchString, sValue, '\0');
+}
+// -----------------------------------------------------------------------------
+KabConditionBoolean::KabConditionBoolean(KabCondition *pLeft, KabCondition *pRight)
+ : KabCondition(),
+ m_pLeft(pLeft),
+ m_pRight(pRight)
+{
+}
+// -----------------------------------------------------------------------------
+KabConditionBoolean::~KabConditionBoolean()
+{
+ delete m_pLeft;
+ delete m_pRight;
+}
+// -----------------------------------------------------------------------------
+KabConditionOr::KabConditionOr(KabCondition *pLeft, KabCondition *pRight)
+ : KabConditionBoolean(pLeft, pRight)
+{
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionOr::isAlwaysTrue() const
+{
+ return m_pLeft->isAlwaysTrue() || m_pRight->isAlwaysTrue();
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionOr::isAlwaysFalse() const
+{
+ return m_pLeft->isAlwaysFalse() && m_pRight->isAlwaysFalse();
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionOr::eval(const ::KABC::Addressee &aAddressee) const
+{
+ // We avoid evaluating terms as much as we can
+ if (m_pLeft->isAlwaysTrue() || m_pRight->isAlwaysTrue()) return sal_True;
+ if (m_pLeft->isAlwaysFalse() && m_pRight->isAlwaysFalse()) return sal_False;
+
+ if (m_pLeft->eval(aAddressee)) return sal_True;
+ if (m_pRight->eval(aAddressee)) return sal_True;
+
+ return sal_False;
+}
+// -----------------------------------------------------------------------------
+KabConditionAnd::KabConditionAnd(KabCondition *pLeft, KabCondition *pRight)
+ : KabConditionBoolean(pLeft, pRight)
+{
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionAnd::isAlwaysTrue() const
+{
+ return m_pLeft->isAlwaysTrue() && m_pRight->isAlwaysTrue();
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionAnd::isAlwaysFalse() const
+{
+ return m_pLeft->isAlwaysFalse() || m_pRight->isAlwaysFalse();
+}
+// -----------------------------------------------------------------------------
+sal_Bool KabConditionAnd::eval(const ::KABC::Addressee &aAddressee) const
+{
+ // We avoid evaluating terms as much as we can
+ if (m_pLeft->isAlwaysFalse() || m_pRight->isAlwaysFalse()) return sal_False;
+ if (m_pLeft->isAlwaysTrue() && m_pRight->isAlwaysTrue()) return sal_True;
+
+ if (!m_pLeft->eval(aAddressee)) return sal_False;
+ if (!m_pRight->eval(aAddressee)) return sal_False;
+
+ return sal_True;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/kcondition.hxx b/connectivity/source/drivers/tdeab/kcondition.hxx
new file mode 100644
index 0000000..a8b729f
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/kcondition.hxx
@@ -0,0 +1,164 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_CONDITION_HXX_
+#define _CONNECTIVITY_KAB_CONDITION_HXX_
+
+#include <comphelper/types.hxx>
+#include <shell/tde_headers.h>
+#include <connectivity/dbexception.hxx>
+
+namespace connectivity
+{
+ namespace kab
+ {
+// -----------------------------------------------------------------------------
+class KabCondition
+{
+ public:
+ virtual ~KabCondition();
+ virtual sal_Bool isAlwaysTrue() const = 0;
+ virtual sal_Bool isAlwaysFalse() const = 0;
+ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const = 0;
+};
+// -----------------------------------------------------------------------------
+class KabConditionConstant : public KabCondition
+{
+ protected:
+ sal_Bool m_bValue;
+
+ public:
+ KabConditionConstant(const sal_Bool bValue);
+ virtual sal_Bool isAlwaysTrue() const;
+ virtual sal_Bool isAlwaysFalse() const;
+ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+};
+// -----------------------------------------------------------------------------
+class KabConditionColumn : public KabCondition
+{
+ protected:
+ sal_Int32 m_nFieldNumber;
+
+ TQString value(const ::KABC::Addressee &aAddressee) const;
+
+ public:
+ KabConditionColumn(
+ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException);
+ virtual sal_Bool isAlwaysTrue() const;
+ virtual sal_Bool isAlwaysFalse() const;
+};
+// -----------------------------------------------------------------------------
+class KabConditionNull : public KabConditionColumn
+{
+ public:
+ KabConditionNull(
+ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException);
+ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+};
+// -----------------------------------------------------------------------------
+class KabConditionNotNull : public KabConditionColumn
+{
+ public:
+ KabConditionNotNull(
+ const ::rtl::OUString &sColumnName) throw(::com::sun::star::sdbc::SQLException);
+ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+};
+// -----------------------------------------------------------------------------
+class KabConditionCompare : public KabConditionColumn
+{
+ protected:
+ const ::rtl::OUString m_sMatchString;
+
+ public:
+ KabConditionCompare(
+ const ::rtl::OUString &sColumnName,
+ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException);
+};
+// -----------------------------------------------------------------------------
+class KabConditionEqual : public KabConditionCompare
+{
+ public:
+ KabConditionEqual(
+ const ::rtl::OUString &sColumnName,
+ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException);
+ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+};
+// -----------------------------------------------------------------------------
+class KabConditionDifferent : public KabConditionCompare
+{
+ public:
+ KabConditionDifferent(
+ const ::rtl::OUString &sColumnName,
+ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException);
+ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+};
+// -----------------------------------------------------------------------------
+class KabConditionSimilar : public KabConditionCompare
+{
+ public:
+ KabConditionSimilar(
+ const ::rtl::OUString &sColumnName,
+ const ::rtl::OUString &sMatchString) throw(::com::sun::star::sdbc::SQLException);
+ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+};
+// -----------------------------------------------------------------------------
+class KabConditionBoolean : public KabCondition
+{
+ protected:
+ KabCondition *m_pLeft, *m_pRight;
+
+ public:
+ KabConditionBoolean(KabCondition *pLeft, KabCondition *pRight);
+ virtual ~KabConditionBoolean();
+};
+// -----------------------------------------------------------------------------
+class KabConditionOr : public KabConditionBoolean
+{
+ public:
+ KabConditionOr(KabCondition *pLeft, KabCondition *pRight);
+ virtual sal_Bool isAlwaysTrue() const;
+ virtual sal_Bool isAlwaysFalse() const;
+ virtual sal_Bool eval(const ::KABC::Addressee &aAddressee) const;
+};
+// -----------------------------------------------------------------------------
+class KabConditionAnd : public KabConditionBoolean
+{
+ public:
+ KabConditionAnd(KabCondition *pLeft, KabCondition *pRight);
+ virtual sal_Bool isAlwaysTrue() const;
+ virtual sal_Bool isAlwaysFalse() const;
+ virtual sal_Bool eval(const ::KABC::Addressee &addressee) const;
+};
+// -----------------------------------------------------------------------------
+ }
+}
+
+#endif // _CONNECTIVITY_KAB_CONDITION_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/kfields.cxx b/connectivity/source/drivers/tdeab/kfields.cxx
new file mode 100644
index 0000000..2d375d7
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/kfields.cxx
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "kfields.hxx"
+#include "resource/common_res.hrc"
+#include "resource/sharedresources.hxx"
+
+using namespace ::connectivity::kab;
+using namespace ::com::sun::star::sdbc;
+
+namespace connectivity
+{
+ namespace kab
+ {
+// -----------------------------------------------------------------------------
+// return the value of a TDE address book field, given an addressee and a field number
+TQString valueOfKabField(const ::KABC::Addressee &aAddressee, sal_Int32 nFieldNumber)
+{
+ switch (nFieldNumber)
+ {
+ case KAB_FIELD_REVISION:
+ return aAddressee.revision().toString("yyyy-MM-dd hh:mm:ss");
+ default:
+ ::KABC::Field::List aFields = ::KABC::Field::allFields();
+ return aFields[nFieldNumber - KAB_DATA_FIELDS]->value(aAddressee);
+ }
+}
+// ------------------------------------------------------------------------------
+// search the TDE address book field number of a given column name
+sal_uInt32 findKabField(const ::rtl::OUString& columnName) throw(SQLException)
+{
+ TQString aQtName;
+ ::rtl::OUString aName;
+
+ aQtName = KABC::Addressee::revisionLabel();
+ aName = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+ if (columnName == aName)
+ return KAB_FIELD_REVISION;
+
+ ::KABC::Field::List aFields = ::KABC::Field::allFields();
+ ::KABC::Field::List::iterator aField;
+ sal_uInt32 nResult;
+
+ for ( aField = aFields.begin(), nResult = KAB_DATA_FIELDS;
+ aField != aFields.end();
+ ++aField, ++nResult)
+ {
+ aQtName = (*aField)->label();
+ aName = ::rtl::OUString((const sal_Unicode *) aQtName.ucs2());
+
+ if (columnName == aName)
+ return nResult;
+ }
+
+ ::connectivity::SharedResources aResources;
+ const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
+ STR_INVALID_COLUMNNAME,
+ "$columnname$",columnName
+ ) );
+ ::dbtools::throwGenericSQLException(sError,NULL);
+ // Unreachable:
+ OSL_ASSERT(false);
+ return 0;
+}
+// ------------------------------------------------------------------------------
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/kfields.hxx b/connectivity/source/drivers/tdeab/kfields.hxx
new file mode 100644
index 0000000..2c5c63b
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/kfields.hxx
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_FIELDS_HXX_
+#define _CONNECTIVITY_KAB_FIELDS_HXX_
+
+#include <shell/tde_headers.h>
+#include <connectivity/dbexception.hxx>
+#include <rtl/ustring.hxx>
+
+#define KAB_FIELD_REVISION 0
+#define KAB_DATA_FIELDS 1
+
+namespace connectivity
+{
+ namespace kab
+ {
+ TQString valueOfKabField(const ::KABC::Addressee &aAddressee, sal_Int32 nFieldNumber);
+ sal_uInt32 findKabField(const ::rtl::OUString& columnName) throw(::com::sun::star::sdbc::SQLException);
+ }
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/korder.cxx b/connectivity/source/drivers/tdeab/korder.cxx
new file mode 100644
index 0000000..994c41f
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/korder.cxx
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+
+#include "korder.hxx"
+#include "kfields.hxx"
+
+using namespace ::connectivity::kab;
+
+KabOrder::~KabOrder()
+{
+}
+// -----------------------------------------------------------------------------
+KabSimpleOrder::KabSimpleOrder(::rtl::OUString &sColumnName, sal_Bool bAscending)
+ : KabOrder(),
+ m_nFieldNumber(findKabField(sColumnName)),
+ m_bAscending(bAscending)
+{
+}
+// -----------------------------------------------------------------------------
+sal_Int32 KabSimpleOrder::compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const
+{
+ sal_Int32 result;
+
+ result = TQString::compare(
+ valueOfKabField(aAddressee1, m_nFieldNumber),
+ valueOfKabField(aAddressee2, m_nFieldNumber));
+// Timestamps should be compared differently than with their string value
+
+ if (!m_bAscending) result = -result;
+
+ return result;
+}
+// -----------------------------------------------------------------------------
+KabComplexOrder::KabComplexOrder()
+ : KabOrder(),
+ m_aOrders()
+{
+}
+// -----------------------------------------------------------------------------
+KabComplexOrder::~KabComplexOrder()
+{
+ for (sal_uInt32 i = 0; i < m_aOrders.size(); i++)
+ delete m_aOrders[i];
+}
+// -----------------------------------------------------------------------------
+void KabComplexOrder::addOrder(KabOrder *pOrder)
+{
+ m_aOrders.push_back(pOrder);
+}
+// -----------------------------------------------------------------------------
+sal_Int32 KabComplexOrder::compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const
+{
+ for (sal_uInt32 i = 0; i < m_aOrders.size(); i++)
+ {
+ const KabOrder *pOrder = m_aOrders[i];
+ sal_Int32 result = pOrder->compare(aAddressee1, aAddressee2);
+
+ if (result) return result;
+ }
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/korder.hxx b/connectivity/source/drivers/tdeab/korder.hxx
new file mode 100644
index 0000000..8e62b79
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/korder.hxx
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_KAB_ORDER_HXX_
+#define _CONNECTIVITY_KAB_ORDER_HXX_
+
+#include "rtl/ustring.hxx"
+#include <shell/tde_headers.h>
+
+#include <vector>
+
+namespace connectivity
+{
+ namespace kab
+ {
+ class KabOrder
+ {
+ public:
+ virtual ~KabOrder();
+
+ virtual sal_Int32 compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const = 0;
+ };
+
+ class KabSimpleOrder : public KabOrder
+ {
+ sal_Int32 m_nFieldNumber;
+ sal_Bool m_bAscending;
+
+ TQString value(const ::KABC::Addressee &aAddressee) const;
+ public:
+ KabSimpleOrder(::rtl::OUString &sColumnName, sal_Bool bAscending);
+
+ virtual sal_Int32 compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const;
+ };
+
+ class KabComplexOrder : public KabOrder
+ {
+ ::std::vector<KabOrder *> m_aOrders;
+
+ public:
+ KabComplexOrder();
+ virtual ~KabComplexOrder();
+
+ void addOrder(KabOrder *pOrder);
+ virtual sal_Int32 compare(const ::KABC::Addressee &aAddressee1, const ::KABC::Addressee &aAddressee2) const;
+ };
+ }
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/drivers/tdeab/makefile.mk b/connectivity/source/drivers/tdeab/makefile.mk
new file mode 100644
index 0000000..cde838a
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/makefile.mk
@@ -0,0 +1,139 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+# Copyright 2011 Timothy Pearson
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+PRJINC=..$/..
+PRJNAME=connectivity
+TARGET=tdeab
+TARGET2=$(TARGET)drv
+
+ENABLE_EXCEPTIONS=TRUE
+VISIBILITY_HIDDEN=TRUE
+
+# --- Settings ----------------------------------
+
+.INCLUDE : $(PRJ)$/makefile.pmk
+.INCLUDE : $(PRJ)$/version.mk
+
+.IF "$(GUI)" == "UNX"
+.IF "$(ENABLE_TDEAB)" == "TRUE"
+
+CFLAGS+=$(TDE_CFLAGS)
+
+.IF "$(TDE_ROOT)"!=""
+EXTRALIBPATHS+=-L$(TDE_ROOT)$/lib
+.ENDIF
+
+# === TDEAB base library ==========================
+
+# --- Files -------------------------------------
+
+SLOFILES= \
+ $(SLO)$/KDriver.obj \
+ $(SLO)$/KServices.obj
+
+DEPOBJFILES= \
+ $(SLO2FILES)
+
+# --- Library -----------------------------------
+
+SHL1VERSIONMAP=$(SOLARENV)/src/component.map
+
+SHL1TARGET= $(TARGET)$(TDEAB_MAJOR)
+SHL1OBJS=$(SLOFILES)
+SHL1STDLIBS=\
+ $(CPPULIB) \
+ $(CPPUHELPERLIB) \
+ $(DBTOOLSLIB) \
+ $(SALLIB) \
+ $(SALHELPERLIB)
+
+SHL1DEPN=
+SHL1IMPLIB= i$(TARGET)
+
+SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME= $(SHL1TARGET)
+
+# === TDEAB impl library ==========================
+
+# --- Files -------------------------------------
+
+SLO2FILES=\
+ $(SLO)$/KColumns.obj \
+ $(SLO)$/KTable.obj \
+ $(SLO)$/KTables.obj \
+ $(SLO)$/KCatalog.obj \
+ $(SLO)$/KResultSet.obj \
+ $(SLO)$/KStatement.obj \
+ $(SLO)$/KPreparedStatement.obj \
+ $(SLO)$/KDatabaseMetaData.obj \
+ $(SLO)$/KConnection.obj \
+ $(SLO)$/KResultSetMetaData.obj \
+ $(SLO)$/kcondition.obj \
+ $(SLO)$/korder.obj \
+ $(SLO)$/kfields.obj \
+ $(SLO)$/TDEInit.obj
+
+TDEAB_LIB=$(TDE_LIBS) -lkabc
+
+# --- Library -----------------------------------
+
+SHL2VERSIONMAP=$(TARGET2).map
+
+SHL2TARGET= $(TARGET2)$(TDEAB_MAJOR)
+SHL2OBJS=$(SLO2FILES)
+SHL2LINKFLAGS+=$(TDEAB_LIB)
+SHL2STDLIBS=\
+ $(CPPULIB) \
+ $(CPPUHELPERLIB) \
+ $(SALLIB) \
+ $(SALHELPERLIB) \
+ $(DBTOOLSLIB) \
+ $(COMPHELPERLIB)
+
+SHL2DEPN=
+SHL2IMPLIB= i$(TARGET2)
+
+SHL2DEF= $(MISC)$/$(SHL2TARGET).def
+
+DEF2NAME= $(SHL2TARGET)
+
+# --- Targets -----------------------------------
+.ELSE # "$(ENABLE_TDEAB)" == "TRUE"
+dummy:
+ @echo TDE Addressbook disabled - nothing to build
+.ENDIF
+
+.ELSE # "$(GUI)" == "UNX"
+dummy:
+ @echo "Nothing to build for GUI $(GUI)"
+.ENDIF
+
+.INCLUDE : $(PRJ)$/target.pmk
+
diff --git a/connectivity/source/drivers/tdeab/tdeab.xcu b/connectivity/source/drivers/tdeab/tdeab.xcu
new file mode 100644
index 0000000..63b2761
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/tdeab.xcu
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--***********************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************ -->
+<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <node oor:name="Installed">
+ <node oor:name="sdbc:address:kab" oor:op="replace">
+ <prop oor:name="Driver">
+ <value>com.sun.star.comp.sdbc.kab.Driver</value>
+ </prop>
+ <prop oor:name="DriverTypeDisplayName" oor:type="xs:string">
+ <value xml:lang="en-US">TDE Address Book</value>
+ </prop>
+ <node oor:name="Features">
+ <node oor:name="EscapeDateTime" oor:op="replace">
+ <prop oor:name="Value" oor:type="xs:boolean">
+ <value>true</value>
+ </prop>
+ </node>
+ </node>
+ </node>
+ </node>
+</oor:component-data>
diff --git a/connectivity/source/drivers/tdeab/tdeab.xml b/connectivity/source/drivers/tdeab/tdeab.xml
new file mode 100644
index 0000000..4deb1d1
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/tdeab.xml
@@ -0,0 +1,77 @@
+<?xml version='1.0' encoding="UTF-8"?>
+<!DOCTYPE COMPONENTDESCRIPTION PUBLIC "-//W3C//DTD HTML 3.2//EN" "module-description.dtd">
+<module-description xmlns:xlink="http://www.w3.org/1999/xlink">
+ <module-name> kab1 </module-name>
+ <component-description>
+ <Author>Eric Bischoff</Author>
+ <Name>com.sun.star.comp.sdbc.kab.Driver</Name>
+ <description>This library implements the database driver for TDE address book formats.</description>
+ <loader-name>com.sun.star.loader.SharedLibrary</loader-name>
+ <language>c++</language>
+ <status value="final"/>
+ <supported-service>com.sun.star.sdbc.Driver</supported-service>
+ <service-dependency> ... </service-dependency>
+ </component-description>
+ <project-build-dependency> cppuhelper </project-build-dependency>
+ <project-build-dependency> cppu </project-build-dependency>
+ <project-build-dependency> sal </project-build-dependency>
+
+ <runtime-module-dependency> cppuhelper </runtime-module-dependency>
+ <runtime-module-dependency> cppu1 </runtime-module-dependency>
+ <runtime-module-dependency> sal1 </runtime-module-dependency>
+
+ <type> com.sun.star.registry.XRegistryKey </type>
+ <type> com.sun.star.util.XCancellable </type>
+ <type> com.sun.star.util.XNumberFormatter </type>
+ <type> com.sun.star.uno.TypeClass </type>
+ <type> com.sun.star.uno.XWeak </type>
+ <type> com.sun.star.uno.XAggregation </type>
+ <type> com.sun.star.uno.XComponentContext </type>
+ <type> com.sun.star.beans.PropertyAttribute </type>
+ <type> com.sun.star.beans.XPropertyState </type>
+ <type> com.sun.star.beans.XPropertySet </type>
+ <type> com.sun.star.beans.PropertyValue </type>
+ <type> com.sun.star.beans.XMultiPropertySet </type>
+ <type> com.sun.star.beans.XFastPropertySet </type>
+ <type> com.sun.star.lang.XSingleServiceFactory </type>
+ <type> com.sun.star.lang.XTypeProvider </type>
+ <type> com.sun.star.lang.XSingleComponentFactory </type>
+ <type> com.sun.star.lang.EventObject </type>
+ <type> com.sun.star.lang.XComponent </type>
+ <type> com.sun.star.lang.IllegalArgumentException </type>
+ <type> com.sun.star.lang.DisposedException </type>
+ <type> com.sun.star.lang.XMultiServiceFactory </type>
+ <type> com.sun.star.lang.XServiceInfo </type>
+ <type> com.sun.star.lang.XUnoTunnel </type>
+ <type> com.sun.star.java.XJavaThreadRegister_11 </type>
+ <type> com.sun.star.java.XJavaVM </type>
+ <type> com.sun.star.sdbc.FetchDirection </type>
+ <type> com.sun.star.sdbc.XConnection </type>
+ <type> com.sun.star.sdbc.XStatement </type>
+ <type> com.sun.star.sdbc.XResultSet </type>
+ <type> com.sun.star.sdbc.XResultSetMetaDataSupplier</type>
+ <type> com.sun.star.sdbc.XColumnLocate </type>
+ <type> com.sun.star.sdbc.XResultSetUpdate </type>
+ <type> com.sun.star.sdbc.XWarningsSupplier </type>
+ <type> com.sun.star.sdbc.XRowUpdate </type>
+ <type> com.sun.star.sdbc.XMultipleResults </type>
+ <type> com.sun.star.sdbc.XBatchExecution </type>
+ <type> com.sun.star.sdbc.XPreparedBatchExecution </type>
+ <type> com.sun.star.sdbc.XParameters </type>
+ <type> com.sun.star.sdbc.XOutParameters </type>
+ <type> com.sun.star.sdbc.DriverPropertyInfo </type>
+ <type> com.sun.star.sdbc.SQLWarning </type>
+ <type> com.sun.star.sdbc.XRow </type>
+ <type> com.sun.star.sdbc.ColumnSearch </type>
+ <type> com.sun.star.sdbc.ColumnValue </type>
+ <type> com.sun.star.sdbc.DataType </type>
+ <type> com.sun.star.sdbc.XDriver </type>
+ <type> com.sun.star.sdbc.TransactionIsolation </type>
+ <type> com.sun.star.sdbc.ResultSetType </type>
+ <type> com.sun.star.sdbc.ResultSetConcurrency </type>
+ <type> com.sun.star.sdbcx.XRowLocate </type>
+ <type> com.sun.star.sdbcx.XDeleteRows </type>
+ <type> com.sun.star.sdbcx.CompareBookmark </type>
+ <type> com.sun.star.sdb.XColumnUpdate </type>
+ <type> com.sun.star.sdb.XColumn </type>
+</module-description>
diff --git a/connectivity/source/drivers/tdeab/tdeabdrv.map b/connectivity/source/drivers/tdeab/tdeabdrv.map
new file mode 100644
index 0000000..2c828d8
--- /dev/null
+++ b/connectivity/source/drivers/tdeab/tdeabdrv.map
@@ -0,0 +1,9 @@
+UDK_3_0_0 {
+ global:
+ createKabConnection;
+ initKApplication;
+ shutdownKApplication;
+ matchTDEVersion;
+ local:
+ *;
+};
diff --git a/connectivity/source/inc/resource/tdeab_res.hrc b/connectivity/source/inc/resource/tdeab_res.hrc
new file mode 100644
index 0000000..ff6a7b2
--- /dev/null
+++ b/connectivity/source/inc/resource/tdeab_res.hrc
@@ -0,0 +1,44 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef CONNECTIVITY_RESOURCE_KAB_HRC
+#define CONNECTIVITY_RESOURCE_KAB_HRC
+
+#include "resource/conn_shared_res.hrc"
+#include "resource/common_res.hrc"
+// ============================================================================
+// = the tdeab driver's resource strings
+// ============================================================================
+
+#define STR_NO_TDE_INST ( STR_KAB_BASE + 0 )
+#define STR_TDE_VERSION_TOO_OLD ( STR_KAB_BASE + 1 )
+#define STR_TDE_VERSION_TOO_NEW ( STR_KAB_BASE + 2 )
+#define STR_TDE_VERSION_TOO_NEW_WORK_AROUND ( STR_KAB_BASE + 3 )
+
+#endif // CONNECTIVITY_RESOURCE_KAB_HRC
+
diff --git a/connectivity/version.mk b/connectivity/version.mk
index fd2235c..9ff6151 100755
--- a/connectivity/version.mk
+++ b/connectivity/version.mk
@@ -101,6 +101,16 @@ KAB_MINOR=0
# the micro
KAB_MICRO=0
+# ----------------------------Tdeab settings-------------------------------------#
+# target
+TDEAB_TARGET=tdeab
+
+# the major
+TDEAB_MAJOR=1
+# the minor
+TDEAB_MINOR=0
+# the micro
+TDEAB_MICRO=0
# ----------------------------Macab settings-------------------------------------#
# target
diff --git a/cui/Library_cui.mk b/cui/Library_cui.mk
index 94d8a4a..1113ab0 100644
--- a/cui/Library_cui.mk
+++ b/cui/Library_cui.mk
@@ -41,6 +41,7 @@ $(eval $(call gb_Library_set_include,cui,\
$(eval $(call gb_Library_add_defs,cui,\
$(if $(filter TRUE,$(ENABLE_GTK)),-DENABLE_GTK) \
$(if $(filter TRUE,$(ENABLE_KDE)),-DENABLE_KDE) \
+ $(if $(filter TRUE,$(ENABLE_TDE)),-DENABLE_TDE) \
$(if $(filter TRUE,$(ENABLE_KDE4)),-DENABLE_KDE4) \
))
diff --git a/cui/source/options/optgdlg.cxx b/cui/source/options/optgdlg.cxx
index e08dcc7..8237c02 100644
--- a/cui/source/options/optgdlg.cxx
+++ b/cui/source/options/optgdlg.cxx
@@ -153,6 +153,14 @@ namespace
return rtl::OUString();
#endif
}
+ else if ( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "tde" ) )
+ {
+ #ifdef ENABLE_TDE
+ return ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.TDEFilePicker" );
+ #else
+ return rtl::OUString();
+ #endif
+ }
#if defined WNT
return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ui.dialogs.SystemFilePicker") );
#elif (defined MACOSX && defined QUARTZ)
diff --git a/desktop/Pagein_common.mk b/desktop/Pagein_common.mk
index 3b0330c..e119474 100644
--- a/desktop/Pagein_common.mk
+++ b/desktop/Pagein_common.mk
@@ -46,6 +46,7 @@ $(eval $(call desktop_Pagein_add_libs,common,\
vclplug_gen \
$(if $(findstring TRUE,$(ENABLE_GTK)),vclplug_gtk) \
$(if $(findstring TRUE,$(ENABLE_KDE)),vclplug_kde) \
+ $(if $(findstring TRUE,$(ENABLE_TDE)),vclplug_tde) \
basegfx \
sot \
xcr \
diff --git a/fpicker/prj/build.lst b/fpicker/prj/build.lst
index 114a301..b4f0898f 100644
--- a/fpicker/prj/build.lst
+++ b/fpicker/prj/build.lst
@@ -7,8 +7,10 @@ fp fpicker\source\unx\gnome nmake - u fp_gnome_filepicker fp_inc NULL
fp fpicker\source\unx\kde4 nmake - u fp_kde4_filepicker fp_inc NULL
fp fpicker\source\unx\kde_unx nmake - u fp_unx_common fp_inc NULL
fp fpicker\source\unx\kde nmake - u fp_unx_kde_filepicker fp_inc NULL
+fp fpicker\source\unx\tde_unx nmake - u fp_unx_tdecommon fp_inc NULL
+fp fpicker\source\unx\tde nmake - u fp_unx_tde_filepicker fp_inc NULL
fp fpicker\source\aqua nmake - u fp_macosx_filepicker NULL
fp fpicker\source\win32\filepicker nmake - w fp_win32_filepicker fp_inc NULL
fp fpicker\source\win32\folderpicker nmake - w fp_win32_folderpicker fp_inc NULL
fp fpicker\source\win32\misc nmake - w fp_win32_misc fp_win32_filepicker.w fp_win32_folderpicker.w fp_inc NULL
-fp fpicker\util nmake - all fp_util fp_gnome_filepicker.u fp_unx_common.u fp_unx_kde_filepicker.u fp_win32_filepicker.w fp_win32_misc.w fp_win32_folderpicker.w NULL
+fp fpicker\util nmake - all fp_util fp_gnome_filepicker.u fp_unx_common.u fp_unx_kde_filepicker.u fp_unx_tdecommon.u fp_unx_tde_filepicker.u fp_win32_filepicker.w fp_win32_misc.w fp_win32_folderpicker.w NULL
diff --git a/fpicker/prj/d.lst b/fpicker/prj/d.lst
index 71ec565..bef8b71 100644
--- a/fpicker/prj/d.lst
+++ b/fpicker/prj/d.lst
@@ -5,6 +5,7 @@ mkdir: %COMMON_DEST%\bin\hid
..\%__SRC%\bin\f*.res %_DEST%\bin\
..\%__SRC%\bin\f*.dll %_DEST%\bin\
..\%__SRC%\bin\kdefilepicker %_DEST%\bin\kdefilepicker
+..\%__SRC%\bin\tdefilepicker %_DEST%\bin\tdefilepicker
..\%__SRC%\lib\f*.so %_DEST%\lib\
..\%__SRC%\lib\*.dylib %_DEST%\lib\*.dylib
diff --git a/fpicker/source/generic/fpicker.cxx b/fpicker/source/generic/fpicker.cxx
index 1444fde..fa5b2ec 100644
--- a/fpicker/source/generic/fpicker.cxx
+++ b/fpicker/source/generic/fpicker.cxx
@@ -65,6 +65,8 @@ static OUString FilePicker_getSystemPickerServiceName()
return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDEFilePicker"));
else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("kde4"))
return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDE4FilePicker"));
+ else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("tde"))
+ return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.TDEFilePicker"));
else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("macosx"))
return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.AquaFilePicker"));
else
@@ -141,6 +143,8 @@ static OUString FolderPicker_getSystemPickerServiceName()
return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.GtkFolderPicker"));
else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("kde"))
return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.KDEFolderPicker"));
+ else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("tde"))
+ return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.TDEFolderPicker"));
else if (aDesktopEnvironment.equalsIgnoreAsciiCaseAscii ("macosx"))
return OUString (RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.ui.dialogs.AquaFolderPicker"));
#endif
diff --git a/fpicker/source/unx/kde/makefile.mk b/fpicker/source/unx/kde/makefile.mk
index 1548d7b..768c946 100644
--- a/fpicker/source/unx/kde/makefile.mk
+++ b/fpicker/source/unx/kde/makefile.mk
@@ -29,8 +29,8 @@ PRJ=..$/..$/..
PRJNAME=fpicker
TARGET=kdefilepicker
-LIBTARGET=NO
ENABLE_EXCEPTIONS=TRUE
+LIBTARGET=NO
EXTERNAL_WARNINGS_NOT_ERRORS=TRUE
# --- Settings -----------------------------------------------------
@@ -63,7 +63,7 @@ SLOFILES =\
APP1TARGET=$(TARGET)
APP1OBJS=$(SLOFILES)
-APP1RPATH=OOO
+APP1RPATH=BRAND
APP1LINKFLAGS=$(KDE_LIBS) -lkio -lX11
APP1STDLIBS=$(SALLIB)
diff --git a/fpicker/source/unx/tde/makefile.mk b/fpicker/source/unx/tde/makefile.mk
new file mode 100644
index 0000000..26d7979
--- /dev/null
+++ b/fpicker/source/unx/tde/makefile.mk
@@ -0,0 +1,78 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2010 Novell, Inc.
+# Copyright 2011 Timothy Pearson
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=fpicker
+TARGET=tdefilepicker
+ENABLE_EXCEPTIONS=TRUE
+LIBTARGET=NO
+EXTERNAL_WARNINGS_NOT_ERRORS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# ------------------------------------------------------------------
+
+.IF "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE"
+
+dummy:
+ @echo "Nothing to build. GUIBASE == $(GUIBASE), ENABLE_TDE is not set"
+
+.ELSE # we build for TDE
+
+CFLAGS+= $(TDE_CFLAGS)
+
+.IF "$(COM)" == "GCC"
+CFLAGSCXX+=-Wno-shadow
+.ENDIF
+
+# --- Files --------------------------------------------------------
+
+SLOFILES =\
+ $(SLO)$/tdecommandthread.obj \
+ $(SLO)$/tdefilepicker.obj \
+ $(SLO)$/tdefilepicker.moc.obj \
+ $(SLO)$/tdefpmain.obj \
+ $(SLO)$/tdemodalityfilter.obj
+
+APP1TARGET=$(TARGET)
+APP1OBJS=$(SLOFILES)
+APP1RPATH=OOO
+APP1LINKFLAGS=$(TDE_LIBS) -lkio -lX11
+APP1STDLIBS=$(SALLIB)
+
+.ENDIF # "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE"
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+$(MISC)$/tdefilepicker.moc.cxx : tdefilepicker.hxx
+ $(MOC) $< -o $@
diff --git a/fpicker/source/unx/tde/tdecommandthread.cxx b/fpicker/source/unx/tde/tdecommandthread.cxx
new file mode 100644
index 0000000..8da50d2
--- /dev/null
+++ b/fpicker/source/unx/tde/tdecommandthread.cxx
@@ -0,0 +1,183 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <cstddef>
+
+#include <tdecommandthread.hxx>
+
+#include <tqstringlist.h>
+
+#include <kapplication.h>
+
+#if OSL_DEBUG_LEVEL > 1
+#include <iostream>
+#endif
+
+//////////////////////////////////////////////////////////////////////////
+// CommandEvent
+//////////////////////////////////////////////////////////////////////////
+
+TDECommandEvent::TDECommandEvent( const TQString &qCommand, TQStringList *pStringList )
+ : TQCustomEvent( TypeId, pStringList ),
+ m_eCommand( Unknown )
+{
+ struct {
+ const char *pName;
+ CommandEventType eType;
+ } *pIdx, pMapping[] =
+ {
+ { "appendControl", AppendControl },
+ { "enableControl", EnableControl },
+ { "getValue", GetValue },
+ { "setValue", SetValue },
+ { "appendFilter", AppendFilter },
+ { "appendFilterGroup", AppendFilterGroup },
+ { "getCurrentFilter", GetCurrentFilter },
+ { "setCurrentFilter", SetCurrentFilter },
+ { "getDirectory", GetDirectory },
+ { "setDirectory", SetDirectory },
+ { "getFiles", GetFiles },
+ { "setTitle", SetTitle },
+ { "setType", SetType },
+ { "setDefaultName", SetDefaultName },
+ { "setMultiSelection", SetMultiSelection },
+ { "exec", Exec },
+ { 0, Unknown }
+ };
+
+ for ( pIdx = pMapping; pIdx->pName && qCommand != pIdx->pName; ++pIdx )
+ ;
+
+ m_eCommand = pIdx->eType;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// CommandThread
+//////////////////////////////////////////////////////////////////////////
+
+TDECommandThread::TDECommandThread( TQWidget *pObject )
+ : m_pObject( pObject )
+{
+}
+
+TDECommandThread::~TDECommandThread()
+{
+}
+
+void TDECommandThread::run()
+{
+ TQTextIStream qStream( stdin );
+ qStream.setEncoding( TQTextStream::UnicodeUTF8 );
+
+ TQString qLine;
+ bool bQuit = false;
+ while ( !bQuit && !qStream.atEnd() )
+ {
+ qLine = qStream.readLine();
+ handleCommand( qLine, bQuit );
+ }
+}
+
+void TDECommandThread::handleCommand( const TQString &rString, bool &bQuit )
+{
+ TQMutexLocker qMutexLocker( &m_aMutex );
+
+#if OSL_DEBUG_LEVEL > 1
+ ::std::cerr << "tdefilepicker received: " << rString.latin1() << ::std::endl;
+#endif
+
+ bQuit = false;
+ TQStringList *pTokens = tokenize( rString );
+
+ if ( !pTokens )
+ return;
+ if ( pTokens->empty() )
+ {
+ delete pTokens, pTokens = NULL;
+ return;
+ }
+
+ TQString qCommand = pTokens->front();
+ pTokens->pop_front();
+
+ if ( qCommand == "exit" )
+ {
+ bQuit = true;
+ kapp->exit();
+ kapp->wakeUpGuiThread();
+ _exit(0); // FIXME This prevents a SIGABRT on some systems Why?
+ }
+ else
+ kapp->postEvent( m_pObject, new TDECommandEvent( qCommand, pTokens ) );
+}
+
+TQStringList* TDECommandThread::tokenize( const TQString &rString )
+{
+ // Commands look like:
+ // command arg1 arg2 arg3 ...
+ // Args may be enclosed in '"', if they contain spaces.
+
+ TQStringList *pList = new TQStringList();
+
+ TQString qBuffer;
+ qBuffer.reserve( 1024 );
+
+ const TQChar *pUnicode = rString.unicode();
+ const TQChar *pEnd = pUnicode + rString.length();
+ bool bQuoted = false;
+
+ for ( ; pUnicode != pEnd; ++pUnicode )
+ {
+ if ( *pUnicode == '\\' )
+ {
+ ++pUnicode;
+ if ( pUnicode != pEnd )
+ {
+ if ( *pUnicode == 'n' )
+ qBuffer.append( '\n' );
+ else
+ qBuffer.append( *pUnicode );
+ }
+ }
+ else if ( *pUnicode == '"' )
+ bQuoted = !bQuoted;
+ else if ( *pUnicode == ' ' && !bQuoted )
+ {
+ pList->push_back( qBuffer );
+ qBuffer.setLength( 0 );
+ }
+ else
+ qBuffer.append( *pUnicode );
+ }
+ pList->push_back( qBuffer );
+
+ return pList;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde/tdecommandthread.hxx b/fpicker/source/unx/tde/tdecommandthread.hxx
new file mode 100644
index 0000000..8697de9
--- /dev/null
+++ b/fpicker/source/unx/tde/tdecommandthread.hxx
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _TDECOMMANDTHREAD_HXX_
+#define _TDECOMMANDTHREAD_HXX_
+
+#include <tqevent.h>
+#include <tqmutex.h>
+#include <tqthread.h>
+
+class TDECommandEvent : public TQCustomEvent
+{
+public:
+ enum CommandEventType {
+ Unknown = 0,
+
+ AppendControl,
+ EnableControl,
+ GetValue,
+ SetValue,
+
+ AppendFilter,
+ AppendFilterGroup,
+ UpdateFilters,
+ GetCurrentFilter,
+ SetCurrentFilter,
+
+ GetDirectory,
+ SetDirectory,
+
+ GetFiles,
+
+ SetTitle,
+ SetType,
+ SetDefaultName,
+ SetMultiSelection,
+
+ Exec
+ };
+ static const TQEvent::Type TypeId = (TQEvent::Type) ( (int) TQEvent::User + 42 /*random magic value*/ );
+
+protected:
+ CommandEventType m_eCommand;
+
+public:
+ TDECommandEvent( const TQString &qCommand, TQStringList *pStringList );
+
+ CommandEventType command() const { return m_eCommand; }
+ TQStringList* stringList() { return static_cast< TQStringList* >( data() ); }
+};
+
+class TDECommandThread : public TQThread
+{
+protected:
+ TQObject *m_pObject;
+
+ TQMutex m_aMutex;
+
+public:
+ TDECommandThread( TQWidget *pObject );
+ virtual ~TDECommandThread();
+
+ virtual void run();
+
+protected:
+ void handleCommand( const TQString &rString, bool &bQuit );
+ TQStringList* tokenize( const TQString &rString );
+};
+
+#endif // _TDECOMMANDTHREAD_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde/tdefilepicker.cxx b/fpicker/source/unx/tde/tdefilepicker.cxx
new file mode 100644
index 0000000..46ab20d
--- /dev/null
+++ b/fpicker/source/unx/tde/tdefilepicker.cxx
@@ -0,0 +1,735 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <cstddef>
+
+#include <tdecommandthread.hxx>
+#include <tdefilepicker.hxx>
+
+#include <tqcheckbox.h>
+#include <tqcombobox.h>
+#include <tqgrid.h>
+#include <tqhbox.h>
+#include <tqlabel.h>
+#include <tqlayout.h>
+#include <tqobjectlist.h>
+#include <tqpushbutton.h>
+#include <tqregexp.h>
+#include <tqvbox.h>
+
+#ifdef TQT_NO_EMIT
+#define emit
+#endif
+
+#include <kdeversion.h>
+#include <kdiroperator.h>
+#include <kfiledialog.h>
+#include <kfilefiltercombo.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <ktempfile.h>
+
+#include <algorithm>
+#include <iostream>
+
+//////////////////////////////////////////////////////////////////////////
+// TDEFileDialog
+//////////////////////////////////////////////////////////////////////////
+
+TDEFileDialog::TDEFileDialog( const TQString &startDir, const TQString &filter,
+ TQWidget *parent, const char *name )
+ : KFileDialog( startDir, filter, parent, name, true, m_pCustomWidget = new TQVBox() ),
+ m_pCombosAndButtons( new TQHBox( m_pCustomWidget ) ),
+ m_pLabels( new TQVBox( m_pCombosAndButtons ) ),
+ m_pComboBoxes( new TQVBox( m_pCombosAndButtons ) ),
+ m_pPushButtons( new TQVBox( m_pCombosAndButtons ) ),
+ m_pCheckBoxes( new TQGrid( 2, m_pCustomWidget ) ),
+ m_bIsSave( false ),
+ m_bIsExecuting( false ),
+ m_bCanNotifySelection( true )
+{
+ connect( this, TQT_SIGNAL( fileHighlighted( const TQString & ) ),
+ this, TQT_SLOT( fileHighlightedCommand( const TQString & ) ) );
+
+ connect( this, TQT_SIGNAL( selectionChanged() ),
+ this, TQT_SLOT( selectionChangedCommand() ) );
+
+ m_pCustomWidget->setSpacing( KDialog::spacingHint() );
+ m_pCombosAndButtons->setSpacing( KDialog::spacingHint() );
+
+ updateCustomWidgetLayout();
+}
+
+TDEFileDialog::~TDEFileDialog()
+{
+}
+
+void TDEFileDialog::resizeEvent( TQResizeEvent *pEvent )
+{
+ KFileDialog::resizeEvent( pEvent );
+
+ updateCustomWidgetLayout();
+}
+
+void TDEFileDialog::showEvent( TQShowEvent *pEvent )
+{
+ KFileDialog::showEvent( pEvent );
+
+ updateCustomWidgetLayout();
+}
+
+void TDEFileDialog::updateCustomWidgetLayout()
+{
+ TQPoint qReferencePoint = filterWidget->mapTo( this, TQPoint( 0, 0 ) );
+ TQPoint qCustomPoint = m_pCustomWidget->mapTo( this, TQPoint( 0, 0 ) );
+
+ int nLeft = qReferencePoint.x() - qCustomPoint.x();
+ int nRight = m_pCustomWidget->width() - filterWidget->width() - nLeft;
+
+ nLeft -= KDialog::spacingHint();
+ nRight -= KDialog::spacingHint();
+ m_pLabels->setFixedWidth( ( nLeft > 0 )? nLeft: 80 );
+ // FIXME The following call sets the width of m_pPushButtons all right,
+ // but it also increases the width of m_pComboBoxes rapidly. Can we do
+ // anything about it?
+ m_pPushButtons->setFixedWidth( ( nRight > 0 )? nRight: 100 );
+}
+
+void TDEFileDialog::customEvent( TQCustomEvent *pEvent )
+{
+ if ( pEvent && pEvent->type() == TDECommandEvent::TypeId )
+ {
+ TDECommandEvent *pCommandEvent = static_cast< TDECommandEvent* >( pEvent );
+ TQStringList *pStringList = pCommandEvent->stringList();
+
+ int nListSize = -1;
+ if ( pStringList )
+ nListSize = pStringList->size();
+
+ switch ( pCommandEvent->command() )
+ {
+ case TDECommandEvent::AppendControl:
+ if ( nListSize >= 3 )
+ {
+ appendControl( (*pStringList)[0], (*pStringList)[1], (*pStringList)[2] );
+ }
+ break;
+ case TDECommandEvent::EnableControl:
+ if ( nListSize >= 2 )
+ {
+ enableControl( (*pStringList)[0], (*pStringList)[1] );
+ }
+ break;
+ case TDECommandEvent::GetValue:
+ if ( nListSize >= 2 )
+ {
+ getValue( (*pStringList)[0], (*pStringList)[1] );
+ }
+ break;
+ case TDECommandEvent::SetValue:
+ if ( nListSize >= 2 )
+ {
+ TQStringList qStringList = (*pStringList);
+ qStringList.pop_front();
+ qStringList.pop_front();
+
+ setValue( (*pStringList)[0], (*pStringList)[1], qStringList );
+ }
+ break;
+ case TDECommandEvent::AppendFilter:
+ if ( nListSize >= 2 )
+ {
+ appendFilter( (*pStringList)[0], (*pStringList)[1] );
+
+ // update the filters widget
+ setFilter( filters() );
+ }
+ break;
+ case TDECommandEvent::AppendFilterGroup:
+ if ( nListSize >= 1 )
+ {
+ TQStringList::const_iterator it = pStringList->begin();
+ ++it; // We ignore the filter group name
+
+ while ( it != pStringList->end() )
+ {
+ TQString qTitle = *it;
+ ++it;
+ if ( it != pStringList->end() )
+ {
+ appendFilter( qTitle, (*it) );
+ ++it;
+ }
+ }
+
+ // update the filters widget
+ setFilter( filters() );
+ }
+ break;
+ case TDECommandEvent::GetCurrentFilter:
+ {
+ TQString qCurrentFilter = filterWidget->currentText();
+ sendCommand( "currentFilter " + escapeString( qCurrentFilter ) );
+ }
+ break;
+ case TDECommandEvent::SetCurrentFilter:
+ if ( nListSize >= 1 )
+ {
+ static_cast< TDEFileFilterComboHack* >( filterWidget )->setCurrentFilter( pStringList->front() );
+ }
+ break;
+ case TDECommandEvent::GetDirectory:
+ {
+ TQString qDirectory = baseURL().url();
+ if ( qDirectory.startsWith( "file:/" ) && qDirectory.mid( 6, 1 ) != "/" )
+ qDirectory.replace( "file:/", "file:///" );
+ sendCommand( "currentDirectory " + escapeString( qDirectory ) );
+ }
+ break;
+ case TDECommandEvent::SetDirectory:
+ if ( nListSize >= 1 )
+ {
+ setURL( pStringList->front() );
+ }
+ break;
+ case TDECommandEvent::GetFiles:
+ {
+ TQString qString;
+ qString.reserve( 1024 );
+
+ qString.append( "files" );
+
+ if ( result() == TQDialog::Accepted )
+ {
+ KURL::List qList( selectedURLs() );
+ for ( KURL::List::const_iterator it = qList.begin(); it != qList.end(); ++it )
+ appendURL( qString, (*it) );
+ }
+ else
+ {
+ // we have to return the selected files anyway
+ const KFileItemList *pItems = ops->selectedItems();
+ for ( KFileItemListIterator it( *pItems ); it.current(); ++it )
+ appendURL( qString, (*it)->url() );
+ }
+
+ sendCommand( qString );
+ setCanNotifySelection( true );
+ }
+ break;
+ case TDECommandEvent::SetTitle:
+ if ( nListSize >= 1 )
+ {
+ setCaption( pStringList->front() );
+ }
+ break;
+ case TDECommandEvent::SetType:
+ if ( nListSize >= 1 )
+ {
+ TQString qType( pStringList->front() );
+ if ( qType == "open" )
+ {
+ setIsSave( false );
+ setCaption( i18n( "Open" ) );
+ }
+ else if ( qType == "save" )
+ {
+ setIsSave( true );
+ setCaption( i18n( "Save As" ) );
+ }
+ }
+ break;
+ case TDECommandEvent::SetDefaultName:
+ if ( nListSize >= 1 )
+ {
+ setKeepLocation( true );
+ setSelection( pStringList->front() );
+ }
+ break;
+ case TDECommandEvent::SetMultiSelection:
+ if ( nListSize >= 1 )
+ {
+ if ( pStringList->front() == "true" )
+ setMode( KFile::Files );
+ else
+ setMode( KFile::File );
+ }
+ break;
+ case TDECommandEvent::Exec:
+ {
+ filterWidget->setEditable( false );
+ setIsExecuting( true );
+ bool bCanExit = false;
+ do {
+ setCanNotifySelection( true );
+ exec();
+
+ KURL qLocalSelectedURL = mostLocalURL( selectedURL() );
+ TQString qProtocol( qLocalSelectedURL.protocol() );
+
+ if ( isSave() && result() == TQDialog::Accepted )
+ {
+ if ( qProtocol == "file" )
+ {
+ TQString qFileName( addExtension( qLocalSelectedURL.path() ) );
+ bCanExit =
+ !QFile::exists( qFileName ) ||
+ ( KMessageBox::warningYesNo( 0,
+ i18n( "A file named \"%1\" already exists. "
+ "Are you sure you want to overwrite it?" ).arg( qFileName ),
+ i18n( "Overwrite File?" ),
+ i18n( "Overwrite" ), KStdGuiItem::cancel() ) == KMessageBox::Yes );
+ }
+ else if ( !isSupportedProtocol( qProtocol ) )
+ {
+ KMessageBox::sorry( 0,
+ i18n( "Saving using protocol \"%1\" is not supported." ).arg( qProtocol ) );
+ bCanExit = false;
+ }
+ else
+ bCanExit = true;
+ }
+ else if ( !isSave() && result() == TQDialog::Accepted && !isSupportedProtocol( qProtocol ) )
+ {
+ KMessageBox::information( 0,
+ i18n( "Protocol \"%1\" is supported only partially. "
+ "Local copy of the file will be created." ).arg( qProtocol ) );
+ bCanExit = true;
+ }
+ else
+ bCanExit = true;
+ } while ( !bCanExit );
+ setIsExecuting( false );
+
+ if ( result() == TQDialog::Accepted )
+ sendCommand( "accept" );
+ else
+ sendCommand( "reject" );
+ }
+ break;
+ default:
+ break;
+ }
+
+ // FIXME Some cleanup of pEvent? delete something, etc.?
+ }
+}
+
+void TDEFileDialog::appendControl( const TQString &rId, const TQString &rType, const TQString &rTitle )
+{
+ TQString qLabel( rTitle );
+ qLabel.replace( '~', '&' );
+
+ if ( rType == "checkbox" )
+ {
+ TQCheckBox *pCheckBox = new TQCheckBox( qLabel, m_pCheckBoxes, rId.utf8() );
+
+ pCheckBox->setEnabled( true );
+ pCheckBox->setChecked( false );
+ }
+ else if ( rType == "listbox" )
+ {
+ TQLabel *pComboLabel = new TQLabel( qLabel, m_pLabels );
+ TQComboBox *pComboBox = new TQComboBox( m_pComboBoxes, rId.utf8() );
+
+ pComboLabel->setBuddy( pComboBox );
+ pComboBox->setEnabled( true );
+ }
+ else if ( rType == "pushbutton" )
+ {
+ TQPushButton *pPushButton = new TQPushButton( qLabel, m_pPushButtons, rId.utf8() );
+ pPushButton->setEnabled( true );
+ }
+}
+
+TQWidget* TDEFileDialog::findControl( const TQString &rId ) const
+{
+ TQObjectList *pList = m_pCustomWidget->queryList();
+ TQCString qName( rId.utf8() );
+ TQObjectList::const_iterator it = pList->begin();
+
+ for ( ; it != pList->end() && qName != (*it)->name(); ++it )
+ ;
+
+ TQWidget *pWidget = NULL;
+ if ( it != pList->end() )
+ pWidget = static_cast< TQWidget* >( *it );
+
+ delete pList;
+
+ return pWidget;
+}
+
+void TDEFileDialog::enableControl( const TQString &rId, const TQString &rValue )
+{
+ TQWidget *pWidget = findControl( rId );
+
+ if ( pWidget )
+ pWidget->setEnabled( rValue.lower() == "true" );
+}
+
+void TDEFileDialog::getValue( const TQString &rId, const TQString &rAction )
+{
+ TQWidget *pWidget = findControl( rId );
+ TQString qString;
+ qString.reserve( 1024 );
+ qString.append( "value" );
+
+ if ( pWidget )
+ {
+ TQCString qClassName = pWidget->className();
+ if ( qClassName == TQCHECKBOX_OBJECT_NAME_STRING )
+ {
+ TQCheckBox *pCheckBox = static_cast< TQCheckBox* >( pWidget );
+
+ if ( pCheckBox->isChecked() )
+ qString.append( " bool true" );
+ else
+ qString.append( " bool false" );
+ }
+ else if ( qClassName == TQCOMBOBOX_OBJECT_NAME_STRING )
+ {
+ TQComboBox *pComboBox = static_cast< TQComboBox* >( pWidget );
+ if ( rAction == "getItems" )
+ {
+ qString.append( " stringList" );
+ for ( int nIdx = 0; nIdx < pComboBox->count(); ++nIdx )
+ {
+ qString.append( ' ' );
+ appendEscaped( qString, pComboBox->text( nIdx ) );
+ }
+ }
+ else if ( rAction == "getSelectedItem" )
+ {
+ qString.append( " string " );
+ appendEscaped( qString, pComboBox->currentText() );
+ }
+ else if ( rAction == "getSelectedItemIndex" )
+ {
+ qString.append( " int " );
+ qString.append( TQString().setNum( pComboBox->currentItem() ) );
+ }
+ // TODO getHelpURL
+ }
+ // TODO push button
+ }
+
+ sendCommand( qString );
+}
+
+void TDEFileDialog::setValue( const TQString &rId, const TQString &rAction, const TQStringList &rValue )
+{
+ TQWidget *pWidget = findControl( rId );
+
+ if ( pWidget )
+ {
+ TQCString qClassName = pWidget->className();
+ if ( qClassName == TQCHECKBOX_OBJECT_NAME_STRING )
+ {
+ TQCheckBox *pCheckBox = static_cast< TQCheckBox* >( pWidget );
+
+ bool bValue = ( !rValue.isEmpty() ) && ( rValue.front().lower() == "true" );
+ pCheckBox->setChecked( bValue );
+ }
+ else if ( qClassName == TQCOMBOBOX_OBJECT_NAME_STRING )
+ {
+ TQComboBox *pComboBox = static_cast< TQComboBox* >( pWidget );
+ if ( rAction == "addItem" )
+ {
+ if ( !rValue.isEmpty() )
+ pComboBox->insertItem( rValue.front() );
+ }
+ else if ( rAction == "addItems" )
+ {
+ pComboBox->insertStringList( rValue );
+ }
+ else if ( rAction == "deleteItem" )
+ {
+ if ( !rValue.isEmpty() )
+ pComboBox->removeItem( rValue.front().toInt() );
+ }
+ else if ( rAction == "deleteItems" )
+ {
+ pComboBox->clear();
+ }
+ else if ( rAction == "setSelectedItem" )
+ {
+ if ( !rValue.isEmpty() )
+ pComboBox->setCurrentItem( rValue.front().toInt() );
+ }
+ // FIXME setHelpURL is ignored
+ }
+ // TODO push button
+ }
+}
+
+void TDEFileDialog::appendFilter( const TQString &rTitle, const TQString &rFilter )
+{
+ // Filters are separated by ';'
+ TQString qFilter( rFilter );
+ qFilter.replace( TQChar( ';' ), TQChar( ' ' ) ).replace( "*.*", "*" );
+
+ // Workaround for too wide <All formats> (*.bmp;...) entry
+ TQString qTitle( rTitle );
+ qTitle.replace( TQRegExp( "^<([^>]*)> \\(.*" ), "<\\1>" );
+
+ m_aFilters.push_back( qMakePair( qTitle, qFilter ) );
+}
+
+TQString TDEFileDialog::filters() const
+{
+ TQString qString, qTmp;
+ bool bFirstFilter = true;
+
+ for ( FilterList::const_iterator it = m_aFilters.begin(); it != m_aFilters.end(); ++it )
+ {
+ if ( bFirstFilter )
+ bFirstFilter = false;
+ else
+ qString.append( '\n' );
+
+ qString.append( (*it).second );
+ qString.append( '|' );
+
+ qTmp = (*it).first;
+ qString.append( qTmp.replace( '/', "\\/" ) );
+ }
+
+ return qString;
+}
+
+TQString TDEFileDialog::addExtension( const TQString &rFileName ) const
+{
+ if ( !isSave() )
+ return rFileName;
+
+ TQString qExtension;
+
+ TQWidget *pExtensionWidget = findControl( "100" ); // CHECKBOX_AUTOEXTENSION
+ TQCheckBox *pExtensionCB = pExtensionWidget? static_cast< TQCheckBox* >( pExtensionWidget->qt_cast( TQCHECKBOX_OBJECT_NAME_STRING ) ): NULL;
+ if ( pExtensionCB && pExtensionCB->isChecked() )
+ {
+ // FIXME: qFilter can be a MIME; we ignore it now...
+ TQStringList qFilterList = TQStringList::split( " ", currentFilter() );
+ for ( TQStringList::const_iterator it = qFilterList.begin();
+ qExtension.isEmpty() && it != qFilterList.end();
+ ++it )
+ {
+ int nUnwanted = (*it).findRev( '*' );
+ if ( nUnwanted < 0 )
+ nUnwanted = (*it).findRev( '?' );
+ else
+ nUnwanted = ::std::max( nUnwanted, (*it).find( '?', nUnwanted ) );
+
+ int nIdx = (*it).find( '.', ::std::max( nUnwanted, 0 ) );
+ if ( nIdx >= 0 )
+ qExtension = (*it).mid( nIdx ).lower();
+ }
+ }
+
+ if ( qExtension.isEmpty() || qExtension == "." || rFileName.endsWith( qExtension ) )
+ return rFileName;
+ else
+ return rFileName + qExtension;
+}
+
+bool TDEFileDialog::isSupportedProtocol( const TQString &rProtocol ) const
+{
+ // TODO Get this information directly from OOo
+ const char * pOOoProtocols[] = { "", "smb", "ftp", "http", "file", "mailto",
+ "vnd.sun.star.webdav", "news", "private", "vnd.sun.star.help",
+ "https", "slot", "macro", "javascript", "imap", "pop3", "data",
+ "cid", "out", "vnd.sun.star.wfs", "vnd.sun.star.hier", "vim",
+ ".uno", ".component", "vnd.sun.star.pkg", "ldap", "db",
+ "vnd.sun.star.cmd", "vnd.sun.star.script", "vnd.sun.star.odma",
+ "telnet",
+ NULL };
+
+ for ( const char **pIndex = pOOoProtocols; *pIndex != NULL; ++pIndex )
+ {
+ if ( rProtocol == *pIndex )
+ return true;
+ }
+
+ // TODO gnome-vfs bits here
+
+ return false;
+}
+
+KURL TDEFileDialog::mostLocalURL( const KURL &rURL ) const
+{
+#if KDE_IS_VERSION(3,5,0)
+ KURL qMostLocalURL( KIO::NetAccess::mostLocalURL( rURL, const_cast<TDEFileDialog*>( this ) ) );
+ if ( qMostLocalURL.isLocalFile() )
+ return qMostLocalURL;
+ else
+ {
+ // Terrible hack to get even non-existing media:// files right
+ qMostLocalURL.cd( ".." );
+ KURL qMostLocalPath( KIO::NetAccess::mostLocalURL( qMostLocalURL, const_cast<TDEFileDialog*>( this ) ) );
+ if ( qMostLocalPath.isLocalFile() )
+ {
+ qMostLocalPath.addPath( rURL.fileName() );
+ return qMostLocalPath;
+ }
+ }
+#endif
+
+ return rURL;
+}
+
+TQString TDEFileDialog::localCopy( const TQString &rFileName ) const
+{
+ // 106 == MIB enum for UTF-8
+ KURL qLocalURL = mostLocalURL( KURL( rFileName, 106 ) );
+ if ( qLocalURL.isLocalFile() )
+ return qLocalURL.url();
+
+ int nExtensionPos = rFileName.findRev( '/' );
+ if ( nExtensionPos >= 0 )
+ nExtensionPos = rFileName.find( '.', nExtensionPos );
+ else
+ nExtensionPos = rFileName.find( '.' );
+
+ KTempFile qTempFile( TQString::null, ( nExtensionPos < 0 )? TQString(): rFileName.mid( nExtensionPos ) );
+ KURL qDestURL;
+ qDestURL.setPath( qTempFile.name() );
+
+ if ( !KIO::NetAccess::file_copy( rFileName, qDestURL, 0600, true, false, NULL ) )
+ {
+ KMessageBox::error( 0, KIO::NetAccess::lastErrorString() );
+ return TQString::null;
+ }
+
+ return qDestURL.url();
+}
+
+void TDEFileDialog::fileHighlightedCommand( const TQString & )
+{
+ if ( canNotifySelection() )
+ {
+ sendCommand( "fileSelectionChanged" );
+ setCanNotifySelection( false );
+ }
+}
+
+void TDEFileDialog::selectionChangedCommand()
+{
+ if ( canNotifySelection() )
+ {
+ sendCommand( "fileSelectionChanged" );
+ setCanNotifySelection( false );
+ }
+}
+
+void TDEFileDialog::sendCommand( const TQString &rCommand )
+{
+#if OSL_DEBUG_LEVEL > 1
+ ::std::cerr << "tdefilepicker sent: " << rCommand.latin1() << ::std::endl;
+#endif
+
+ //m_aOutputStream << rCommand << endl;
+ ::std::cout << rCommand.utf8() << ::std::endl;
+}
+
+void TDEFileDialog::appendURL( TQString &rBuffer, const KURL &rURL )
+{
+ // From Martin Kretzschmar:
+ // file:///path/to/test%E0.odt is not a valid URL from OOo's point of
+ // view. (?Most modern parts of?) OOo assume(s) that the URL contains only
+ // ASCII characters (which test%E0.odt does) and is UTF-8 after unescaping
+ // (which file:///path/test%E0.odt is not).
+ // Cf. the comment in sal/inc/osl/file.h.
+ // 106 == MIB enum for UTF-8
+ TQString qUrlStr = addExtension( rURL.url( 0, 106 ) );
+
+ if ( !isExecuting() && !isSupportedProtocol( rURL.protocol() ) )
+ qUrlStr = localCopy( qUrlStr );
+
+ if ( qUrlStr.startsWith( "file:/" ) && qUrlStr.mid( 6, 1 ) != "/" )
+ qUrlStr.replace( "file:/", "file:///" );
+
+ rBuffer.append( " " );
+ if ( !qUrlStr.isEmpty() )
+ appendEscaped( rBuffer, qUrlStr );
+}
+
+void TDEFileDialog::appendEscaped( TQString &rBuffer, const TQString &rString )
+{
+ const TQChar *pUnicode = rString.unicode();
+ const TQChar *pEnd = pUnicode + rString.length();
+
+ rBuffer.append( '"' );
+ for ( ; pUnicode != pEnd; ++pUnicode )
+ {
+ if ( *pUnicode == '\\' )
+ rBuffer.append( "\\\\" );
+ else if ( *pUnicode == '"' )
+ rBuffer.append( "\\\"" );
+ else if ( *pUnicode == '\n' )
+ rBuffer.append( "\\\n" );
+ else
+ rBuffer.append( *pUnicode );
+ }
+ rBuffer.append( '"' );
+}
+
+TQString TDEFileDialog::escapeString( const TQString &rString )
+{
+ TQString qString;
+ qString.reserve( 2*rString.length() + 2 ); // every char escaped + quotes
+
+ appendEscaped( qString, rString );
+
+ return qString;
+}
+
+
+void TDEFileFilterComboHack::setCurrentFilter( const TQString& filter )
+{
+ setCurrentText( filter );
+ filterChanged();
+
+ // Workaround for 'Filter name (*.blah)' vs. 'Filter name'
+ if ( currentText() != text( currentItem() ) )
+ {
+ int nItem = 0;
+ for ( ; nItem < count() && !text( nItem ).startsWith( filter ); ++nItem );
+
+ if ( nItem < count() )
+ setCurrentItem( nItem );
+ else
+ setCurrentItem( 0 );
+
+ filterChanged();
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde/tdefilepicker.hxx b/fpicker/source/unx/tde/tdefilepicker.hxx
new file mode 100644
index 0000000..f411db5
--- /dev/null
+++ b/fpicker/source/unx/tde/tdefilepicker.hxx
@@ -0,0 +1,128 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _TDEFILEPICKER_HXX_
+#define _TDEFILEPICKER_HXX_
+
+#include <cstddef>
+
+#include <kfiledialog.h>
+#include <kfilefiltercombo.h>
+
+class TQGrid;
+class TQHBox;
+class TQVBox;
+
+class TDEFileDialog : public KFileDialog
+{
+ Q_OBJECT
+
+protected:
+ typedef TQPair< TQString, TQString > FilterEntry;
+ typedef TQValueList< FilterEntry > FilterList;
+
+ TQVBox *m_pCustomWidget;
+ TQHBox *m_pCombosAndButtons;
+
+ TQVBox *m_pLabels;
+ TQVBox *m_pComboBoxes;
+ TQVBox *m_pPushButtons;
+
+ TQGrid *m_pCheckBoxes;
+
+ FilterList m_aFilters;
+
+ /** Are we a "Save As" dialog?
+ *
+ * We cannot use KFileDialog::setOperationMode() here, because then
+ * it automatically adds an "Automatically select filename extension"
+ * check box, and completely destroys the dialog's layout
+ * (custom list boxes are under this check box, which looks ugly).
+ */
+ bool m_bIsSave;
+ bool m_bIsExecuting;
+
+ bool m_bCanNotifySelection;
+
+public:
+ TDEFileDialog( const TQString &startDir, const TQString &filter,
+ TQWidget *parent, const char *name );
+ virtual ~TDEFileDialog();
+
+protected:
+ virtual void resizeEvent( TQResizeEvent *pEvent );
+ virtual void showEvent( TQShowEvent *pEvent );
+ void updateCustomWidgetLayout();
+
+ virtual void customEvent( TQCustomEvent *pEvent );
+
+protected:
+ void appendControl( const TQString &rId, const TQString &rType, const TQString &rTitle );
+ TQWidget* findControl( const TQString &rId ) const;
+ void enableControl( const TQString &rId, const TQString &rValue );
+ void getValue( const TQString &rId, const TQString &rAction );
+ void setValue( const TQString &rId, const TQString &rAction, const TQStringList &rValue );
+
+ void appendFilter( const TQString &rTitle, const TQString &rFilter );
+ TQString filters() const;
+ TQString addExtension( const TQString &rFileName ) const;
+
+ void setIsSave( bool bIsSave ) { m_bIsSave = bIsSave; }
+ bool isSave( void ) const { return m_bIsSave; }
+
+ void setIsExecuting( bool bIsExecuting ) { m_bIsExecuting = bIsExecuting; }
+ bool isExecuting( void ) const { return m_bIsExecuting; }
+
+ bool isSupportedProtocol( const TQString &rProtocol ) const;
+ KURL mostLocalURL( const KURL &rURL ) const;
+ TQString localCopy( const TQString &rFileName ) const;
+
+ void setCanNotifySelection( bool bCanNotifySelection ) { m_bCanNotifySelection = bCanNotifySelection; }
+ bool canNotifySelection( void ) const { return m_bCanNotifySelection; }
+
+protected slots:
+ void fileHighlightedCommand( const TQString & );
+ void selectionChangedCommand();
+
+protected:
+ void sendCommand( const TQString &rCommand );
+ void appendURL( TQString &rBuffer, const KURL &rURL );
+ void appendEscaped( TQString &rBuffer, const TQString &rString );
+ TQString escapeString( const TQString &rString );
+};
+
+class TDEFileFilterComboHack : public KFileFilterCombo
+{
+public:
+ void setCurrentFilter( const TQString& filter );
+};
+
+#endif // _TDEFILEPICKER_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde/tdefpmain.cxx b/fpicker/source/unx/tde/tdefpmain.cxx
new file mode 100644
index 0000000..eb20aa3
--- /dev/null
+++ b/fpicker/source/unx/tde/tdefpmain.cxx
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <cstddef>
+
+#include <tdemodalityfilter.hxx>
+#include <tdefilepicker.hxx>
+#include <tdecommandthread.hxx>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+
+#include <iostream>
+#include <stdlib.h>
+
+//////////////////////////////////////////////////////////////////////////
+// Main
+//////////////////////////////////////////////////////////////////////////
+
+static KCmdLineOptions sOptions[] =
+{
+ { "winid <argument>", I18N_NOOP("Window ID to which is the fpicker modal"), "0" },
+ KCmdLineLastOption
+};
+
+int main( int argc, char* argv[] )
+{
+ // we fake the name of the application to have "OpenOffice.org" in the
+ // title
+ KAboutData qAboutData( "tdefilepicker", I18N_NOOP( "OpenOffice.org" ),
+ "0.1", I18N_NOOP( "tdefilepicker is an implementation of the TDE file dialog for OpenOffice.org." ),
+ KAboutData::License_LGPL,
+ "(c) 2004, Jan Holesovsky" );
+ qAboutData.addAuthor( "Jan Holesovsky", I18N_NOOP("Original author and current maintainer"), "kendy@openoffice.org" );
+
+ // Let the user see that this does something...
+ ::std::cerr << "tdefilepicker, an implementation of TDE file dialog for OOo." << ::std::endl
+ << "Type 'exit' and press Enter to finish." << ::std::endl;
+
+ KCmdLineArgs::addCmdLineOptions( sOptions );
+ KCmdLineArgs::init( argc, argv, &qAboutData );
+
+ KLocale::setMainCatalogue( "kdialog" );
+
+ KApplication kApplication;
+
+ // Setup the modality
+ KCmdLineArgs *pArgs = KCmdLineArgs::parsedArgs();
+ long nWinId = atol( pArgs->getOption( "winid" ) );
+ pArgs->clear();
+
+ TDEModalityFilter qModalityFilter( nWinId );
+
+ TDEFileDialog aFileDialog( NULL, TQString(), NULL, "tdefiledialog" );
+
+ TDECommandThread qCommandThread( &aFileDialog );
+ qCommandThread.start();
+
+ kApplication.exec();
+
+ qCommandThread.wait();
+
+ ::std::cout << "exited" << ::std::endl;
+
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde/tdemodalityfilter.cxx b/fpicker/source/unx/tde/tdemodalityfilter.cxx
new file mode 100644
index 0000000..6ced314
--- /dev/null
+++ b/fpicker/source/unx/tde/tdemodalityfilter.cxx
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <cstddef>
+
+#include <tdemodalityfilter.hxx>
+
+#include <kapplication.h>
+#include <kdialogbase.h>
+
+#include <netwm.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+//////////////////////////////////////////////////////////////////////////
+// Modality filter
+//////////////////////////////////////////////////////////////////////////
+
+TDEModalityFilter::TDEModalityFilter( WId nWinId )
+ : m_nWinId( nWinId )
+{
+ kapp->installEventFilter( this );
+}
+
+TDEModalityFilter::~TDEModalityFilter()
+{
+ kapp->removeEventFilter( this );
+}
+
+bool TDEModalityFilter::eventFilter( TQObject *pObject, TQEvent *pEvent )
+{
+ if ( pObject->isWidgetType() && pEvent->type() == TQEvent::Show )
+ {
+ KDialogBase* pDlg = ::qt_cast< KDialogBase* >( pObject );
+ if ( pDlg != NULL && m_nWinId != 0 )
+ {
+ XSetTransientForHint( qt_xdisplay(), pDlg->winId(), m_nWinId );
+ m_nWinId = 0;
+ }
+ }
+ return false;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde/tdemodalityfilter.hxx b/fpicker/source/unx/tde/tdemodalityfilter.hxx
new file mode 100644
index 0000000..b00f9a3
--- /dev/null
+++ b/fpicker/source/unx/tde/tdemodalityfilter.hxx
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _TDEMODALITYFILTER_HXX_
+#define _TDEMODALITYFILTER_HXX_
+
+#include <tqobject.h>
+
+class TDEModalityFilter : public TQObject
+{
+private:
+ WId m_nWinId;
+
+public:
+ TDEModalityFilter( WId nWinId );
+ virtual ~TDEModalityFilter();
+
+ virtual bool eventFilter( TQObject *pObject, TQEvent *pEvent );
+};
+
+#endif // _TDEMODALITYFILTER_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde_unx/FPServiceInfo.hxx b/fpicker/source/unx/tde_unx/FPServiceInfo.hxx
new file mode 100644
index 0000000..2dcbe6d
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/FPServiceInfo.hxx
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _FPSERVICEINFO_HXX_
+#define _FPSERVICEINFO_HXX_
+
+// the service names
+#define FILE_PICKER_SERVICE_NAME "com.sun.star.ui.dialogs.TDEFilePicker"
+
+// the implementation names
+#define FILE_PICKER_IMPL_NAME "com.sun.star.ui.dialogs.UnxFilePicker"
+
+// the registry key names
+// a key under which this service will be registered,
+// Format: -> "/ImplName/UNO/SERVICES/ServiceName"
+// <Implementation-Name></UNO/SERVICES/><Service-Name>
+#define FILE_PICKER_REGKEY_NAME "/com.sun.star.ui.dialogs.UnxFilePicker/UNO/SERVICES/com.sun.star.ui.dialogs.TDEFilePicker"
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde_unx/UnxCommandThread.cxx b/fpicker/source/unx/tde_unx/UnxCommandThread.cxx
new file mode 100644
index 0000000..e6ae0bb
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/UnxCommandThread.cxx
@@ -0,0 +1,315 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <UnxCommandThread.hxx>
+#include <UnxNotifyThread.hxx>
+
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.hxx>
+
+#include <unistd.h>
+#include <string.h>
+#include <iostream>
+
+using namespace ::com::sun::star;
+
+//////////////////////////////////////////////////////////////////////////
+// UnxFilePickerCommandThread
+//////////////////////////////////////////////////////////////////////////
+
+UnxFilePickerCommandThread::UnxFilePickerCommandThread( UnxFilePickerNotifyThread *pNotifyThread, int nReadFD )
+ : m_pNotifyThread( pNotifyThread ),
+ m_nReadFD( nReadFD )
+{
+}
+
+UnxFilePickerCommandThread::~UnxFilePickerCommandThread()
+{
+}
+
+sal_Bool SAL_CALL UnxFilePickerCommandThread::result()
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_aResult;
+}
+
+::rtl::OUString SAL_CALL UnxFilePickerCommandThread::getCurrentFilter()
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_aGetCurrentFilter;
+}
+
+::rtl::OUString SAL_CALL UnxFilePickerCommandThread::getDirectory()
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_aGetDirectory;
+}
+
+uno::Sequence< ::rtl::OUString > SAL_CALL UnxFilePickerCommandThread::getFiles()
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ sal_Int32 nSize = m_aGetFiles.size();
+ uno::Sequence< ::rtl::OUString > aFiles( ( nSize > 1 )? nSize + 1: nSize );
+
+ if ( nSize == 1 )
+ aFiles[0] = m_aGetFiles.front();
+ else if ( nSize > 1 )
+ {
+ // First entry in the sequence must be the dirname, the others are the
+ // filenames, so we have to rearrange the list...
+
+ ::rtl::OUString aFront = m_aGetFiles.front();
+ sal_Int32 nLastSlash = aFront.lastIndexOf( '/' );
+
+ aFiles[0] = ( nLastSlash >= 0 )? aFront.copy( 0, nLastSlash ): ::rtl::OUString();
+ ++nLastSlash;
+
+ sal_Int32 nIdx = 1;
+ for ( ::std::list< ::rtl::OUString >::const_iterator it = m_aGetFiles.begin();
+ it != m_aGetFiles.end(); ++it, ++nIdx )
+ {
+ sal_Int32 nLength = (*it).getLength() - nLastSlash;
+ aFiles[nIdx] = ( nLength >= 0 )? (*it).copy( nLastSlash, nLength ): ::rtl::OUString();
+ }
+ }
+
+ return aFiles;
+}
+
+uno::Any SAL_CALL UnxFilePickerCommandThread::getValue()
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_aGetValue;
+}
+
+void SAL_CALL UnxFilePickerCommandThread::run()
+{
+ if ( m_nReadFD < 0 )
+ return;
+
+ sal_Int32 nBufferSize = 1024; // 1 is for testing, 1024 for real use
+ sal_Char *pBuffer = new sal_Char[nBufferSize];
+ sal_Char *pBufferEnd = pBuffer + nBufferSize;
+
+ sal_Char *pWhereToRead = pBuffer;
+ sal_Char *pEntryBegin = pBuffer;
+ sal_Int32 nBytesRead = 0;
+ sal_Bool bShouldExit = sal_False;
+ while ( !bShouldExit && ( nBytesRead = read( m_nReadFD, pWhereToRead, pBufferEnd - pWhereToRead ) ) > 0 )
+ {
+ sal_Bool bFoundNL = sal_False;
+ sal_Char *pWhereToReadEnd = pWhereToRead + nBytesRead;
+ sal_Char *pEntryEnd = pWhereToRead;
+ do {
+ for ( ; pEntryEnd < pWhereToReadEnd && *pEntryEnd != '\n'; ++pEntryEnd )
+ ;
+
+ if ( pEntryEnd < pWhereToReadEnd )
+ {
+ bFoundNL = sal_True;
+ *pEntryEnd = 0;
+
+ if ( strcmp( pEntryBegin, "exited" ) == 0 )
+ bShouldExit = sal_True;
+ else
+ handleCommand( ::rtl::OUString( pEntryBegin, pEntryEnd - pEntryBegin, RTL_TEXTENCODING_UTF8 )/*, bQuit*/ );
+
+ pEntryBegin = pEntryEnd + 1;
+ }
+ } while ( pEntryEnd < pWhereToReadEnd );
+
+ if ( bFoundNL )
+ {
+ if ( pEntryBegin < pBufferEnd )
+ memmove( pBuffer, pEntryBegin, pWhereToReadEnd - pEntryBegin );
+ }
+ else
+ {
+ // enlarge the buffer size
+ nBufferSize *= 2;
+ sal_Char *pNewBuffer = new sal_Char[nBufferSize];
+ if ( pEntryBegin < pBufferEnd )
+ memmove( pNewBuffer, pEntryBegin, pWhereToReadEnd - pEntryBegin );
+
+ delete[] pBuffer;
+ pBuffer = pNewBuffer;
+ pBufferEnd = pBuffer + nBufferSize;
+ }
+
+ pWhereToRead = pBuffer + ( pWhereToReadEnd - pEntryBegin );
+ pEntryBegin = pBuffer;
+ }
+}
+
+void SAL_CALL UnxFilePickerCommandThread::handleCommand( const ::rtl::OUString &rCommand )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+#if OSL_DEBUG_LEVEL > 0
+ ::std::cerr << "UnxFilePicker received: \"" <<
+ OUStringToOString( rCommand, RTL_TEXTENCODING_ASCII_US ).getStr() << "\"" << ::std::endl;
+#endif
+
+ ::std::list< ::rtl::OUString > aList = tokenize( rCommand );
+
+ if ( aList.size() == 0 )
+ return;
+
+ ::rtl::OUString aCommandName = aList.front();
+ aList.pop_front();
+
+ if ( aCommandName.equalsAscii( "accept" ) )
+ {
+ m_aResult = sal_True;
+ m_aExecCondition.set();
+ }
+ else if ( aCommandName.equalsAscii( "reject" ) )
+ {
+ m_aResult = sal_False;
+ m_aExecCondition.set();
+ }
+ else if ( aCommandName.equalsAscii( "fileSelectionChanged" ) )
+ {
+ if ( m_pNotifyThread )
+ m_pNotifyThread->fileSelectionChanged();
+ }
+ else if ( aCommandName.equalsAscii( "files" ) )
+ {
+ m_aGetFiles = aList;
+ m_aGetFilesCondition.set();
+ }
+ else if ( aCommandName.equalsAscii( "value" ) )
+ {
+ ::rtl::OUString aType;
+ if ( !aList.empty() )
+ {
+ aType = aList.front();
+ aList.pop_front();
+ }
+
+ if ( aType.equalsAscii( "bool" ) )
+ {
+ sal_Bool bValue = !aList.empty() && aList.front().equalsIgnoreAsciiCaseAscii( "true" );
+
+ m_aGetValue <<= bValue;
+ m_aGetValueCondition.set();
+ }
+ else if ( aType.equalsAscii( "int" ) )
+ {
+ sal_Int32 nValue = 0;
+ if ( !aList.empty() )
+ nValue = aList.front().toInt32();
+
+ m_aGetValue <<= nValue;
+ m_aGetValueCondition.set();
+ }
+ else if ( aType.equalsAscii( "string" ) )
+ {
+ ::rtl::OUString aValue;
+ if ( !aList.empty() )
+ aValue = aList.front();
+
+ m_aGetValue <<= aValue;
+ m_aGetValueCondition.set();
+ }
+ else if ( aType.equalsAscii( "stringList" ) )
+ {
+ uno::Sequence< ::rtl::OUString > aSequence( aList.size() );
+ sal_Int32 nIdx = 0;
+ for ( ::std::list< ::rtl::OUString >::const_iterator it = aList.begin(); it != aList.end(); ++it, ++nIdx )
+ aSequence[nIdx] = (*it);
+
+ m_aGetValue <<= aSequence;
+ m_aGetValueCondition.set();
+ }
+ else
+ {
+ m_aGetValue = uno::Any();
+ m_aGetValueCondition.set();
+ }
+ }
+ else if ( aCommandName.equalsAscii( "currentFilter" ) )
+ {
+ m_aGetCurrentFilter = aList.empty()? ::rtl::OUString(): aList.front();
+ m_aGetCurrentFilterCondition.set();
+ }
+ else if ( aCommandName.equalsAscii( "currentDirectory" ) )
+ {
+ m_aGetDirectory = aList.empty()? ::rtl::OUString(): aList.front();
+ m_aGetDirectoryCondition.set();
+ }
+ else
+ {
+#if OSL_DEBUG_LEVEL > 0
+ ::std::cerr << "Unrecognized command: "
+ << OUStringToOString( aCommandName, RTL_TEXTENCODING_ASCII_US ).getStr() << "\"" << ::std::endl;
+#endif
+ }
+}
+
+::std::list< ::rtl::OUString > SAL_CALL UnxFilePickerCommandThread::tokenize( const ::rtl::OUString &rCommand )
+{
+ ::std::list< ::rtl::OUString > aList;
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ const sal_Unicode *pUnicode = rCommand.getStr();
+ const sal_Unicode *pEnd = pUnicode + rCommand.getLength();
+ sal_Bool bQuoted = sal_False;
+
+ for ( ; pUnicode != pEnd; ++pUnicode )
+ {
+ if ( *pUnicode == '\\' )
+ {
+ ++pUnicode;
+ if ( pUnicode != pEnd )
+ {
+ if ( *pUnicode == 'n' )
+ aBuffer.appendAscii( "\n", 1 );
+ else
+ aBuffer.append( *pUnicode );
+ }
+ }
+ else if ( *pUnicode == '"' )
+ bQuoted = !bQuoted;
+ else if ( *pUnicode == ' ' && !bQuoted )
+ aList.push_back( aBuffer.makeStringAndClear() );
+ else
+ aBuffer.append( *pUnicode );
+ }
+ aList.push_back( aBuffer.makeStringAndClear() );
+
+ return aList;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde_unx/UnxCommandThread.hxx b/fpicker/source/unx/tde_unx/UnxCommandThread.hxx
new file mode 100644
index 0000000..41b82bd
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/UnxCommandThread.hxx
@@ -0,0 +1,136 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _UNXCOMMANDTHREAD_HXX_
+#define _UNXCOMMANDTHREAD_HXX_
+
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+
+#include <osl/conditn.hxx>
+#include <osl/mutex.hxx>
+#include <osl/thread.hxx>
+#include <rtl/ustring.hxx>
+
+#include <vcl/svapp.hxx>
+
+#include <list>
+
+class UnxFilePickerNotifyThread;
+
+/** Synchronization for the 'thread-less' version of the fpicker.
+
+ Something like osl::Condition, but calls Application::Yield() while in
+ wait().
+*/
+class YieldingCondition
+{
+ ::osl::Mutex m_aMutex;
+ bool m_bValue;
+
+ bool get()
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ return m_bValue;
+ }
+
+public:
+ YieldingCondition() { reset(); }
+
+ void reset()
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ m_bValue = false;
+ }
+
+ void set()
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ m_bValue = true;
+ }
+
+ void wait()
+ {
+ while ( !get() )
+ Application::Yield();
+ }
+};
+
+class UnxFilePickerCommandThread : public ::osl::Thread
+{
+protected:
+ UnxFilePickerNotifyThread *m_pNotifyThread;
+ int m_nReadFD;
+
+ ::osl::Mutex m_aMutex;
+
+ YieldingCondition m_aExecCondition;
+ sal_Bool m_aResult;
+
+ ::osl::Condition m_aGetCurrentFilterCondition;
+ ::rtl::OUString m_aGetCurrentFilter;
+
+ ::osl::Condition m_aGetDirectoryCondition;
+ ::rtl::OUString m_aGetDirectory;
+
+ ::osl::Condition m_aGetFilesCondition;
+ ::std::list< ::rtl::OUString > m_aGetFiles;
+
+ ::osl::Condition m_aGetValueCondition;
+ ::com::sun::star::uno::Any m_aGetValue;
+
+public:
+ UnxFilePickerCommandThread( UnxFilePickerNotifyThread *pNotifyThread, int nReadFD );
+ ~UnxFilePickerCommandThread();
+
+ YieldingCondition& SAL_CALL execCondition() { return m_aExecCondition; }
+ sal_Bool SAL_CALL result();
+
+ ::osl::Condition& SAL_CALL getCurrentFilterCondition() { return m_aGetCurrentFilterCondition; }
+ ::rtl::OUString SAL_CALL getCurrentFilter();
+
+ ::osl::Condition& SAL_CALL getDirectoryCondition() { return m_aGetDirectoryCondition; }
+ ::rtl::OUString SAL_CALL getDirectory();
+
+ ::osl::Condition& SAL_CALL getFilesCondition() { return m_aGetFilesCondition; }
+ ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getFiles();
+
+ ::osl::Condition& SAL_CALL getValueCondition() { return m_aGetValueCondition; }
+ ::com::sun::star::uno::Any SAL_CALL getValue();
+
+protected:
+ virtual void SAL_CALL run();
+
+ virtual void SAL_CALL handleCommand( const ::rtl::OUString &rCommand/*, sal_Bool &rQuit*/ );
+ ::std::list< ::rtl::OUString > SAL_CALL tokenize( const ::rtl::OUString &rCommand );
+};
+
+#endif // _UNXCOMMANDTHREAD_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde_unx/UnxFPentry.cxx b/fpicker/source/unx/tde_unx/UnxFPentry.cxx
new file mode 100644
index 0000000..bd4582d
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/UnxFPentry.cxx
@@ -0,0 +1,112 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <com/sun/star/container/XSet.hpp>
+
+#include <cppuhelper/factory.hxx>
+#include <osl/diagnose.h>
+
+#include "UnxFilePicker.hxx"
+#include "FPServiceInfo.hxx"
+
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::registry;
+using namespace ::cppu;
+using ::com::sun::star::ui::dialogs::XFilePicker;
+
+//////////////////////////////////////////////////////////////////////////
+//
+//////////////////////////////////////////////////////////////////////////
+
+static Reference< XInterface > SAL_CALL createInstance( const Reference< XMultiServiceFactory >& rServiceManager )
+{
+ return Reference< XInterface >(
+ static_cast< XFilePicker* >( new UnxFilePicker( rServiceManager ) ) );
+}
+
+extern "C"
+{
+
+sal_Bool SAL_CALL component_writeInfo( void* /*pServiceManager*/, void* pRegistryKey )
+{
+ sal_Bool bRetVal = sal_True;
+
+ if ( pRegistryKey )
+ {
+ try
+ {
+ Reference< XRegistryKey > pXNewKey( static_cast< XRegistryKey* >( pRegistryKey ) );
+ pXNewKey->createKey( OUString(RTL_CONSTASCII_USTRINGPARAM( FILE_PICKER_REGKEY_NAME ) ));
+ }
+ catch( InvalidRegistryException& )
+ {
+ OSL_FAIL( "InvalidRegistryException caught" );
+ bRetVal = sal_False;
+ }
+ }
+
+ return bRetVal;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+//////////////////////////////////////////////////////////////////////////
+
+SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( const sal_Char* pImplName, uno_Interface* pSrvManager, uno_Interface* /*pRegistryKey*/ )
+{
+ void* pRet = 0;
+
+ if ( pSrvManager && ( 0 == rtl_str_compare( pImplName, FILE_PICKER_IMPL_NAME ) ) )
+// if ( pSrvManager && ( 0 == rtl_str_compare( pImplName, FILE_PICKER_SERVICE_NAME ) ) )
+ {
+ Sequence< OUString > aSNS( 1 );
+ aSNS.getArray( )[0] = OUString(RTL_CONSTASCII_USTRINGPARAM( FILE_PICKER_SERVICE_NAME ));
+
+ Reference< XSingleServiceFactory > xFactory ( createSingleFactory(
+ reinterpret_cast< XMultiServiceFactory* > ( pSrvManager ),
+ OUString::createFromAscii( pImplName ),
+ createInstance,
+ aSNS ) );
+ if ( xFactory.is() )
+ {
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+ }
+
+ return pRet;
+}
+
+} // extern "C"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde_unx/UnxFilePicker.cxx b/fpicker/source/unx/tde_unx/UnxFilePicker.cxx
new file mode 100644
index 0000000..c2a5ca8
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/UnxFilePicker.cxx
@@ -0,0 +1,932 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
+#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
+#include <com/sun/star/ui/dialogs/ControlActions.hpp>
+
+#include <FPServiceInfo.hxx>
+
+#include <cppuhelper/interfacecontainer.h>
+#include <osl/diagnose.h>
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <tools/resmgr.hxx>
+
+#include <svtools/svtools.hrc>
+#include <UnxFilePicker.hxx>
+#include <UnxCommandThread.hxx>
+#include <UnxNotifyThread.hxx>
+
+#include <vcl/svapp.hxx>
+#include <vcl/sysdata.hxx>
+#include <vcl/syswin.hxx>
+#include <vcl/window.hxx>
+
+#include <sys/wait.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdio.h>
+
+#include <iostream>
+
+using namespace ::com::sun::star;
+
+using namespace ::com::sun::star::ui::dialogs;
+using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
+
+//////////////////////////////////////////////////////////////////////////
+// helper functions
+//////////////////////////////////////////////////////////////////////////
+
+namespace
+{
+ // controling event notifications
+ const bool STARTUP_SUSPENDED = true;
+ const bool STARTUP_ALIVE = false;
+
+ uno::Sequence<rtl::OUString> SAL_CALL FilePicker_getSupportedServiceNames()
+ {
+ uno::Sequence<rtl::OUString> aRet(3);
+ aRet[0] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.FilePicker");
+ aRet[1] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.SystemFilePicker");
+ aRet[2] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.TDEFilePicker");
+ return aRet;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// UnxFilePicker
+//////////////////////////////////////////////////////////////////////////
+
+UnxFilePicker::UnxFilePicker( const uno::Reference<lang::XMultiServiceFactory>& xServiceMgr )
+ : cppu::WeakComponentImplHelper8<
+ XFilterManager,
+ XFilterGroupManager,
+ XFilePickerControlAccess,
+ XFilePickerNotifier,
+// TODO XFilePreview,
+ lang::XInitialization,
+ util::XCancellable,
+ lang::XEventListener,
+ lang::XServiceInfo>( m_rbHelperMtx ),
+ m_xServiceMgr( xServiceMgr ),
+ m_nFilePickerPid( -1 ),
+ m_nFilePickerWrite( -1 ),
+ m_nFilePickerRead( -1 ),
+ m_pNotifyThread( NULL ),
+ m_pCommandThread( NULL ),
+ m_pResMgr( CREATEVERSIONRESMGR( fps_office ) )
+{
+}
+
+UnxFilePicker::~UnxFilePicker()
+{
+ if ( m_nFilePickerPid > 0 )
+ {
+ sendCommand( ::rtl::OUString::createFromAscii( "exit" ) );
+ waitpid( m_nFilePickerPid, NULL, 0 );
+ }
+
+ if ( m_pCommandThread )
+ {
+ m_pCommandThread->join();
+
+ delete m_pCommandThread, m_pCommandThread = NULL;
+ }
+
+ if ( m_pNotifyThread )
+ {
+ m_pNotifyThread->exit();
+
+ m_pNotifyThread->join();
+
+ delete m_pNotifyThread, m_pNotifyThread = NULL;
+ }
+
+ if ( m_nFilePickerWrite >= 0 )
+ close( m_nFilePickerWrite );
+
+ if ( m_nFilePickerRead >= 0 )
+ close( m_nFilePickerRead );
+
+ delete m_pResMgr, m_pResMgr = NULL;
+}
+
+void SAL_CALL UnxFilePicker::addFilePickerListener( const uno::Reference<XFilePickerListener>& xListener )
+ throw( uno::RuntimeException )
+{
+ OSL_ASSERT( m_pNotifyThread );
+ osl::MutexGuard aGuard( m_aMutex );
+
+ m_pNotifyThread->addFilePickerListener( xListener );
+}
+
+void SAL_CALL UnxFilePicker::removeFilePickerListener( const uno::Reference<XFilePickerListener>& xListener )
+ throw( uno::RuntimeException )
+{
+ OSL_ASSERT( m_pNotifyThread );
+ osl::MutexGuard aGuard( m_aMutex );
+
+ m_pNotifyThread->removeFilePickerListener( xListener );
+}
+
+void SAL_CALL UnxFilePicker::setTitle( const rtl::OUString &rTitle )
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "setTitle " );
+ appendEscaped( aBuffer, rTitle );
+
+ sendCommand( aBuffer.makeStringAndClear() );
+}
+
+sal_Int16 SAL_CALL UnxFilePicker::execute()
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+
+ // this is _not_ an osl::Condition, see i#93366
+ m_pCommandThread->execCondition().reset();
+
+ sendCommand( ::rtl::OUString::createFromAscii( "exec" ) );
+
+ m_pCommandThread->execCondition().wait();
+
+ return m_pCommandThread->result();
+}
+
+void SAL_CALL UnxFilePicker::setMultiSelectionMode( sal_Bool bMode )
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUString aString = bMode?
+ ::rtl::OUString::createFromAscii( "setMultiSelection true" ):
+ ::rtl::OUString::createFromAscii( "setMultiSelection false" );
+
+ sendCommand( aString );
+}
+
+void SAL_CALL UnxFilePicker::setDefaultName( const ::rtl::OUString &rName )
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "setDefaultName " );
+ appendEscaped( aBuffer, rName );
+
+ sendCommand( aBuffer.makeStringAndClear() );
+}
+
+void SAL_CALL UnxFilePicker::setDisplayDirectory( const rtl::OUString &rDirectory )
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "setDirectory " );
+ appendEscaped( aBuffer, rDirectory );
+
+ sendCommand( aBuffer.makeStringAndClear() );
+}
+
+rtl::OUString SAL_CALL UnxFilePicker::getDisplayDirectory()
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ sendCommand( ::rtl::OUString::createFromAscii( "getDirectory" ),
+ m_pCommandThread->getDirectoryCondition() );
+
+ return m_pCommandThread->getDirectory();
+}
+
+uno::Sequence< ::rtl::OUString > SAL_CALL UnxFilePicker::getFiles()
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ sendCommand( ::rtl::OUString::createFromAscii( "getFiles" ),
+ m_pCommandThread->getFilesCondition() );
+
+ return m_pCommandThread->getFiles();
+}
+
+void SAL_CALL UnxFilePicker::appendFilter( const ::rtl::OUString &rTitle, const ::rtl::OUString &rFilter )
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "appendFilter " );
+ appendEscaped( aBuffer, rTitle );
+ aBuffer.appendAscii( " ", 1 );
+ appendEscaped( aBuffer, rFilter );
+
+ sendCommand( aBuffer.makeStringAndClear() );
+}
+
+void SAL_CALL UnxFilePicker::setCurrentFilter( const rtl::OUString &rTitle )
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "setCurrentFilter " );
+ appendEscaped( aBuffer, rTitle );
+
+ sendCommand( aBuffer.makeStringAndClear() );
+}
+
+rtl::OUString SAL_CALL UnxFilePicker::getCurrentFilter()
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ sendCommand( ::rtl::OUString::createFromAscii( "getCurrentFilter" ),
+ m_pCommandThread->getCurrentFilterCondition() );
+
+ return m_pCommandThread->getCurrentFilter();
+}
+
+void SAL_CALL UnxFilePicker::appendFilterGroup( const rtl::OUString &rGroupTitle, const uno::Sequence<beans::StringPair> &rFilters )
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "appendFilterGroup " );
+ appendEscaped( aBuffer, rGroupTitle );
+
+ for ( sal_Int32 i = 0; i < rFilters.getLength(); ++i )
+ {
+ beans::StringPair aPair = rFilters[i];
+
+ aBuffer.appendAscii( " ", 1 );
+ appendEscaped( aBuffer, aPair.First );
+ aBuffer.appendAscii( " ", 1 );
+ appendEscaped( aBuffer, aPair.Second );
+ }
+
+ sendCommand( aBuffer.makeStringAndClear() );
+}
+
+void SAL_CALL UnxFilePicker::setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const uno::Any &rValue )
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUString aType;
+ ::rtl::OUString aAction;
+ sal_Int32 nTitleId;
+
+ if ( controlIdInfo( nControlId, aType, nTitleId ) && controlActionInfo( nControlAction, aAction ) )
+ {
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "setValue " );
+ aBuffer.append( static_cast< sal_Int32 >( nControlId ) );
+ aBuffer.appendAscii( " ", 1 );
+ aBuffer.append( aAction );
+
+ if ( aType.equalsAscii( "checkbox" ) )
+ {
+ sal_Bool bControlValue;
+ if ( ( rValue >>= bControlValue ) && bControlValue )
+ aBuffer.appendAscii( " true" );
+ else
+ aBuffer.appendAscii( " false" );
+ }
+ else if ( aType.equalsAscii( "listbox" ) )
+ {
+ switch ( nControlAction )
+ {
+ case ControlActions::ADD_ITEM:
+ case ControlActions::SET_HELP_URL:
+ {
+ ::rtl::OUString aString;
+ if ( rValue >>= aString )
+ {
+ aBuffer.appendAscii( " ", 1 );
+ appendEscaped( aBuffer, aString );
+ }
+ }
+ break;
+
+ case ControlActions::ADD_ITEMS:
+ {
+ uno::Sequence< ::rtl::OUString > aSequence;
+ if ( rValue >>= aSequence )
+ {
+ for ( sal_Int32 nIdx = 0; nIdx < aSequence.getLength(); ++nIdx )
+ {
+ aBuffer.appendAscii( " ", 1 );
+ appendEscaped( aBuffer, aSequence[nIdx] );
+ }
+
+ }
+ }
+ break;
+
+ case ControlActions::DELETE_ITEM:
+ case ControlActions::SET_SELECT_ITEM:
+ {
+ sal_Int32 nInt;
+ if ( rValue >>= nInt )
+ {
+ aBuffer.appendAscii( " ", 1 );
+ aBuffer.append( nInt );
+ }
+ }
+ break;
+
+ default:
+ // nothing
+ break;
+ }
+ }
+ // TODO else if push button...
+
+ sendCommand( aBuffer.makeStringAndClear() );
+ }
+}
+
+uno::Any SAL_CALL UnxFilePicker::getValue( sal_Int16 nControlId, sal_Int16 nControlAction )
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUString aAction;
+
+ if ( controlActionInfo( nControlAction, aAction ) )
+ {
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "getValue " );
+ aBuffer.append( static_cast< sal_Int32 >( nControlId ) );
+ aBuffer.appendAscii( " ", 1 );
+ aBuffer.append( aAction );
+
+ sendCommand( aBuffer.makeStringAndClear(),
+ m_pCommandThread->getValueCondition() );
+
+ return m_pCommandThread->getValue();
+ }
+
+ return uno::Any();
+}
+
+void SAL_CALL UnxFilePicker::enableControl( sal_Int16 nControlId, sal_Bool bEnable )
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "enableControl " );
+ aBuffer.append( static_cast< sal_Int32 >( nControlId ) );
+ aBuffer.appendAscii( bEnable? " true": " false" );
+
+ sendCommand( aBuffer.makeStringAndClear() );
+}
+
+void SAL_CALL UnxFilePicker::setLabel( sal_Int16 nControlId, const ::rtl::OUString &rLabel )
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "setLabel " );
+ aBuffer.append( static_cast< sal_Int32 >( nControlId ) );
+ aBuffer.appendAscii( " ", 1 );
+ appendEscaped( aBuffer, rLabel );
+
+ sendCommand( aBuffer.makeStringAndClear() );
+}
+
+rtl::OUString SAL_CALL UnxFilePicker::getLabel(sal_Int16 /*nControlId*/)
+ throw ( uno::RuntimeException )
+{
+ // FIXME getLabel() is not yet implemented
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ // TODO return m_pImpl->getLabel(nControlId);
+ return ::rtl::OUString();
+}
+
+/* TODO
+uno::Sequence<sal_Int16> SAL_CALL UnxFilePicker::getSupportedImageFormats()
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_pImpl->getSupportedImageFormats();
+}
+
+sal_Int32 SAL_CALL UnxFilePicker::getTargetColorDepth()
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_pImpl->getTargetColorDepth();
+}
+
+sal_Int32 SAL_CALL UnxFilePicker::getAvailableWidth()
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_pImpl->getAvailableWidth();
+}
+
+sal_Int32 SAL_CALL UnxFilePicker::getAvailableHeight()
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_pImpl->getAvailableHeight();
+}
+
+void SAL_CALL UnxFilePicker::setImage( sal_Int16 aImageFormat, const uno::Any &rImage )
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ m_pImpl->setImage( aImageFormat, aImage );
+}
+
+sal_Bool SAL_CALL UnxFilePicker::setShowState( sal_Bool bShowState )
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_pImpl->setShowState( bShowState );
+}
+
+sal_Bool SAL_CALL UnxFilePicker::getShowState()
+ throw( uno::RuntimeException )
+{
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return m_pImpl->getShowState();
+}
+*/
+
+void SAL_CALL UnxFilePicker::initialize( const uno::Sequence<uno::Any> &rArguments )
+ throw( uno::Exception, uno::RuntimeException )
+{
+ initFilePicker();
+
+ // parameter checking
+ uno::Any aAny;
+ if ( 0 == rArguments.getLength( ) )
+ throw lang::IllegalArgumentException(
+ rtl::OUString::createFromAscii( "no arguments" ),
+ static_cast< XFilePicker* >( this ), 1 );
+
+ aAny = rArguments[0];
+
+ if ( ( aAny.getValueType() != ::getCppuType( (sal_Int16*)0 ) ) && ( aAny.getValueType() != ::getCppuType( (sal_Int8*)0 ) ) )
+ throw lang::IllegalArgumentException(
+ rtl::OUString::createFromAscii( "invalid argument type" ),
+ static_cast< XFilePicker* >( this ), 1 );
+
+ sal_Int16 templateId = -1;
+ aAny >>= templateId;
+
+ ::rtl::OUString aTypeOpen = ::rtl::OUString::createFromAscii( "setType \"open\"" );
+ ::rtl::OUString aTypeSaveAs = ::rtl::OUString::createFromAscii( "setType \"save\"" );
+
+ switch ( templateId )
+ {
+ case FILEOPEN_SIMPLE:
+ sendCommand( aTypeOpen );
+ break;
+
+ case FILESAVE_SIMPLE:
+ sendCommand( aTypeSaveAs );
+ break;
+
+ case FILESAVE_AUTOEXTENSION_PASSWORD:
+ sendCommand( aTypeSaveAs );
+
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION );
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD );
+ break;
+
+ case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
+ sendCommand( aTypeSaveAs );
+
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION );
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD );
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS );
+ break;
+
+ case FILESAVE_AUTOEXTENSION_SELECTION:
+ sendCommand( aTypeSaveAs );
+
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION );
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_SELECTION );
+ break;
+
+ case FILESAVE_AUTOEXTENSION_TEMPLATE:
+ sendCommand( aTypeSaveAs );
+
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION );
+ sendAppendControlCommand( ExtendedFilePickerElementIds::LISTBOX_TEMPLATE );
+ break;
+
+ case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
+ sendCommand( aTypeOpen );
+
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_LINK );
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW );
+ sendAppendControlCommand( ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE );
+ break;
+
+ case FILEOPEN_PLAY:
+ sendCommand( aTypeOpen );
+
+ sendAppendControlCommand( ExtendedFilePickerElementIds::PUSHBUTTON_PLAY );
+ break;
+
+ case FILEOPEN_READONLY_VERSION:
+ sendCommand( aTypeOpen );
+
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_READONLY );
+ sendAppendControlCommand( ExtendedFilePickerElementIds::LISTBOX_VERSION );
+ break;
+
+ case FILEOPEN_LINK_PREVIEW:
+ sendCommand( aTypeOpen );
+
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_LINK );
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW );
+ break;
+
+ case FILESAVE_AUTOEXTENSION:
+ sendCommand( aTypeSaveAs );
+
+ sendAppendControlCommand( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION );
+ break;
+
+ default:
+ throw lang::IllegalArgumentException(
+ rtl::OUString::createFromAscii( "Unknown template" ),
+ static_cast< XFilePicker* >( this ),
+ 1 );
+ }
+}
+
+void SAL_CALL UnxFilePicker::cancel()
+ throw ( uno::RuntimeException )
+{
+ // FIXME cancel() is not implemented
+ checkFilePicker();
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ // TODO m_pImpl->cancel();
+}
+
+void SAL_CALL UnxFilePicker::disposing( const lang::EventObject &rEvent )
+ throw( uno::RuntimeException )
+{
+ uno::Reference<XFilePickerListener> xFilePickerListener( rEvent.Source, uno::UNO_QUERY );
+
+ if ( xFilePickerListener.is() )
+ removeFilePickerListener( xFilePickerListener );
+}
+
+rtl::OUString SAL_CALL UnxFilePicker::getImplementationName()
+ throw( uno::RuntimeException )
+{
+ return rtl::OUString::createFromAscii( FILE_PICKER_IMPL_NAME );
+}
+
+sal_Bool SAL_CALL UnxFilePicker::supportsService( const rtl::OUString& ServiceName )
+ throw( uno::RuntimeException )
+{
+ uno::Sequence< ::rtl::OUString > SupportedServicesNames = FilePicker_getSupportedServiceNames();
+
+ for ( sal_Int32 n = SupportedServicesNames.getLength(); n--; )
+ {
+ if ( SupportedServicesNames[n].compareTo( ServiceName ) == 0 )
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+uno::Sequence< ::rtl::OUString > SAL_CALL UnxFilePicker::getSupportedServiceNames()
+ throw( uno::RuntimeException )
+{
+ return FilePicker_getSupportedServiceNames();
+}
+
+void UnxFilePicker::initFilePicker()
+{
+ int aFiledesStdin[2], aFiledesStdout[2];
+ if ( pipe( aFiledesStdin ) < 0 || pipe( aFiledesStdout ) < 0 )
+ return;
+
+ m_nFilePickerPid = fork();
+ if ( m_nFilePickerPid < 0 )
+ return;
+
+ if ( m_nFilePickerPid == 0 )
+ {
+ // Child...
+ close( aFiledesStdin[1] ); // write end of the pipe
+ dup2( aFiledesStdin[0], 0 );
+ close( aFiledesStdin[0] );
+
+ close( aFiledesStdout[0] ); // read end of the pipe
+ dup2( aFiledesStdout[1], 1 );
+ close( aFiledesStdout[1] );
+
+#if OSL_DEBUG_LEVEL == 0
+ int nRedirect = open( "/dev/null", O_WRONLY );
+ if( nRedirect != -1 )
+ {
+ dup2( nRedirect, 2 );
+ }
+#endif
+
+ // The executable name
+ char pFname[1024]; snprintf(pFname, sizeof pFname, "%s/%s", getenv("OLDPWD"), "tdefilepicker");
+
+ // ID of the main window
+ const int nIdLen = 20;
+ char pWinId[nIdLen] = "0";
+
+ // TODO pass here the real parent (not possible for system dialogs
+ // yet), and default to GetDefDialogParent() only when the real parent
+ // is NULL
+ Window *pParentWin = Application::GetDefDialogParent();
+ if ( pParentWin )
+ {
+ const SystemEnvData* pSysData = ((SystemWindow *)pParentWin)->GetSystemData();
+ if ( pSysData )
+ {
+ snprintf( pWinId, nIdLen, "%ld", pSysData->aWindow ); // unx only
+ pWinId[nIdLen-1] = 0;
+ }
+ }
+
+ // Execute the fpicker implementation
+ execlp( pFname, pFname, "--winid", pWinId, NULL );
+
+ // Error, finish the child
+ exit( -1 );
+ }
+
+ // Parent continues
+ close( aFiledesStdin[0] );
+ m_nFilePickerWrite = aFiledesStdin[1];
+
+ close( aFiledesStdout[1] );
+ m_nFilePickerRead = aFiledesStdout[0];
+
+ // Create the notify thread
+ if ( !m_pNotifyThread )
+ m_pNotifyThread = new UnxFilePickerNotifyThread( this );
+
+ // Create the command thread
+ if ( !m_pCommandThread )
+ m_pCommandThread = new UnxFilePickerCommandThread( m_pNotifyThread, m_nFilePickerRead );
+
+ // Start the threads
+ m_pNotifyThread->create();
+ m_pCommandThread->create();
+
+ return;
+}
+
+void UnxFilePicker::checkFilePicker() throw( ::com::sun::star::uno::RuntimeException )
+{
+ if ( m_nFilePickerPid > 0 )
+ {
+ // TODO check if external file picker is runnning
+ }
+ else
+ {
+ throw uno::RuntimeException(
+ ::rtl::OUString::createFromAscii( "the external file picker does not run" ),
+ *this );
+ }
+}
+
+void UnxFilePicker::sendCommand( const ::rtl::OUString &rCommand )
+{
+ if ( m_nFilePickerWrite < 0 )
+ return;
+
+ ::rtl::OString aUtfString = OUStringToOString( rCommand + ::rtl::OUString::createFromAscii( "\n" ), RTL_TEXTENCODING_UTF8 );
+
+#if OSL_DEBUG_LEVEL > 0
+ ::std::cerr << "UnxFilePicker sent: \"" << aUtfString.getStr() << "\"" << ::std::endl;
+#endif
+
+ write( m_nFilePickerWrite, aUtfString.getStr(), aUtfString.getLength() );
+}
+
+void UnxFilePicker::sendCommand( const ::rtl::OUString &rCommand, ::osl::Condition &rCondition )
+{
+ rCondition.reset();
+
+ sendCommand( rCommand );
+
+ rCondition.wait();
+}
+
+void UnxFilePicker::appendEscaped( ::rtl::OUStringBuffer &rBuffer, const ::rtl::OUString &rString )
+{
+ const sal_Unicode *pUnicode = rString.getStr();
+ const sal_Unicode *pEnd = pUnicode + rString.getLength();
+
+ rBuffer.appendAscii( "\"" , 1 );
+
+ for ( ; pUnicode != pEnd; ++pUnicode )
+ {
+ if ( *pUnicode == '\\' )
+ rBuffer.appendAscii( "\\\\", 2 );
+ else if ( *pUnicode == '"' )
+ rBuffer.appendAscii( "\\\"", 2 );
+ else if ( *pUnicode == '\n' )
+ rBuffer.appendAscii( "\\n", 2 );
+ else
+ rBuffer.append( *pUnicode );
+ }
+
+ rBuffer.appendAscii( "\"", 1 );
+}
+
+sal_Bool UnxFilePicker::controlIdInfo( sal_Int16 nControlId, ::rtl::OUString &rType, sal_Int32 &rTitleId )
+{
+ typedef struct {
+ sal_Int16 nId;
+ const ::rtl::OUString *pType;
+ sal_Int32 nTitle;
+ } ElementToName;
+
+ const ::rtl::OUString aCheckBox( RTL_CONSTASCII_USTRINGPARAM( "checkbox" ) );
+ const ::rtl::OUString aControl( RTL_CONSTASCII_USTRINGPARAM( "control" ) );
+ const ::rtl::OUString aEdit( RTL_CONSTASCII_USTRINGPARAM( "edit" ) );
+ const ::rtl::OUString aLabel( RTL_CONSTASCII_USTRINGPARAM( "label" ) );
+ const ::rtl::OUString aListBox( RTL_CONSTASCII_USTRINGPARAM( "listbox" ) );
+ const ::rtl::OUString aPushButton( RTL_CONSTASCII_USTRINGPARAM( "pushbutton" ) );
+
+ const ElementToName *pPtr;
+ const ElementToName pArray[] =
+ {
+ { CommonFilePickerElementIds::PUSHBUTTON_OK, &aPushButton, 0/*FIXME?*/ },
+ { CommonFilePickerElementIds::PUSHBUTTON_CANCEL, &aPushButton, 0/*FIXME?*/ },
+ { CommonFilePickerElementIds::LISTBOX_FILTER, &aListBox, 0/*FIXME?*/ },
+ { CommonFilePickerElementIds::CONTROL_FILEVIEW, &aControl, 0/*FIXME?*/ },
+ { CommonFilePickerElementIds::EDIT_FILEURL, &aEdit, 0/*FIXME?*/ },
+ { CommonFilePickerElementIds::LISTBOX_FILTER_LABEL, &aLabel, 0/*FIXME?*/ },
+ { CommonFilePickerElementIds::EDIT_FILEURL_LABEL, &aLabel, 0/*FIXME?*/ },
+
+ { ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, &aCheckBox, STR_SVT_FILEPICKER_AUTO_EXTENSION },
+ { ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, &aCheckBox, STR_SVT_FILEPICKER_PASSWORD },
+ { ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS, &aCheckBox, STR_SVT_FILEPICKER_FILTER_OPTIONS },
+ { ExtendedFilePickerElementIds::CHECKBOX_READONLY, &aCheckBox, STR_SVT_FILEPICKER_READONLY },
+ { ExtendedFilePickerElementIds::CHECKBOX_LINK, &aCheckBox, STR_SVT_FILEPICKER_INSERT_AS_LINK },
+ { ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, &aCheckBox, STR_SVT_FILEPICKER_SHOW_PREVIEW },
+ { ExtendedFilePickerElementIds::PUSHBUTTON_PLAY, &aPushButton, STR_SVT_FILEPICKER_PLAY },
+ { ExtendedFilePickerElementIds::LISTBOX_VERSION, &aListBox, STR_SVT_FILEPICKER_VERSION },
+ { ExtendedFilePickerElementIds::LISTBOX_TEMPLATE, &aListBox, STR_SVT_FILEPICKER_TEMPLATES },
+ { ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE, &aListBox, STR_SVT_FILEPICKER_IMAGE_TEMPLATE },
+ { ExtendedFilePickerElementIds::CHECKBOX_SELECTION, &aCheckBox, STR_SVT_FILEPICKER_SELECTION },
+ { 0, 0, 0 }
+ };
+
+ for ( pPtr = pArray; pPtr->nId && ( pPtr->nId != nControlId ); ++pPtr )
+ ;
+
+ if ( pPtr->nId == nControlId )
+ {
+ rType = *(pPtr->pType);
+ rTitleId = pPtr->nTitle;
+
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+sal_Bool UnxFilePicker::controlActionInfo( sal_Int16 nControlAction, ::rtl::OUString &rType )
+{
+ typedef struct {
+ sal_Int16 nId;
+ const ::rtl::OUString pType;
+ } ElementToName;
+
+ const ElementToName *pPtr;
+ const ElementToName pArray[] =
+ {
+ { ControlActions::ADD_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "addItem" ) ) },
+ { ControlActions::ADD_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "addItems" ) ) },
+ { ControlActions::DELETE_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "deleteItem" ) ) },
+ { ControlActions::DELETE_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "deleteItems" ) ) },
+ { ControlActions::SET_SELECT_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "setSelectedItem" ) ) },
+ { ControlActions::GET_ITEMS, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getItems" ) ) },
+ { ControlActions::GET_SELECTED_ITEM, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getSelectedItem" ) ) },
+ { ControlActions::GET_SELECTED_ITEM_INDEX, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getSelectedItemIndex" ) ) },
+ { ControlActions::SET_HELP_URL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "setHelpURL" ) ) },
+ { ControlActions::GET_HELP_URL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getHelpURL" ) ) },
+ { 0, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "noAction" ) ) }
+ };
+
+ for ( pPtr = pArray; pPtr->nId && ( pPtr->nId != nControlAction ); ++pPtr )
+ ;
+
+ rType = pPtr->pType;
+
+ return sal_True;
+}
+
+void UnxFilePicker::sendAppendControlCommand( sal_Int16 nControlId )
+{
+ ::rtl::OUString aType;
+ sal_Int32 nTitleId;
+
+ if ( controlIdInfo( nControlId, aType, nTitleId ) )
+ {
+ ::rtl::OUStringBuffer aBuffer( 1024 );
+
+ aBuffer.appendAscii( "appendControl " );
+ aBuffer.append( static_cast< sal_Int32 >( nControlId ) );
+ aBuffer.appendAscii( " ", 1 );
+ appendEscaped( aBuffer, aType );
+ aBuffer.appendAscii( " ", 1 );
+ appendEscaped( aBuffer, m_pResMgr? String( ResId( nTitleId, *m_pResMgr ) ): String() );
+
+ sendCommand( aBuffer.makeStringAndClear() );
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde_unx/UnxFilePicker.hxx b/fpicker/source/unx/tde_unx/UnxFilePicker.hxx
new file mode 100644
index 0000000..4e0b526
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/UnxFilePicker.hxx
@@ -0,0 +1,178 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _UNXFILEPICKER_HXX_
+#define _UNXFILEPICKER_HXX_
+
+#include <cppuhelper/compbase8.hxx>
+#include <osl/conditn.hxx>
+#include <osl/mutex.hxx>
+#include <rtl/ustrbuf.hxx>
+
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/ui/dialogs/XFilePickerNotifier.hpp>
+#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
+#include <com/sun/star/ui/dialogs/XFilterGroupManager.hpp>
+#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
+#include <com/sun/star/ui/dialogs/XFilePreview.hpp>
+#include <com/sun/star/util/XCancellable.hpp>
+
+#include <list>
+
+class UnxFilePickerCommandThread;
+class UnxFilePickerNotifyThread;
+class ResMgr;
+
+class UnxFilePickerDummy
+{
+protected:
+ osl::Mutex m_aMutex;
+ osl::Mutex m_rbHelperMtx;
+};
+
+class UnxFilePicker :
+ public UnxFilePickerDummy,
+ public cppu::WeakComponentImplHelper8<
+ ::com::sun::star::ui::dialogs::XFilterManager,
+ ::com::sun::star::ui::dialogs::XFilterGroupManager,
+ ::com::sun::star::ui::dialogs::XFilePickerControlAccess,
+ ::com::sun::star::ui::dialogs::XFilePickerNotifier,
+// TODO ::com::sun::star::ui::dialogs::XFilePreview,
+ ::com::sun::star::lang::XInitialization,
+ ::com::sun::star::util::XCancellable,
+ ::com::sun::star::lang::XEventListener,
+ ::com::sun::star::lang::XServiceInfo >
+{
+protected:
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xServiceMgr; // to instanciate own services
+
+ pid_t m_nFilePickerPid;
+ int m_nFilePickerWrite; // (tde|...)filepicker gets it as stdin
+ int m_nFilePickerRead; // (tde|...)filepicker gets it as stdout
+
+ UnxFilePickerNotifyThread *m_pNotifyThread;
+ UnxFilePickerCommandThread *m_pCommandThread;
+
+ ResMgr *m_pResMgr;
+
+public:
+ UnxFilePicker( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceMgr );
+ virtual ~UnxFilePicker();
+
+ // XFilePickerNotifier
+
+ virtual void SAL_CALL addFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException );
+ virtual void SAL_CALL removeFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener ) throw( ::com::sun::star::uno::RuntimeException );
+
+ // XExecutableDialog functions
+
+ virtual void SAL_CALL setTitle( const ::rtl::OUString &rTitle ) throw( ::com::sun::star::uno::RuntimeException );
+ virtual sal_Int16 SAL_CALL execute() throw( ::com::sun::star::uno::RuntimeException );
+
+ // XFilePicker functions
+
+ virtual void SAL_CALL setMultiSelectionMode( sal_Bool bMode ) throw( ::com::sun::star::uno::RuntimeException );
+ virtual void SAL_CALL setDefaultName( const ::rtl::OUString &rName ) throw( ::com::sun::star::uno::RuntimeException );
+ virtual void SAL_CALL setDisplayDirectory( const ::rtl::OUString &rDirectory ) throw( ::com::sun::star::uno::RuntimeException );
+ virtual ::rtl::OUString SAL_CALL getDisplayDirectory() throw( ::com::sun::star::uno::RuntimeException );
+ virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getFiles() throw( ::com::sun::star::uno::RuntimeException );
+
+ // XFilterManager functions
+
+ virtual void SAL_CALL appendFilter( const ::rtl::OUString &rTitle, const ::rtl::OUString &rFilter ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
+ virtual void SAL_CALL setCurrentFilter( const ::rtl::OUString &rTitle ) throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
+ virtual ::rtl::OUString SAL_CALL getCurrentFilter() throw( ::com::sun::star::uno::RuntimeException );
+
+ // XFilterGroupManager functions
+
+ virtual void SAL_CALL appendFilterGroup( const ::rtl::OUString &rGroupTitle, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::StringPair > &rFilters ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
+
+ // XFilePickerControlAccess functions
+
+ virtual void SAL_CALL setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const ::com::sun::star::uno::Any &rValue ) throw (::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Any SAL_CALL getValue( sal_Int16 nControlId, sal_Int16 nControlAction ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL enableControl( sal_Int16 nControlId, sal_Bool bEnable ) throw( ::com::sun::star::uno::RuntimeException );
+ virtual void SAL_CALL setLabel( sal_Int16 nControlId, const ::rtl::OUString &rLabel ) throw (::com::sun::star::uno::RuntimeException);
+ virtual ::rtl::OUString SAL_CALL getLabel( sal_Int16 nControlId ) throw (::com::sun::star::uno::RuntimeException);
+
+ /* TODO XFilePreview
+
+ virtual ::com::sun::star::uno::Sequence< sal_Int16 > SAL_CALL getSupportedImageFormats( ) throw (::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getTargetColorDepth( ) throw (::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getAvailableWidth( ) throw (::com::sun::star::uno::RuntimeException);
+ virtual sal_Int32 SAL_CALL getAvailableHeight( ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL setImage( sal_Int16 aImageFormat, const ::com::sun::star::uno::Any &rImage ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL setShowState( sal_Bool bShowState ) throw (::com::sun::star::uno::RuntimeException);
+ virtual sal_Bool SAL_CALL getShowState( ) throw (::com::sun::star::uno::RuntimeException);
+ */
+
+ // XInitialization
+
+ virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > &rArguments ) throw( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException );
+
+ // XCancellable
+
+ virtual void SAL_CALL cancel( ) throw( ::com::sun::star::uno::RuntimeException );
+
+ // XEventListener
+
+ virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject &rEvent ) throw( ::com::sun::star::uno::RuntimeException );
+
+ // XServiceInfo
+
+ virtual ::rtl::OUString SAL_CALL getImplementationName() throw( ::com::sun::star::uno::RuntimeException );
+ virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString &rServiceName ) throw( ::com::sun::star::uno::RuntimeException );
+ virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( ::com::sun::star::uno::RuntimeException );
+
+private:
+ // prevent copy and assignment
+ UnxFilePicker( const UnxFilePicker& );
+ UnxFilePicker& operator=( const UnxFilePicker& );
+
+protected:
+ void initFilePicker();
+ void checkFilePicker() throw( ::com::sun::star::uno::RuntimeException );
+
+ // Async sendCommand
+ void sendCommand( const ::rtl::OUString &rCommand );
+ // Synchronized sendCommand
+ void sendCommand( const ::rtl::OUString &rCommand, ::osl::Condition &rCondition );
+ void appendEscaped( ::rtl::OUStringBuffer &rBuffer, const ::rtl::OUString &rString );
+
+private:
+ sal_Bool controlIdInfo( sal_Int16 nControlId, ::rtl::OUString &rType, sal_Int32 &rTitleId );
+ sal_Bool controlActionInfo( sal_Int16 nControlId, ::rtl::OUString &rType );
+ void sendAppendControlCommand( sal_Int16 nControlId );
+};
+
+#endif // _UNXFILEPICKER_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde_unx/UnxNotifyThread.cxx b/fpicker/source/unx/tde_unx/UnxNotifyThread.cxx
new file mode 100644
index 0000000..3bc96b1
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/UnxNotifyThread.cxx
@@ -0,0 +1,116 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <UnxNotifyThread.hxx>
+#include <UnxFilePicker.hxx>
+
+using namespace ::com::sun::star;
+
+//////////////////////////////////////////////////////////////////////////
+// UnxFilePickerNotifyThread
+//////////////////////////////////////////////////////////////////////////
+
+UnxFilePickerNotifyThread::UnxFilePickerNotifyThread( UnxFilePicker *pUnxFilePicker )
+ : m_pUnxFilePicker( pUnxFilePicker ),
+ m_bExit( sal_False ),
+ m_eNotifyType( Nothing ),
+ m_nControlId( 0 )
+{
+}
+
+void SAL_CALL UnxFilePickerNotifyThread::addFilePickerListener( const uno::Reference< ui::dialogs::XFilePickerListener >& xListener )
+ throw( uno::RuntimeException )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ m_xListener = xListener;
+}
+
+void SAL_CALL UnxFilePickerNotifyThread::removeFilePickerListener( const uno::Reference< ui::dialogs::XFilePickerListener >& xListener )
+ throw( uno::RuntimeException )
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ m_xListener.clear();
+}
+
+void SAL_CALL UnxFilePickerNotifyThread::exit()
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ m_bExit = sal_True;
+
+ m_aExitCondition.reset();
+ m_aNotifyCondition.set();
+
+ m_aExitCondition.wait();
+}
+
+void SAL_CALL UnxFilePickerNotifyThread::fileSelectionChanged()
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ m_eNotifyType = FileSelectionChanged;
+ m_nControlId = 0;
+
+ m_aNotifyCondition.set();
+}
+
+void SAL_CALL UnxFilePickerNotifyThread::run()
+{
+ do {
+ m_aNotifyCondition.reset();
+ m_aNotifyCondition.wait();
+
+ if ( m_xListener.is() && m_pUnxFilePicker )
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ui::dialogs::FilePickerEvent aEvent( *m_pUnxFilePicker, m_nControlId );
+
+ switch ( m_eNotifyType )
+ {
+ case FileSelectionChanged:
+ m_xListener->fileSelectionChanged( aEvent );
+ break;
+
+ // TODO More to come...
+
+ default:
+ // nothing
+ break;
+ }
+ }
+ } while ( !m_bExit );
+
+ m_aExitCondition.set();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde_unx/UnxNotifyThread.hxx b/fpicker/source/unx/tde_unx/UnxNotifyThread.hxx
new file mode 100644
index 0000000..9f5d1a5
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/UnxNotifyThread.hxx
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2010 Novell, Inc.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _UNXNOTIFYTHREAD_HXX_
+#define _UNXNOTIFYTHREAD_HXX_
+
+#include <com/sun/star/ui/dialogs/XFilePickerListener.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+
+#include <osl/conditn.hxx>
+#include <osl/mutex.hxx>
+#include <osl/thread.hxx>
+
+class UnxFilePicker;
+
+class UnxFilePickerNotifyThread : public ::osl::Thread
+{
+protected:
+ enum NotifyType
+ {
+ Nothing = 0,
+ FileSelectionChanged
+ // TODO More to come...
+ };
+
+ UnxFilePicker *m_pUnxFilePicker;
+
+ ::osl::Mutex m_aMutex;
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener > m_xListener;
+
+ sal_Bool m_bExit;
+ ::osl::Condition m_aExitCondition;
+
+ NotifyType m_eNotifyType;
+ ::osl::Condition m_aNotifyCondition;
+ sal_Int16 m_nControlId;
+
+public:
+ UnxFilePickerNotifyThread( UnxFilePicker *pUnxFilePicker );
+
+ virtual void SAL_CALL addFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener )
+ throw( ::com::sun::star::uno::RuntimeException );
+ virtual void SAL_CALL removeFilePickerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFilePickerListener >& xListener )
+ throw( ::com::sun::star::uno::RuntimeException );
+
+ void SAL_CALL exit();
+
+ void SAL_CALL fileSelectionChanged();
+ /* TODO
+ void SAL_CALL directoryChanged( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent );
+ rtl::OUString SAL_CALL helpRequested( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent ) const;
+ void SAL_CALL controlStateChanged( ::com::sun::star::ui::dialogs::FilePickerEvent aEvent );
+ void SAL_CALL dialogSizeChanged( );
+ */
+
+protected:
+ virtual void SAL_CALL run();
+};
+
+#endif // _UNXNOTIFYTHREAD_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/fpicker/source/unx/tde_unx/fps_tde.component b/fpicker/source/unx/tde_unx/fps_tde.component
new file mode 100644
index 0000000..e7a201d
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/fps_tde.component
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--**********************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+* Copyright 2011 Timothy Pearson
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+**********************************************************************-->
+
+<component loader="com.sun.star.loader.SharedLibrary"
+ xmlns="http://openoffice.org/2010/uno-components">
+ <implementation name="com.sun.star.ui.dialogs.UnxFilePicker">
+ <service name="com.sun.star.ui.dialogs.TDEFilePicker"/>
+ </implementation>
+</component>
diff --git a/fpicker/source/unx/tde_unx/fps_tde.xml b/fpicker/source/unx/tde_unx/fps_tde.xml
new file mode 100644
index 0000000..fc1ed68
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/fps_tde.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module-description PUBLIC "-//StarOffice//DTD ComponentDescription 1.0//EN" "module-description.dtd">
+<module-description xmlns:xlink="http://www.w3.org/1999/xlink">
+ <module-name>fps_tde</module-name>
+ <component-description>
+ <author> Jan Holesovsky </author>
+ <name> com.sun.star.comp.ui.dialogs.FilePicker </name>
+ <description>
+ The TDE implementation of the FilePicker service.
+ </description>
+ <loader-name>com.sun.star.loader.SharedLibrary</loader-name>
+ <language> c++ </language>
+ <status value="beta"/>
+ <supported-service> com.sun.star.ui.dialogs.FilePicker </supported-service>
+ <service-dependency>...</service-dependency>
+ <type> com.sun.star.ui.dialogs.XExecutableDialog </type>
+ <type> com.sun.star.ui.dialogs.XFilePicker </type>
+ <type> com.sun.star.ui.dialogs.XFilterManager </type>
+ <type> com.sun.star.ui.dialogs.XFilterGroupManager </type>
+ <type> com.sun.star.ui.dialogs.XFilePickerListener </type>
+ <type> com.sun.star.ui.dialogs.ExecutableDialogException </type>
+ <type> com.sun.star.ui.dialogs.XFilePickerNotifier </type>
+ <type> com.sun.star.ui.dialogs.XFilePickerControlAccess </type>
+ <type> com.sun.star.ui.dialogs.XFilePreview </type>
+ <type> com.sun.star.ui.dialogs.ExtendedFilePickerElementIds </type>
+ <type> com.sun.star.ui.dialogs.ExecutableDialogResults </type>
+ <type> com.sun.star.ui.dialogs.FilePickerEvent </type>
+ <type> com.sun.star.ui.dialogs.CommonFilePickerElementIds </type>
+ <type> com.sun.star.ui.dialogs.ListboxControlActions </type>
+ <type> com.sun.star.ui.dialogs.TemplateDescription </type>
+ <type> com.sun.star.ui.dialogs.FilePreviewImageFormats </type>
+ <type> com.sun.star.util.XCancellable </type>
+ <type> com.sun.star.lang.XComponent </type>
+ <type> com.sun.star.lang.XMultiServiceFactory </type>
+ <type> com.sun.star.lang.XSingleServiceFactory </type>
+ <type> com.sun.star.lang.XServiceInfo </type>
+ <type> com.sun.star.lang.XTypeProvider </type>
+ <type> com.sun.star.lang.IllegalArgumentException </type>
+ <type> com.sun.star.uno.TypeClass </type>
+ <type> com.sun.star.uno.XWeak </type>
+ <type> com.sun.star.uno.XAggregation </type>
+ <type> com.sun.star.registry.XRegistryKey </type>
+ <type> com.sun.star.container.XSet </type>
+ </component-description>
+ <project-build-dependency> cppuhelper </project-build-dependency>
+ <project-build-dependency> cppu </project-build-dependency>
+ <project-build-dependency> sal </project-build-dependency>
+ <runtime-module-dependency> cppuhelper </runtime-module-dependency>
+ <runtime-module-dependency> cppu2 </runtime-module-dependency>
+ <runtime-module-dependency> sal2 </runtime-module-dependency>
+</module-description>
diff --git a/fpicker/source/unx/tde_unx/makefile.mk b/fpicker/source/unx/tde_unx/makefile.mk
new file mode 100644
index 0000000..196c948
--- /dev/null
+++ b/fpicker/source/unx/tde_unx/makefile.mk
@@ -0,0 +1,86 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+# Copyright 2010 Novell, Inc.
+# Copyright 2011 Timothy Pearson
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=fpicker
+TARGET=fps_tde.uno
+LIBTARGET=NO
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+DLLPRE=
+
+# ------------------------------------------------------------------
+
+# Currently just TDE is supported...
+.IF "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE"
+
+dummy:
+ @echo "Nothing to build. GUIBASE == $(GUIBASE), ENABLE_TDE is not set"
+
+.ELSE # we build for TDE
+
+# --- Files --------------------------------------------------------
+
+SLOFILES =\
+ $(SLO)$/UnxCommandThread.obj \
+ $(SLO)$/UnxFilePicker.obj \
+ $(SLO)$/UnxNotifyThread.obj \
+ $(SLO)$/UnxFPentry.obj
+
+SHL1NOCHECK=TRUE
+SHL1TARGET=fps_tde.uno
+SHL1STDLIBS=$(CPPULIB)\
+ $(CPPUHELPERLIB)\
+ $(SALLIB)\
+ $(VCLLIB)\
+ $(TOOLSLIB)
+
+SHL1OBJS=$(SLOFILES)
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME=$(SHL1TARGET)
+DEF1VERSIONMAP=$(SOLARENV)/src/component.map
+
+.ENDIF # "$(GUIBASE)" != "unx" || "$(ENABLE_TDE)" != "TRUE"
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+ALLTAR : $(MISC)/fps_tde.component
+
+$(MISC)/fps_tde.component .ERRREMOVE : $(SOLARENV)/bin/createcomponent.xslt \
+ fps_tde.component
+ $(XSLTPROC) --nonet --stringparam uri \
+ '$(COMPONENTPREFIX_BASIS_NATIVE)$(SHL1TARGETN:f)' -o $@ \
+ $(SOLARENV)/bin/createcomponent.xslt fps_tde.component
diff --git a/postprocess/packcomponents/makefile.mk b/postprocess/packcomponents/makefile.mk
index b983928..a47e9c6 100644
--- a/postprocess/packcomponents/makefile.mk
+++ b/postprocess/packcomponents/makefile.mk
@@ -235,6 +235,10 @@ my_components += kab1
my_components += kdebe1
.END
+.IF "$(ENABLE_TDE)" != ""
+my_components += tdebe1
+.END
+
.IF "$(ENABLE_KDE4)" != ""
my_components += kde4be1
.END
@@ -354,6 +358,10 @@ my_components += fps_gnome
my_components += fps_kde4
.END
+.IF "$(ENABLE_TDE)" != ""
+my_components += fps_tde
+.END
+
.IF "$(OS)" != "WNT"
my_components += cmdmail
.END
diff --git a/postprocess/packregistry/makefile.mk b/postprocess/packregistry/makefile.mk
index d82c9ef..a3a6de4 100644
--- a/postprocess/packregistry/makefile.mk
+++ b/postprocess/packregistry/makefile.mk
@@ -328,6 +328,9 @@ MY_FILES_main += \
.IF "$(ENABLE_KAB)" == "TRUE"
MY_FILES_main += $(MY_MOD)/DataAccess/kab.xcu
.END
+.IF "$(ENABLE_TDEAB)" == "TRUE"
+MY_FILES_main += $(MY_MOD)/DataAccess/tdeab.xcu
+.END
.IF "$(SYSTEM_MOZILLA)" != "YES" && "$(WITH_MOZILLA)" != "NO" && \
"$(OS)" != "MACOSX"
.IF "$(OS)" == "WNT"
diff --git a/scp2/prj/build.lst b/scp2/prj/build.lst
index f225c3e..41be4f3 100644
--- a/scp2/prj/build.lst
+++ b/scp2/prj/build.lst
@@ -14,6 +14,7 @@ cp scp2\source\graphicfilter nmake - all cp_graphicfilter cp_langm
cp scp2\source\impress nmake - all cp_impress cp_langmacros cp_langtemplates NULL
cp scp2\source\javafilter nmake - all cp_javafilter cp_langmacros cp_langtemplates NULL
cp scp2\source\kde nmake - all cp_kde cp_langmacros cp_langtemplates NULL
+cp scp2\source\tde nmake - all cp_tde cp_langmacros cp_langtemplates NULL
cp scp2\source\layout nmake - all cp_layout cp_langmacros NULL
cp scp2\source\math nmake - all cp_math cp_langmacros cp_langtemplates NULL
cp scp2\source\ooo nmake - all cp_ooo cp_langmacros cp_langtemplates NULL
@@ -27,4 +28,4 @@ cp scp2\source\xsltfilter nmake - all cp_xsltfilter cp_langmacr
cp scp2\source\winexplorerext nmake - all cp_winexplorerext cp_langmacros cp_langtemplates NULL
cp scp2\source\onlineupdate nmake - all cp_update cp_langmacros cp_langtemplates NULL
cp scp2\source\accessories nmake - all cp_accessories cp_langmacros NULL
-cp scp2\util nmake - all cp_util cp_activex cp_binfilter cp_calc cp_canvas cp_crashrep cp_draw cp_extensions cp_gnome cp_graphicfilter cp_impress cp_javafilter cp_kde cp_layout cp_math cp_ooo cp_python cp_quickstart cp_testtool cp_writer cp_base cp_xsltfilter cp_winexplorerext cp_sdkoo cp_update cp_accessories NULL
+cp scp2\util nmake - all cp_util cp_activex cp_binfilter cp_calc cp_canvas cp_crashrep cp_draw cp_extensions cp_gnome cp_graphicfilter cp_impress cp_javafilter cp_kde cp_tde cp_layout cp_math cp_ooo cp_python cp_quickstart cp_testtool cp_writer cp_base cp_xsltfilter cp_winexplorerext cp_sdkoo cp_update cp_accessories NULL
diff --git a/scp2/source/ooo/file_library_ooo.scp b/scp2/source/ooo/file_library_ooo.scp
index d83d6cf..fe378e1 100644
--- a/scp2/source/ooo/file_library_ooo.scp
+++ b/scp2/source/ooo/file_library_ooo.scp
@@ -425,6 +425,24 @@ End
#endif
+#ifdef ENABLE_TDEAB
+File gid_File_Lib_Tdeab_1
+ TXT_FILE_BODY;
+ Styles = (PACKED,UNO_COMPONENT);
+ RegistryID = gid_Starregistry_Services_Rdb;
+ Dir = SCP2_OOO_BIN_DIR;
+ Name = STRING(CONCAT2(libtdeab1,UNXSUFFIX));
+End
+
+File gid_File_Lib_Tdeab_Drv_1
+ TXT_FILE_BODY;
+ Styles = (PACKED);
+ Dir = SCP2_OOO_BIN_DIR;
+ Name = STRING(CONCAT2(libtdeabdrv1,UNXSUFFIX));
+End
+
+#endif
+
#ifdef MACOSX
File gid_File_Lib_Macab_1
TXT_FILE_BODY;
@@ -525,6 +543,23 @@ File gid_File_Bin_KdeFilePicker
End
#endif
#endif
+#ifdef ENABLE_TDE
+#ifndef MACOSX
+File gid_File_Lib_Fps_Tde
+ TXT_FILE_BODY;
+ Styles = (PACKED);
+ Dir = SCP2_OOO_BIN_DIR;
+ Name = SPECIAL_COMPONENT_LIB_NAME(fps_tde.uno);
+End
+File gid_File_Bin_TdeFilePicker
+ BIN_FILE_BODY;
+ Styles = (PACKED);
+ Dir = gid_Brand_Dir_Program;
+ Name = "tdefilepicker";
+End
+#endif
+#endif
+
#endif
#ifdef QUARTZ
@@ -992,6 +1027,17 @@ File gid_File_Lib_Vclplug_Kde4
End
#endif
#endif
+#ifdef ENABLE_TDE
+#ifndef MACOSX
+File gid_File_Lib_Vclplug_Tde
+ Name = LIBNAME(vclplug_tde);
+ TXT_FILE_BODY;
+ Styles = (PACKED);
+ Dir = SCP2_OOO_BIN_DIR;
+End
+#endif
+#endif
+
#endif
#if defined(QUARTZ)
diff --git a/scp2/source/ooo/file_ooo.scp b/scp2/source/ooo/file_ooo.scp
index 34ed8a9..5291d0d 100644
--- a/scp2/source/ooo/file_ooo.scp
+++ b/scp2/source/ooo/file_ooo.scp
@@ -169,6 +169,13 @@ File gid_File_Bin_Kde_Open_Url
Styles = (PACKED);
End
+File gid_File_Bin_Tde_Open_Url
+ BIN_FILE_BODY;
+ Dir = gid_Brand_Dir_Program;
+ Name = "tde-open-url";
+ Styles = (PACKED);
+End
+
File gid_File_Bin_Cde_Open_Url
BIN_FILE_BODY;
Dir = gid_Brand_Dir_Program;
diff --git a/scp2/source/ooo/makefile.mk b/scp2/source/ooo/makefile.mk
index ce2ab52..0b8d12b 100644
--- a/scp2/source/ooo/makefile.mk
+++ b/scp2/source/ooo/makefile.mk
@@ -84,6 +84,14 @@ SCPDEFS+=-DENABLE_KDE4
SCPDEFS+=-DENABLE_KAB
.ENDIF
+.IF "$(ENABLE_TDE)" != ""
+SCPDEFS+=-DENABLE_TDE
+.ENDIF
+
+.IF "$(ENABLE_TDEAB)" != ""
+SCPDEFS+=-DENABLE_TDEAB
+.ENDIF
+
.IF "$(ENABLE_EVOAB2)" != ""
SCPDEFS+=-DENABLE_EVOAB2
.ENDIF
diff --git a/scp2/source/ooo/module_hidden_ooo.scp b/scp2/source/ooo/module_hidden_ooo.scp
index 20d9b16..fce92ce 100644
--- a/scp2/source/ooo/module_hidden_ooo.scp
+++ b/scp2/source/ooo/module_hidden_ooo.scp
@@ -84,6 +84,7 @@ Module gid_Module_Root_Files_2
Styles = (HIDDEN_ROOT);
Files = (gid_File_Bin_Cde_Open_Url,
gid_File_Bin_Kde_Open_Url,
+ gid_File_Bin_Tde_Open_Url,
gid_File_Bin_Open_Url,
gid_File_Bin_Pagein,
gid_File_Bin_Pluginapp,
@@ -277,6 +278,7 @@ Module gid_Module_Root_Files_4
gid_File_Lib_Vclplug_Gen,
gid_File_Lib_Vclplug_Kde,
gid_File_Lib_Vclplug_Kde4,
+ gid_File_Lib_Vclplug_Tde,
gid_File_Lib_Vclplug_Svp,
gid_File_Lib_Basctl,
gid_File_Lib_CanvasTools,
@@ -348,6 +350,8 @@ Module gid_Module_Root_Files_5
gid_File_Lib_Emboleobj,
gid_File_Lib_Kab_1,
gid_File_Lib_Kab_Drv_1,
+ gid_File_Lib_Tdeab_1,
+ gid_File_Lib_Tdeab_Drv_1,
gid_File_Lib_Macab_1,
gid_File_Lib_Macab_Drv_1,
gid_File_Lib_Evtatt,
diff --git a/scp2/source/tde/file_tde.scp b/scp2/source/tde/file_tde.scp
new file mode 100644
index 0000000..6387a57
--- /dev/null
+++ b/scp2/source/tde/file_tde.scp
@@ -0,0 +1,37 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include "macros.inc"
+
+#ifdef ENABLE_TDE
+File gid_File_Lib_Tdebe
+ TXT_FILE_BODY;
+ Styles = (PACKED);
+ Dir = SCP2_OOO_BIN_DIR;
+ Name = STRING(CONCAT2(tdebe1.uno,UNXSUFFIX));
+End
+#endif
diff --git a/scp2/source/tde/makefile.mk b/scp2/source/tde/makefile.mk
new file mode 100644
index 0000000..78d5728
--- /dev/null
+++ b/scp2/source/tde/makefile.mk
@@ -0,0 +1,59 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+# Copyright 2011 Timothy Pearson
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJPCH=
+
+PRJNAME=scp2
+TARGET=tde
+TARGETTYPE=CUI
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+SCP_PRODUCT_TYPE=osl
+
+.IF "$(ENABLE_TDE)" == "TRUE"
+
+.IF "$(ENABLE_TDE)" != ""
+SCPDEFS+=-DENABLE_TDE
+.ENDIF
+
+PARFILES = \
+ module_tde.par \
+ file_tde.par
+
+ULFFILES= \
+ module_tde.ulf
+.ENDIF
+
+# --- File ---------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/scp2/source/tde/module_tde.scp b/scp2/source/tde/module_tde.scp
new file mode 100644
index 0000000..9fdfecd
--- /dev/null
+++ b/scp2/source/tde/module_tde.scp
@@ -0,0 +1,45 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ * Copyright 2011 Timothy Pearson
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.inc"
+
+#if defined( ENABLE_TDE )
+Module gid_Module_Optional_Tde
+ ParentID = gid_Module_Optional;
+ Default = YES;
+ PackageInfo = "packinfo_office.txt";
+ MOD_NAME_DESC(MODULE_OPTIONAL_TDE);
+ Styles = (DONTSHOWINUSERINSTALL);
+ Files = (
+#ifdef ENABLE_TDE
+ gid_File_Lib_Tdebe
+#endif // ENABLE_TDE
+ );
+End
+#endif
+
diff --git a/scp2/source/tde/module_tde.ulf b/scp2/source/tde/module_tde.ulf
new file mode 100644
index 0000000..e55735f
--- /dev/null
+++ b/scp2/source/tde/module_tde.ulf
@@ -0,0 +1,34 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+[STR_NAME_MODULE_OPTIONAL_TDE]
+en-US = "TDE Integration"
+
+[STR_DESC_MODULE_OPTIONAL_TDE]
+en-US = "System integration of %PRODUCTNAME %PRODUCTVERSION into TDE."
+
diff --git a/scp2/util/makefile.mk b/scp2/util/makefile.mk
index 1d6d694..c59e04c 100644
--- a/scp2/util/makefile.mk
+++ b/scp2/util/makefile.mk
@@ -200,6 +200,12 @@ SCP1FILES += \
module_kde.par \
file_kde.par
.ENDIF
+
+.IF "$(ENABLE_TDE)" == "TRUE"
+SCP1FILES += \
+ module_tde.par \
+ file_tde.par
+.ENDIF
.ENDIF
.IF "$(ENABLE_CRASHDUMP)" != ""
diff --git a/set_soenv.in b/set_soenv.in
index dc2d996..e0d7c39 100755
--- a/set_soenv.in
+++ b/set_soenv.in
@@ -1546,6 +1546,10 @@ ToFile( "KDE_GLIB_CFLAGS", "@KDE_GLIB_CFLAGS@", "e" );
ToFile( "KDE_GLIB_LIBS", "@KDE_GLIB_LIBS@", "e" );
ToFile( "KDE_HAVE_GLIB", "@KDE_HAVE_GLIB@", "e" );
ToFile( "ENABLE_KAB", "@ENABLE_KAB@", "e" );
+ToFile( "ENABLE_TDE", "@ENABLE_TDE@", "e" );
+ToFile( "TDE_CFLAGS", "@TDE_CFLAGS@", "e" );
+ToFile( "TDE_LIBS", "@TDE_LIBS@", "e" );
+ToFile( "ENABLE_TDEAB", "@ENABLE_TDEAB@", "e" );
ToFile( "PSPRINT", "TRUE", "e" );
ToFile( "MKDEPENDSOLVER", "TRUE", "e" );
ToFile( "nodep", "@nodep@", "e" );
diff --git a/setup_native/source/packinfo/packinfo_office.txt b/setup_native/source/packinfo/packinfo_office.txt
index 63bb1fe..c5bb1d1 100644
--- a/setup_native/source/packinfo/packinfo_office.txt
+++ b/setup_native/source/packinfo/packinfo_office.txt
@@ -48,6 +48,21 @@ packageversion = "%OOOPACKAGEVERSION"
End
Start
+module = "gid_Module_Optional_Tde"
+solarispackagename = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-tde-integration"
+solarisrequires = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01"
+packagename = "%BASISPACKAGEPREFIX%OOOBASEVERSION-tde-integration"
+freebsdrequires = "%BASISPACKAGEPREFIX%OOOBASEVERSION-core01"
+requires = "%BASISPACKAGEPREFIX%OOOBASEVERSION-core01"
+copyright = "1999-2009 by OpenOffice.org"
+solariscopyright = "solariscopyrightfile"
+vendor = "The Document Foundation"
+description = "TDE integration module for LibreOffice %OOOBASEVERSION"
+destpath = "/opt"
+packageversion = "%OOOPACKAGEVERSION"
+End
+
+Start
module = "gid_Module_Root"
# script = "shellscripts_core01.txt"
solarispackagename = "%BASISPACKAGEPREFIX%WITHOUTDOTOOOBASEVERSION-core01"
diff --git a/shell/inc/tde_headers.h b/shell/inc/tde_headers.h
new file mode 100644
index 0000000..91f59f9
--- /dev/null
+++ b/shell/inc/tde_headers.h
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_VCL_TDE_HEADERS_H
+#define INCLUDED_VCL_TDE_HEADERS_H
+
+/* ********* Suppress warnings if needed */
+#include "sal/config.h"
+
+#if defined __GNUC__
+#pragma GCC system_header
+#endif
+
+
+/* ********* Hack, but needed because of conflicting types... */
+#define Region QtXRegion
+
+
+/* ********* TQt headers */
+#include <tqaccessible.h>
+#include <tqcheckbox.h>
+#include <tqcombobox.h>
+#include <tqfont.h>
+#include <tqframe.h>
+#include <tqlineedit.h>
+#include <tqlistview.h>
+#include <tqmainwindow.h>
+#include <tqmenudata.h>
+#include <tqpaintdevice.h>
+#include <tqpainter.h>
+#include <tqpushbutton.h>
+#include <tqradiobutton.h>
+#include <tqrangecontrol.h>
+#include <tqstring.h>
+#include <tqtabbar.h>
+#include <tqtabwidget.h>
+#include <tqtoolbar.h>
+#include <tqtoolbutton.h>
+#include <tqwidget.h>
+#include <tqprogressbar.h>
+
+/* ********* See hack on top of this file */
+#undef Region
+
+
+/* ********* TDE base headers */
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kconfig.h>
+#include <kdeversion.h>
+#include <kemailsettings.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kmenubar.h>
+#include <kprotocolmanager.h>
+#include <kstartupinfo.h>
+#include <kstyle.h>
+
+
+/* ********* TDE address book connectivity headers */
+#include <kabc/addressbook.h>
+#include <kabc/addressee.h>
+#include <kabc/field.h>
+#include <kabc/stdaddressbook.h>
+
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/shell/prj/build.lst b/shell/prj/build.lst
index 6dc5270..700c989 100644
--- a/shell/prj/build.lst
+++ b/shell/prj/build.lst
@@ -25,5 +25,6 @@ sl shell\source\backends\macbe nmake - u sl_backends_m
sl shell\source\backends\gconfbe nmake - u sl_backends_gconfbe sl_inc NULL
sl shell\source\backends\kdebe nmake - u sl_backends_kdebe sl_inc NULL
sl shell\source\backends\kde4be nmake - u sl_backends_kde4be sl_inc NULL
+sl shell\source\backends\tdebe nmake - u sl_backends_tdebe sl_inc NULL
sl shell\source\backends\desktopbe nmake - u sl_backends_desktopbe sl_inc NULL
sl shell\source\win32\shlxthandler\ooofilt nmake - w sl_win32_shlxthandler_ooofilt sl_win32_zipfile.w sl_win32_ooofilereader.w sl_win32_shlxthandler_util.w sl_all sl_inc NULL
diff --git a/shell/prj/d.lst b/shell/prj/d.lst
index 62dfa80..7665b62 100644
--- a/shell/prj/d.lst
+++ b/shell/prj/d.lst
@@ -15,6 +15,7 @@
..\%__SRC%\bin\open-url %_DEST%\bin\open-url
..\%__SRC%\bin\cde-open-url %_DEST%\bin\cde-open-url
..\%__SRC%\bin\kde-open-url %_DEST%\bin\kde-open-url
+..\%__SRC%\bin\tde-open-url %_DEST%\bin\tde-open-url
..\%__SRC%\bin\gnome-open-url %_DEST%\bin\gnome-open-url
..\%__SRC%\bin\gnome-open-url.bin %_DEST%\bin\gnome-open-url.bin
..\%__SRC%\bin\senddoc %_DEST%\bin\senddoc
@@ -27,7 +28,9 @@
..\%__SRC%\misc\gconfbe1.component %_DEST%\xml\gconfbe1.component
..\%__SRC%\misc\kde4be1.component %_DEST%\xml\kde4be1.component
..\%__SRC%\misc\kdebe1.component %_DEST%\xml\kdebe1.component
+..\%__SRC%\misc\tdebe1.component %_DEST%\xml\tdebe1.component
..\inc\kde_headers.h %_DEST%\inc\shell\kde_headers.h
+..\inc\tde_headers.h %_DEST%\inc\shell\tde_headers.h
..\%__SRC%\misc\localebe1.component %_DEST%\xml\localebe1.component
..\%__SRC%\misc\macbe1.component %_DEST%\xml\macbe1.component
..\%__SRC%\misc\smplmail.component %_DEST%\xml\smplmail.component
diff --git a/shell/source/backends/tdebe/makefile.mk b/shell/source/backends/tdebe/makefile.mk
new file mode 100644
index 0000000..5243da4
--- /dev/null
+++ b/shell/source/backends/tdebe/makefile.mk
@@ -0,0 +1,88 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+# Copyright 2011 Timothy Pearson
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..$/..
+
+PRJNAME=shell
+TARGET=tdebe
+
+LIBTARGET=NO
+ENABLE_EXCEPTIONS=TRUE
+VISIBILITY_HIDDEN=TRUE
+
+# --- Settings ---
+
+.INCLUDE : settings.mk
+
+# For some of the included external TDE headers, GCC complains about shadowed
+# symbols in instantiated template code only at the end of a compilation unit,
+# so the only solution is to disable that warning here:
+.IF "$(COM)" == "GCC"
+CFLAGSCXX+=-Wno-shadow
+.ENDIF
+
+# no "lib" prefix
+DLLPRE =
+
+.IF "$(ENABLE_TDE)" == "TRUE"
+
+CFLAGS+=$(TDE_CFLAGS)
+
+# --- Files ---
+
+SLOFILES=\
+ $(SLO)$/tdeaccess.obj \
+ $(SLO)$/tdebackend.obj
+
+SHL1NOCHECK=TRUE
+SHL1TARGET=$(TARGET)1.uno
+SHL1OBJS=$(SLOFILES)
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+
+SHL1IMPLIB=i$(SHL1TARGET)
+SHL1LINKFLAGS+=$(TDE_LIBS) -lkio
+SHL1STDLIBS= \
+ $(CPPUHELPERLIB) \
+ $(CPPULIB) \
+ $(SALLIB)
+
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+DEF1NAME=$(SHL1TARGET)
+
+.ENDIF # "$(ENABLE_TDE)" == "TRUE"
+
+# --- Targets ---
+
+.INCLUDE : target.mk
+
+ALLTAR : $(MISC)/tdebe1.component
+
+$(MISC)/tdebe1.component .ERRREMOVE : $(SOLARENV)/bin/createcomponent.xslt \
+ tdebe1.component
+ $(XSLTPROC) --nonet --stringparam uri \
+ '$(COMPONENTPREFIX_BASIS_NATIVE)$(SHL1TARGETN:f)' -o $@ \
+ $(SOLARENV)/bin/createcomponent.xslt tdebe1.component
diff --git a/shell/source/backends/tdebe/tdeaccess.cxx b/shell/source/backends/tdebe/tdeaccess.cxx
new file mode 100644
index 0000000..1dbd64f
--- /dev/null
+++ b/shell/source/backends/tdebe/tdeaccess.cxx
@@ -0,0 +1,319 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+* Copyright 2011 Timothy Pearson
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+#include "precompiled_shell.hxx"
+#include "sal/config.h"
+
+#include "com/sun/star/uno/Any.hxx"
+#include "cppu/unotype.hxx"
+#include "osl/diagnose.h"
+#include "osl/file.h"
+#include "rtl/string.h"
+#include "rtl/ustring.hxx"
+
+#include "tde_headers.h"
+
+#include "tdeaccess.hxx"
+
+#define SPACE ' '
+#define COMMA ','
+#define SEMI_COLON ';'
+
+namespace tdeaccess {
+
+namespace {
+
+namespace css = com::sun::star ;
+namespace uno = css::uno ;
+
+}
+
+css::beans::Optional< css::uno::Any > getValue(rtl::OUString const & id) {
+ if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ExternalMailer"))) {
+ KEMailSettings aEmailSettings;
+ TQString aClientProgram;
+ ::rtl::OUString sClientProgram;
+
+ aClientProgram = aEmailSettings.getSetting( KEMailSettings::ClientProgram );
+ if ( aClientProgram.isEmpty() )
+ aClientProgram = "kmail";
+ else
+ aClientProgram = aClientProgram.section(SPACE, 0, 0);
+ sClientProgram = (const sal_Unicode *) aClientProgram.ucs2();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( sClientProgram ) );
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("SourceViewFontHeight")))
+ {
+ TQFont aFixedFont;
+ short nFontHeight;
+
+ aFixedFont = KGlobalSettings::fixedFont();
+ nFontHeight = aFixedFont.pointSize();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( nFontHeight ) );
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("SourceViewFontName")))
+ {
+ TQFont aFixedFont;
+ TQString aFontName;
+ :: rtl::OUString sFontName;
+
+ aFixedFont = KGlobalSettings::fixedFont();
+ aFontName = aFixedFont.family();
+ sFontName = (const sal_Unicode *) aFontName.ucs2();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( sFontName ) );
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("EnableATToolSupport")))
+ {
+ /* does not make much sense without an accessibility bridge */
+ sal_Bool ATToolSupport = sal_False;
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( rtl::OUString::valueOf( ATToolSupport ) ) );
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("WorkPathVariable")))
+ {
+ TQString aDocumentsDir( KGlobalSettings::documentPath() );
+ rtl::OUString sDocumentsDir;
+ rtl::OUString sDocumentsURL;
+ if ( aDocumentsDir.endsWith(TQChar('/')) )
+ aDocumentsDir.truncate ( aDocumentsDir.length() - 1 );
+ sDocumentsDir = (const sal_Unicode *) aDocumentsDir.ucs2();
+ osl_getFileURLFromSystemPath( sDocumentsDir.pData, &sDocumentsURL.pData );
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( sDocumentsURL ) );
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName")))
+ {
+ TQString aFTPProxy;
+ switch ( KProtocolManager::proxyType() )
+ {
+ case KProtocolManager::ManualProxy: // Proxies are manually configured
+ aFTPProxy = KProtocolManager::proxyFor( "FTP" );
+ break;
+ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+// The best we can do here is to ask the current value for a given address.
+ aFTPProxy = KProtocolManager::proxyForURL( "ftp://ftp.openoffice.org" );
+ break;
+ default: // No proxy is used
+ break;
+ }
+ if ( !aFTPProxy.isEmpty() )
+ {
+ KURL aProxy(aFTPProxy);
+ ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( sProxy ) );
+ }
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort")))
+ {
+ TQString aFTPProxy;
+ switch ( KProtocolManager::proxyType() )
+ {
+ case KProtocolManager::ManualProxy: // Proxies are manually configured
+ aFTPProxy = KProtocolManager::proxyFor( "FTP" );
+ break;
+ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+// The best we can do here is to ask the current value for a given address.
+ aFTPProxy = KProtocolManager::proxyForURL( "ftp://ftp.openoffice.org" );
+ break;
+ default: // No proxy is used
+ break;
+ }
+ if ( !aFTPProxy.isEmpty() )
+ {
+ KURL aProxy(aFTPProxy);
+ sal_Int32 nPort = aProxy.port();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( nPort ) );
+ }
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName")))
+ {
+ TQString aHTTPProxy;
+ switch ( KProtocolManager::proxyType() )
+ {
+ case KProtocolManager::ManualProxy: // Proxies are manually configured
+ aHTTPProxy = KProtocolManager::proxyFor( "HTTP" );
+ break;
+ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+// The best we can do here is to ask the current value for a given address.
+ aHTTPProxy = KProtocolManager::proxyForURL( "http://http.openoffice.org" );
+ break;
+ default: // No proxy is used
+ break;
+ }
+ if ( !aHTTPProxy.isEmpty() )
+ {
+ KURL aProxy(aHTTPProxy);
+ ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( sProxy ) );
+ }
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort")))
+ {
+ TQString aHTTPProxy;
+ switch ( KProtocolManager::proxyType() )
+ {
+ case KProtocolManager::ManualProxy: // Proxies are manually configured
+ aHTTPProxy = KProtocolManager::proxyFor( "HTTP" );
+ break;
+ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+// The best we can do here is to ask the current value for a given address.
+ aHTTPProxy = KProtocolManager::proxyForURL( "http://http.openoffice.org" );
+ break;
+ default: // No proxy is used
+ break;
+ }
+ if ( !aHTTPProxy.isEmpty() )
+ {
+ KURL aProxy(aHTTPProxy);
+ sal_Int32 nPort = aProxy.port();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( nPort ) );
+ }
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName")))
+ {
+ TQString aHTTPSProxy;
+ switch ( KProtocolManager::proxyType() )
+ {
+ case KProtocolManager::ManualProxy: // Proxies are manually configured
+ aHTTPSProxy = KProtocolManager::proxyFor( "HTTPS" );
+ break;
+ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+// The best we can do here is to ask the current value for a given address.
+ aHTTPSProxy = KProtocolManager::proxyForURL( "https://https.openoffice.org" );
+ break;
+ default: // No proxy is used
+ break;
+ }
+ if ( !aHTTPSProxy.isEmpty() )
+ {
+ KURL aProxy(aHTTPSProxy);
+ ::rtl::OUString sProxy = (const sal_Unicode *) aProxy.host().ucs2();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( sProxy ) );
+ }
+ } else if (id.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort")))
+ {
+ TQString aHTTPSProxy;
+ switch ( KProtocolManager::proxyType() )
+ {
+ case KProtocolManager::ManualProxy: // Proxies are manually configured
+ aHTTPSProxy = KProtocolManager::proxyFor( "HTTPS" );
+ break;
+ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+// In such cases, the proxy address is not stored in TDE, but determined dynamically.
+// The proxy address may depend on the requested address, on the time of the day, on the speed of the wind...
+// The best we can do here is to ask the current value for a given address.
+ aHTTPSProxy = KProtocolManager::proxyForURL( "https://https.openoffice.org" );
+ break;
+ default: // No proxy is used
+ break;
+ }
+ if ( !aHTTPSProxy.isEmpty() )
+ {
+ KURL aProxy(aHTTPSProxy);
+ sal_Int32 nPort = aProxy.port();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( nPort ) );
+ }
+ } else if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy"))) {
+ TQString aNoProxyFor;
+ switch ( KProtocolManager::proxyType() )
+ {
+ case KProtocolManager::ManualProxy: // Proxies are manually configured
+ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+ aNoProxyFor = KProtocolManager::noProxyFor();
+ break;
+ default: // No proxy is used
+ break;
+ }
+ if ( !aNoProxyFor.isEmpty() )
+ {
+ ::rtl::OUString sNoProxyFor;
+
+ aNoProxyFor = aNoProxyFor.replace( COMMA, SEMI_COLON );
+ sNoProxyFor = (const sal_Unicode *) aNoProxyFor.ucs2();
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( sNoProxyFor ) );
+ }
+ } else if (id.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ooInetProxyType"))) {
+ int nProxyType;
+ switch ( KProtocolManager::proxyType() )
+ {
+ case KProtocolManager::ManualProxy: // Proxies are manually configured
+ case KProtocolManager::PACProxy: // A proxy configuration URL has been given
+ case KProtocolManager::WPADProxy: // A proxy should be automatically discovered
+ case KProtocolManager::EnvVarProxy: // Use the proxy values set through environment variables
+ nProxyType = 1;
+ break;
+ default: // No proxy is used
+ nProxyType = 0;
+ }
+ return css::beans::Optional< css::uno::Any >(
+ true, uno::makeAny( (sal_Int32) nProxyType ) );
+ } else {
+ OSL_ASSERT(false); // this cannot happen
+ }
+ return css::beans::Optional< css::uno::Any >();
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/shell/source/backends/tdebe/tdeaccess.hxx b/shell/source/backends/tdebe/tdeaccess.hxx
new file mode 100644
index 0000000..5029c12
--- /dev/null
+++ b/shell/source/backends/tdebe/tdeaccess.hxx
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+* Copyright 2011 Timothy Pearson
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+#ifndef INCLUDED_SHELL_SOURCE_BACKENDS_TDEBE_TDEACCESS_HXX
+#define INCLUDED_SHELL_SOURCE_BACKENDS_TDEBE_TDEACCESS_HXX
+
+#include "sal/config.h"
+
+#include "com/sun/star/beans/Optional.hpp"
+
+namespace com { namespace sun { namespace star { namespace uno {
+ class Any;
+} } } }
+namespace rtl { class OUString; }
+
+namespace tdeaccess {
+
+com::sun::star::beans::Optional< com::sun::star::uno::Any > getValue(
+ rtl::OUString const & id);
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/shell/source/backends/tdebe/tdebackend.cxx b/shell/source/backends/tdebe/tdebackend.cxx
new file mode 100644
index 0000000..19eaa60
--- /dev/null
+++ b/shell/source/backends/tdebe/tdebackend.cxx
@@ -0,0 +1,262 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+* Copyright 2011 Timothy Pearson
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+#include "precompiled_shell.hxx"
+#include "sal/config.h"
+
+#include "boost/noncopyable.hpp"
+#include "com/sun/star/beans/Optional.hpp"
+#include "com/sun/star/beans/PropertyVetoException.hpp"
+#include "com/sun/star/beans/UnknownPropertyException.hpp"
+#include "com/sun/star/beans/XPropertyChangeListener.hpp"
+#include "com/sun/star/beans/XPropertySet.hpp"
+#include "com/sun/star/beans/XPropertySetInfo.hpp"
+#include "com/sun/star/beans/XVetoableChangeListener.hpp"
+#include "com/sun/star/lang/IllegalArgumentException.hpp"
+#include "com/sun/star/lang/WrappedTargetException.hpp"
+#include "com/sun/star/lang/XMultiComponentFactory.hpp"
+#include "com/sun/star/lang/XServiceInfo.hpp"
+#include "com/sun/star/lang/WrappedTargetException.hpp"
+#include "com/sun/star/uno/Any.hxx"
+#include "com/sun/star/uno/Reference.hxx"
+#include "com/sun/star/uno/RuntimeException.hpp"
+#include "com/sun/star/uno/Sequence.hxx"
+#include "com/sun/star/uno/XComponentContext.hpp"
+#include "com/sun/star/uno/XCurrentContext.hpp"
+#include "cppuhelper/factory.hxx"
+#include "cppuhelper/implbase2.hxx"
+#include "cppuhelper/implementationentry.hxx"
+#include "cppuhelper/weak.hxx"
+#include "rtl/string.h"
+#include "rtl/ustring.h"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+#include "uno/current_context.hxx"
+#include "uno/lbnames.h"
+
+#include "tde_headers.h"
+
+#include "tdeaccess.hxx"
+
+namespace {
+
+namespace css = com::sun::star;
+
+rtl::OUString SAL_CALL getServiceImplementationName() {
+ return rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "com.sun.star.comp.configuration.backend.TDEBackend"));
+}
+
+css::uno::Sequence< rtl::OUString > SAL_CALL getServiceSupportedServiceNames() {
+ rtl::OUString name(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "com.sun.star.configuration.backend.TDEBackend"));
+ return css::uno::Sequence< rtl::OUString >(&name, 1);
+}
+
+class Service:
+ public cppu::WeakImplHelper2<
+ css::lang::XServiceInfo, css::beans::XPropertySet >,
+ private boost::noncopyable
+{
+public:
+ Service();
+
+private:
+ virtual ~Service() {}
+
+ virtual rtl::OUString SAL_CALL getImplementationName()
+ throw (css::uno::RuntimeException)
+ { return getServiceImplementationName(); }
+
+ virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName)
+ throw (css::uno::RuntimeException)
+ { return ServiceName == getSupportedServiceNames()[0]; }
+
+ virtual css::uno::Sequence< rtl::OUString > SAL_CALL
+ getSupportedServiceNames() throw (css::uno::RuntimeException)
+ { return getServiceSupportedServiceNames(); }
+
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
+ getPropertySetInfo() throw (css::uno::RuntimeException)
+ { return css::uno::Reference< css::beans::XPropertySetInfo >(); }
+
+ virtual void SAL_CALL setPropertyValue(
+ rtl::OUString const &, css::uno::Any const &)
+ throw (
+ css::beans::UnknownPropertyException,
+ css::beans::PropertyVetoException,
+ css::lang::IllegalArgumentException,
+ css::lang::WrappedTargetException, css::uno::RuntimeException);
+
+ virtual css::uno::Any SAL_CALL getPropertyValue(
+ rtl::OUString const & PropertyName)
+ throw (
+ css::beans::UnknownPropertyException,
+ css::lang::WrappedTargetException, css::uno::RuntimeException);
+
+ virtual void SAL_CALL addPropertyChangeListener(
+ rtl::OUString const &,
+ css::uno::Reference< css::beans::XPropertyChangeListener > const &)
+ throw (
+ css::beans::UnknownPropertyException,
+ css::lang::WrappedTargetException, css::uno::RuntimeException)
+ {}
+
+ virtual void SAL_CALL removePropertyChangeListener(
+ rtl::OUString const &,
+ css::uno::Reference< css::beans::XPropertyChangeListener > const &)
+ throw (
+ css::beans::UnknownPropertyException,
+ css::lang::WrappedTargetException, css::uno::RuntimeException)
+ {}
+
+ virtual void SAL_CALL addVetoableChangeListener(
+ rtl::OUString const &,
+ css::uno::Reference< css::beans::XVetoableChangeListener > const &)
+ throw (
+ css::beans::UnknownPropertyException,
+ css::lang::WrappedTargetException, css::uno::RuntimeException)
+ {}
+
+ virtual void SAL_CALL removeVetoableChangeListener(
+ rtl::OUString const &,
+ css::uno::Reference< css::beans::XVetoableChangeListener > const &)
+ throw (
+ css::beans::UnknownPropertyException,
+ css::lang::WrappedTargetException, css::uno::RuntimeException)
+ {}
+
+ bool enabled_;
+};
+
+Service::Service(): enabled_(false) {
+ css::uno::Reference< css::uno::XCurrentContext > context(
+ css::uno::getCurrentContext());
+ if (context.is()) {
+ rtl::OUString desktop;
+ context->getValueByName(
+ rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM("system.desktop-environment"))) >>=
+ desktop;
+ enabled_ = desktop.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("TDE")) &&
+ KApplication::kApplication() != 0;
+ }
+}
+
+void Service::setPropertyValue(rtl::OUString const &, css::uno::Any const &)
+ throw (
+ css::beans::UnknownPropertyException, css::beans::PropertyVetoException,
+ css::lang::IllegalArgumentException, css::lang::WrappedTargetException,
+ css::uno::RuntimeException)
+{
+ throw css::lang::IllegalArgumentException(
+ rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM("setPropertyValue not supported")),
+ static_cast< cppu::OWeakObject * >(this), -1);
+}
+
+css::uno::Any Service::getPropertyValue(rtl::OUString const & PropertyName)
+ throw (
+ css::beans::UnknownPropertyException, css::lang::WrappedTargetException,
+ css::uno::RuntimeException)
+{
+ if (PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("EnableATToolSupport")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ExternalMailer")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("SourceViewFontHeight")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("SourceViewFontName")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("WorkPathVariable")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyName")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetFTPProxyPort")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyName")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPProxyPort")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyName")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetHTTPSProxyPort")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetNoProxy")) ||
+ PropertyName.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("ooInetProxyType")))
+ {
+ return css::uno::makeAny(
+ enabled_
+ ? tdeaccess::getValue(PropertyName)
+ : css::beans::Optional< css::uno::Any >());
+ }
+ throw css::beans::UnknownPropertyException(
+ PropertyName, static_cast< cppu::OWeakObject * >(this));
+}
+
+css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance(
+ css::uno::Reference< css::uno::XComponentContext > const &)
+{
+ return static_cast< cppu::OWeakObject * >(new Service);
+}
+
+static cppu::ImplementationEntry const services[] = {
+ { &createInstance, &getServiceImplementationName,
+ &getServiceSupportedServiceNames, &cppu::createSingleComponentFactory, 0,
+ 0 },
+ { 0, 0, 0, 0, 0, 0 }
+};
+
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(
+ char const * pImplName, void * pServiceManager, void * pRegistryKey)
+{
+ return cppu::component_getFactoryHelper(
+ pImplName, pServiceManager, pRegistryKey, services);
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL
+component_getImplementationEnvironment(
+ char const ** ppEnvTypeName, uno_Environment **)
+{
+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(
+ void * pServiceManager, void * pRegistryKey)
+{
+ return component_writeInfoHelper(pServiceManager, pRegistryKey, services);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/shell/source/backends/tdebe/tdebe1.component b/shell/source/backends/tdebe/tdebe1.component
new file mode 100755
index 0000000..9eb7ca2
--- /dev/null
+++ b/shell/source/backends/tdebe/tdebe1.component
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--**********************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+* Copyright 2011 Timothy Pearson
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+**********************************************************************-->
+
+<component loader="com.sun.star.loader.SharedLibrary"
+ xmlns="http://openoffice.org/2010/uno-components">
+ <implementation name="com.sun.star.comp.configuration.backend.TDEBackend">
+ <service name="com.sun.star.configuration.backend.TDEBackend"/>
+ </implementation>
+</component>
diff --git a/shell/source/unix/misc/makefile.mk b/shell/source/unix/misc/makefile.mk
index 840f372..df4efa8 100644
--- a/shell/source/unix/misc/makefile.mk
+++ b/shell/source/unix/misc/makefile.mk
@@ -45,7 +45,8 @@ SCRIPTFILES = \
$(BIN)$/open-url \
$(BIN)$/cde-open-url \
$(BIN)$/gnome-open-url \
- $(BIN)$/kde-open-url
+ $(BIN)$/kde-open-url \
+ $(BIN)$/tde-open-url
APP1TARGET = gnome-open-url.bin
APP1OBJS = \
diff --git a/shell/source/unix/misc/tde-open-url.sh b/shell/source/unix/misc/tde-open-url.sh
new file mode 100644
index 0000000..fa05bde
--- /dev/null
+++ b/shell/source/unix/misc/tde-open-url.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# special handling for mailto: uris
+if echo $1 | grep '^mailto:' > /dev/null; then
+ kmailservice "$1" &
+else
+ kfmclient openURL "$1" &
+fi
+
+exit 0
diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk
index 4ff643a..d871b05 100644
--- a/solenv/gbuild/gbuild.mk
+++ b/solenv/gbuild/gbuild.mk
@@ -268,6 +268,10 @@ ifneq ($(strip $(ENABLE_KDE)),)
gb_GLOBALDEFS += -DENABLE_KDE
endif
+ifneq ($(strip $(ENABLE_TDE)),)
+gb_GLOBALDEFS += -DENABLE_TDE
+endif
+
ifneq ($(strip $(ENABLE_KDE4)),)
gb_GLOBALDEFS += -DENABLE_KDE4
endif
diff --git a/solenv/inc/unx.mk b/solenv/inc/unx.mk
index 74ed8d5..d6ce918 100644
--- a/solenv/inc/unx.mk
+++ b/solenv/inc/unx.mk
@@ -179,4 +179,13 @@ SOLARLIB+=-L$(KDE_ROOT)/lib64
.ENDIF # "$(KDE_ROOT)"!=""
.ENDIF # "$(ENABLE_KDE)" != ""
+# enable building/linking TDE-dependent code in both OOo and SO build environment
+.IF "$(ENABLE_TDE)" != ""
+.IF "$(TDE_ROOT)"!=""
+TDE_CFLAGS:=-I$(TDE_ROOT)/include -I/usr/include/tqt -DQT_CLEAN_NAMESPACE
+TDE_LIBS:=-lkdeui -lkdecore -ltqt -lqt-mt
+SOLARLIB+=-L$(TDE_ROOT)/lib
+.ENDIF # "$(TDE_ROOT)"!=""
+.ENDIF # "$(ENABLE_TDE)" != ""
+
OOO_LIBRARY_PATH_VAR *= LD_LIBRARY_PATH
diff --git a/toolkit/source/layout/core/dialogbuttonhbox.cxx b/toolkit/source/layout/core/dialogbuttonhbox.cxx
index 9c19306..741fc1c 100644
--- a/toolkit/source/layout/core/dialogbuttonhbox.cxx
+++ b/toolkit/source/layout/core/dialogbuttonhbox.cxx
@@ -48,6 +48,8 @@ DialogButtonHBox::Ordering const DialogButtonHBox::DEFAULT_ORDERING =
DialogButtonHBox::WINDOWS;
#elif defined( ENABLE_KDE )
DialogButtonHBox::KDE;
+#elif defined( ENABLE_TDE )
+DialogButtonHBox::TDE;
#else /* !MACOSX && !SAL_W32 && !ENABLE_KDE */
DialogButtonHBox::GNOME;
#endif /* !MACOSX && !SAL_W32 && !ENABLE_KDE */
@@ -75,6 +77,8 @@ DialogButtonHBox::setOrdering( rtl::OUString const& ordering )
mnOrdering = GNOME;
else if ( ordering.equalsIgnoreAsciiCaseAscii( "KDE" ) )
mnOrdering = KDE;
+ else if ( ordering.equalsIgnoreAsciiCaseAscii( "TDE" ) )
+ mnOrdering = TDE;
else if ( ordering.equalsIgnoreAsciiCaseAscii( "MacOS" ) )
mnOrdering = MACOS;
else if ( ordering.equalsIgnoreAsciiCaseAscii( "Windows" ) )
@@ -135,6 +139,8 @@ DialogButtonHBox::orderChildren()
macosOrdering();
else if ( mnOrdering == KDE )
kdeOrdering();
+ else if ( mnOrdering == TDE )
+ tdeOrdering();
else if ( 1 || mnOrdering == GNOME )
gnomeOrdering();
}
@@ -229,6 +235,30 @@ DialogButtonHBox::kdeOrdering()
}
void
+DialogButtonHBox::tdeOrdering()
+{
+ std::list< Box_Base::ChildData * > ordered;
+ if ( mpHelp )
+ ordered.push_back( mpHelp );
+ if ( mpReset )
+ ordered.push_back( mpReset );
+ if ( mpFlow && ( mpHelp || mpReset ) )
+ ordered.push_back( mpFlow );
+ ordered.insert( ordered.end(), maOther.begin(), maOther.end() );
+ if ( mpAction )
+ ordered.push_back( mpAction );
+ if ( mpAffirmative )
+ ordered.push_back( mpAffirmative );
+ if ( mpApply )
+ ordered.push_back( mpApply );
+ if ( mpAlternate )
+ ordered.push_back( mpAlternate );
+ if ( mpCancel )
+ ordered.push_back( mpCancel );
+ maChildren = ordered;
+}
+
+void
DialogButtonHBox::macosOrdering()
{
std::list< Box_Base::ChildData * > ordered;
diff --git a/toolkit/source/layout/core/dialogbuttonhbox.hxx b/toolkit/source/layout/core/dialogbuttonhbox.hxx
index aead7fc..67845a1 100644
--- a/toolkit/source/layout/core/dialogbuttonhbox.hxx
+++ b/toolkit/source/layout/core/dialogbuttonhbox.hxx
@@ -45,11 +45,12 @@ public:
void SAL_CALL removeChild( css::uno::Reference< css::awt::XLayoutConstrains > const& xChild ) throw ( css::uno::RuntimeException );
private:
- enum Ordering { PLATFORM, GNOME, KDE, MACOS, WINDOWS };
+ enum Ordering { PLATFORM, GNOME, KDE, TDE, MACOS, WINDOWS };
void orderChildren();
void gnomeOrdering();
void kdeOrdering();
+ void tdeOrdering();
void macosOrdering();
void windowsOrdering();
diff --git a/vcl/Library_vclplug_kde.mk b/vcl/Library_vclplug_kde.mk
index 19c42e0..014a96e 100644
--- a/vcl/Library_vclplug_kde.mk
+++ b/vcl/Library_vclplug_kde.mk
@@ -4,6 +4,7 @@
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# Copyright 2000, 2010 Oracle and/or its affiliates.
+# Copyright 2011 Timothy Pearson
#
# OpenOffice.org - a multi-platform office productivity suite
#
@@ -26,9 +27,9 @@
#
#*************************************************************************
-$(eval $(call gb_Library_Library,vclplug_kde))
+$(eval $(call gb_Library_Library,vclplug_tde))
-$(eval $(call gb_Library_set_include,vclplug_kde,\
+$(eval $(call gb_Library_set_include,vclplug_tde,\
$$(INCLUDE) \
-I$(SRCDIR)/vcl/inc \
-I$(SRCDIR)/vcl/inc/pch \
@@ -36,25 +37,25 @@ $(eval $(call gb_Library_set_include,vclplug_kde,\
-I$(OUTDIR)/inc \
))
-$(eval $(call gb_Library_set_include,vclplug_kde,\
+$(eval $(call gb_Library_set_include,vclplug_tde,\
$$(INCLUDE) \
- $$(KDE_CFLAGS) \
+ $$(TDE_CFLAGS) \
))
-$(eval $(call gb_Library_add_defs,vclplug_kde,\
- -DVCLPLUG_KDE_IMPLEMENTATION \
+$(eval $(call gb_Library_add_defs,vclplug_tde,\
+ -DVCLPLUG_TDE_IMPLEMENTATION \
))
-$(eval $(call gb_Library_add_api,vclplug_kde,\
+$(eval $(call gb_Library_add_api,vclplug_tde,\
offapi \
udkapi \
))
-$(eval $(call gb_Library_add_libs,vclplug_kde,\
- $$(KDE_LIBS) \
+$(eval $(call gb_Library_add_libs,vclplug_tde,\
+ $$(TDE_LIBS) \
))
-$(eval $(call gb_Library_add_linked_libs,vclplug_kde,\
+$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\
vclplug_gen \
vcl \
tl \
@@ -76,18 +77,18 @@ $(eval $(call gb_Library_add_linked_libs,vclplug_kde,\
ICE \
))
-$(eval $(call gb_Library_use_externals,vclplug_kde,\
+$(eval $(call gb_Library_use_externals,vclplug_tde,\
icule \
icuuc \
))
-$(eval $(call gb_Library_add_exception_objects,vclplug_kde,\
- vcl/unx/kde/kdedata \
- vcl/unx/kde/salnativewidgets-kde \
+$(eval $(call gb_Library_add_exception_objects,vclplug_tde,\
+ vcl/unx/tde/tdedata \
+ vcl/unx/tde/salnativewidgets-tde \
))
ifeq ($(OS),LINUX)
-$(eval $(call gb_Library_add_linked_libs,vclplug_kde,\
+$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\
dl \
m \
pthread \
diff --git a/vcl/Library_vclplug_tde.mk b/vcl/Library_vclplug_tde.mk
new file mode 100644
index 0000000..9a324a8
--- /dev/null
+++ b/vcl/Library_vclplug_tde.mk
@@ -0,0 +1,96 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+$(eval $(call gb_Library_Library,vclplug_tde))
+
+$(eval $(call gb_Library_set_include,vclplug_tde,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/vcl/inc \
+ -I$(SRCDIR)/vcl/inc/pch \
+ -I$(SRCDIR)/solenv/inc \
+ -I$(OUTDIR)/inc \
+))
+
+$(eval $(call gb_Library_set_include,vclplug_tde,\
+ $$(INCLUDE) \
+ $$(TDE_CFLAGS) \
+))
+
+$(eval $(call gb_Library_add_defs,vclplug_tde,\
+ -DVCLPLUG_TDE_IMPLEMENTATION \
+))
+
+$(eval $(call gb_Library_add_api,vclplug_tde,\
+ offapi \
+ udkapi \
+))
+
+$(eval $(call gb_Library_add_libs,vclplug_tde,\
+ $$(TDE_LIBS) \
+))
+
+$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\
+ vclplug_gen \
+ vcl \
+ tl \
+ utl \
+ sot \
+ ucbhelper \
+ basegfx \
+ comphelper \
+ cppuhelper \
+ i18nisolang1 \
+ i18npaper \
+ i18nutil \
+ jvmaccess \
+ cppu \
+ sal \
+ X11 \
+ Xext \
+ SM \
+ ICE \
+))
+
+$(eval $(call gb_Library_use_externals,vclplug_tde,\
+ icule \
+ icuuc \
+))
+
+$(eval $(call gb_Library_add_exception_objects,vclplug_tde,\
+ vcl/unx/tde/tdedata \
+ vcl/unx/tde/salnativewidgets-tde \
+))
+
+ifeq ($(OS),LINUX)
+$(eval $(call gb_Library_add_linked_libs,vclplug_tde,\
+ dl \
+ m \
+ pthread \
+))
+endif
+# vim: set noet sw=4 ts=4:
diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk
index 0a91f87..1de0022 100644
--- a/vcl/Module_vcl.mk
+++ b/vcl/Module_vcl.mk
@@ -59,6 +59,11 @@ $(eval $(call gb_Module_add_targets,vcl,\
Library_vclplug_kde \
))
endif
+ifneq ($(ENABLE_TDE),)
+$(eval $(call gb_Module_add_targets,vcl,\
+ Library_vclplug_tde \
+))
+endif
ifneq ($(ENABLE_KDE4),)
$(eval $(call gb_Module_add_targets,vcl,\
Library_vclplug_kde4 \
diff --git a/vcl/inc/generic/gendata.hxx b/vcl/inc/generic/gendata.hxx
index c52e891..e5b7b25 100644
--- a/vcl/inc/generic/gendata.hxx
+++ b/vcl/inc/generic/gendata.hxx
@@ -38,7 +38,7 @@ class SalGenericDisplay;
class SalDisplay;
class GtkSalDisplay;
enum SalGenericDataType { SAL_DATA_GTK, SAL_DATA_GTK3,
- SAL_DATA_KDE3, SAL_DATA_KDE4,
+ SAL_DATA_KDE3, SAL_DATA_TDE, SAL_DATA_KDE4,
SAL_DATA_UNX, SAL_DATA_SVP };
class VCL_DLLPUBLIC SalGenericData : public SalData
diff --git a/vcl/inc/unx/desktops.hxx b/vcl/inc/unx/desktops.hxx
index de4ebb8..1d29c7d 100644
--- a/vcl/inc/unx/desktops.hxx
+++ b/vcl/inc/unx/desktops.hxx
@@ -34,6 +34,7 @@ enum DesktopType {
DESKTOP_UNKNOWN, // unknown desktop, simple WM, etc.
DESKTOP_GNOME,
DESKTOP_KDE,
+ DESKTOP_TDE,
DESKTOP_KDE4,
DESKTOP_CDE
}; // keep in sync with desktop_strings[] in salplug.cxx
diff --git a/vcl/inc/unx/tde/tde_headers.h b/vcl/inc/unx/tde/tde_headers.h
new file mode 100644
index 0000000..9c9f008
--- /dev/null
+++ b/vcl/inc/unx/tde/tde_headers.h
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_VCL_TDE_HEADERS_H
+#define INCLUDED_VCL_TDE_HEADERS_H
+
+/* ********* Suppress warnings if needed */
+#include "sal/config.h"
+
+#include <cstddef>
+
+#if defined __GNUC__
+#pragma GCC system_header
+#endif
+
+
+/* ********* Hack, but needed because of conflicting types... */
+#define Region TQtXRegion
+
+
+/* ********* TQt headers */
+#include <tqaccessible.h>
+#include <tqcheckbox.h>
+#include <tqcombobox.h>
+#include <tqfont.h>
+#include <tqframe.h>
+#include <tqlineedit.h>
+#include <tqlistview.h>
+#include <tqmainwindow.h>
+#include <tqmenudata.h>
+#include <tqpaintdevice.h>
+#include <tqpainter.h>
+#include <tqpushbutton.h>
+#include <tqradiobutton.h>
+#include <tqrangecontrol.h>
+#include <tqstring.h>
+#include <tqtabbar.h>
+#include <tqtabwidget.h>
+#include <tqtoolbar.h>
+#include <tqtoolbutton.h>
+#include <tqwidget.h>
+#include <tqprogressbar.h>
+
+/* ********* See hack on top of this file */
+#undef Region
+
+
+/* ********* TDE base headers */
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kconfig.h>
+#include <kdeversion.h>
+#include <kemailsettings.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kmenubar.h>
+#include <kprotocolmanager.h>
+#include <kstartupinfo.h>
+#include <kstyle.h>
+
+
+/* ********* TDE address book connectivity headers */
+#include <kabc/addressbook.h>
+#include <kabc/addressee.h>
+#include <kabc/field.h>
+#include <kabc/stdaddressbook.h>
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/unx/tde/tdedata.hxx b/vcl/inc/unx/tde/tdedata.hxx
new file mode 100644
index 0000000..fccdb49
--- /dev/null
+++ b/vcl/inc/unx/tde/tdedata.hxx
@@ -0,0 +1,114 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _VCL_TDEDATA_HXX
+#define _VCL_TDEDATA_HXX
+
+#include <unx/saldisp.hxx>
+#include <unx/saldata.hxx>
+#include <unx/salframe.h>
+
+class TDEData : public X11SalData
+{
+public:
+ TDEData( SalInstance *pInstance ) : X11SalData( SAL_DATA_TDE, pInstance ) {}
+ virtual ~TDEData();
+
+ virtual void Init();
+ virtual void initNWF();
+ virtual void deInitNWF();
+};
+
+class SalTDEDisplay : public SalX11Display
+{
+public:
+ SalTDEDisplay( Display* pDisp );
+ virtual ~SalTDEDisplay();
+};
+
+class TDESalFrame : public X11SalFrame
+{
+ static const int nMaxGraphics = 2;
+
+ struct GraphicsHolder
+ {
+ X11SalGraphics* pGraphics;
+ bool bInUse;
+ GraphicsHolder()
+ : pGraphics( NULL ),
+ bInUse( false )
+ {}
+ ~GraphicsHolder();
+ };
+ GraphicsHolder m_aGraphics[ nMaxGraphics ];
+
+public:
+ TDESalFrame( SalFrame* pParent, sal_uLong );
+ virtual ~TDESalFrame();
+
+ virtual SalGraphics* GetGraphics();
+ virtual void ReleaseGraphics( SalGraphics *pGraphics );
+ virtual void updateGraphics( bool bClear );
+ virtual void UpdateSettings( AllSettings& rSettings );
+ virtual void Show( sal_Bool bVisible, sal_Bool bNoActivate );
+};
+
+class TDESalInstance : public X11SalInstance
+{
+public:
+ TDESalInstance( SalYieldMutex* pMutex )
+ : X11SalInstance( pMutex ) {}
+ virtual ~TDESalInstance() {}
+ virtual SalFrame* CreateFrame( SalFrame* pParent, sal_uLong nStyle );
+};
+
+class TDEXLib : public SalXLib
+{
+ bool m_bStartupDone;
+ void* m_pApplication;
+ char** m_pFreeCmdLineArgs;
+ char** m_pAppCmdLineArgs;
+ int m_nFakeCmdLineArgs;
+public:
+ TDEXLib() : SalXLib(),
+ m_bStartupDone( false ),
+ m_pApplication( NULL ),
+ m_pFreeCmdLineArgs( NULL ),
+ m_pAppCmdLineArgs( NULL ),
+ m_nFakeCmdLineArgs( 0 )
+ {}
+ virtual ~TDEXLib();
+ virtual void Init();
+
+ void doStartup();
+};
+
+#endif // _VCL_TDEDATA_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/vclpluginapi.h b/vcl/inc/vclpluginapi.h
index 462943b..ae4123e 100644
--- a/vcl/inc/vclpluginapi.h
+++ b/vcl/inc/vclpluginapi.h
@@ -50,6 +50,12 @@
#define VCLPLUG_KDE_PUBLIC SAL_DLLPUBLIC_IMPORT
#endif
+#if defined VCLPLUG_TDE_IMPLEMENTATION
+#define VCLPLUG_TDE_PUBLIC SAL_DLLPUBLIC_EXPORT
+#else
+#define VCLPLUG_TDE_PUBLIC SAL_DLLPUBLIC_IMPORT
+#endif
+
#if defined VCLPLUG_KDE4_IMPLEMENTATION
#define VCLPLUG_KDE4_PUBLIC SAL_DLLPUBLIC_EXPORT
#else
diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx
index 1795d5a..62ebffd 100644
--- a/vcl/source/app/settings.cxx
+++ b/vcl/source/app/settings.cxx
@@ -831,6 +831,8 @@ sal_uLong StyleSettings::GetAutoSymbolsStyle() const
nRet = STYLE_SYMBOLS_CRYSTAL;
else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "kde4" ) )
nRet = STYLE_SYMBOLS_OXYGEN;
+ else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "tde" ) )
+ nRet = STYLE_SYMBOLS_CRYSTAL;
}
// falback to any existing style
diff --git a/vcl/unx/generic/desktopdetect/desktopdetector.cxx b/vcl/unx/generic/desktopdetect/desktopdetector.cxx
index 12ea4fc..2b9e2c9 100644
--- a/vcl/unx/generic/desktopdetect/desktopdetector.cxx
+++ b/vcl/unx/generic/desktopdetect/desktopdetector.cxx
@@ -210,6 +210,15 @@ static bool is_kde_desktop( Display* pDisplay )
return false;
}
+static bool is_tde_desktop( Display* pDisplay )
+{
+ if ( NULL != getenv( "TDE_FULL_SESSION" ) )
+ {
+ return true;
+ }
+ return false;
+}
+
static bool is_kde4_desktop( Display* pDisplay )
{
if ( NULL != getenv( "KDE_FULL_SESSION" ) )
@@ -238,6 +247,8 @@ DESKTOP_DETECTOR_PUBLIC DesktopType get_desktop_environment()
{
OString aOver( pOverride );
+ if ( aOver.equalsIgnoreAsciiCase( "tde" ) )
+ return DESKTOP_TDE;
if ( aOver.equalsIgnoreAsciiCase( "kde4" ) )
return DESKTOP_KDE4;
if ( aOver.equalsIgnoreAsciiCase( "gnome" ) )
@@ -301,7 +312,9 @@ DESKTOP_DETECTOR_PUBLIC DesktopType get_desktop_environment()
XErrorHandler pOldHdl = XSetErrorHandler( autodect_error_handler );
- if ( is_kde4_desktop( pDisplay ) )
+ if ( is_tde_desktop( pDisplay ) )
+ ret = DESKTOP_TDE;
+ else if ( is_kde4_desktop( pDisplay ) )
ret = DESKTOP_KDE4;
else if ( is_gnome_desktop( pDisplay ) )
ret = DESKTOP_GNOME;
diff --git a/vcl/unx/generic/plugadapt/salplug.cxx b/vcl/unx/generic/plugadapt/salplug.cxx
index 90f0d3e..875a9fb 100644
--- a/vcl/unx/generic/plugadapt/salplug.cxx
+++ b/vcl/unx/generic/plugadapt/salplug.cxx
@@ -148,7 +148,12 @@ static SalInstance* autodetect_plugin()
{
static const char* pKDEFallbackList[] =
{
- "kde4", "kde", "gtk3", "gtk", "gen", 0
+ "kde4", "kde", "tde", "gtk3", "gtk", "gen", 0
+ };
+
+ static const char* pTDEFallbackList[] =
+ {
+ "tde", "gtk3", "gtk", "gen", 0
};
static const char* pStandardFallbackList[] =
@@ -177,6 +182,8 @@ static SalInstance* autodetect_plugin()
}
else if( desktop == DESKTOP_KDE4 )
pList = pKDEFallbackList;
+ else if( desktop == DESKTOP_TDE )
+ pList = pTDEFallbackList;
SalInstance* pInst = NULL;
while( pList[nListEntry] && pInst == NULL )
@@ -224,7 +231,7 @@ SalInstance *CreateSalInstance()
pInst = autodetect_plugin();
// fallback, try everything
- const char* pPlugin[] = { "gtk3", "gtk", "kde4", "kde", "gen", 0 };
+ const char* pPlugin[] = { "gtk3", "gtk", "kde4", "kde", "tde", "gen", 0 };
for ( int i = 0; !pInst && pPlugin[ i ]; ++i )
pInst = tryInstance( OUString::createFromAscii( pPlugin[ i ] ) );
@@ -279,7 +286,7 @@ void SalAbort( const XubString& rErrorText, bool bDumpCore )
_exit(1);
}
-static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4" };
+static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "TDE", "KDE4" };
const OUString& SalGetDesktopEnvironment()
{
diff --git a/vcl/unx/tde/salnativewidgets-tde.cxx b/vcl/unx/tde/salnativewidgets-tde.cxx
new file mode 100644
index 0000000..7c173cc
--- /dev/null
+++ b/vcl/unx/tde/salnativewidgets-tde.cxx
@@ -0,0 +1,2119 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_vcl.hxx"
+
+#define _SV_SALNATIVEWIDGETS_TDE_CXX
+#include <shell/tde_headers.h>
+
+#include <unx/salunx.h>
+#include <unx/saldata.hxx>
+#include <unx/saldisp.hxx>
+#include <unx/salgdi.h>
+#include <unx/tde/tdedata.hxx>
+
+#include <vcl/settings.hxx>
+#include <vcl/fontmanager.hxx>
+#include <vcl/vclenum.hxx>
+#include <rtl/ustrbuf.hxx>
+
+#define USHORT unsigned short
+#define BYTE unsigned char
+
+using namespace ::rtl;
+
+/** Cached native widgets.
+
+ A class which caches and paints the native widgets.
+*/
+class WidgetPainter
+{
+ protected:
+ /** Cached push button.
+
+ It is necessary for the TQStyle::drawControl(). The buttons are created
+ on demand and they are still hidden (no TQWidget::show() is called).
+ */
+ TQPushButton *m_pPushButton;
+
+ /** Cached radio button.
+
+ @see m_pPushButton
+ */
+ TQRadioButton *m_pRadioButton;
+
+ /** Cached check box.
+
+ @see m_pPushButton
+ */
+ TQCheckBox *m_pCheckBox;
+
+ /** Cached combo box.
+
+ @see m_pPushButton
+ */
+ TQComboBox *m_pComboBox;
+
+ /** Cached editable combo box.
+
+ Needed, because some styles do not like dynamic changes
+ (TQComboBox::setEditable()).
+
+ @see m_pPushButton
+ */
+ TQComboBox *m_pEditableComboBox;
+
+ /** Cached line edit box.
+
+ @see m_pPushButton
+ */
+ TQLineEdit *m_pLineEdit;
+
+ /** Cached spin box.
+
+ @see m_pPushButton
+ */
+ TQSpinWidget *m_pSpinWidget;
+
+ /** Cached spin box'es line edit.
+
+ @see m_pPushButton
+ */
+ TQLineEdit *m_pSpinEdit;
+
+ /** Cached tab.
+
+ Left, middle, right tab and a tab which is alone.
+
+ @see m_pPushButton
+ */
+ TQTab *m_pTabLeft, *m_pTabMiddle, *m_pTabRight, *m_pTabAlone;
+
+ /** Cached tab bar's parent widget.
+
+ Needed, because the Qt windows style checks for the availability
+ of tab bar's parent. We cannot use m_pTabWidget, because
+ TabWidget::setTabBar() and TabWidget::tabBar() methods are
+ protected.
+
+ @see m_pPushButton, m_pTabWidget
+ */
+ TQWidget *m_pTabBarParent;
+
+ /** Cached tab bar widget.
+
+ @see m_pPushButton
+ */
+ TQTabBar *m_pTabBar;
+
+ /** Cached tab widget.
+
+ We need it to draw the tab page. It cannot be used to draw the
+ tabs themselves, because the drawing has to be tweaked a little
+ due to not enough information from VCL.
+
+ @see m_pPushButton, m_pTabBarParent
+ */
+ TQTabWidget *m_pTabWidget;
+
+ /** Cached list view.
+
+ @see m_pPushButton
+ */
+ TQListView *m_pListView;
+
+ /** Cached scroll bar.
+
+ @see m_pPushButton
+ */
+ TQScrollBar *m_pScrollBar;
+
+ /** Cached dock area. Needed for proper functionality of tool bars.
+
+ @see m_pPushButton
+ */
+ TQMainWindow *m_pMainWindow;
+
+ /** Cached tool bar.
+
+ @see m_pPushButton
+ */
+ TQToolBar *m_pToolBarHoriz, *m_pToolBarVert;
+
+ /** Cached tool button.
+
+ @see m_pPushButton
+ */
+ TQToolButton *m_pToolButton;
+
+ /** Cached menu bar.
+
+ @see m_pPushButton
+ */
+ TQMenuBar *m_pMenuBar;
+
+ /** Identifiers of menu bar items.
+ */
+ int m_nMenuBarEnabledItem, m_nMenuBarDisabledItem;
+
+ /** Cached popup menu.
+
+ @see m_pPushButton
+ */
+ TQPopupMenu *m_pPopupMenu;
+
+ /** Identifiers of popup menu items.
+ */
+ int m_nPopupMenuEnabledItem, m_nPopupMenuDisabledItem;
+
+ /** cached progress bar
+ */
+ TQProgressBar *m_pProgressBar;
+
+ // TODO other widgets
+
+ public:
+ /** Implicit constructor.
+
+ It creates an empty WidgetPainter with all the cached widgets initialized
+ to NULL. The widgets are created on demand and they are still hidden
+ (no TQWidget::show()), because they are needed just as a parameter for
+ TQStyle::drawControl().
+
+ @see m_pPushButton
+ */
+ WidgetPainter( void );
+
+ /** Destructor.
+
+ Destruct all the cached widgets.
+ */
+ virtual ~WidgetPainter( void );
+
+ /** Paints the specified widget to the X window.
+
+ Use X calls to bitblt (bit block transfer) the widget qWidget to
+ the window specified by drawable with the style defined by nStyle.
+
+ @param qWidget
+ A pointer to the cached widget.
+
+ @param nState
+ The state of the control (focused, on/off, ...)
+
+ @param aValue
+ The value (true/false, ...)
+
+ @param dpy
+ The display to be used by the X calls.
+
+ @param drawable
+ The destination X window.
+
+ @param gc
+ The graphics context.
+ */
+ sal_Bool drawStyledWidget( TQWidget *pWidget,
+ ControlState nState, const ImplControlValue& aValue,
+ Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc,
+ ControlPart nPart = PART_ENTIRE_CONTROL );
+
+ /** 'Get' method for push button.
+
+ The method returns the cached push button. It is constructed if it
+ does not exist. It has NULL as a parent and it stays hidden, but it
+ is necessary for the drawStyledWidget() method.
+
+ @return valid push button.
+ */
+ TQPushButton *pushButton( const Rectangle& rControlRegion, sal_Bool bDefault );
+
+ /** 'Get' method for radio button.
+
+ @see pushButton()
+ */
+ TQRadioButton *radioButton( const Rectangle& rControlRegion );
+
+ /** 'Get' method for check box.
+
+ @see pushButton()
+ */
+ TQCheckBox *checkBox( const Rectangle& rControlRegion );
+
+ /** 'Get' method for combo box.
+
+ It returns m_pComboBox or m_pEditableComboBox according to
+ bEditable.
+
+ @see pushButton(), m_pEditableComboBox
+ */
+ TQComboBox *comboBox( const Rectangle& rControlRegion, sal_Bool bEditable );
+
+ /** 'Get' method for line edit box.
+
+ @see pushButton()
+ */
+ TQLineEdit *lineEdit( const Rectangle& rControlRegion );
+
+ /** 'Get' method for spin box.
+
+ @see pushButton()
+ */
+ TQSpinWidget *spinWidget( const Rectangle& rControlRegion );
+
+ /** 'Get' method for tab bar.
+
+ @see pushButton()
+ */
+ TQTabBar *tabBar( const Rectangle& rControlRegion );
+
+ /** 'Get' method for tab widget.
+
+ @see pushButton()
+ */
+ TQTabWidget *tabWidget( const Rectangle& rControlRegion );
+
+ /** 'Get' method for list view.
+
+ @see pushButton()
+ */
+ TQListView *listView( const Rectangle& rControlRegion );
+
+ /** 'Get' method for scroll bar.
+
+ @see pushButton()
+ */
+ TQScrollBar *scrollBar( const Rectangle& rControlRegion,
+ sal_Bool bHorizontal, const ImplControlValue& aValue );
+
+ /** 'Get' method for tool bar.
+
+ @see pushButton()
+ */
+ TQToolBar *toolBar( const Rectangle& rControlRegion, sal_Bool bHorizontal );
+
+ /** 'Get' method for tool button.
+
+ @see pushButton()
+ */
+ TQToolButton *toolButton( const Rectangle& rControlRegion );
+
+ /** 'Get' method for menu bar.
+
+ @see pushButton()
+ */
+ TQMenuBar *menuBar( const Rectangle& rControlRegion );
+
+ /** 'Get' method for popup menu.
+
+ @see pushButton()
+ */
+ TQPopupMenu *popupMenu( const Rectangle& rControlRegion );
+
+ /** 'Get' method for progress bar
+
+ @see pushButton()
+ */
+ TQProgressBar *progressBar( const Rectangle& rControlRegion );
+
+ // TODO other widgets
+
+ protected:
+ /** Style conversion function.
+
+ Conversion function between VCL ControlState together with
+ ImplControlValue and Qt state flags.
+
+ @param nState
+ State of the widget (default, focused, ...) as defined in Native
+ Widget Framework.
+
+ @param aValue
+ Value held by the widget (on, off, ...)
+ */
+ TQStyle::SFlags vclStateValue2SFlags( ControlState nState, const ImplControlValue& aValue );
+
+ public:
+ /** Convert VCL Rectangle to TQRect.
+
+ @param rControlRegion
+ The region to convert.
+
+ @return
+ The bounding box of the region.
+ */
+ static TQRect region2TQRect( const Rectangle& rControlRegion );
+};
+
+WidgetPainter::WidgetPainter( void )
+ : m_pPushButton( NULL ),
+ m_pRadioButton( NULL ),
+ m_pCheckBox( NULL ),
+ m_pComboBox( NULL ),
+ m_pEditableComboBox( NULL ),
+ m_pLineEdit( NULL ),
+ m_pSpinWidget( NULL ),
+ m_pSpinEdit( NULL ),
+ m_pTabLeft( NULL ),
+ m_pTabMiddle( NULL ),
+ m_pTabRight( NULL ),
+ m_pTabAlone( NULL ),
+ m_pTabBarParent( NULL ),
+ m_pTabBar( NULL ),
+ m_pTabWidget( NULL ),
+ m_pListView( NULL ),
+ m_pScrollBar( NULL ),
+ m_pMainWindow( NULL ),
+ m_pToolBarHoriz( NULL ),
+ m_pToolBarVert( NULL ),
+ m_pToolButton( NULL ),
+ m_pMenuBar( NULL ),
+ m_pPopupMenu( NULL ),
+ m_pProgressBar( NULL )
+{
+}
+
+WidgetPainter::~WidgetPainter( void )
+{
+ delete m_pPushButton, m_pPushButton = NULL;
+ delete m_pRadioButton, m_pRadioButton = NULL;
+ delete m_pCheckBox, m_pCheckBox = NULL;
+ delete m_pComboBox, m_pComboBox = NULL;
+ delete m_pEditableComboBox, m_pEditableComboBox = NULL;
+ delete m_pLineEdit, m_pLineEdit = NULL;
+ delete m_pSpinWidget, m_pSpinWidget = NULL;
+ m_pSpinEdit = NULL; // Deleted in m_pSpinWidget's destructor
+ delete m_pTabAlone, m_pTabAlone = NULL;
+ delete m_pTabBarParent, m_pTabBarParent = NULL;
+ m_pTabBar = NULL; // Deleted in m_pTabBarParent's destructor
+ m_pTabLeft = NULL;
+ m_pTabMiddle = NULL;
+ m_pTabRight = NULL;
+ delete m_pTabWidget, m_pTabWidget = NULL;
+ delete m_pListView, m_pListView = NULL;
+ delete m_pScrollBar, m_pScrollBar = NULL;
+ delete m_pToolBarHoriz, m_pToolBarHoriz = NULL;
+ delete m_pToolBarVert, m_pToolBarVert = NULL;
+ delete m_pMainWindow, m_pMainWindow = NULL;
+ delete m_pToolButton, m_pToolButton = NULL;
+ delete m_pMenuBar, m_pMenuBar = NULL;
+ delete m_pPopupMenu, m_pPopupMenu = NULL;
+ delete m_pProgressBar, m_pProgressBar = NULL;
+}
+
+sal_Bool WidgetPainter::drawStyledWidget( TQWidget *pWidget,
+ ControlState nState, const ImplControlValue& aValue,
+ Display *dpy, XLIB_Window drawable, int nScreen, int nDepth, GC gc,
+ ControlPart nPart )
+{
+ if ( !pWidget )
+ return FALSE;
+
+ // Normalize the widget
+ TQPoint qWidgetPos( pWidget->pos() );
+ pWidget->move( 0, 0 );
+
+ // Enable/disable the widget
+ pWidget->setEnabled( nState & CTRL_STATE_ENABLED );
+
+ // Create pixmap to paint to
+ TQPixmap qPixmap( pWidget->width(), pWidget->height() );
+ TQPainter qPainter( &qPixmap );
+ TQRect qRect( 0, 0, pWidget->width(), pWidget->height() );
+
+ // Use the background of the widget
+ qPixmap.fill( pWidget, TQPoint(0, 0) );
+
+ // Convert the flags
+ TQStyle::SFlags nStyle = vclStateValue2SFlags( nState, aValue );
+
+ // Store the widget class
+ const char *pClassName = pWidget->className();
+
+ // Draw the widget to the pixmap
+ if ( strcmp( TQPUSHBUTTON_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ // Workaround for the Platinum style.
+ // Platinum takes the state directly from the widget, not from SFlags.
+ TQPushButton *pPushButton = static_cast<TQPushButton *>( pWidget->qt_cast( TQPUSHBUTTON_OBJECT_NAME_STRING ) );
+ if ( pPushButton )
+ {
+ pPushButton->setDown ( nStyle & TQStyle::Style_Down );
+ pPushButton->setOn ( nStyle & TQStyle::Style_On );
+ pPushButton->setEnabled( nStyle & TQStyle::Style_Enabled );
+ }
+
+ kapp->style().drawControl( TQStyle::CE_PushButton,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle );
+ }
+ else if ( strcmp( TQRADIOBUTTON_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ // Bitblt from the screen, because the radio buttons are usually not
+ // rectangular, and there could be a bitmap under them
+ GC aTmpGC = XCreateGC( dpy, qPixmap.handle(), 0, NULL );
+ X11SalGraphics::CopyScreenArea( dpy,
+ drawable, nScreen, nDepth,
+ qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(),
+ aTmpGC,
+ qWidgetPos.x(), qWidgetPos.y(), qRect.width(), qRect.height(),
+ 0, 0 );
+ XFreeGC( dpy, aTmpGC );
+
+ kapp->style().drawControl( TQStyle::CE_RadioButton,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle );
+ }
+ else if ( strcmp( TQCHECKBOX_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ kapp->style().drawControl( TQStyle::CE_CheckBox,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle );
+ }
+ else if ( strcmp( TQCOMBOBOX_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ kapp->style().drawComplexControl( TQStyle::CC_ComboBox,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle );
+
+ // Editable combo box uses the background of the associated edit box
+ TQComboBox *pComboBox = static_cast<TQComboBox *>( pWidget->qt_cast( TQCOMBOBOX_OBJECT_NAME_STRING ) );
+ if ( pComboBox && pComboBox->editable() && pComboBox->lineEdit() )
+ {
+ TQColorGroup::ColorRole eColorRole = ( pComboBox->isEnabled() )?
+ TQColorGroup::Base: TQColorGroup::Background;
+ qPainter.fillRect(
+ kapp->style().querySubControlMetrics( TQStyle::CC_ComboBox,
+ pComboBox, TQStyle::SC_ComboBoxEditField ),
+ pComboBox->lineEdit()->colorGroup().brush( eColorRole ) );
+ }
+ }
+ else if ( strcmp( TQLINEEDIT_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ kapp->style().drawPrimitive( TQStyle::PE_PanelLineEdit,
+ &qPainter, qRect,
+ pWidget->colorGroup(), nStyle | TQStyle::Style_Sunken );
+ }
+ else if ( strcmp( TQSPINWIDGET_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ const SpinbuttonValue *pValue = static_cast<const SpinbuttonValue *> ( &aValue );
+
+ // Is any of the buttons pressed?
+ TQStyle::SCFlags eActive = TQStyle::SC_None;
+ if ( pValue )
+ {
+ if ( pValue->mnUpperState & CTRL_STATE_PRESSED )
+ eActive = TQStyle::SC_SpinWidgetUp;
+ else if ( pValue->mnLowerState & CTRL_STATE_PRESSED )
+ eActive = TQStyle::SC_SpinWidgetDown;
+
+ // Update the enable/disable state of the widget
+ if ( ( nState & CTRL_STATE_ENABLED ) ||
+ ( pValue->mnUpperState & CTRL_STATE_ENABLED ) ||
+ ( pValue->mnLowerState & CTRL_STATE_ENABLED ) )
+ {
+ pWidget->setEnabled( true );
+ nStyle |= TQStyle::Style_Enabled;
+ }
+ else
+ pWidget->setEnabled( false );
+
+ // Mouse-over effect
+ if ( (pValue->mnUpperState & CTRL_STATE_ROLLOVER) ||
+ (pValue->mnLowerState & CTRL_STATE_ROLLOVER) )
+ nStyle |= TQStyle::Style_MouseOver;
+ }
+
+ // Spin widget uses the background of the associated edit box
+ TQSpinWidget *pSpinWidget = static_cast<TQSpinWidget *>( pWidget->qt_cast( TQSPINWIDGET_OBJECT_NAME_STRING ) );
+ if ( pSpinWidget && pSpinWidget->editWidget() )
+ {
+ TQColorGroup::ColorRole eColorRole = ( pSpinWidget->isEnabled() )?
+ TQColorGroup::Base: TQColorGroup::Background;
+ qPainter.fillRect(
+ kapp->style().querySubControlMetrics( TQStyle::CC_SpinWidget,
+ pSpinWidget, TQStyle::SC_SpinWidgetEditField ),
+ pSpinWidget->editWidget()->colorGroup().brush( eColorRole ) );
+ }
+
+ // Adjust the frame (needed for Motif Plus style)
+ TQRect qFrameRect = kapp->style().querySubControlMetrics( TQStyle::CC_SpinWidget,
+ pWidget, TQStyle::SC_SpinWidgetFrame );
+
+ kapp->style().drawComplexControl( TQStyle::CC_SpinWidget,
+ &qPainter, pWidget, qFrameRect,
+ pWidget->colorGroup(), nStyle,
+ TQStyle::SC_All, eActive );
+ }
+ else if ( strcmp( TQTABBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ const TabitemValue *pValue = static_cast<const TabitemValue *> ( &aValue );
+
+ TQTab *pTab = NULL;
+ if ( pValue )
+ {
+ if ( ( pValue->isFirst() || pValue->isLeftAligned() ) && ( pValue->isLast() || pValue->isRightAligned() ) )
+ pTab = m_pTabAlone;
+ else if ( pValue->isFirst() || pValue->isLeftAligned() )
+ pTab = m_pTabLeft;
+ else if ( pValue->isLast() || pValue->isRightAligned() )
+ pTab = m_pTabRight;
+ else
+ pTab = m_pTabMiddle;
+ }
+ if ( !pTab )
+ return FALSE;
+
+ pTab->setRect( qRect );
+
+ kapp->style().drawControl( TQStyle::CE_TabBarTab,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle,
+ TQStyleOption( pTab ) );
+ }
+ else if ( strcmp( TQTABWIDGET_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ kapp->style().drawPrimitive( TQStyle::PE_PanelTabWidget,
+ &qPainter, qRect,
+ pWidget->colorGroup(), nStyle );
+ }
+ else if ( strcmp( TQLISTVIEW_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ kapp->style().drawPrimitive( TQStyle::PE_Panel,
+ &qPainter, qRect,
+ pWidget->colorGroup(), nStyle | TQStyle::Style_Sunken );
+ }
+ else if ( strcmp( TQSCROLLBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ const ScrollbarValue *pValue = static_cast<const ScrollbarValue *> ( &aValue );
+
+ TQStyle::SCFlags eActive = TQStyle::SC_None;
+ if ( pValue )
+ {
+ // Workaround for Style_MouseOver-aware themes.
+ // Quite ugly, but I do not know about a better solution.
+ const char *pStyleName = kapp->style().className();
+ if ( strcmp( "QMotifPlusStyle", pStyleName ) == 0 )
+ {
+ nStyle |= TQStyle::Style_MouseOver;
+ if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER )
+ eActive = TQStyle::SC_ScrollBarSlider;
+ }
+ else if ( strcmp( "QSGIStyle", pStyleName ) == 0 )
+ {
+ nStyle |= TQStyle::Style_MouseOver;
+ if ( pValue->mnButton1State & CTRL_STATE_ROLLOVER )
+ eActive = TQStyle::SC_ScrollBarSubLine;
+ else if ( pValue->mnButton2State & CTRL_STATE_ROLLOVER )
+ eActive = TQStyle::SC_ScrollBarAddLine;
+ else if ( pValue->mnThumbState & CTRL_STATE_ROLLOVER )
+ eActive = TQStyle::SC_ScrollBarSlider;
+ }
+
+ if ( pValue->mnButton1State & CTRL_STATE_PRESSED )
+ eActive = TQStyle::SC_ScrollBarSubLine;
+ else if ( pValue->mnButton2State & CTRL_STATE_PRESSED )
+ eActive = TQStyle::SC_ScrollBarAddLine;
+ else if ( pValue->mnThumbState & CTRL_STATE_PRESSED )
+ eActive = TQStyle::SC_ScrollBarSlider;
+ else if ( pValue->mnPage1State & CTRL_STATE_PRESSED )
+ eActive = TQStyle::SC_ScrollBarSubPage;
+ else if ( pValue->mnPage2State & CTRL_STATE_PRESSED )
+ eActive = TQStyle::SC_ScrollBarAddPage;
+
+ // Update the enable/disable state of the widget
+ if ( ( nState & CTRL_STATE_ENABLED ) ||
+ ( pValue->mnButton1State & CTRL_STATE_ENABLED ) ||
+ ( pValue->mnButton2State & CTRL_STATE_ENABLED ) ||
+ ( pValue->mnThumbState & CTRL_STATE_ENABLED ) ||
+ ( pValue->mnPage1State & CTRL_STATE_ENABLED ) ||
+ ( pValue->mnPage2State & CTRL_STATE_ENABLED ) )
+ {
+ pWidget->setEnabled( true );
+ nStyle |= TQStyle::Style_Enabled;
+ }
+ else
+ pWidget->setEnabled( false );
+ }
+
+ // Is it a horizontal scroll bar?
+ TQScrollBar *pScrollBar = static_cast<TQScrollBar *> ( pWidget->qt_cast( TQSCROLLBAR_OBJECT_NAME_STRING ) );
+ TQStyle::StyleFlags eHoriz = TQStyle::Style_Default;
+ if ( pScrollBar && pScrollBar->orientation() == Qt::Horizontal )
+ eHoriz = TQStyle::Style_Horizontal;
+
+ kapp->style().drawComplexControl( TQStyle::CC_ScrollBar,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle | eHoriz,
+ TQStyle::SC_All, eActive );
+ }
+ else if ( strcmp( TQTOOLBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ TQToolBar *pToolBar = static_cast< TQToolBar * >( pWidget->qt_cast( TQTOOLBAR_OBJECT_NAME_STRING ) );
+ bool bIsHorizontal = false;
+ if ( pToolBar && pToolBar->orientation() == Qt::Horizontal )
+ {
+ nStyle |= TQStyle::Style_Horizontal;
+ bIsHorizontal = true;
+ }
+
+ kapp->style().drawControl( TQStyle::CE_DockWindowEmptyArea,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle );
+
+ kapp->style().drawPrimitive( TQStyle::PE_PanelDockWindow,
+ &qPainter, qRect, pWidget->colorGroup(), nStyle );
+
+ if ( nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT )
+ {
+ const ToolbarValue *pValue = static_cast< const ToolbarValue * >( &aValue );
+
+ TQRect qThumbRect = region2TQRect( pValue->maGripRect );
+ qThumbRect.moveBy( -qWidgetPos.x(), -qWidgetPos.y() );
+ if ( bIsHorizontal )
+ qThumbRect.addCoords( 0, 2, 0, -3 ); // make the thumb a bit nicer
+ else
+ qThumbRect.addCoords( 2, 0, -3, 0 ); // make the thumb a bit nicer
+
+ if ( kapp->style().inherits( "HighColorStyle" ) ||
+ kapp->style().inherits( "HighContrastStyle" ) ||
+ kapp->style().inherits( "KeramikStyle" ) ||
+ kapp->style().inherits( "KThemeStyle" ) ||
+ kapp->style().inherits( "ThinKeramikStyle" ) )
+ {
+ // Workaround for the workaround in KStyle::drawPrimitive()
+ KStyle *pStyle = static_cast< KStyle * >( &kapp->style() );
+ pStyle->drawKStylePrimitive( KStyle::KPE_ToolBarHandle,
+ &qPainter, pToolBar, qThumbRect,
+ pWidget->colorGroup(), nStyle );
+ }
+ else
+ kapp->style().drawPrimitive( TQStyle::PE_DockWindowHandle,
+ &qPainter, qThumbRect, pWidget->colorGroup(), nStyle );
+ }
+ }
+ else if ( strcmp( TQTOOLBUTTON_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ if( (nStyle & TQStyle::Style_MouseOver) )
+ nStyle &= ~TQStyle::Style_Off;
+ kapp->style().drawComplexControl( TQStyle::CC_ToolButton,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle,
+ TQStyle::SC_ToolButton );
+ }
+ else if ( strcmp( TQMENUBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ if ( nPart == PART_ENTIRE_CONTROL )
+ {
+ kapp->style().drawControl( TQStyle::CE_MenuBarEmptyArea,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle );
+ }
+ else if ( nPart == PART_MENU_ITEM )
+ {
+ int nMenuItem = ( nStyle & TQStyle::Style_Enabled )? m_nMenuBarEnabledItem: m_nMenuBarDisabledItem;
+ TQMenuItem *pMenuItem = static_cast<TQMenuBar*>( pWidget )->findItem( nMenuItem );
+
+ if ( nStyle & TQStyle::Style_Selected )
+ nStyle |= TQStyle::Style_Active | TQStyle::Style_Down | TQStyle::Style_HasFocus;
+
+ kapp->style().drawControl( TQStyle::CE_MenuBarItem,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle,
+ TQStyleOption( pMenuItem ) );
+ }
+ }
+ else if ( strcmp( TQPOPUPMENU_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ int nMenuItem = ( nStyle & TQStyle::Style_Enabled )? m_nPopupMenuEnabledItem: m_nPopupMenuDisabledItem;
+ TQMenuItem *pMenuItem = static_cast<TQPopupMenu*>( pWidget )->findItem( nMenuItem );
+
+ if ( nStyle & TQStyle::Style_Selected )
+ nStyle |= TQStyle::Style_Active;
+
+ kapp->style().drawControl( TQStyle::CE_PopupMenuItem,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle,
+ TQStyleOption( pMenuItem, 0, 0 ) );
+ }
+ else if ( strcmp( TQPROGRESSBAR_OBJECT_NAME_STRING, pClassName ) == 0 )
+ {
+ long nProgressWidth = aValue.getNumericVal();
+ TQProgressBar* pProgress = static_cast<TQProgressBar*>(pWidget);
+ pProgress->setProgress( nProgressWidth, qRect.width() );
+
+ kapp->style().drawControl( TQStyle::CE_ProgressBarGroove,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle );
+ kapp->style().drawControl( TQStyle::CE_ProgressBarContents,
+ &qPainter, pWidget, qRect,
+ pWidget->colorGroup(), nStyle );
+ }
+ else
+ return FALSE;
+
+ // Bitblt it to the screen
+ X11SalGraphics::CopyScreenArea( dpy,
+ qPixmap.handle(), qPixmap.x11Screen(), qPixmap.x11Depth(),
+ drawable, nScreen, nDepth,
+ gc,
+ 0, 0, qRect.width(), qRect.height(),
+ qWidgetPos.x(), qWidgetPos.y() );
+
+ // Restore widget's position
+ pWidget->move( qWidgetPos );
+
+ return TRUE;
+}
+
+TQPushButton *WidgetPainter::pushButton( const Rectangle& rControlRegion,
+ sal_Bool bDefault )
+{
+ if ( !m_pPushButton )
+ m_pPushButton = new TQPushButton( NULL, "push_button" );
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ // Workaround for broken styles which do not add
+ // TQStyle::PM_ButtonDefaultIndicator to the size of the default button
+ // (for example Keramik)
+ // FIXME Fix Keramik style to be consistant with Qt built-in styles. Aargh!
+ if ( bDefault )
+ {
+ TQSize qContentsSize( 50, 50 );
+ m_pPushButton->setDefault( false );
+ TQSize qNormalSize = kapp->style().sizeFromContents( TQStyle::CT_PushButton,
+ m_pPushButton, qContentsSize );
+ m_pPushButton->setDefault( true );
+ TQSize qDefSize = kapp->style().sizeFromContents( TQStyle::CT_PushButton,
+ m_pPushButton, qContentsSize );
+
+ int nIndicatorSize = kapp->style().pixelMetric(
+ TQStyle::PM_ButtonDefaultIndicator, m_pPushButton );
+ if ( qNormalSize.width() == qDefSize.width() )
+ qRect.addCoords( nIndicatorSize, 0, -nIndicatorSize, 0 );
+ if ( qNormalSize.height() == qDefSize.height() )
+ qRect.addCoords( 0, nIndicatorSize, 0, -nIndicatorSize );
+ }
+
+ m_pPushButton->move( qRect.topLeft() );
+ m_pPushButton->resize( qRect.size() );
+ m_pPushButton->setDefault( bDefault );
+
+ return m_pPushButton;
+}
+
+TQRadioButton *WidgetPainter::radioButton( const Rectangle& rControlRegion )
+{
+ if ( !m_pRadioButton )
+ m_pRadioButton = new TQRadioButton( NULL, "radio_button" );
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ // Workaround for broken themes which do not honor the given size.
+ // Quite ugly, but I do not know about a better solution.
+ const char *pStyleName = kapp->style().className();
+ if ( strcmp( "KThemeStyle", pStyleName ) == 0 )
+ {
+ TQRect qOldRect( qRect );
+
+ qRect.setWidth( kapp->style().pixelMetric(
+ TQStyle::PM_ExclusiveIndicatorWidth, m_pRadioButton ) );
+ qRect.setHeight( kapp->style().pixelMetric(
+ TQStyle::PM_ExclusiveIndicatorHeight, m_pRadioButton ) );
+
+ qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2,
+ ( qOldRect.height() - qRect.height() ) / 2 );
+ }
+
+ m_pRadioButton->move( qRect.topLeft() );
+ m_pRadioButton->resize( qRect.size() );
+
+ return m_pRadioButton;
+}
+
+TQCheckBox *WidgetPainter::checkBox( const Rectangle& rControlRegion )
+{
+ if ( !m_pCheckBox )
+ m_pCheckBox = new TQCheckBox( NULL, "check_box" );
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ // Workaround for broken themes which do not honor the given size.
+ // Quite ugly, but I do not know about a better solution.
+ const char *pStyleName = kapp->style().className();
+ if ( strcmp( "KThemeStyle", pStyleName ) == 0 )
+ {
+ TQRect qOldRect( qRect );
+
+ qRect.setWidth( kapp->style().pixelMetric(
+ TQStyle::PM_IndicatorWidth, m_pCheckBox ) );
+ qRect.setHeight( kapp->style().pixelMetric(
+ TQStyle::PM_IndicatorHeight, m_pCheckBox ) );
+
+ qRect.moveBy( ( qOldRect.width() - qRect.width() ) / 2,
+ ( qOldRect.height() - qRect.height() ) / 2 );
+ }
+
+ m_pCheckBox->move( qRect.topLeft() );
+ m_pCheckBox->resize( qRect.size() );
+
+ return m_pCheckBox;
+}
+
+TQComboBox *WidgetPainter::comboBox( const Rectangle& rControlRegion,
+ sal_Bool bEditable )
+{
+ TQComboBox *pComboBox = NULL;
+ if ( bEditable )
+ {
+ if ( !m_pEditableComboBox )
+ m_pEditableComboBox = new TQComboBox( true, NULL, "combo_box_edit" );
+ pComboBox = m_pEditableComboBox;
+ }
+ else
+ {
+ if ( !m_pComboBox )
+ m_pComboBox = new TQComboBox( false, NULL, "combo_box" );
+ pComboBox = m_pComboBox;
+ }
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ pComboBox->move( qRect.topLeft() );
+ pComboBox->resize( qRect.size() );
+
+ return pComboBox;
+}
+
+TQLineEdit *WidgetPainter::lineEdit( const Rectangle& rControlRegion )
+{
+ if ( !m_pLineEdit )
+ m_pLineEdit = new TQLineEdit( NULL, "line_edit" );
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ m_pLineEdit->move( qRect.topLeft() );
+ m_pLineEdit->resize( qRect.size() );
+
+ return m_pLineEdit;
+}
+
+TQSpinWidget *WidgetPainter::spinWidget( const Rectangle& rControlRegion )
+{
+ if ( !m_pSpinWidget )
+ {
+ m_pSpinWidget = new TQSpinWidget( NULL, "spin_widget" );
+
+ m_pSpinEdit = new TQLineEdit( NULL, "line_edit_spin" );
+ m_pSpinWidget->setEditWidget( m_pSpinEdit );
+ }
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ m_pSpinWidget->move( qRect.topLeft() );
+ m_pSpinWidget->resize( qRect.size() );
+ m_pSpinWidget->arrange();
+
+ return m_pSpinWidget;
+}
+
+TQTabBar *WidgetPainter::tabBar( const Rectangle& rControlRegion )
+{
+ if ( !m_pTabBar )
+ {
+ if ( !m_pTabBarParent )
+ m_pTabBarParent = new TQWidget( NULL, "tab_bar_parent" );
+
+ m_pTabBar = new TQTabBar( m_pTabBarParent, "tab_bar" );
+
+ m_pTabLeft = new TQTab();
+ m_pTabMiddle = new TQTab();
+ m_pTabRight = new TQTab();
+ m_pTabAlone = new TQTab();
+
+ m_pTabBar->addTab( m_pTabLeft );
+ m_pTabBar->addTab( m_pTabMiddle );
+ m_pTabBar->addTab( m_pTabRight );
+ }
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ m_pTabBar->move( qRect.topLeft() );
+ m_pTabBar->resize( qRect.size() );
+
+ m_pTabBar->setShape( TQTabBar::RoundedAbove );
+
+ return m_pTabBar;
+}
+
+TQTabWidget *WidgetPainter::tabWidget( const Rectangle& rControlRegion )
+{
+ if ( !m_pTabWidget )
+ m_pTabWidget = new TQTabWidget( NULL, "tab_widget" );
+
+ TQRect qRect = region2TQRect( rControlRegion );
+ --qRect.rTop();
+
+ m_pTabWidget->move( qRect.topLeft() );
+ m_pTabWidget->resize( qRect.size() );
+
+ return m_pTabWidget;
+}
+
+TQListView *WidgetPainter::listView( const Rectangle& rControlRegion )
+{
+ if ( !m_pListView )
+ m_pListView = new TQListView( NULL, "list_view" );
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ m_pListView->move( qRect.topLeft() );
+ m_pListView->resize( qRect.size() );
+
+ return m_pListView;
+}
+
+TQScrollBar *WidgetPainter::scrollBar( const Rectangle& rControlRegion,
+ sal_Bool bHorizontal, const ImplControlValue& aValue )
+{
+ if ( !m_pScrollBar )
+ {
+ m_pScrollBar = new TQScrollBar( NULL, "scroll_bar" );
+ m_pScrollBar->setTracking( false );
+ m_pScrollBar->setLineStep( 1 );
+ }
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ m_pScrollBar->move( qRect.topLeft() );
+ m_pScrollBar->resize( qRect.size() );
+ m_pScrollBar->setOrientation( bHorizontal? Qt::Horizontal: Qt::Vertical );
+
+ const ScrollbarValue *pValue = static_cast<const ScrollbarValue *> ( &aValue );
+ if ( pValue )
+ {
+ m_pScrollBar->setMinValue( pValue->mnMin );
+ m_pScrollBar->setMaxValue( pValue->mnMax - pValue->mnVisibleSize );
+ m_pScrollBar->setValue( pValue->mnCur );
+ m_pScrollBar->setPageStep( pValue->mnVisibleSize );
+ }
+
+ return m_pScrollBar;
+}
+
+TQToolBar *WidgetPainter::toolBar( const Rectangle& rControlRegion, sal_Bool bHorizontal )
+{
+ if ( !m_pMainWindow )
+ m_pMainWindow = new TQMainWindow( NULL, "main_window" );
+
+ TQToolBar *pToolBar;
+ if ( bHorizontal )
+ {
+ if ( !m_pToolBarHoriz )
+ {
+ m_pToolBarHoriz = new TQToolBar( m_pMainWindow, "tool_bar_horiz" );
+ m_pMainWindow->moveDockWindow( m_pToolBarHoriz, Qt::DockTop );
+ }
+ pToolBar = m_pToolBarHoriz;
+ }
+ else
+ {
+ if ( !m_pToolBarVert )
+ {
+ m_pToolBarVert = new TQToolBar( m_pMainWindow, "tool_bar_horiz" );
+ m_pMainWindow->moveDockWindow( m_pToolBarVert, Qt::DockLeft );
+ }
+ pToolBar = m_pToolBarVert;
+ }
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ pToolBar->move( qRect.topLeft() );
+ pToolBar->resize( qRect.size() );
+
+ return pToolBar;
+}
+
+TQToolButton *WidgetPainter::toolButton( const Rectangle& rControlRegion)
+{
+ if ( !m_pToolButton )
+ m_pToolButton = new TQToolButton( NULL, "tool_button" );
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ m_pToolButton->move( qRect.topLeft() );
+ m_pToolButton->resize( qRect.size() );
+
+ return m_pToolButton;
+}
+
+TQMenuBar *WidgetPainter::menuBar( const Rectangle& rControlRegion)
+{
+ if ( !m_pMenuBar )
+ {
+ m_pMenuBar = new TQMenuBar( NULL, "menu_bar" );
+
+ m_nMenuBarEnabledItem = m_pMenuBar->insertItem( "" );
+ m_nMenuBarDisabledItem = m_pMenuBar->insertItem( "" );
+
+ m_pMenuBar->setItemEnabled( m_nMenuBarEnabledItem, true );
+ m_pMenuBar->setItemEnabled( m_nMenuBarDisabledItem, false );
+ }
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ m_pMenuBar->move( qRect.topLeft() );
+ m_pMenuBar->resize( qRect.size() );
+
+ return m_pMenuBar;
+}
+
+TQPopupMenu *WidgetPainter::popupMenu( const Rectangle& rControlRegion)
+{
+ if ( !m_pPopupMenu )
+ {
+ m_pPopupMenu = new TQPopupMenu( NULL, "popup_menu" );
+
+ m_nPopupMenuEnabledItem = m_pPopupMenu->insertItem( "" );
+ m_nPopupMenuDisabledItem = m_pPopupMenu->insertItem( "" );
+
+ m_pPopupMenu->setItemEnabled( m_nPopupMenuEnabledItem, true );
+ m_pPopupMenu->setItemEnabled( m_nPopupMenuDisabledItem, false );
+ }
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ m_pPopupMenu->move( qRect.topLeft() );
+ m_pPopupMenu->resize( qRect.size() );
+
+ return m_pPopupMenu;
+}
+
+TQProgressBar *WidgetPainter::progressBar( const Rectangle& rControlRegion )
+{
+ if ( !m_pProgressBar )
+ m_pProgressBar = new TQProgressBar( NULL, "progress_bar" );
+
+ TQRect qRect = region2TQRect( rControlRegion );
+
+ m_pProgressBar->move( qRect.topLeft() );
+ m_pProgressBar->resize( qRect.size() );
+
+ return m_pProgressBar;
+}
+
+TQStyle::SFlags WidgetPainter::vclStateValue2SFlags( ControlState nState,
+ const ImplControlValue& aValue )
+{
+ TQStyle::SFlags nStyle =
+ ( (nState & CTRL_STATE_DEFAULT)? TQStyle::Style_ButtonDefault: TQStyle::Style_Default ) |
+ ( (nState & CTRL_STATE_ENABLED)? TQStyle::Style_Enabled: TQStyle::Style_Default ) |
+ ( (nState & CTRL_STATE_FOCUSED)? TQStyle::Style_HasFocus: TQStyle::Style_Default ) |
+ ( (nState & CTRL_STATE_PRESSED)? TQStyle::Style_Down: TQStyle::Style_Raised ) |
+ ( (nState & CTRL_STATE_SELECTED)? TQStyle::Style_Selected : TQStyle::Style_Default ) |
+ ( (nState & CTRL_STATE_ROLLOVER)? TQStyle::Style_MouseOver: TQStyle::Style_Default );
+ //TODO ( (nState & CTRL_STATE_HIDDEN)? TQStyle::Style_: TQStyle::Style_Default ) |
+
+ switch ( aValue.getTristateVal() )
+ {
+ case BUTTONVALUE_ON: nStyle |= TQStyle::Style_On; break;
+ case BUTTONVALUE_OFF: nStyle |= TQStyle::Style_Off; break;
+ case BUTTONVALUE_MIXED: nStyle |= TQStyle::Style_NoChange; break;
+ default: break;
+ }
+
+ return nStyle;
+}
+
+TQRect WidgetPainter::region2TQRect( const Rectangle& rControlRegion )
+{
+ return TQRect( TQPoint( rControlRegion.Left(), rControlRegion.Top() ),
+ TQPoint( rControlRegion.Right(), rControlRegion.Bottom() ) );
+}
+
+/** Instance of WidgetPainter.
+
+ It is used to paint the widgets requested by NWF.
+*/
+static WidgetPainter *pWidgetPainter;
+
+class TDESalGraphics : public X11SalGraphics
+{
+ public:
+ TDESalGraphics() {}
+ virtual ~TDESalGraphics() {}
+ virtual sal_Bool IsNativeControlSupported( ControlType nType, ControlPart nPart );
+ virtual sal_Bool hitTestNativeControl( ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion, const Point& aPos,
+ sal_Bool& rIsInside );
+ virtual sal_Bool drawNativeControl( ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion, ControlState nState,
+ const ImplControlValue& aValue,
+ const OUString& aCaption );
+ virtual sal_Bool drawNativeControlText( ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion, ControlState nState,
+ const ImplControlValue& aValue,
+ const OUString& aCaption );
+ virtual sal_Bool getNativeControlRegion( ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion, ControlState nState,
+ const ImplControlValue& aValue,
+ const OUString& aCaption,
+ Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion );
+};
+
+/** What widgets can be drawn the native way.
+
+ @param nType
+ Type of the widget.
+
+ @param nPart
+ Specification of the widget's part if it consists of more than one.
+
+ @return TRUE if the platform supports native drawing of the widget nType
+ defined by nPart.
+*/
+sal_Bool TDESalGraphics::IsNativeControlSupported( ControlType nType, ControlPart nPart )
+{
+ return
+ ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) ||
+ ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) ) ||
+ ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) ) ||
+ ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
+ ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
+ ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_WINDOW || nPart == HAS_BACKGROUND_TEXTURE ) ) ||
+ ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL || nPart == HAS_BACKGROUND_TEXTURE) ) ||
+ // no CTRL_SPINBUTTONS for TDE
+ ( (nType == CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) ) ||
+ ( (nType == CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) ) ||
+ // no CTRL_TAB_BODY for TDE
+ ( (nType == CTRL_SCROLLBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) ) ||
+ ( (nType == CTRL_SCROLLBAR) && (nPart == HAS_THREE_BUTTONS) ) || // TODO small optimization is possible here: return this only if the style really has 3 buttons
+ // CTRL_GROUPBOX not supported
+ // CTRL_FIXEDLINE not supported
+ // CTRL_FIXEDBORDER not supported
+ ( (nType == CTRL_TOOLBAR) && (nPart == PART_ENTIRE_CONTROL ||
+ nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT ||
+ nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT ||
+ nPart == PART_BUTTON) ) ||
+ ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ||
+ ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) ) ||
+ ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) )
+ ;
+}
+
+
+/** Test whether the position is in the native widget.
+
+ If the return value is TRUE, bIsInside contains information whether
+ aPos was or was not inside the native widget specified by the
+ nType/nPart combination.
+*/
+sal_Bool TDESalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion, const Point& rPos,
+ sal_Bool& rIsInside )
+{
+ if ( nType == CTRL_SCROLLBAR )
+ {
+ // make position relative to rControlRegion
+ Point aPos = rPos - rControlRegion.TopLeft();
+ rIsInside = FALSE;
+
+ sal_Bool bHorizontal = ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT );
+
+ TQScrollBar *pScrollBar = pWidgetPainter->scrollBar( rControlRegion,
+ bHorizontal, ImplControlValue() );
+ TQRect qRectSubLine = kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarSubLine );
+ TQRect qRectAddLine = kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarAddLine );
+
+ // There are 2 buttons on the right/bottom side of the scrollbar
+ sal_Bool bTwoSubButtons = FALSE;
+
+ // It is a Platinum style scroll bar
+ sal_Bool bPlatinumStyle = FALSE;
+
+ // Workaround for Platinum and 3 button style scroll bars.
+ // It makes the right/down button bigger.
+ if ( bHorizontal )
+ {
+ qRectAddLine.setLeft( kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pScrollBar,
+ TQStyle::SC_ScrollBarAddPage ).right() + 1 );
+ if ( qRectAddLine.width() > qRectSubLine.width() )
+ bTwoSubButtons = TRUE;
+ if ( qRectSubLine.left() > kapp->style().querySubControlMetrics( TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarSubPage ).left() )
+ bPlatinumStyle = TRUE;
+ }
+ else
+ {
+ qRectAddLine.setTop( kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pScrollBar,
+ TQStyle::SC_ScrollBarAddPage ).bottom() + 1 );
+ if ( qRectAddLine.height() > qRectSubLine.height() )
+ bTwoSubButtons = TRUE;
+ if ( qRectSubLine.top() > kapp->style().querySubControlMetrics( TQStyle::CC_ScrollBar, pScrollBar, TQStyle::SC_ScrollBarSubPage ).top() )
+ bPlatinumStyle = TRUE;
+ }
+
+ switch ( nPart )
+ {
+ case PART_BUTTON_LEFT:
+ if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) )
+ rIsInside = TRUE;
+ else if ( bTwoSubButtons )
+ {
+ qRectAddLine.setWidth( qRectAddLine.width() / 2 );
+ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
+ }
+ break;
+
+ case PART_BUTTON_UP:
+ if ( !bPlatinumStyle && qRectSubLine.contains( aPos.getX(), aPos.getY() ) )
+ rIsInside = TRUE;
+ else if ( bTwoSubButtons )
+ {
+ qRectAddLine.setHeight( qRectAddLine.height() / 2 );
+ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
+ }
+ break;
+
+ case PART_BUTTON_RIGHT:
+ if ( bTwoSubButtons )
+ qRectAddLine.setLeft( qRectAddLine.left() + qRectAddLine.width() / 2 );
+
+ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
+ break;
+
+ case PART_BUTTON_DOWN:
+ if ( bTwoSubButtons )
+ qRectAddLine.setTop( qRectAddLine.top() + qRectAddLine.height() / 2 );
+
+ rIsInside = qRectAddLine.contains( aPos.getX(), aPos.getY() );
+ break;
+
+ // cases PART_TRACK_HORZ_AREA and PART_TRACK_VERT_AREA
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+/** Draw the requested control described by nPart/nState.
+
+ @param rControlRegion
+ The bounding region of the complete control in VCL frame coordinates.
+
+ @param aValue
+ An optional value (tristate/numerical/string).
+
+ @param aCaption
+ A caption or title string (like button text etc.)
+*/
+sal_Bool TDESalGraphics::drawNativeControl( ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion, ControlState nState,
+ const ImplControlValue& aValue,
+ const OUString& )
+{
+ sal_Bool bReturn = FALSE;
+
+ Display *dpy = GetXDisplay();
+ XLIB_Window drawable = GetDrawable();
+ GC gc = SelectPen(); //SelectFont(); // GC with current clipping region set
+
+ if ( (nType == CTRL_PUSHBUTTON) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->pushButton( rControlRegion, (nState & CTRL_STATE_DEFAULT) ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_RADIOBUTTON) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->radioButton( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_CHECKBOX) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->checkBox( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_COMBOBOX) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->comboBox( rControlRegion, TRUE ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_EDITBOX) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->lineEdit( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_LISTBOX) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->comboBox( rControlRegion, FALSE ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_LISTBOX) && (nPart == PART_WINDOW) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->listView( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_SPINBOX) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->spinWidget( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType==CTRL_TAB_ITEM) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->tabBar( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType==CTRL_TAB_PANE) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->tabWidget( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_SCROLLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->scrollBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ, aValue ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_DRAW_BACKGROUND_VERT || nPart == PART_THUMB_HORZ || nPart == PART_THUMB_VERT) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->toolBar( rControlRegion, nPart == PART_DRAW_BACKGROUND_HORZ || nPart == PART_THUMB_VERT ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
+ }
+ else if ( (nType == CTRL_TOOLBAR) && (nPart == PART_BUTTON) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->toolButton( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
+ }
+ else if ( (nType == CTRL_MENUBAR) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->menuBar( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, nPart );
+ }
+ else if ( (nType == CTRL_MENU_POPUP) && (nPart == PART_ENTIRE_CONTROL || nPart == PART_MENU_ITEM) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->popupMenu( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+ else if ( (nType == CTRL_PROGRESS) && (nPart == PART_ENTIRE_CONTROL) )
+ {
+ bReturn = pWidgetPainter->drawStyledWidget(
+ pWidgetPainter->progressBar( rControlRegion ),
+ nState, aValue,
+ dpy, drawable, GetScreenNumber(), GetVisual().GetDepth(), gc );
+ }
+
+ return bReturn;
+}
+
+
+/** Draw text on the widget.
+
+ OPTIONAL. Draws the requested text for the control described by nPart/nState.
+ Used if text is not drawn by DrawNativeControl().
+
+ @param rControlRegion
+ The bounding region of the complete control in VCL frame coordinates.
+
+ @param aValue
+ An optional value (tristate/numerical/string)
+
+ @param aCaption
+ A caption or title string (like button text etc.)
+*/
+sal_Bool TDESalGraphics::drawNativeControlText( ControlType, ControlPart,
+ const Rectangle&, ControlState,
+ const ImplControlValue&,
+ const OUString& )
+{
+ return FALSE;
+}
+
+/** Check if the bounding regions match.
+
+ If the return value is TRUE, rNativeBoundingRegion
+ contains the true bounding region covered by the control
+ including any adornment, while rNativeContentRegion contains the area
+ within the control that can be safely drawn into without drawing over
+ the borders of the control.
+
+ @param rControlRegion
+ The bounding region of the control in VCL frame coordinates.
+
+ @param aValue
+ An optional value (tristate/numerical/string)
+
+ @param aCaption
+ A caption or title string (like button text etc.)
+*/
+sal_Bool TDESalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion, ControlState nState,
+ const ImplControlValue&,
+ const OUString&,
+ Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion )
+{
+ sal_Bool bReturn = FALSE;
+ TQRect qBoundingRect = WidgetPainter::region2TQRect( rControlRegion );
+ TQRect qRect;
+
+ TQWidget *pWidget = NULL;
+ switch ( nType )
+ {
+ // Metrics of the push button
+ case CTRL_PUSHBUTTON:
+ pWidget = pWidgetPainter->pushButton( rControlRegion, ( nState & CTRL_STATE_DEFAULT ) );
+
+ switch ( nPart )
+ {
+ case PART_ENTIRE_CONTROL:
+ qRect = qBoundingRect;
+
+ if ( nState & CTRL_STATE_DEFAULT )
+ {
+ int nIndicatorSize = kapp->style().pixelMetric(
+ TQStyle::PM_ButtonDefaultIndicator, pWidget );
+ qBoundingRect.addCoords( -nIndicatorSize, -nIndicatorSize,
+ nIndicatorSize, nIndicatorSize );
+ bReturn = TRUE;
+ }
+ break;
+ }
+ break;
+
+ // Metrics of the radio button
+ case CTRL_RADIOBUTTON:
+ pWidget = pWidgetPainter->radioButton( rControlRegion );
+
+ if ( nPart == PART_ENTIRE_CONTROL )
+ {
+ qRect.setWidth( kapp->style().pixelMetric( TQStyle::PM_ExclusiveIndicatorWidth, pWidget ) );
+ qRect.setHeight( kapp->style().pixelMetric( TQStyle::PM_ExclusiveIndicatorHeight, pWidget ) );
+
+ bReturn = TRUE;
+ }
+ break;
+
+ // Metrics of the check box
+ case CTRL_CHECKBOX:
+ pWidget = pWidgetPainter->checkBox( rControlRegion );
+
+ if ( nPart == PART_ENTIRE_CONTROL )
+ {
+ qRect.setWidth( kapp->style().pixelMetric( TQStyle::PM_IndicatorWidth, pWidget ) );
+ qRect.setHeight( kapp->style().pixelMetric( TQStyle::PM_IndicatorHeight, pWidget ) );
+
+ bReturn = TRUE;
+ }
+ break;
+
+ // Metrics of the combo box
+ case CTRL_COMBOBOX:
+ case CTRL_LISTBOX:
+ pWidget = pWidgetPainter->comboBox( rControlRegion, ( nType == CTRL_COMBOBOX ) );
+ switch ( nPart )
+ {
+ case PART_BUTTON_DOWN:
+ qRect = kapp->style().querySubControlMetrics(
+ TQStyle::CC_ComboBox, pWidget, TQStyle::SC_ComboBoxArrow );
+ qRect.setLeft( kapp->style().querySubControlMetrics(
+ TQStyle::CC_ComboBox, pWidget,
+ TQStyle::SC_ComboBoxEditField ).right() + 1 );
+ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+ bReturn = TRUE;
+ break;
+
+ case PART_SUB_EDIT:
+ qRect = kapp->style().querySubControlMetrics(
+ TQStyle::CC_ComboBox, pWidget, TQStyle::SC_ComboBoxEditField );
+ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+ bReturn = TRUE;
+ break;
+ }
+ break;
+
+ // Metrics of the spin box
+ case CTRL_SPINBOX:
+ pWidget = pWidgetPainter->spinWidget( rControlRegion );
+ switch ( nPart )
+ {
+ case PART_BUTTON_UP:
+ qRect = kapp->style().querySubControlMetrics(
+ TQStyle::CC_SpinWidget, pWidget, TQStyle::SC_SpinWidgetUp );
+ bReturn = TRUE;
+ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+ break;
+
+ case PART_BUTTON_DOWN:
+ qRect = kapp->style().querySubControlMetrics(
+ TQStyle::CC_SpinWidget, pWidget, TQStyle::SC_SpinWidgetDown );
+ bReturn = TRUE;
+ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+ break;
+
+ case PART_SUB_EDIT:
+ qRect = kapp->style().querySubControlMetrics(
+ TQStyle::CC_SpinWidget, pWidget, TQStyle::SC_SpinWidgetEditField );
+ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+ bReturn = TRUE;
+ break;
+ }
+ break;
+
+ // Metrics of the scroll bar
+ case CTRL_SCROLLBAR:
+ pWidget = pWidgetPainter->scrollBar( rControlRegion,
+ ( nPart == PART_BUTTON_LEFT || nPart == PART_BUTTON_RIGHT ),
+ ImplControlValue() );
+ switch ( nPart )
+ {
+ case PART_BUTTON_LEFT:
+ case PART_BUTTON_UP:
+ qRect = kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pWidget, TQStyle::SC_ScrollBarSubLine );
+
+ // Workaround for Platinum style scroll bars. It makes the
+ // left/up button invisible.
+ if ( nPart == PART_BUTTON_LEFT )
+ {
+ if ( qRect.left() > kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pWidget,
+ TQStyle::SC_ScrollBarSubPage ).left() )
+ {
+ qRect.setLeft( 0 );
+ qRect.setRight( 0 );
+ }
+ }
+ else
+ {
+ if ( qRect.top() > kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pWidget,
+ TQStyle::SC_ScrollBarSubPage ).top() )
+ {
+ qRect.setTop( 0 );
+ qRect.setBottom( 0 );
+ }
+ }
+
+ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+
+ bReturn = TRUE;
+ break;
+
+ case PART_BUTTON_RIGHT:
+ case PART_BUTTON_DOWN:
+ qRect = kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pWidget, TQStyle::SC_ScrollBarAddLine );
+
+ // Workaround for Platinum and 3 button style scroll bars.
+ // It makes the right/down button bigger.
+ if ( nPart == PART_BUTTON_RIGHT )
+ qRect.setLeft( kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pWidget,
+ TQStyle::SC_ScrollBarAddPage ).right() + 1 );
+ else
+ qRect.setTop( kapp->style().querySubControlMetrics(
+ TQStyle::CC_ScrollBar, pWidget,
+ TQStyle::SC_ScrollBarAddPage ).bottom() + 1 );
+
+ qRect.moveBy( qBoundingRect.left(), qBoundingRect.top() );
+
+ bReturn = TRUE;
+ break;
+ }
+ break;
+ }
+
+ // Fill rNativeBoundingRegion and rNativeContentRegion
+ if ( bReturn )
+ {
+ // Bounding region
+ Point aBPoint( qBoundingRect.x(), qBoundingRect.y() );
+ Size aBSize( qBoundingRect.width(), qBoundingRect.height() );
+ rNativeBoundingRegion = Rectangle( aBPoint, aBSize );
+
+ // Region of the content
+ Point aPoint( qRect.x(), qRect.y() );
+ Size aSize( qRect.width(), qRect.height() );
+ rNativeContentRegion = Rectangle( aPoint, aSize );
+ }
+
+ return bReturn;
+}
+
+// -----------------------------------------------------------------------
+// TDESalFrame implementation
+// -----------------------------------------------------------------------
+
+TDESalFrame::TDESalFrame( SalFrame* pParent, sal_uLong nStyle ) :
+ X11SalFrame( pParent, nStyle )
+{
+}
+
+void TDESalFrame::Show( sal_Bool bVisible, sal_Bool bNoActivate )
+{
+ if ( !GetParent() && ! (GetStyle() & SAL_FRAME_STYLE_INTRO) )
+ {
+ TDEXLib* pXLib = static_cast<TDEXLib*>(GetDisplay()->GetXLib());
+ pXLib->doStartup();
+ }
+ X11SalFrame::Show( bVisible, bNoActivate );
+}
+
+/** Helper function to convert colors.
+*/
+static Color toColor( const TQColor &rColor )
+{
+ return Color( rColor.red(), rColor.green(), rColor.blue() );
+}
+
+/** Helper function to read untranslated text entry from KConfig configuration repository.
+*/
+static OUString readEntryUntranslated( KConfig *pConfig, const char *pKey )
+{
+ return OUString::createFromAscii( pConfig->readEntryUntranslated( pKey ).ascii() );
+}
+
+/** Helper function to read color from KConfig configuration repository.
+*/
+static Color readColor( KConfig *pConfig, const char *pKey )
+{
+ return toColor( pConfig->readColorEntry( pKey ) );
+}
+
+/** Helper function to add information to Font from TQFont.
+
+ Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx).
+*/
+static Font toFont( const TQFont &rTQFont, const ::com::sun::star::lang::Locale& rLocale )
+{
+ psp::FastPrintFontInfo aInfo;
+ TQFontInfo qFontInfo( rTQFont );
+
+ // set family name
+ aInfo.m_aFamilyName = String( rTQFont.family().utf8(), RTL_TEXTENCODING_UTF8 );
+
+ // set italic
+ aInfo.m_eItalic = ( qFontInfo.italic()? ITALIC_NORMAL: ITALIC_NONE );
+
+ // set weight
+ int nWeight = qFontInfo.weight();
+ if ( nWeight <= TQFont::Light )
+ aInfo.m_eWeight = WEIGHT_LIGHT;
+ else if ( nWeight <= TQFont::Normal )
+ aInfo.m_eWeight = WEIGHT_NORMAL;
+ else if ( nWeight <= TQFont::DemiBold )
+ aInfo.m_eWeight = WEIGHT_SEMIBOLD;
+ else if ( nWeight <= TQFont::Bold )
+ aInfo.m_eWeight = WEIGHT_BOLD;
+ else
+ aInfo.m_eWeight = WEIGHT_ULTRABOLD;
+
+ // set width
+ int nStretch = rTQFont.stretch();
+ if ( nStretch <= TQFont::UltraCondensed )
+ aInfo.m_eWidth = WIDTH_ULTRA_CONDENSED;
+ else if ( nStretch <= TQFont::ExtraCondensed )
+ aInfo.m_eWidth = WIDTH_EXTRA_CONDENSED;
+ else if ( nStretch <= TQFont::Condensed )
+ aInfo.m_eWidth = WIDTH_CONDENSED;
+ else if ( nStretch <= TQFont::SemiCondensed )
+ aInfo.m_eWidth = WIDTH_SEMI_CONDENSED;
+ else if ( nStretch <= TQFont::Unstretched )
+ aInfo.m_eWidth = WIDTH_NORMAL;
+ else if ( nStretch <= TQFont::SemiExpanded )
+ aInfo.m_eWidth = WIDTH_SEMI_EXPANDED;
+ else if ( nStretch <= TQFont::Expanded )
+ aInfo.m_eWidth = WIDTH_EXPANDED;
+ else if ( nStretch <= TQFont::ExtraExpanded )
+ aInfo.m_eWidth = WIDTH_EXTRA_EXPANDED;
+ else
+ aInfo.m_eWidth = WIDTH_ULTRA_EXPANDED;
+
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "font name BEFORE system match: \"%s\"\n", OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() );
+#endif
+
+ // match font to e.g. resolve "Sans"
+ psp::PrintFontManager::get().matchFont( aInfo, rLocale );
+
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "font match %s, name AFTER: \"%s\"\n",
+ aInfo.m_nID != 0 ? "succeeded" : "failed",
+ OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() );
+#endif
+
+ // font height
+ int nPointHeight = qFontInfo.pointSize();
+ if ( nPointHeight <= 0 )
+ nPointHeight = rTQFont.pointSize();
+
+ // Create the font
+ Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) );
+ if( aInfo.m_eWeight != WEIGHT_DONTKNOW )
+ aFont.SetWeight( aInfo.m_eWeight );
+ if( aInfo.m_eWidth != WIDTH_DONTKNOW )
+ aFont.SetWidthType( aInfo.m_eWidth );
+ if( aInfo.m_eItalic != ITALIC_DONTKNOW )
+ aFont.SetItalic( aInfo.m_eItalic );
+ if( aInfo.m_ePitch != PITCH_DONTKNOW )
+ aFont.SetPitch( aInfo.m_ePitch );
+
+ return aFont;
+}
+
+/** Implementation of TDE integration's main method.
+*/
+void TDESalFrame::UpdateSettings( AllSettings& rSettings )
+{
+ StyleSettings aStyleSettings( rSettings.GetStyleSettings() );
+ bool bSetTitleFont = false;
+
+ aStyleSettings.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_LARGE );
+
+ // WM settings
+ KConfig *pConfig = KGlobal::config();
+ if ( pConfig )
+ {
+ pConfig->setGroup( "WM" );
+ const char *pKey;
+
+ pKey = "activeBackground";
+ if ( pConfig->hasKey( pKey ) )
+ aStyleSettings.SetActiveColor( readColor( pConfig, pKey ) );
+
+ pKey = "activeBlend";
+ if ( pConfig->hasKey( pKey ) )
+ aStyleSettings.SetActiveColor2( readColor( pConfig, pKey ) );
+
+ pKey = "inactiveBackground";
+ if ( pConfig->hasKey( pKey ) )
+ aStyleSettings.SetDeactiveColor( readColor( pConfig, pKey ) );
+
+ pKey = "inactiveBlend";
+ if ( pConfig->hasKey( pKey ) )
+ aStyleSettings.SetDeactiveColor2( readColor( pConfig, pKey ) );
+
+ pKey = "inactiveForeground";
+ if ( pConfig->hasKey( pKey ) )
+ aStyleSettings.SetDeactiveTextColor( readColor( pConfig, pKey ) );
+
+ pKey = "activeForeground";
+ if ( pConfig->hasKey( pKey ) )
+ aStyleSettings.SetActiveTextColor( readColor( pConfig, pKey ) );
+
+ pKey = "titleFont";
+ if ( pConfig->hasKey( pKey ) )
+ {
+ Font aFont = toFont( pConfig->readFontEntry( pKey ), rSettings.GetUILocale() );
+ aStyleSettings.SetTitleFont( aFont );
+ bSetTitleFont = true;
+ }
+
+ pConfig->setGroup( "Icons" );
+
+ pKey = "Theme";
+ if ( pConfig->hasKey( pKey ) )
+ aStyleSettings.SetPreferredSymbolsStyleName( readEntryUntranslated( pConfig, pKey ) );
+ }
+
+ // General settings
+ TQColorGroup qColorGroup = kapp->palette().active();
+
+ Color aFore = toColor( qColorGroup.foreground() );
+ Color aBack = toColor( qColorGroup.background() );
+ Color aText = toColor( qColorGroup.text() );
+ Color aBase = toColor( qColorGroup.base() );
+
+ // Foreground
+ aStyleSettings.SetRadioCheckTextColor( aFore );
+ aStyleSettings.SetLabelTextColor( aFore );
+ aStyleSettings.SetInfoTextColor( aFore );
+ aStyleSettings.SetDialogTextColor( aFore );
+ aStyleSettings.SetGroupTextColor( aFore );
+
+ // Text
+ aStyleSettings.SetFieldTextColor( aText );
+ aStyleSettings.SetFieldRolloverTextColor( aText );
+ aStyleSettings.SetWindowTextColor( aText );
+ aStyleSettings.SetHelpTextColor( aText );
+
+ // Base
+ aStyleSettings.SetFieldColor( aBase );
+ aStyleSettings.SetHelpColor( aBase );
+ aStyleSettings.SetWindowColor( aBase );
+ aStyleSettings.SetActiveTabColor( aBase );
+
+ // Buttons
+ aStyleSettings.SetButtonTextColor( toColor( qColorGroup.buttonText() ) );
+ aStyleSettings.SetButtonRolloverTextColor( toColor( qColorGroup.buttonText() ) );
+
+ // Disable color
+ aStyleSettings.SetDisableColor( toColor( qColorGroup.mid() ) );
+
+ // Workspace
+ aStyleSettings.SetWorkspaceColor( toColor( qColorGroup.mid() ) );
+
+ // Background
+ aStyleSettings.Set3DColors( aBack );
+ aStyleSettings.SetFaceColor( aBack );
+ aStyleSettings.SetInactiveTabColor( aBack );
+ aStyleSettings.SetDialogColor( aBack );
+ if( aBack == COL_LIGHTGRAY )
+ aStyleSettings.SetCheckedColor( Color( 0xCC, 0xCC, 0xCC ) );
+ else
+ {
+ Color aColor2 = aStyleSettings.GetLightColor();
+ aStyleSettings.
+ SetCheckedColor( Color( (BYTE)(((USHORT)aBack.GetRed()+(USHORT)aColor2.GetRed())/2),
+ (BYTE)(((USHORT)aBack.GetGreen()+(USHORT)aColor2.GetGreen())/2),
+ (BYTE)(((USHORT)aBack.GetBlue()+(USHORT)aColor2.GetBlue())/2)
+ ) );
+ }
+
+ // Selection
+ aStyleSettings.SetHighlightColor( toColor( qColorGroup.highlight() ) );
+ aStyleSettings.SetHighlightTextColor( toColor( qColorGroup.highlightedText() ) );
+
+ // Font
+ Font aFont = toFont( kapp->font(), rSettings.GetUILocale() );
+
+ aStyleSettings.SetAppFont( aFont );
+ aStyleSettings.SetHelpFont( aFont );
+ aStyleSettings.SetMenuFont( aFont ); // will be changed according to pMenuBar
+ aStyleSettings.SetToolFont( aFont ); // will be changed according to pToolBar
+ aStyleSettings.SetLabelFont( aFont );
+ aStyleSettings.SetInfoFont( aFont );
+ aStyleSettings.SetRadioCheckFont( aFont );
+ aStyleSettings.SetPushButtonFont( aFont );
+ aStyleSettings.SetFieldFont( aFont );
+ aStyleSettings.SetIconFont( aFont );
+ aStyleSettings.SetGroupFont( aFont );
+
+ aFont.SetWeight( WEIGHT_BOLD );
+ if( !bSetTitleFont )
+ aStyleSettings.SetTitleFont( aFont );
+ aStyleSettings.SetFloatTitleFont( aFont );
+
+ int flash_time = TQApplication::cursorFlashTime();
+ aStyleSettings.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME );
+
+ KMainWindow qMainWindow;
+ qMainWindow.createGUI( "/dev/null" ); // hack
+
+ // Menu
+ aStyleSettings.SetSkipDisabledInMenus( TRUE );
+ KMenuBar *pMenuBar = qMainWindow.menuBar();
+ if ( pMenuBar )
+ {
+ // Color
+ TQColorGroup qMenuCG = pMenuBar->colorGroup();
+
+ // Menu text and background color, theme specific
+ Color aMenuFore = toColor( qMenuCG.foreground() );
+ Color aMenuBack = toColor( qMenuCG.background() );
+ if ( kapp->style().inherits( "LightStyleV2" ) ||
+ kapp->style().inherits( "LightStyleV3" ) ||
+ ( kapp->style().inherits( "QMotifStyle" ) && !kapp->style().inherits( "QSGIStyle" ) ) ||
+ kapp->style().inherits( "QWindowsStyle" ) )
+ {
+ aMenuFore = toColor( qMenuCG.buttonText() );
+ aMenuBack = toColor( qMenuCG.button() );
+ }
+
+ aStyleSettings.SetMenuTextColor( aMenuFore );
+ aStyleSettings.SetMenuBarTextColor( aMenuFore );
+ aStyleSettings.SetMenuColor( aMenuBack );
+ aStyleSettings.SetMenuBarColor( aMenuBack );
+
+ aStyleSettings.SetMenuHighlightColor( toColor ( qMenuCG.highlight() ) );
+
+ // Menu items higlight text color, theme specific
+ if ( kapp->style().inherits( "HighContrastStyle" ) ||
+ kapp->style().inherits( "KeramikStyle" ) ||
+ kapp->style().inherits( "QWindowsStyle" ) ||
+ kapp->style().inherits( "ThinKeramikStyle" ) ||
+ kapp->style().inherits( "PlastikStyle" ) )
+ {
+ aStyleSettings.SetMenuHighlightTextColor( toColor ( qMenuCG.highlightedText() ) );
+ }
+ else
+ aStyleSettings.SetMenuHighlightTextColor( aMenuFore );
+
+ // set special menubar higlight text color
+ if ( kapp->style().inherits( "HighContrastStyle" ) )
+ ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.highlightedText() );
+ else
+ ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore;
+
+ // Font
+ aFont = toFont( pMenuBar->font(), rSettings.GetUILocale() );
+ aStyleSettings.SetMenuFont( aFont );
+ }
+
+ // Tool bar
+ KToolBar *pToolBar = qMainWindow.toolBar();
+ if ( pToolBar )
+ {
+ aFont = toFont( pToolBar->font(), rSettings.GetUILocale() );
+ aStyleSettings.SetToolFont( aFont );
+ }
+
+ // Scroll bar size
+ aStyleSettings.SetScrollBarSize( kapp->style().pixelMetric( TQStyle::PM_ScrollBarExtent ) );
+
+ rSettings.SetStyleSettings( aStyleSettings );
+}
+
+SalGraphics* TDESalFrame::GetGraphics()
+{
+ if( GetWindow() )
+ {
+ for( int i = 0; i < nMaxGraphics; i++ )
+ {
+ if( ! m_aGraphics[i].bInUse )
+ {
+ m_aGraphics[i].bInUse = true;
+ if( ! m_aGraphics[i].pGraphics )
+ {
+ m_aGraphics[i].pGraphics = new TDESalGraphics();
+ m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() );
+ }
+ return m_aGraphics[i].pGraphics;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+void TDESalFrame::ReleaseGraphics( SalGraphics *pGraphics )
+{
+ for( int i = 0; i < nMaxGraphics; i++ )
+ {
+ if( m_aGraphics[i].pGraphics == pGraphics )
+ {
+ m_aGraphics[i].bInUse = false;
+ break;
+ }
+ }
+}
+
+void TDESalFrame::updateGraphics( bool bClear )
+{
+ Drawable aDrawable = bClear ? None : GetWindow();
+ for( int i = 0; i < nMaxGraphics; i++ )
+ {
+ if( m_aGraphics[i].bInUse )
+ m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() );
+ }
+}
+
+TDESalFrame::~TDESalFrame()
+{
+}
+
+TDESalFrame::GraphicsHolder::~GraphicsHolder()
+{
+ delete pGraphics;
+}
+
+// -----------------------------------------------------------------------
+// TDESalInstance implementation
+// -----------------------------------------------------------------------
+
+SalFrame *
+TDESalInstance::CreateFrame( SalFrame *pParent, sal_uLong nStyle )
+{
+ return new TDESalFrame( pParent, nStyle );
+}
+
+// -----------------------------------------------------------------------
+// TDESalData pieces
+// -----------------------------------------------------------------------
+
+// Create the widget painter so we have some control over
+// the destruction sequence, so Qt doesn't die in action.
+
+void TDEData::initNWF()
+{
+ ImplSVData *pSVData = ImplGetSVData();
+ // draw toolbars on separate lines
+ pSVData->maNWFData.mbDockingAreaSeparateTB = true;
+
+ pWidgetPainter = new WidgetPainter();
+}
+
+void TDEData::deInitNWF()
+{
+ delete pWidgetPainter;
+ pWidgetPainter = NULL;
+
+ // We have to destroy the style early
+ kapp->setStyle( NULL );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/tde/tdedata.cxx b/vcl/unx/tde/tdedata.cxx
new file mode 100644
index 0000000..adeb628
--- /dev/null
+++ b/vcl/unx/tde/tdedata.cxx
@@ -0,0 +1,267 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ * Copyright 2011 Timothy Pearson
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_vcl.hxx"
+
+#define _SV_SALDATA_CXX
+#include <unx/tde/tde_headers.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <errno.h>
+#include <poll.h>
+#ifdef FREEBSD
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>
+#endif
+
+#include <osl/thread.h>
+#include <osl/process.h>
+#include <osl/module.h>
+#include <osl/mutex.hxx>
+
+#include <tools/debug.hxx>
+
+#include "unx/tde/tdedata.hxx"
+#include "unx/i18n_im.hxx"
+#include "unx/i18n_xkb.hxx"
+
+#include "vclpluginapi.h"
+
+/* #i59042# override KApplications method for session management
+ * since it will interfere badly with our own.
+ */
+class VCLTDEApplication : public KApplication
+{
+ public:
+ VCLTDEApplication() : KApplication() {}
+
+ virtual void commitData(QSessionManager &sm);
+};
+
+void VCLTDEApplication::commitData(QSessionManager&)
+{
+}
+
+/***************************************************************************
+ * class SalTDEDisplay *
+ ***************************************************************************/
+
+SalTDEDisplay::SalTDEDisplay( Display* pDisp )
+ : SalX11Display( pDisp )
+{
+}
+
+SalTDEDisplay::~SalTDEDisplay()
+{
+ // in case never a frame opened
+ static_cast<TDEXLib*>(GetXLib())->doStartup();
+ // clean up own members
+ doDestruct();
+ // prevent SalDisplay from closing KApplication's display
+ pDisp_ = NULL;
+}
+
+/***************************************************************************
+ * class TDEXLib *
+ ***************************************************************************/
+
+TDEXLib::~TDEXLib()
+{
+ // on 64 bit linux using libXRandr.so.2 will crash in
+ // XCloseDisplay when freeing extension data
+ // no known work around, therefor currently leak. Hopefully
+ // this does not make problems since we're shutting down anyway
+ // should we ever get a real tde plugin that uses the TDE event loop
+ // we should use tde's method to signal screen changes similar
+ // to the gtk plugin
+ #if ! defined USE_RANDR || ! (defined LINUX && defined X86_64)
+ // properly deinitialize KApplication
+ delete (VCLTDEApplication*)m_pApplication;
+ #endif
+ // free the faked cmdline arguments no longer needed by KApplication
+ for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
+ free( m_pFreeCmdLineArgs[i] );
+ delete [] m_pFreeCmdLineArgs;
+ delete [] m_pAppCmdLineArgs;
+}
+
+void TDEXLib::Init()
+{
+ SalI18N_InputMethod* pInputMethod = new SalI18N_InputMethod;
+ pInputMethod->SetLocale();
+ XrmInitialize();
+
+ KAboutData *kAboutData = new KAboutData( "LibreOffice",
+ I18N_NOOP( "LibreOffice" ),
+ "1.1.0",
+ I18N_NOOP( "LibreOffice with TDE Native Widget Support." ),
+ KAboutData::License_LGPL,
+ "(c) 2003, 2004 Novell, Inc\n(c) 2010 Timothy Pearson",
+ I18N_NOOP( "LibreOffice is an office suite.\n" ),
+ "http://libreoffice.org",
+ "libreoffice@lists.freedesktop.org");
+ kAboutData->addAuthor( "Jan Holesovsky",
+ I18N_NOOP( "Original author and maintainer of the TDE NWF." ),
+ "kendy@artax.karlin.mff.cuni.cz",
+ "http://artax.karlin.mff.cuni.cz/~kendy" );
+
+ m_nFakeCmdLineArgs = 1;
+ sal_uInt16 nIdx;
+ int nParams = osl_getCommandArgCount();
+ rtl::OString aDisplay;
+ rtl::OUString aParam, aBin;
+
+ for ( nIdx = 0; nIdx < nParams; ++nIdx )
+ {
+ osl_getCommandArg( nIdx, &aParam.pData );
+ if ( !m_pFreeCmdLineArgs && aParam.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "-display" ) ) && nIdx + 1 < nParams )
+ {
+ osl_getCommandArg( nIdx + 1, &aParam.pData );
+ aDisplay = rtl::OUStringToOString( aParam, osl_getThreadTextEncoding() );
+
+ m_nFakeCmdLineArgs = 3;
+ m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
+ m_pFreeCmdLineArgs[ 1 ] = strdup( "-display" );
+ m_pFreeCmdLineArgs[ 2 ] = strdup( aDisplay.getStr() );
+ }
+ }
+ if ( !m_pFreeCmdLineArgs )
+ m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
+
+ osl_getExecutableFile( &aParam.pData );
+ osl_getSystemPathFromFileURL( aParam.pData, &aBin.pData );
+ rtl::OString aExec = rtl::OUStringToOString( aBin, osl_getThreadTextEncoding() );
+ m_pFreeCmdLineArgs[0] = strdup( aExec.getStr() );
+
+ // make a copy of the string list for freeing it since
+ // KApplication manipulates the pointers inside the argument vector
+ // note: KApplication bad !
+ m_pAppCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
+ for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
+ m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i];
+
+ KCmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs, kAboutData );
+
+ KApplication::disableAutoDcopRegistration();
+ m_pApplication = new VCLTDEApplication();
+ kapp->disableSessionManagement();
+
+ Display* pDisp = QPaintDevice::x11AppDisplay();
+
+ SalX11Display *pSalDisplay = new SalTDEDisplay( pDisp );
+
+ pInputMethod->CreateMethod( pDisp );
+ pSalDisplay->SetupInput( pInputMethod );
+}
+
+void TDEXLib::doStartup()
+{
+ if( ! m_bStartupDone )
+ {
+ KStartupInfo::appStarted();
+ m_bStartupDone = true;
+ #if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "called KStartupInfo::appStarted()\n" );
+ #endif
+ }
+}
+
+/**********************************************************************
+ * class TDEData *
+ **********************************************************************/
+
+TDEData::~TDEData()
+{
+}
+
+void TDEData::Init()
+{
+ pXLib_ = new TDEXLib();
+ pXLib_->Init();
+}
+
+/**********************************************************************
+ * plugin entry point *
+ **********************************************************************/
+
+extern "C" {
+ VCLPLUG_TDE_PUBLIC SalInstance* create_SalInstance( oslModule )
+ {
+ /* #i92121# workaround deadlocks in the X11 implementation
+ */
+ static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" );
+ /* #i90094#
+ from now on we know that an X connection will be
+ established, so protect X against itself
+ */
+ if( ! ( pNoXInitThreads && *pNoXInitThreads ) )
+ XInitThreads();
+
+ rtl::OString aVersion( qVersion() );
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "qt version string is \"%s\"\n", aVersion.getStr() );
+#endif
+ sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0, nMicro = 0;
+ nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32();
+ if( nIndex > 0 )
+ nMinor = aVersion.getToken( 0, '.', nIndex ).toInt32();
+ if( nIndex > 0 )
+ nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32();
+ if( nMajor != 3 || nMinor < 2 || (nMinor == 2 && nMicro < 2) )
+ {
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "unsuitable qt version %d.%d.%d\n", (int)nMajor, (int)nMinor, (int)nMicro );
+#endif
+ return NULL;
+ }
+
+ TDESalInstance* pInstance = new TDESalInstance( new SalYieldMutex() );
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "created TDESalInstance 0x%p\n", pInstance );
+#endif
+
+ // initialize SalData
+ TDEData *pSalData = new TDEData( pInstance );
+ pSalData->Init();
+ pInstance->SetLib( pSalData->GetLib() );
+ pSalData->initNWF();
+
+ return pInstance;
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */