ROOT logo
// @(#)root/ldap:$Id$
// Author: Evgenia Smirnova   21/09/2001

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

#include "TLDAPEntry.h"
#include "TLDAPAttribute.h"
#include "Riostream.h"


ClassImp(TLDAPEntry)

//______________________________________________________________________________
TLDAPEntry::TLDAPEntry(const char *dn) : fNCount(0)
{
   // Creates the new TLDAPEntry object with the specified DN (distinguished
   // name) and the empty list of attributes.
   // const char *dn: The DN of the entry. You can change it later by calling
   //                 the SetDn() member function

   SetDn(dn);
   fAttr = new TList;
   fAttr->SetOwner();
}

//______________________________________________________________________________
TLDAPEntry::TLDAPEntry(const TLDAPEntry &e) : TObject(e), fNCount(e.fNCount)
{
   // Copy ctor.

   SetDn(e.GetDn());
   fAttr = new TList;
   fAttr->SetOwner();

   TIter next(e.fAttr);
   while (TLDAPAttribute *att = (TLDAPAttribute *)next()) {
      fAttr->AddLast(new TLDAPAttribute(*att));
   }
}

//______________________________________________________________________________
TLDAPEntry& TLDAPEntry::operator=(const TLDAPEntry& lde) 
{
   // Equal operator
   if(this!=&lde) {
      TObject::operator=(lde);
      fDn=lde.fDn;
      fAttr=lde.fAttr;
      fNCount=lde.fNCount;
   } return *this;
}

//______________________________________________________________________________
TLDAPEntry::~TLDAPEntry()
{
   // Deletes all the attributes of the entry.

   delete fAttr;
}

//______________________________________________________________________________
void TLDAPEntry::AddAttribute(const TLDAPAttribute &attr)
{
   // Add an attribute to the entry.
   // TLDAPAtrribute attr: attribute to be added.

   fAttr->AddLast(new TLDAPAttribute(attr));
}

//______________________________________________________________________________
void TLDAPEntry::Print(Option_t *) const
{
   // Print entry in LDIF format.

   cout << "dn: "<< fDn << endl;
   TLDAPAttribute *attr = GetAttribute("objectClass");
   if (attr != 0)
      attr->Print();
   Int_t n = GetCount();
   for (Int_t i = 0; i < n; i++) {
      attr = (TLDAPAttribute*) fAttr->At(i);
      if (TString(attr->GetName()).CompareTo("objectClass", TString::kIgnoreCase) != 0)
         attr->Print();
   }
   cout << endl;
}

//______________________________________________________________________________
TLDAPAttribute *TLDAPEntry::GetAttribute() const
{
   // Get next attribute of the entry. Returns zero after the last attribute,
   // then returns the first attribute again.

   Int_t n = GetCount();
   if (n > fNCount) {
      return (TLDAPAttribute*)fAttr->At(fNCount++);
   } else {
      fNCount = 0;
      return 0;
   }
}

//______________________________________________________________________________
TLDAPAttribute *TLDAPEntry::GetAttribute(const char *name) const
{
   // Get attribute by name.
   // Doesn't affect the order of attributes to be returned from the
   // next GetAttribute() call. Attribute name is case insensitive.

   Int_t n = GetCount();
   for (Int_t i = 0; i < n; i++) {
      if (TString(((TLDAPAttribute*)fAttr->At(i))->GetName()).CompareTo(name, TString::kIgnoreCase) == 0) {
         return (TLDAPAttribute*)fAttr->At(i);
      }
   }
   return 0;
}

//______________________________________________________________________________
void TLDAPEntry::DeleteAttribute(const char *name)
{
   // Delete attribute by name.
   // Attribute name is case insensitive.

   Int_t n = GetCount();
   for (Int_t i = 0; i < n; i++) {
      if (TString(((TLDAPAttribute*)fAttr->At(i))->GetName()).CompareTo(name, TString::kIgnoreCase) == 0) {
         delete fAttr->Remove(fAttr->At(i));
         if (fNCount > i) fNCount--;
         return;
      }
   }
}

//______________________________________________________________________________
Bool_t TLDAPEntry::IsReferral() const
{
   // Check if entry is referal.

   Bool_t att = kFALSE;
   Bool_t obj = kFALSE;
   Int_t n = GetCount();
   TString name;
   for (Int_t i = 0; (i < n) && (!att || !obj); i++) {
      name = TString(((TLDAPAttribute*) fAttr->At(i))->GetName());
      if (name.CompareTo("ref", TString::kIgnoreCase) == 0) {
         att = kTRUE;
      } else {
         if (name.CompareTo("objectclass", TString::kIgnoreCase) == 0) {
            TLDAPAttribute *attr = (TLDAPAttribute*)fAttr->At(i);
            Int_t valcnt = attr->GetCount() + 1;
            for (Int_t j = 0; (j < valcnt) && (!obj); j++)
               obj |= (Bool_t)TString(attr->GetValue()).CompareTo("referral", TString::kIgnoreCase);
         }
      }
   }
   return (att && obj);
}

//______________________________________________________________________________
TList *TLDAPEntry::GetReferrals() const
{
   // Get the TList of referrals.
   // Returns an empty list if entry is not referral.
   // User is responsible for deleting returned TList.

   TList *list = new TList;
   TLDAPAttribute *ref = GetAttribute("ref");
   if (ref != 0) {
      Int_t n = ref->GetCount();
      for (Int_t i = 0; i < n; i++) {
         list->Add(ref->fValues->At(i));
      }
   }
   return list;
}

//______________________________________________________________________________
LDAPMod **TLDAPEntry::GetMods(Int_t op)
{
   // Get array of "LDAPMod" structures for entry.

   Int_t n = GetCount();
   LDAPMod **mods = new LDAPMod* [n + 1];
   for (Int_t i = 0; i < n; i++)
      mods[i] = ((TLDAPAttribute*)(fAttr->At(i)))->GetMod(op);
   mods[n] = 0;
   return mods;
}
 TLDAPEntry.cxx:1
 TLDAPEntry.cxx:2
 TLDAPEntry.cxx:3
 TLDAPEntry.cxx:4
 TLDAPEntry.cxx:5
 TLDAPEntry.cxx:6
 TLDAPEntry.cxx:7
 TLDAPEntry.cxx:8
 TLDAPEntry.cxx:9
 TLDAPEntry.cxx:10
 TLDAPEntry.cxx:11
 TLDAPEntry.cxx:12
 TLDAPEntry.cxx:13
 TLDAPEntry.cxx:14
 TLDAPEntry.cxx:15
 TLDAPEntry.cxx:16
 TLDAPEntry.cxx:17
 TLDAPEntry.cxx:18
 TLDAPEntry.cxx:19
 TLDAPEntry.cxx:20
 TLDAPEntry.cxx:21
 TLDAPEntry.cxx:22
 TLDAPEntry.cxx:23
 TLDAPEntry.cxx:24
 TLDAPEntry.cxx:25
 TLDAPEntry.cxx:26
 TLDAPEntry.cxx:27
 TLDAPEntry.cxx:28
 TLDAPEntry.cxx:29
 TLDAPEntry.cxx:30
 TLDAPEntry.cxx:31
 TLDAPEntry.cxx:32
 TLDAPEntry.cxx:33
 TLDAPEntry.cxx:34
 TLDAPEntry.cxx:35
 TLDAPEntry.cxx:36
 TLDAPEntry.cxx:37
 TLDAPEntry.cxx:38
 TLDAPEntry.cxx:39
 TLDAPEntry.cxx:40
 TLDAPEntry.cxx:41
 TLDAPEntry.cxx:42
 TLDAPEntry.cxx:43
 TLDAPEntry.cxx:44
 TLDAPEntry.cxx:45
 TLDAPEntry.cxx:46
 TLDAPEntry.cxx:47
 TLDAPEntry.cxx:48
 TLDAPEntry.cxx:49
 TLDAPEntry.cxx:50
 TLDAPEntry.cxx:51
 TLDAPEntry.cxx:52
 TLDAPEntry.cxx:53
 TLDAPEntry.cxx:54
 TLDAPEntry.cxx:55
 TLDAPEntry.cxx:56
 TLDAPEntry.cxx:57
 TLDAPEntry.cxx:58
 TLDAPEntry.cxx:59
 TLDAPEntry.cxx:60
 TLDAPEntry.cxx:61
 TLDAPEntry.cxx:62
 TLDAPEntry.cxx:63
 TLDAPEntry.cxx:64
 TLDAPEntry.cxx:65
 TLDAPEntry.cxx:66
 TLDAPEntry.cxx:67
 TLDAPEntry.cxx:68
 TLDAPEntry.cxx:69
 TLDAPEntry.cxx:70
 TLDAPEntry.cxx:71
 TLDAPEntry.cxx:72
 TLDAPEntry.cxx:73
 TLDAPEntry.cxx:74
 TLDAPEntry.cxx:75
 TLDAPEntry.cxx:76
 TLDAPEntry.cxx:77
 TLDAPEntry.cxx:78
 TLDAPEntry.cxx:79
 TLDAPEntry.cxx:80
 TLDAPEntry.cxx:81
 TLDAPEntry.cxx:82
 TLDAPEntry.cxx:83
 TLDAPEntry.cxx:84
 TLDAPEntry.cxx:85
 TLDAPEntry.cxx:86
 TLDAPEntry.cxx:87
 TLDAPEntry.cxx:88
 TLDAPEntry.cxx:89
 TLDAPEntry.cxx:90
 TLDAPEntry.cxx:91
 TLDAPEntry.cxx:92
 TLDAPEntry.cxx:93
 TLDAPEntry.cxx:94
 TLDAPEntry.cxx:95
 TLDAPEntry.cxx:96
 TLDAPEntry.cxx:97
 TLDAPEntry.cxx:98
 TLDAPEntry.cxx:99
 TLDAPEntry.cxx:100
 TLDAPEntry.cxx:101
 TLDAPEntry.cxx:102
 TLDAPEntry.cxx:103
 TLDAPEntry.cxx:104
 TLDAPEntry.cxx:105
 TLDAPEntry.cxx:106
 TLDAPEntry.cxx:107
 TLDAPEntry.cxx:108
 TLDAPEntry.cxx:109
 TLDAPEntry.cxx:110
 TLDAPEntry.cxx:111
 TLDAPEntry.cxx:112
 TLDAPEntry.cxx:113
 TLDAPEntry.cxx:114
 TLDAPEntry.cxx:115
 TLDAPEntry.cxx:116
 TLDAPEntry.cxx:117
 TLDAPEntry.cxx:118
 TLDAPEntry.cxx:119
 TLDAPEntry.cxx:120
 TLDAPEntry.cxx:121
 TLDAPEntry.cxx:122
 TLDAPEntry.cxx:123
 TLDAPEntry.cxx:124
 TLDAPEntry.cxx:125
 TLDAPEntry.cxx:126
 TLDAPEntry.cxx:127
 TLDAPEntry.cxx:128
 TLDAPEntry.cxx:129
 TLDAPEntry.cxx:130
 TLDAPEntry.cxx:131
 TLDAPEntry.cxx:132
 TLDAPEntry.cxx:133
 TLDAPEntry.cxx:134
 TLDAPEntry.cxx:135
 TLDAPEntry.cxx:136
 TLDAPEntry.cxx:137
 TLDAPEntry.cxx:138
 TLDAPEntry.cxx:139
 TLDAPEntry.cxx:140
 TLDAPEntry.cxx:141
 TLDAPEntry.cxx:142
 TLDAPEntry.cxx:143
 TLDAPEntry.cxx:144
 TLDAPEntry.cxx:145
 TLDAPEntry.cxx:146
 TLDAPEntry.cxx:147
 TLDAPEntry.cxx:148
 TLDAPEntry.cxx:149
 TLDAPEntry.cxx:150
 TLDAPEntry.cxx:151
 TLDAPEntry.cxx:152
 TLDAPEntry.cxx:153
 TLDAPEntry.cxx:154
 TLDAPEntry.cxx:155
 TLDAPEntry.cxx:156
 TLDAPEntry.cxx:157
 TLDAPEntry.cxx:158
 TLDAPEntry.cxx:159
 TLDAPEntry.cxx:160
 TLDAPEntry.cxx:161
 TLDAPEntry.cxx:162
 TLDAPEntry.cxx:163
 TLDAPEntry.cxx:164
 TLDAPEntry.cxx:165
 TLDAPEntry.cxx:166
 TLDAPEntry.cxx:167
 TLDAPEntry.cxx:168
 TLDAPEntry.cxx:169
 TLDAPEntry.cxx:170
 TLDAPEntry.cxx:171
 TLDAPEntry.cxx:172
 TLDAPEntry.cxx:173
 TLDAPEntry.cxx:174
 TLDAPEntry.cxx:175
 TLDAPEntry.cxx:176
 TLDAPEntry.cxx:177
 TLDAPEntry.cxx:178
 TLDAPEntry.cxx:179
 TLDAPEntry.cxx:180
 TLDAPEntry.cxx:181
 TLDAPEntry.cxx:182
 TLDAPEntry.cxx:183
 TLDAPEntry.cxx:184
 TLDAPEntry.cxx:185
 TLDAPEntry.cxx:186
 TLDAPEntry.cxx:187
 TLDAPEntry.cxx:188
 TLDAPEntry.cxx:189
 TLDAPEntry.cxx:190
 TLDAPEntry.cxx:191
 TLDAPEntry.cxx:192