]> git.sur5r.net Git - openldap/blob - contrib/ldapc++/src/LDAPSearchRequest.cpp
6115c71024c40753b1f1eaebd40eace481f51c54
[openldap] / contrib / ldapc++ / src / LDAPSearchRequest.cpp
1 /*
2  * Copyright 2000, OpenLDAP Foundation, All Rights Reserved.
3  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
4  */
5
6 #include "debug.h"
7 #include "LDAPSearchRequest.h"
8 #include "LDAPException.h"
9 #include "LDAPSearchReference.h"
10 #include "LDAPResult.h"
11 #include "LDAPRequest.h"
12 #include "LDAPUrl.h"
13
14 LDAPSearchRequest::LDAPSearchRequest(const LDAPSearchRequest& req ) :
15         LDAPRequest (req){
16     DEBUG(LDAP_DEBUG_CONSTRUCT, 
17         "LDAPSearchRequest::LDAPSearchRequest(&)" << endl);
18     m_base=req.m_base;
19     m_scope=req.m_scope;
20     m_filter=req.m_filter;
21     m_attrs=req.m_attrs;
22     m_attrsOnly=req.m_attrsOnly;
23 }
24         
25
26 LDAPSearchRequest::LDAPSearchRequest(const string& base, int scope, 
27         const string& filter, const StringList& attrs, bool attrsOnly,
28         LDAPAsynConnection *connect,
29         const LDAPConstraints* cons, bool isReferral, 
30         const LDAPRequest* parent) 
31             : LDAPRequest (connect,cons,isReferral,parent) {
32     
33     DEBUG(LDAP_DEBUG_CONSTRUCT,
34             "LDAPSearchRequest:LDAPSearchRequest()" << endl);
35     DEBUG(LDAP_DEBUG_CONSTRUCT & LDAP_DEBUG_PARAMETER,
36             "   base:" << base << endl << "   scope:" << scope << endl
37             << "   filter:" << filter << endl);
38     m_requestType=LDAPRequest::SEARCH;
39     //insert some validating and copying here  
40     m_base=base;
41     m_scope=scope;
42     if(filter == ""){
43         m_filter="objectClass=*";  
44     }else{
45         m_filter=filter;
46     }
47     m_attrs=attrs;
48     m_attrsOnly=attrsOnly;
49 }
50
51 LDAPSearchRequest::~LDAPSearchRequest(){
52     DEBUG(LDAP_DEBUG_DESTROY, "LDAPSearchRequest::~LDAPSearchRequest" << endl);
53 }
54
55 LDAPMessageQueue* LDAPSearchRequest::sendRequest(){
56     int msgID; 
57     DEBUG(LDAP_DEBUG_TRACE, "LDAPSearchRequest::sendRequest()" << endl);
58     timeval* tmptime=m_cons->getTimeoutStruct();
59     char** tmpattrs=m_attrs.toCharArray();
60     LDAPControl** tmpSrvCtrl=m_cons->getSrvCtrlsArray();
61     LDAPControl** tmpClCtrl=m_cons->getClCtrlsArray();
62     int aliasDeref = m_cons->getAliasDeref();
63     ldap_set_option(m_connection->getSessionHandle(), LDAP_OPT_DEREF, 
64             &aliasDeref);
65     int err=ldap_search_ext(m_connection->getSessionHandle(), m_base.c_str(),
66             m_scope, m_filter.c_str(), tmpattrs, m_attrsOnly, tmpSrvCtrl,
67             tmpClCtrl, tmptime, m_cons->getSizeLimit(), &msgID );
68     delete tmptime;
69     ldap_value_free(tmpattrs);
70     ldap_controls_free(tmpSrvCtrl);
71     ldap_controls_free(tmpClCtrl);
72
73     if (err != LDAP_SUCCESS){  
74         throw LDAPException(err);
75     } else if (isReferral()){
76         m_msgID=msgID;
77         return 0;
78     }else{
79         m_msgID=msgID;
80         return  new LDAPMessageQueue(this);
81     }
82 }
83
84 LDAPRequest* LDAPSearchRequest::followReferral(LDAPMsg* ref){
85     DEBUG(LDAP_DEBUG_TRACE, "LDAPSearchRequest::followReferral()" << endl);
86     LDAPUrlList urls;
87     LDAPUrlList::const_iterator usedUrl;
88     LDAPAsynConnection* con;
89     string filter;
90     int scope;
91     if(ref->getMessageType() == LDAPMsg::SEARCH_REFERENCE){
92         urls = ((LDAPSearchReference *)ref)->getUrls();
93     }else{
94         urls = ((LDAPResult *)ref)->getReferralUrls();
95     }
96     con = getConnection()->referralConnect(urls,usedUrl,m_cons);
97     if(con != 0){
98         cerr << usedUrl->getFilter();
99         if((usedUrl->getFilter() != "") && 
100             (usedUrl->getFilter() != m_filter)){
101                 filter=usedUrl->getFilter();
102         }else{
103             filter=m_filter;
104         }
105         if( (ref->getMessageType() == LDAPMsg::SEARCH_REFERENCE) && 
106             (m_scope == LDAPAsynConnection::SEARCH_ONE)
107           ){
108             scope = LDAPAsynConnection::SEARCH_BASE;
109             DEBUG(LDAP_DEBUG_TRACE,"   adjusted scope to BASE" << endl);
110         }else{
111             scope = m_scope;
112         }
113     }else{
114         return 0;
115     }
116     return new LDAPSearchRequest(usedUrl->getDN(), scope, filter,
117             m_attrs, m_attrsOnly, con, m_cons,true,this);
118 }
119
120 bool LDAPSearchRequest::equals(const LDAPRequest* req)const{
121     DEBUG(LDAP_DEBUG_TRACE,"LDAPSearchRequest::equals()" << endl);
122     if( LDAPRequest::equals(req)){
123         LDAPSearchRequest* sreq = (LDAPSearchRequest*)req;
124         if ( (m_base == sreq->m_base) &&
125              (m_scope == sreq->m_scope) 
126            ){
127             return true;
128         }
129     }
130     return false;
131 }