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