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