1// OpenLDAP: pkg/ldap/contrib/ldapc++/src/LDAPRequest.cpp,v 1.3.10.3 2008/04/14 23:09:26 quanah Exp
2/*
3 * Copyright 2000, OpenLDAP Foundation, All Rights Reserved.
4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5 */
6
7
8#include "debug.h"
9#include "LDAPRequest.h"
10
11using namespace std;
12
13LDAPRequest::LDAPRequest(){
14    DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPRequest::LDAPRequest()" << endl);
15}
16
17LDAPRequest::LDAPRequest(const LDAPRequest& req){
18    DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPRequest::LDAPRequest(&)" << endl);
19    m_isReferral=req.m_isReferral;
20    m_cons = new LDAPConstraints(*(req.m_cons));
21    m_connection = req.m_connection;
22    m_parent = req.m_parent;
23    m_hopCount = req.m_hopCount;
24    m_msgID = req.m_msgID;
25}
26
27LDAPRequest::LDAPRequest(LDAPAsynConnection* con,
28       const LDAPConstraints* cons,bool isReferral, const LDAPRequest* parent){
29    DEBUG(LDAP_DEBUG_CONSTRUCT,"LDAPRequest::LDAPRequest()" << endl);
30    m_connection=con;
31    if(cons == 0){
32        m_cons=new LDAPConstraints( *(con->getConstraints()) );
33    }else{
34        m_cons=new LDAPConstraints( *cons);
35    }
36    m_isReferral=isReferral;
37    if(m_isReferral){
38        m_hopCount = (parent->getHopCount()+1);
39        m_parent= parent;
40    }else{
41        m_hopCount=0;
42        m_parent=0;
43    }
44}
45
46LDAPRequest::~LDAPRequest(){
47    DEBUG(LDAP_DEBUG_DESTROY,"LDAPRequest::~LDAPRequest()" << endl);
48    delete m_cons;
49}
50
51LDAPMsg* LDAPRequest::getNextMessage() const
52{
53    DEBUG(LDAP_DEBUG_DESTROY,"LDAPRequest::getNextMessage()" << endl);
54    int res;
55    LDAPMessage *msg;
56
57    res=ldap_result(this->m_connection->getSessionHandle(),
58            this->m_msgID,0,0,&msg);
59
60    if (res <= 0){
61        if(msg != 0){
62            ldap_msgfree(msg);
63        }
64        throw  LDAPException(this->m_connection);
65    }else{
66        LDAPMsg *ret=0;
67        //this can  throw an exception (Decoding Error)
68        ret = LDAPMsg::create(this,msg);
69        ldap_msgfree(msg);
70        return ret;
71    }
72}
73
74LDAPRequest* LDAPRequest::followReferral(LDAPMsg* /*urls*/){
75    DEBUG(LDAP_DEBUG_TRACE,"LDAPBindRequest::followReferral()" << endl);
76    DEBUG(LDAP_DEBUG_TRACE,
77            "ReferralChasing not implemented for this operation" << endl);
78    return 0;
79}
80
81const LDAPConstraints* LDAPRequest::getConstraints() const{
82    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::getConstraints()" << endl);
83    return m_cons;
84}
85
86const LDAPAsynConnection* LDAPRequest::getConnection() const{
87    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::getConnection()" << endl);
88    return m_connection;
89}
90
91int LDAPRequest::getType() const {
92    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::getType()" << endl);
93    return m_requestType;
94}
95
96int LDAPRequest::getMsgID() const {
97    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::getMsgId()" << endl);
98    return m_msgID;
99}
100
101int LDAPRequest::getHopCount() const {
102    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::getHopCount()" << endl);
103    return m_hopCount;
104}
105
106const LDAPRequest* LDAPRequest::getParent() const{
107    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::getParent()" << endl);
108    return m_parent;
109}
110
111bool LDAPRequest::isReferral() const {
112    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::isReferral()" << endl);
113    return m_isReferral;
114}
115
116bool LDAPRequest::equals(const LDAPRequest* req) const{
117    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::equals()" << endl);
118    if( (this->m_requestType == req->getType()) &&
119        (this->m_connection->getHost() == req->m_connection->getHost()) &&
120        (this->m_connection->getPort() == req->m_connection->getPort())
121      ){
122        return true;
123    }return false;
124}
125
126bool LDAPRequest::isCycle() const{
127    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::isCycle()" << endl);
128    const LDAPRequest* parent=m_parent;
129    if(parent != 0){
130        do{
131            if(this->equals(parent)){
132                return true;
133            }else{
134                parent=parent->getParent();
135            }
136        }
137        while(parent != 0);
138    }
139    return false;
140}
141
142void LDAPRequest::unbind() const{
143    DEBUG(LDAP_DEBUG_TRACE,"LDAPRequest::unbind()" << endl);
144    m_connection->unbind();
145}
146