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