summaryrefslogtreecommitdiff
path: root/connectivity
diff options
context:
space:
mode:
authorHans-Joachim Lankenau <hjs@openoffice.org>2004-06-25 17:33:31 +0000
committerHans-Joachim Lankenau <hjs@openoffice.org>2004-06-25 17:33:31 +0000
commitee5a5efe4e51589c1ae6e9966d15796162961ac0 (patch)
tree434354d3e38e9782e021b36331453b05e04cdf99 /connectivity
parentaef2171332725abe456f51af333533254a8ddd5d (diff)
INTEGRATION: CWS mozab04 (1.12.2); FILE MERGED
2004/04/13 10:50:37 windly 1.12.2.4: #i6883# some little change such as replace tab to space 2004/04/13 04:45:33 windly 1.12.2.3: #i6883# fix some build error on Solaris 2004/04/12 10:15:55 windly 1.12.2.2: #i6883# make mozab driver threadsafe 2004/04/05 09:54:44 windly 1.12.2.1: #i20338# Read and Write access to Address Books
Diffstat (limited to 'connectivity')
-rw-r--r--connectivity/source/drivers/mozab/mozillasrc/MQuery.cxx259
1 files changed, 232 insertions, 27 deletions
diff --git a/connectivity/source/drivers/mozab/mozillasrc/MQuery.cxx b/connectivity/source/drivers/mozab/mozillasrc/MQuery.cxx
index 734b59dcb919..7d6c53b78dd3 100644
--- a/connectivity/source/drivers/mozab/mozillasrc/MQuery.cxx
+++ b/connectivity/source/drivers/mozab/mozillasrc/MQuery.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: MQuery.cxx,v $
*
- * $Revision: 1.12 $
+ * $Revision: 1.13 $
*
- * last change: $Author: obo $ $Date: 2004-03-17 10:42:49 $
+ * last change: $Author: hjs $ $Date: 2004-06-25 18:33:31 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -59,7 +59,9 @@
*
************************************************************************/
+#ifndef _CONNECTIVITY_MAB_QUERYHELPER_HXX_
#include <MQueryHelper.hxx>
+#endif
#include <MNameMapper.hxx>
#include <MConnection.hxx>
@@ -72,6 +74,9 @@
#ifndef _CONNECTIVITY_MAB_CONVERSIONS_HXX_
#include "MTypeConverter.hxx"
#endif
+#ifndef _CONNECTIVITY_MAB_MOZABHELPER_HXX_
+#include "MNSMozabProxy.hxx"
+#endif
#if OSL_DEBUG_LEVEL > 0
# define OUtoCStr( x ) ( ::rtl::OUStringToOString ( (x), RTL_TEXTENCODING_ASCII_US).getStr())
@@ -98,9 +103,9 @@ using namespace connectivity;
namespace connectivity {
namespace mozab {
struct MQueryDirectory {
- nsCOMPtr<nsIAbDirectoryQuery> directory;
+ nsCOMPtr<nsIAbDirectory> directory;
+ nsCOMPtr<nsIAbDirectoryQuery> directoryQuery;
PRInt32 contextId;
-
MQueryDirectory() : contextId(-1) {}
};
}
@@ -112,6 +117,9 @@ MQuery::MQuery()
OSL_TRACE( "IN MQuery::MQuery()\n" );
construct();
+#if OSL_DEBUG_LEVEL > 0
+ m_oThreadID = osl_getThreadIdentifier(NULL);
+#endif
OSL_TRACE( "\tOUT MQuery::MQuery()\n" );
}
@@ -123,6 +131,9 @@ MQuery::MQuery(const ::std::map< ::rtl::OUString, ::rtl::OUString> & ca)
construct();
m_aColumnAliasMap = ca;
+#if OSL_DEBUG_LEVEL > 0
+ m_oThreadID = osl_getThreadIdentifier(NULL);
+#endif
OSL_TRACE( "\tOUT MQuery::MQuery( ca )\n" );
}
@@ -134,9 +145,9 @@ MQuery::~MQuery()
// MQueryHelper is reference counted, so we need to decrement the
// count here.
//
- if ( m_aQueryDirectory->contextId != -1 && m_aQueryDirectory->directory !=
+ if ( m_aQueryDirectory->contextId != -1 && m_aQueryDirectory->directoryQuery !=
NULL )
- m_aQueryDirectory->directory->StopQuery(m_aQueryDirectory->contextId);
+ m_aQueryDirectory->directoryQuery->StopQuery(m_aQueryDirectory->contextId);
if ( m_aQueryDirectory )
delete m_aQueryDirectory;
@@ -170,7 +181,8 @@ void MQuery::setAttributes(::std::vector< ::rtl::OUString> &attrs)
m_aAttributes.reserve(attrs.size());
::std::vector< ::rtl::OUString>::iterator aIterAttr = attrs.begin();
::std::map< ::rtl::OUString, ::rtl::OUString>::iterator aIterMap;
- for(aIterAttr; aIterAttr != attrs.end();++aIterAttr)
+
+ for(aIterAttr = attrs.begin(); aIterAttr != attrs.end();++aIterAttr)
{
aIterMap = m_aColumnAliasMap.find(*aIterAttr);
if (aIterMap == m_aColumnAliasMap.end()) {
@@ -411,33 +423,110 @@ sal_uInt32 MQuery::InsertLoginInfo(OConnection* _pCon)
sslPrefName.Append(NS_LITERAL_CSTRING(".UseSSL"));
rv = prefs->SetBoolPref (sslPrefName.get(),useSSL);
NS_ENSURE_SUCCESS(rv, rv);
+ return rv;
}
+
// -------------------------------------------------------------------------
-sal_Bool CheckForceQueryProxyUse(const nsIAbDirectory* directory)
+sal_Int32 getDirectoryType(const nsIAbDirectory* directory)
{
nsresult retCode;
nsCOMPtr<nsIRDFResource> rdfResource = do_QueryInterface((nsISupports *)directory, &retCode) ;
- if (NS_FAILED(retCode)) { return sal_False; }
+ if (NS_FAILED(retCode)) { return SDBCAddress::Unknown; }
const char * uri;
retCode=rdfResource->GetValueConst(&uri);
- if (NS_FAILED(retCode)) { return sal_False; }
- const char *outlookUriPrefix="moz-aboutlookdirectory://";
- if (strncmp(uri,outlookUriPrefix,strlen(outlookUriPrefix)) == 0)
+ if (NS_FAILED(retCode)) { return SDBCAddress::Unknown; }
+ const sal_Char *sUriPrefix = ::connectivity::mozab::MOZ_SCHEME_LDAP;
+ if (strncmp(uri,sUriPrefix,strlen(sUriPrefix)) == 0)
{
- return sal_True;
+ return SDBCAddress::LDAP;
}
- else
+ sUriPrefix = ::connectivity::mozab::MOZ_SCHEME_MOZILLA;
+ if (strncmp(uri,sUriPrefix,strlen(sUriPrefix)) == 0)
{
- return sal_False;
+ return SDBCAddress::Mozilla;
+ }
+ sUriPrefix = ::connectivity::mozab::MOZ_SCHEME_MOZILLA_MDB;
+ if (strncmp(uri,sUriPrefix,strlen(sUriPrefix)) == 0)
+ {
+ return SDBCAddress::Mozilla;
}
+ sUriPrefix = ::connectivity::mozab::MOZ_SCHEME_OUTLOOK_EXPRESS;
+ if (strncmp(uri,sUriPrefix,strlen(sUriPrefix)) == 0)
+ {
+ return SDBCAddress::OutlookExp;
+ }
+ sUriPrefix = ::connectivity::mozab::MOZ_SCHEME_OUTLOOK_MAPI;
+ if (strncmp(uri,sUriPrefix,strlen(sUriPrefix)) == 0)
+ {
+ return SDBCAddress::Outlook;
+ }
+ return SDBCAddress::Unknown;
}
// -------------------------------------------------------------------------
+sal_Bool isForceQueryProxyUsed(const nsIAbDirectory* directory)
+{
+ sal_Int32 nType = getDirectoryType(directory);
+ if (nType == SDBCAddress::Outlook || nType == SDBCAddress::OutlookExp)
+ return sal_True;
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Int32 MQuery::commitRow(const sal_Int32 rowIndex)
+{
+ if (!m_aQueryHelper || !m_aQueryDirectory || !m_aQueryDirectory->directoryQuery)
+ return sal_False;
+ MNSMozabProxy xMProxy;
+ RunArgs args;
+ args.funcIndex = ProxiedFunc::FUNC_QUERYHELPER_COMMIT_CARD;
+ args.argCount = 3;
+ args.arg1 = (void*)m_aQueryHelper;
+ args.arg2 = (void*)&rowIndex;
+ args.arg3 = (void*)m_aQueryDirectory->directory;
+ nsresult rv = xMProxy.StartProxy(&args);
+ m_aErrorString = m_aQueryHelper->getErrorString();
+ return rv;
+}
+
+// -------------------------------------------------------------------------
+sal_Int32 MQuery::deleteRow(const sal_Int32 rowIndex)
+{
+ if (!m_aQueryHelper || !m_aQueryDirectory || !m_aQueryDirectory->directoryQuery)
+ return sal_False;
+ MNSMozabProxy xMProxy;
+ RunArgs args;
+ args.funcIndex = ProxiedFunc::FUNC_QUERYHELPER_DELETE_CARD;
+ args.argCount = 3;
+ args.arg1 = (void*)m_aQueryHelper;
+ args.arg2 = (void*)&rowIndex;
+ args.arg3 = (void*)m_aQueryDirectory->directory;
+ nsresult rv = xMProxy.StartProxy(&args);
+ m_aErrorString = m_aQueryHelper->getErrorString();
+ return rv;
+
+}
+
+// -------------------------------------------------------------------------
sal_Int32 MQuery::executeQuery(OConnection* _pCon)
{
- OSL_TRACE("IN MQuery::executeQuery()\n");
::osl::MutexGuard aGuard(m_aMutex);
-
+ OSL_TRACE("IN MQuery::executeQuery()\n");
+ nsresult rv;
+ MNSMozabProxy xMProxy;
+ RunArgs args;
+ args.funcIndex = ProxiedFunc::FUNC_EXECUTE_QUERY;
+ args.argCount = 2;
+ args.arg1 = (void*)this;
+ args.arg2 = (void*)_pCon;
+ rv = xMProxy.StartProxy(&args);
+ return rv;
+}
+// -------------------------------------------------------------------------
+sal_Int32 MQuery::executeQueryProxied(OConnection* _pCon)
+{
+#if OSL_DEBUG_LEVEL > 0
+ OSL_TRACE("IN MQuery::executeQueryProxied() Caller thread: %4d \n", m_oThreadID);
+#endif
nsresult rv; // Store return values.
// MTypeConverter aTypeConverter;
@@ -464,10 +553,11 @@ sal_Int32 MQuery::executeQuery(OConnection* _pCon)
// Since Outlook Express and Outlook in OCL mode support a very limited query capability,
// we use the following bool to judge whether we need bypass any use of a DirectoryQuery
// interface and instead force the use of the QueryProxy.
- sal_Bool forceQueryProxyUse = CheckForceQueryProxyUse(directory);
+ sal_Bool forceQueryProxyUse = isForceQueryProxyUsed(directory);
+ m_aQueryDirectory->directory = directory;
// Initialize directory in cases of LDAP and Mozilla
- if (!forceQueryProxyUse) m_aQueryDirectory->directory = do_QueryInterface(directory, &rv);
+ if (!forceQueryProxyUse) m_aQueryDirectory->directoryQuery = do_QueryInterface(directory, &rv);
if ( NS_FAILED(rv) || forceQueryProxyUse)
{
@@ -483,7 +573,7 @@ sal_Int32 MQuery::executeQuery(OConnection* _pCon)
rv = directoryQueryProxy->Initiate (directory);
NS_ENSURE_SUCCESS(rv, rv);
- m_aQueryDirectory->directory = do_QueryInterface (directoryQueryProxy, &rv);
+ m_aQueryDirectory->directoryQuery = do_QueryInterface (directoryQueryProxy, &rv);
NS_ENSURE_SUCCESS(rv, rv);
OSL_TRACE("Using the directoryQueryProxy\n");
}
@@ -530,6 +620,7 @@ sal_Int32 MQuery::executeQuery(OConnection* _pCon)
}
}
+
nsCOMPtr< nsIAbBooleanExpression > queryExpression = do_CreateInstance( kBooleanExpressionCID , &rv);
NS_ENSURE_SUCCESS( rv, rv );
rv = generateExpression( this, &m_aExpr, queryExpression );
@@ -558,13 +649,13 @@ sal_Int32 MQuery::executeQuery(OConnection* _pCon)
m_aQueryHelper->reset();
- rv = m_aQueryDirectory->directory->DoQuery(arguments, m_aQueryHelper, m_nMaxNrOfReturns, -1, &m_aQueryDirectory->contextId);
+ rv = m_aQueryDirectory->directoryQuery->DoQuery(arguments, m_aQueryHelper, m_nMaxNrOfReturns, -1, &m_aQueryDirectory->contextId);
if (NS_FAILED(rv)) {
m_aQueryDirectory->contextId = -1;
OSL_TRACE( "****** DoQuery failed\n");
- OSL_TRACE("\tOUT MQuery::executeQuery()\n");
+ OSL_TRACE("\tOUT MQuery::executeQueryProxied()\n");
m_aQueryHelper->notifyQueryError() ;
return(-1);
}
@@ -574,7 +665,7 @@ sal_Int32 MQuery::executeQuery(OConnection* _pCon)
}
#endif
- OSL_TRACE("\tOUT MQuery::executeQuery()\n");
+ OSL_TRACE("\tOUT MQuery::executeQueryProxied()\n");
return(0);
}
@@ -616,9 +707,9 @@ MQuery::queryComplete( void )
sal_Bool
MQuery::waitForQueryComplete( void )
{
- if( m_aQueryHelper->waitForQueryComplete( m_aErrorString ) )
+ if( m_aQueryHelper->waitForQueryComplete( ) )
return sal_True;
-
+ m_aErrorString = m_aQueryHelper->getErrorString();
m_aErrorOccurred = sal_True;
return( sal_False );
}
@@ -629,24 +720,57 @@ sal_Bool
MQuery::checkRowAvailable( sal_Int32 nDBRow )
{
while( !queryComplete() && m_aQueryHelper->getRealCount() <= (sal_uInt32)nDBRow )
- if ( !m_aQueryHelper->waitForRow( nDBRow, m_aErrorString ) ) {
+ if ( !m_aQueryHelper->waitForRow( nDBRow ) ) {
m_aErrorOccurred = sal_True;
+ m_aErrorString = m_aQueryHelper->getErrorString();
return( sal_False );
}
return( getRowCount() > nDBRow );
}
+// -------------------------------------------------------------------------
+sal_Bool
+MQuery::setRowValue( ORowSetValue& rValue, sal_Int32 nDBRow,const rtl::OUString& aDBColumnName, sal_Int32 nType ) const
+{
+ MQueryHelperResultEntry* xResEntry = m_aQueryHelper->getByIndex( nDBRow );
+
+ OSL_ENSURE( xResEntry != NULL, "xResEntry == NULL");
+ if (xResEntry == NULL )
+ {
+ m_aErrorOccurred = sal_True;
+ m_aErrorString = m_aQueryHelper->getErrorString();
+ return sal_False;
+ }
+ switch ( nType )
+ {
+ case DataType::VARCHAR:
+ {
+ ::std::map< ::rtl::OUString, ::rtl::OUString>::const_iterator aIterMap = m_aColumnAliasMap.find(aDBColumnName);
+ if (aIterMap != m_aColumnAliasMap.end())
+ xResEntry->setValue(aIterMap->second, rValue.getString());
+ else
+ xResEntry->setValue( aDBColumnName, rValue.getString());
+ }
+ break;
+ default:
+ OSL_ENSURE( sal_False, "invalid data type!" );
+ break;
+ }
+
+ return sal_True;
+}
// -------------------------------------------------------------------------
sal_Bool
MQuery::getRowValue( ORowSetValue& rValue, sal_Int32 nDBRow,const rtl::OUString& aDBColumnName, sal_Int32 nType ) const
{
- MQueryHelperResultEntry* xResEntry = m_aQueryHelper->getByIndex( nDBRow, m_aErrorString );
+ MQueryHelperResultEntry* xResEntry = m_aQueryHelper->getByIndex( nDBRow );
OSL_ENSURE( xResEntry != NULL, "xResEntry == NULL");
if (xResEntry == NULL )
{
m_aErrorOccurred = sal_True;
+ m_aErrorString = m_aQueryHelper->getErrorString();
rValue.setNull();
return sal_False;
}
@@ -669,6 +793,66 @@ MQuery::getRowValue( ORowSetValue& rValue, sal_Int32 nDBRow,const rtl::OUString&
return sal_True;
}
// -------------------------------------------------------------------------
+sal_Int32
+MQuery::getRowStates(sal_Int32 nDBRow)
+{
+ MQueryHelperResultEntry* xResEntry = m_aQueryHelper->getByIndex( nDBRow );
+
+ OSL_ENSURE( xResEntry != NULL, "xResEntry == NULL");
+ if (xResEntry == NULL )
+ {
+ m_aErrorOccurred = sal_True;
+ m_aErrorString = m_aQueryHelper->getErrorString();
+ return RowStates_Error;
+ }
+ return xResEntry->getRowStates();
+}
+sal_Bool
+MQuery::setRowStates(sal_Int32 nDBRow,sal_Int32 aState)
+{
+ MQueryHelperResultEntry* xResEntry = m_aQueryHelper->getByIndex( nDBRow );
+
+ OSL_ENSURE( xResEntry != NULL, "xResEntry == NULL");
+ if (xResEntry == NULL )
+ {
+ m_aErrorOccurred = sal_True;
+ m_aErrorString = m_aQueryHelper->getErrorString();
+ return sal_False;
+ }
+ return xResEntry->setRowStates(aState);
+}
+
+sal_Bool
+MQuery::resyncRow(sal_Int32 nDBRow)
+{
+ MNSMozabProxy xMProxy;
+ RunArgs args;
+ args.funcIndex = ProxiedFunc::FUNC_QUERYHELPER_RESYNC_CARD;
+ args.argCount = 2;
+ args.arg1 = (void*)m_aQueryHelper;
+ args.arg2 = (void*)&nDBRow;
+ nsresult rv = xMProxy.StartProxy(&args);
+ m_aErrorString = m_aQueryHelper->getErrorString();
+ return rv;
+}
+
+sal_Int32
+MQuery::createNewCard()
+{
+ sal_Int32 nNumber = 0;
+ MNSMozabProxy xMProxy;
+ RunArgs args;
+ args.funcIndex = ProxiedFunc::FUNC_QUERYHELPER_CREATE_NEW_CARD;
+ args.argCount = 2;
+ args.arg1 = (void*)m_aQueryHelper;
+ args.arg2 = (void*)&nNumber;
+ nsresult rv = xMProxy.StartProxy(&args);
+
+ m_aErrorString = m_aQueryHelper->getErrorString();
+ NS_ENSURE_SUCCESS(rv,0);
+ return nNumber;
+}
+// -------------------------------------------------------------------------
MNameMapper*
MQuery::CreateNameMapper()
@@ -682,3 +866,24 @@ MQuery::FreeNameMapper( MNameMapper* _ptr )
{
delete _ptr;
}
+// -------------------------------------------------------------------------
+sal_Bool MQuery::
+isWritable()
+{
+ if ( !m_aQueryDirectory )
+ return sal_False;
+
+ nsresult rv; // Store return values.
+ nsCOMPtr<nsIAbDirectory> directory = do_QueryInterface(m_aQueryDirectory->directory, &rv);;
+ if (NS_FAILED(rv))
+ return sal_False;
+ if (getDirectoryType(directory) == SDBCAddress::Mozilla && isProfileLocked())
+ return sal_False;
+
+ PRBool isWriteable;
+ rv = directory->GetOperations (&isWriteable);
+ if (NS_FAILED(rv))
+ return sal_False;
+ sal_Bool bWritable = isWriteable & nsIAbDirectory::opWrite;
+ return bWritable;
+}