Commit 2d1b255c authored by Quanah Gibson-Mount's avatar Quanah Gibson-Mount
Browse files

moved ldap_result() code to the LDAPRequest-Class

parent a655210a
......@@ -6,10 +6,8 @@
#include "config.h"
#include "debug.h"
#include <ldap.h>
#include "LDAPMessageQueue.h"
#include "LDAPRequest.h"
#include "LDAPAsynConnection.h"
#include "LDAPResult.h"
#include "LDAPSearchReference.h"
#include "LDAPSearchRequest.h"
......@@ -40,110 +38,99 @@ LDAPMessageQueue::~LDAPMessageQueue(){
LDAPMsg *LDAPMessageQueue::getNext(){
DEBUG(LDAP_DEBUG_TRACE,"LDAPMessageQueue::getNext()" << endl);
LDAPMessage *msg;
LDAPRequest *req=m_activeReq.top();
int msg_id = req->getMsgID();
int res;
const LDAPAsynConnection *con=req->getConnection();
res=ldap_result(con->getSessionHandle(),msg_id,0,0,&msg);
if (res <= 0){
if(msg != 0){
ldap_msgfree(msg);
}
throw LDAPException(con);
}else{
const LDAPConstraints *constr=req->getConstraints();
LDAPMsg *ret=0;
//this can throw an exception (Decoding Error)
try{
ret = LDAPMsg::create(req,msg);
ldap_msgfree(msg);
}catch(LDAPException e){
//do some clean up
delete req;
m_activeReq.top();
throw;
}
switch (ret->getMessageType()) {
case LDAPMsg::SEARCH_REFERENCE :
if (constr->getReferralChase() ){
//throws Exception (limit Exceeded)
LDAPRequest *refReq=chaseReferral(ret);
if(refReq != 0){
m_activeReq.push(refReq);
m_issuedReq.push_back(refReq);
delete ret;
return getNext();
}
}
return ret;
break;
case LDAPMsg::SEARCH_ENTRY :
return ret;
break;
case LDAPMsg::SEARCH_DONE :
if(req->isReferral()){
req->unbind();
LDAPMsg *ret=0;
try{
ret = req->getNextMessage();
}catch(LDAPException e){
//do some clean up
delete req;
m_activeReq.top();
throw;
}
const LDAPConstraints *constr=req->getConstraints();
switch (ret->getMessageType()) {
case LDAPMsg::SEARCH_REFERENCE :
if (constr->getReferralChase() ){
//throws Exception (limit Exceeded)
LDAPRequest *refReq=chaseReferral(ret);
if(refReq != 0){
m_activeReq.push(refReq);
m_issuedReq.push_back(refReq);
delete ret;
return getNext();
}
switch ( ((LDAPResult*)ret)->getResultCode()) {
case LDAPResult::REFERRAL :
if(constr->getReferralChase()){
//throws Exception (limit Exceeded)
LDAPRequest *refReq=chaseReferral(ret);
if(refReq != 0){
m_activeReq.pop();
m_activeReq.push(refReq);
m_issuedReq.push_back(refReq);
delete ret;
return getNext();
}
}
return ret;
break;
case LDAPResult::SUCCESS :
if(req->isReferral()){
delete ret;
}
return ret;
break;
case LDAPMsg::SEARCH_ENTRY :
return ret;
break;
case LDAPMsg::SEARCH_DONE :
if(req->isReferral()){
req->unbind();
}
switch ( ((LDAPResult*)ret)->getResultCode()) {
case LDAPResult::REFERRAL :
if(constr->getReferralChase()){
//throws Exception (limit Exceeded)
LDAPRequest *refReq=chaseReferral(ret);
if(refReq != 0){
m_activeReq.pop();
m_activeReq.push(refReq);
m_issuedReq.push_back(refReq);
delete ret;
return getNext();
}else{
m_activeReq.pop();
return ret;
}
break;
default:
}
return ret;
break;
case LDAPResult::SUCCESS :
if(req->isReferral()){
delete ret;
m_activeReq.pop();
return ret;
break;
}
break;
//must be some kind of LDAPResultMessage
default:
if(req->isReferral()){
req->unbind();
}
LDAPResult* res_p=(LDAPResult*)ret;
switch (res_p->getResultCode()) {
case LDAPResult::REFERRAL :
if(constr->getReferralChase()){
//throws Exception (limit Exceeded)
LDAPRequest *refReq=chaseReferral(ret);
if(refReq != 0){
m_activeReq.pop();
m_activeReq.push(refReq);
m_issuedReq.push_back(refReq);
delete ret;
return getNext();
}
}
return ret;
break;
default:
return getNext();
}else{
m_activeReq.pop();
return ret;
}
break;
}
}
}
break;
default:
m_activeReq.pop();
return ret;
break;
}
break;
//must be some kind of LDAPResultMessage
default:
if(req->isReferral()){
req->unbind();
}
LDAPResult* res_p=(LDAPResult*)ret;
switch (res_p->getResultCode()) {
case LDAPResult::REFERRAL :
if(constr->getReferralChase()){
//throws Exception (limit Exceeded)
LDAPRequest *refReq=chaseReferral(ret);
if(refReq != 0){
m_activeReq.pop();
m_activeReq.push(refReq);
m_issuedReq.push_back(refReq);
delete ret;
return getNext();
}
}
return ret;
break;
default:
m_activeReq.pop();
return ret;
}
break;
}
}
// TODO Maybe moved to LDAPRequest::followReferral seems more reasonable
......
......@@ -47,6 +47,29 @@ LDAPRequest::~LDAPRequest(){
delete m_cons;
}
LDAPMsg* LDAPRequest::getNextMessage() const
{
DEBUG(LDAP_DEBUG_DESTROY,"LDAPRequest::getNextMessage()" << endl);
int res;
LDAPMessage *msg;
res=ldap_result(this->m_connection->getSessionHandle(),
this->m_msgID,0,0,&msg);
if (res <= 0){
if(msg != 0){
ldap_msgfree(msg);
}
throw LDAPException(this->m_connection);
}else{
LDAPMsg *ret=0;
//this can throw an exception (Decoding Error)
ret = LDAPMsg::create(this,msg);
ldap_msgfree(msg);
return ret;
}
}
const LDAPConstraints* LDAPRequest::getConstraints() const{
DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::getConstraints()" << endl);
return m_cons;
......
......@@ -40,6 +40,7 @@ class LDAPRequest{
const LDAPConstraints* getConstraints() const;
const LDAPAsynConnection* getConnection() const;
LDAPMsg *getNextMessage() const;
int getType()const;
int getMsgID() const;
int getHopCount() const;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment