2 * Copyright 2000, OpenLDAP Foundation, All Rights Reserved.
3 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
9 #include "LDAPMessageQueue.h"
10 #include "LDAPRequest.h"
11 #include "LDAPResult.h"
12 #include "LDAPSearchReference.h"
13 #include "LDAPSearchRequest.h"
15 #include "LDAPUrlList.h"
16 #include "LDAPException.h"
20 // TODO: How to handle unsolicited notifications, like notice of
23 LDAPMessageQueue::LDAPMessageQueue(LDAPRequest *req){
24 DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPMessageQueue::LDAPMessageQueue()" << endl);
25 m_activeReq.push(req);
26 m_issuedReq.push_back(req);
29 LDAPMessageQueue::~LDAPMessageQueue(){
30 DEBUG(LDAP_DEBUG_DESTROY, "LDAPMessageQueue::~LDAPMessageQueue()" << endl);
31 for(LDAPRequestList::iterator i=m_issuedReq.begin();
32 i != m_issuedReq.end(); i++){
39 LDAPMsg *LDAPMessageQueue::getNext(){
40 DEBUG(LDAP_DEBUG_TRACE,"LDAPMessageQueue::getNext()" << endl);
42 if ( m_activeReq.empty() ) {
46 LDAPRequest *req=m_activeReq.top();
50 ret = req->getNextMessage();
51 }catch(LDAPException e){
57 const LDAPConstraints *constr=req->getConstraints();
58 switch (ret->getMessageType()) {
59 case LDAPMsg::SEARCH_REFERENCE :
60 if (constr->getReferralChase() ){
61 //throws Exception (limit Exceeded)
62 LDAPRequest *refReq=chaseReferral(ret);
64 m_activeReq.push(refReq);
65 m_issuedReq.push_back(refReq);
72 case LDAPMsg::SEARCH_ENTRY :
75 case LDAPMsg::SEARCH_DONE :
76 if(req->isReferral()){
79 switch ( ((LDAPResult*)ret)->getResultCode()) {
80 case LDAPResult::REFERRAL :
81 if(constr->getReferralChase()){
82 //throws Exception (limit Exceeded)
83 LDAPRequest *refReq=chaseReferral(ret);
86 m_activeReq.push(refReq);
87 m_issuedReq.push_back(refReq);
94 case LDAPResult::SUCCESS :
95 if(req->isReferral()){
110 //must be some kind of LDAPResultMessage
112 if(req->isReferral()){
115 LDAPResult* res_p=(LDAPResult*)ret;
116 switch (res_p->getResultCode()) {
117 case LDAPResult::REFERRAL :
118 if(constr->getReferralChase()){
119 //throws Exception (limit Exceeded)
120 LDAPRequest *refReq=chaseReferral(ret);
123 m_activeReq.push(refReq);
124 m_issuedReq.push_back(refReq);
139 // TODO Maybe moved to LDAPRequest::followReferral seems more reasonable
141 LDAPRequest* LDAPMessageQueue::chaseReferral(LDAPMsg* ref){
142 DEBUG(LDAP_DEBUG_TRACE,"LDAPMessageQueue::chaseReferral()" << endl);
143 LDAPRequest *req=m_activeReq.top();
144 LDAPRequest *refReq=req->followReferral(ref);
146 if(refReq->getConstraints()->getHopLimit() < refReq->getHopCount()){
148 throw LDAPException(LDAP_REFERRAL_LIMIT_EXCEEDED);
150 if(refReq->isCycle()){
152 throw LDAPException(LDAP_CLIENT_LOOP);
155 refReq->sendRequest();
157 }catch (LDAPException e){
158 DEBUG(LDAP_DEBUG_TRACE," caught exception" << endl);
166 LDAPRequestStack* LDAPMessageQueue::getRequestStack(){
167 DEBUG(LDAP_DEBUG_TRACE,"LDAPMessageQueue::getRequestStack()" << endl);