ROOT logo
// @(#)root/ldap:$Id: TLDAPResult.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Oleksandr Grebenyuk   21/09/2001

/*************************************************************************
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TLDAPResult.h"
#include "TLDAPEntry.h"
#include "TLDAPAttribute.h"


ClassImp(TLDAPResult)

//______________________________________________________________________________
TLDAPResult::TLDAPResult(LDAP *ld, LDAPMessage *searchresult)
   : fLd(ld), fSearchResult(searchresult), fCurrentEntry(searchresult)
{
   // TLDAPResult object is just a wrapper of the LDAPMessage structure.
   // LDAP *ld:                  The current session handler
   // LDAPMessage *searchresult: The LDAPMessage structure returned from
   //                            the ldap_search_s() call

   if (!GetCount())
      fCurrentEntry = 0;
}

//______________________________________________________________________________
TLDAPResult::TLDAPResult(const TLDAPResult& ldr) :
   TObject(ldr),
   fLd(ldr.fLd),
   fSearchResult(ldr.fSearchResult),
   fCurrentEntry(ldr.fCurrentEntry)
{
   // Copy constructor
}

//______________________________________________________________________________
TLDAPResult& TLDAPResult::operator=(const TLDAPResult& ldr)
{
   // Equal operator
   if(this!=&ldr) {
      TObject::operator=(ldr);
      fLd=ldr.fLd;
      fSearchResult=ldr.fSearchResult;
      fCurrentEntry=ldr.fCurrentEntry;
   } return *this;
}

//______________________________________________________________________________
TLDAPResult::~TLDAPResult()
{
   // Deletes the LDAPMessage structure

   if (fSearchResult)
      ldap_msgfree(fSearchResult);
}

//______________________________________________________________________________
TLDAPEntry *TLDAPResult::GetNext()
{
   // Returns next entry from the search result.
   // After the last entry it returns a zero pointer
   // and after this it returns the first entry again.
   // The user is responsable for deleting the returned object after use.

   TLDAPEntry *entry = CreateEntry(fCurrentEntry);
   fCurrentEntry = (fCurrentEntry != 0 ? ldap_next_entry(fLd, fCurrentEntry) :
                   (GetCount() != 0 ? fSearchResult : 0));
   return entry;
}

//______________________________________________________________________________
TLDAPEntry *TLDAPResult::CreateEntry(LDAPMessage *entry)
{
   // Creates TLDAPEntry object from the data containing in the LDAPMessage
   // structure and returns pointer to it.
   // The user is responsable for deleting the returned object after use.
   // LDAPMessage *entry: Pointer to the LDAPMessage structure containing
   // the entry data.

   if (entry == 0)
      return 0;

   char *dn;
   char *attr;
   BerValue   **vals;
   BerElement *ptr;

   dn = ldap_get_dn(fLd, entry);
   TLDAPEntry *ldapentry = new TLDAPEntry(dn);
   for (attr = ldap_first_attribute(fLd, entry, &ptr); attr != 0;
        attr = ldap_next_attribute(fLd, entry, ptr)) {
      TLDAPAttribute attribute(attr);
      vals = ldap_get_values_len(fLd, entry, attr);
      if (vals) {
         for (Int_t i = 0; vals[i] != 0; i++) {
            attribute.AddValue(vals[i]->bv_val);
         }
         ldap_value_free_len(vals);
      }
      ldapentry->AddAttribute(attribute);
   }

   return ldapentry;
}

//______________________________________________________________________________
Int_t TLDAPResult::GetCount() const
{
   // Returns the number of entries in the search result

   LDAP *ld = fLd;
   LDAPMessage *result = fSearchResult;

   return ldap_count_entries(ld, result);
}

//______________________________________________________________________________
void TLDAPResult::Print(Option_t *) const
{
   // Prints all entries.
   // Calls the Print() member function of the each entry.

   TLDAPEntry *e;
   Int_t count = GetCount() + 1;
   for (Int_t i = 0; i < count; i++) {
      e = const_cast<TLDAPResult*>(this)->GetNext();
      if (e) {
         e->Print();
         delete e;
      }
   }
}
 TLDAPResult.cxx:1
 TLDAPResult.cxx:2
 TLDAPResult.cxx:3
 TLDAPResult.cxx:4
 TLDAPResult.cxx:5
 TLDAPResult.cxx:6
 TLDAPResult.cxx:7
 TLDAPResult.cxx:8
 TLDAPResult.cxx:9
 TLDAPResult.cxx:10
 TLDAPResult.cxx:11
 TLDAPResult.cxx:12
 TLDAPResult.cxx:13
 TLDAPResult.cxx:14
 TLDAPResult.cxx:15
 TLDAPResult.cxx:16
 TLDAPResult.cxx:17
 TLDAPResult.cxx:18
 TLDAPResult.cxx:19
 TLDAPResult.cxx:20
 TLDAPResult.cxx:21
 TLDAPResult.cxx:22
 TLDAPResult.cxx:23
 TLDAPResult.cxx:24
 TLDAPResult.cxx:25
 TLDAPResult.cxx:26
 TLDAPResult.cxx:27
 TLDAPResult.cxx:28
 TLDAPResult.cxx:29
 TLDAPResult.cxx:30
 TLDAPResult.cxx:31
 TLDAPResult.cxx:32
 TLDAPResult.cxx:33
 TLDAPResult.cxx:34
 TLDAPResult.cxx:35
 TLDAPResult.cxx:36
 TLDAPResult.cxx:37
 TLDAPResult.cxx:38
 TLDAPResult.cxx:39
 TLDAPResult.cxx:40
 TLDAPResult.cxx:41
 TLDAPResult.cxx:42
 TLDAPResult.cxx:43
 TLDAPResult.cxx:44
 TLDAPResult.cxx:45
 TLDAPResult.cxx:46
 TLDAPResult.cxx:47
 TLDAPResult.cxx:48
 TLDAPResult.cxx:49
 TLDAPResult.cxx:50
 TLDAPResult.cxx:51
 TLDAPResult.cxx:52
 TLDAPResult.cxx:53
 TLDAPResult.cxx:54
 TLDAPResult.cxx:55
 TLDAPResult.cxx:56
 TLDAPResult.cxx:57
 TLDAPResult.cxx:58
 TLDAPResult.cxx:59
 TLDAPResult.cxx:60
 TLDAPResult.cxx:61
 TLDAPResult.cxx:62
 TLDAPResult.cxx:63
 TLDAPResult.cxx:64
 TLDAPResult.cxx:65
 TLDAPResult.cxx:66
 TLDAPResult.cxx:67
 TLDAPResult.cxx:68
 TLDAPResult.cxx:69
 TLDAPResult.cxx:70
 TLDAPResult.cxx:71
 TLDAPResult.cxx:72
 TLDAPResult.cxx:73
 TLDAPResult.cxx:74
 TLDAPResult.cxx:75
 TLDAPResult.cxx:76
 TLDAPResult.cxx:77
 TLDAPResult.cxx:78
 TLDAPResult.cxx:79
 TLDAPResult.cxx:80
 TLDAPResult.cxx:81
 TLDAPResult.cxx:82
 TLDAPResult.cxx:83
 TLDAPResult.cxx:84
 TLDAPResult.cxx:85
 TLDAPResult.cxx:86
 TLDAPResult.cxx:87
 TLDAPResult.cxx:88
 TLDAPResult.cxx:89
 TLDAPResult.cxx:90
 TLDAPResult.cxx:91
 TLDAPResult.cxx:92
 TLDAPResult.cxx:93
 TLDAPResult.cxx:94
 TLDAPResult.cxx:95
 TLDAPResult.cxx:96
 TLDAPResult.cxx:97
 TLDAPResult.cxx:98
 TLDAPResult.cxx:99
 TLDAPResult.cxx:100
 TLDAPResult.cxx:101
 TLDAPResult.cxx:102
 TLDAPResult.cxx:103
 TLDAPResult.cxx:104
 TLDAPResult.cxx:105
 TLDAPResult.cxx:106
 TLDAPResult.cxx:107
 TLDAPResult.cxx:108
 TLDAPResult.cxx:109
 TLDAPResult.cxx:110
 TLDAPResult.cxx:111
 TLDAPResult.cxx:112
 TLDAPResult.cxx:113
 TLDAPResult.cxx:114
 TLDAPResult.cxx:115
 TLDAPResult.cxx:116
 TLDAPResult.cxx:117
 TLDAPResult.cxx:118
 TLDAPResult.cxx:119
 TLDAPResult.cxx:120
 TLDAPResult.cxx:121
 TLDAPResult.cxx:122
 TLDAPResult.cxx:123
 TLDAPResult.cxx:124
 TLDAPResult.cxx:125
 TLDAPResult.cxx:126
 TLDAPResult.cxx:127
 TLDAPResult.cxx:128
 TLDAPResult.cxx:129
 TLDAPResult.cxx:130
 TLDAPResult.cxx:131
 TLDAPResult.cxx:132
 TLDAPResult.cxx:133
 TLDAPResult.cxx:134
 TLDAPResult.cxx:135