ldapurl.cpp00001
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 }
|