00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include <kdebug.h>
00022
#include <qstringlist.h>
00023
#include <qdir.h>
00024
00025
#include "ldapurl.h"
00026
00027
using namespace KABC;
00028
00029 LDAPUrl::LDAPUrl()
00030 {
00031 m_scope = Base;
00032 }
00033
00034 LDAPUrl::LDAPUrl(
const KURL &_url)
00035 :
KURL(_url), m_extensions()
00036 {
00037 m_dn =
path();
00038
if ( !QDir::isRelativePath(m_dn) )
00039
#ifdef Q_WS_WIN
00040
m_dn.
remove(0,3);
00041
#else
00042
m_dn.
remove(0,1);
00043
#endif
00044
parseQuery();
00045 }
00046
00047 void LDAPUrl::setDn(
const QString &dn)
00048 {
00049 m_dn = dn;
00050
if ( !QDir::isRelativePath(m_dn) )
00051
#ifdef Q_WS_WIN
00052
m_dn.
remove(0,3);
00053
#else
00054
m_dn.
remove(0,1);
00055
#endif
00056
setPath(m_dn);
00057 }
00058
00059 bool LDAPUrl::hasExtension(
const QString &key )
const
00060
{
00061
return m_extensions.
contains( key );
00062 }
00063
00064 LDAPUrl::Extension LDAPUrl::extension(
const QString &key )
const
00065
{
00066
QMap<QString, Extension>::const_iterator it;
00067
00068 it = m_extensions.
find( key );
00069
if ( it != m_extensions.
constEnd() )
00070
return (*it);
00071
else {
00072 Extension ext;
00073 ext.value =
"";
00074 ext.critical =
false;
00075
return ext;
00076 }
00077 }
00078
00079 QString LDAPUrl::extension(
const QString &key,
bool &critical )
const
00080
{
00081 Extension ext;
00082
00083 ext =
extension( key );
00084 critical = ext.critical;
00085
return ext.value;
00086 }
00087
00088 void LDAPUrl::setExtension(
const QString &key,
const LDAPUrl::Extension &ext )
00089 {
00090 m_extensions[ key ] = ext;
00091
updateQuery();
00092 }
00093
00094 void LDAPUrl::setExtension(
const QString &key,
const QString &value,
bool critical )
00095 {
00096 Extension ext;
00097 ext.value = value;
00098 ext.critical = critical;
00099
setExtension( key, ext );
00100 }
00101
00102 void LDAPUrl::removeExtension(
const QString &key )
00103 {
00104 m_extensions.
remove( key );
00105
updateQuery();
00106 }
00107
00108 void LDAPUrl::updateQuery()
00109 {
00110 Extension ext;
00111
QMap<QString, Extension>::iterator it;
00112
QString q =
"?";
00113
00114
00115
if ( m_attributes.count() > 0 ) q += m_attributes.
join(
",");
00116
00117
00118 q +=
"?";
00119
switch( m_scope ) {
00120
case Sub:
00121 q +=
"sub";
00122
break;
00123
case One:
00124 q +=
"one";
00125
break;
00126
case Base:
00127 q +=
"base";
00128
break;
00129 }
00130
00131
00132 q +=
"?";
00133
if ( m_filter !=
"(objectClass=*)" && !m_filter.
isEmpty() )
00134 q += m_filter;
00135
00136
00137 q +=
"?";
00138
for ( it = m_extensions.
begin(); it != m_extensions.
end(); it++ ) {
00139
if ( it.data().critical ) q +=
"!";
00140 q += it.key();
00141
if ( !it.data().value.
isEmpty() )
00142 q +=
"=" + it.data().value;
00143 q +=
",";
00144 }
00145
while ( q.
endsWith(
"?") || q.
endsWith(
",") )
00146 q.
remove( q.
length() - 1, 1 );
00147
00148 setQuery(q);
00149
kdDebug(5700) <<
"LDAP URL updateQuery(): " << prettyURL() <<
endl;
00150 }
00151
00152
void LDAPUrl::parseQuery()
00153 {
00154 Extension ext;
00155
QStringList extensions;
00156
QString q =
query();
00157
00158
if (q.
startsWith(
"?"))
00159 q.
remove(0,1);
00160
00161
00162
QStringList url_items = QStringList::split(
"?", q,
true);
00163
00164 m_attributes.clear();
00165 m_scope = Base;
00166 m_filter =
"(objectClass=*)";
00167 m_extensions.
clear();
00168
00169
int i = 0;
00170
for ( QStringList::Iterator it = url_items.begin(); it != url_items.end(); it++, i++ ) {
00171
switch (i) {
00172
case 0:
00173 m_attributes = QStringList::split(
",", (*it),
false);
00174
break;
00175
case 1:
00176
if ( (*it) ==
"sub" ) m_scope = Sub;
else
00177
if ( (*it) ==
"one") m_scope = One;
00178
break;
00179
case 2:
00180 m_filter = decode_string( *it );
00181
break;
00182
case 3:
00183 extensions = QStringList::split(
",", (*it),
false);
00184
break;
00185 }
00186 }
00187
00188
QString name,value;
00189
for ( QStringList::Iterator it = extensions.begin(); it != extensions.end(); it++ ) {
00190 ext.critical =
false;
00191
name =
decode_string( (*it).section(
'=',0,0) ).
lower();
00192 value = decode_string( (*it).section(
'=',1) );
00193
if (
name.
startsWith(
"!") ) {
00194 ext.critical =
true;
00195
name.
remove(0, 1);
00196 }
00197
kdDebug(5700) <<
"LDAPUrl extensions name= " <<
name <<
" value: " << value <<
endl;
00198 ext.value = value.
replace(
"%2",
"," );
00199
setExtension( name, ext );
00200 }
00201 }