2 * Copyright 2000, OpenLDAP Foundation, All Rights Reserved.
3 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
6 // $Id: LDAPMessageQueue.cpp,v 1.17 2000/08/31 17:43:48 rhafer Exp $
11 #include "LDAPMessageQueue.h"
12 #include "LDAPRequest.h"
13 #include "LDAPAsynConnection.h"
14 #include "LDAPMessage.h"
15 #include "LDAPResult.h"
16 #include "LDAPSearchReference.h"
17 #include "LDAPSearchRequest.h"
19 #include "LDAPUrlList.h"
20 #include "LDAPException.h"
22 // TODO: How to handel unsolicited notifications, like notice of
25 LDAPMessageQueue::LDAPMessageQueue(LDAPRequest *req){
26 DEBUG(LDAP_DEBUG_TRACE, "LDAPMessageQueue::LDAPMessageQueue()" << endl);
30 LDAPMessageQueue::~LDAPMessageQueue(){
31 DEBUG(LDAP_DEBUG_TRACE, "LDAPMessageQueue::~LDAPMessageQueue()" << endl);
33 while(! m_reqQueue.empty()){
40 LDAPMsg *LDAPMessageQueue::getNext(){
41 DEBUG(LDAP_DEBUG_TRACE,"LDAPMessageQueue::getNext()" << endl);
43 LDAPRequest *req=m_reqQueue.top();
44 const LDAPConstraints *constr=req->getConstraints();
45 int msg_id = req->getMsgID();
47 const LDAPAsynConnection *con=req->getConnection();
48 res=ldap_result(con->getSessionHandle(),msg_id,0,0,&msg);
51 throw LDAPException(con);
53 LDAPMsg *ret = LDAPMsg::create(req,msg);
55 switch (ret->getMessageType()) {
56 case LDAPMsg::SEARCH_REFERENCE :
57 if (constr->getReferralChase() ){
58 LDAPSearchReference *ref=(LDAPSearchReference *)ret;
59 LDAPRequest *refReq=chaseReferral(ref->getURLs());
61 m_reqQueue.push(refReq);
67 case LDAPMsg::SEARCH_ENTRY :
70 case LDAPMsg::SEARCH_DONE :
71 if (req->isReferral()){
72 LDAPResult* res_p=(LDAPResult*)ret;
73 switch (res_p->getResultCode()) {
74 case LDAPResult::REFERRAL :
75 DEBUG(LDAP_DEBUG_TRACE,
76 "referral chasing to be implemented"
90 //must be some kind of LDAPResultMessage
92 LDAPResult* res_p=(LDAPResult*)ret;
93 switch (res_p->getResultCode()) {
94 case LDAPResult::REFERRAL :
95 DEBUG(LDAP_DEBUG_TRACE,
96 "referral chasing to be implemented"
98 //for now just end it here
112 // TODO Maybe moved to LDAPRequest::followReferral seems more reasonable
114 LDAPRequest* LDAPMessageQueue::chaseReferral(LDAPUrlList *refs){
115 DEBUG(LDAP_DEBUG_TRACE,"LDAPMessageQueue::chaseReferra()" << endl);
116 LDAPRequest *req=m_reqQueue.top();
117 LDAPRequest *refReq=req->followReferral(refs);
120 refReq->sendRequest();
122 }catch (LDAPException e){
124 DEBUG(LDAP_DEBUG_TRACE," caught exception" << endl);
132 LDAPRequestStack* LDAPMessageQueue::getRequestStack(){