⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pldap.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 2 页
字号:
BOOL PLDAPSession::Modify(const PString & dn, const PStringArray & attributes){  return Modify(dn, AttribsFromArray(attributes));}BOOL PLDAPSession::Modify(const PString & dn, const PLDAPStructBase & attributes){  return Modify(dn, AttribsFromStruct(attributes));}BOOL PLDAPSession::Delete(const PString & dn){  if (!IsOpen())    return FALSE;  int msgid;  errorNumber = ldap_delete_ext(ldapContext, dn, NULL, NULL, &msgid);  if (errorNumber != LDAP_SUCCESS)    return FALSE;  P_timeval tval = timeout;  LDAPMessage * result = NULL;  ldap_result(ldapContext, msgid, LDAP_MSG_ALL, tval, &result);  if (result)    errorNumber = ldap_result2error(ldapContext, result, TRUE);  return errorNumber == LDAP_SUCCESS;}PLDAPSession::SearchContext::SearchContext(){  result = NULL;  message = NULL;  found = FALSE;  completed = FALSE;}PLDAPSession::SearchContext::~SearchContext(){  if (message != NULL)    ldap_msgfree(message);  if (result != NULL && result != message)    ldap_msgfree(result);}BOOL PLDAPSession::Search(SearchContext & context,                          const PString & filter,                          const PStringArray & attributes,                          const PString & baseDN,                          SearchScope scope){  if (!IsOpen())    return FALSE;  PCharArray storage;  char ** attribs = attributes.ToCharArray(&storage);  PString base = baseDN;  if (base.IsEmpty())    base = defaultBaseDN;  static const int ScopeCode[NumSearchScope] = {    LDAP_SCOPE_BASE, LDAP_SCOPE_ONELEVEL, LDAP_SCOPE_SUBTREE  };  P_timeval tval = timeout;  errorNumber = ldap_search_ext(ldapContext,                                base,                                ScopeCode[scope],                                filter,                                attribs,                                FALSE,                                NULL,                                NULL,                                tval,                                searchLimit,                                &context.msgid);  if (errorNumber != LDAP_SUCCESS)    return FALSE;  if (ldap_result(ldapContext, context.msgid, LDAP_MSG_ONE, tval, &context.result) > 0)    return GetNextSearchResult(context);  if (context.result)    errorNumber = ldap_result2error(ldapContext, context.result, TRUE);  if (errorNumber == 0)    errorNumber = LDAP_OTHER;  return FALSE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context, PStringToString & data){  data.RemoveAll();  if (!IsOpen())    return FALSE;  if (context.result == NULL || context.message == NULL || context.completed)    return FALSE;  // Extract the resulting data  data.SetAt("dn", GetSearchResultDN(context));  BerElement * ber = NULL;  char * attrib = ldap_first_attribute(ldapContext, context.message, &ber);  while (attrib != NULL) {    struct berval ** bvals = ldap_get_values_len(ldapContext, context.message, attrib);    if (bvals != NULL) {      PString value = data(attrib);      for (PINDEX i = 0; bvals[i] != NULL; i++ ) {        if (!value)          value += multipleValueSeparator;        value += PString(bvals[i]->bv_val, bvals[i]->bv_len);      }      ber_bvecfree(bvals);      data.SetAt(attrib, value);    }    ldap_memfree(attrib);    attrib = ldap_next_attribute(ldapContext, context.message, ber);  }  if (ber != NULL)    ber_free (ber, 0);  return TRUE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context,                                   const PString & attribute,                                   PString & data){  data.MakeEmpty();  if (!IsOpen())    return FALSE;  if (context.result == NULL || context.message == NULL || context.completed)    return FALSE;  if (attribute == "dn") {    data = GetSearchResultDN(context);    return TRUE;  }  char ** values = ldap_get_values(ldapContext, context.message, attribute);  if (values == NULL)    return FALSE;  PINDEX count = ldap_count_values(values);  for (PINDEX i = 0; i < count; i++) {    if (!data)      data += multipleValueSeparator;    data += values[i];  }  ldap_value_free(values);  return TRUE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context,                                   const PString & attribute,                                   PStringArray & data){  data.RemoveAll();  if (!IsOpen())    return FALSE;  if (context.result == NULL || context.message == NULL || context.completed)    return FALSE;  if (attribute == "dn") {    data.SetSize(1);    data[0] = GetSearchResultDN(context);    return TRUE;  }  char ** values = ldap_get_values(ldapContext, context.message, attribute);  if (values == NULL)    return FALSE;  PINDEX count = ldap_count_values(values);  data.SetSize(count);  for (PINDEX i = 0; i < count; i++)    data[i] = values[i];  ldap_value_free(values);  return TRUE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context,                                   const PString & attribute,                                   PArray<PBYTEArray> & data){  data.RemoveAll();  if (!IsOpen())    return FALSE;  if (attribute == "dn") {    char * dn = ldap_get_dn(ldapContext, context.message);    data.Append(new PBYTEArray((const BYTE *)dn, ::strlen(dn)));    ldap_memfree(dn);    return TRUE;  }  struct berval ** values = ldap_get_values_len(ldapContext, context.message, attribute);  if (values == NULL)    return FALSE;  PINDEX count = ldap_count_values_len(values);  data.SetSize(count);  for (PINDEX i = 0; i < count; i++)    data[i] = PBYTEArray((const BYTE *)values[i]->bv_val, values[i]->bv_len);  ldap_value_free_len(values);  return TRUE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context,                                   PLDAPStructBase & data){  if (!IsOpen())    return FALSE;  BOOL atLeastOne = FALSE;  for (PINDEX i = 0; i < data.GetNumAttributes(); i++) {    PLDAPAttributeBase & attr = data.GetAttribute(i);    if (attr.IsBinary()) {      PArray<PBYTEArray> bin;      if (GetSearchResult(context, attr.GetName(), bin)) {        attr.FromBinary(bin);        atLeastOne = TRUE;      }    }    else {      PString str;      if (GetSearchResult(context, attr.GetName(), str)) {        attr.FromString(str);        atLeastOne = TRUE;      }    }  }  return atLeastOne;}PString PLDAPSession::GetSearchResultDN(SearchContext & context){  PString str;  if (context.message != NULL) {    char * dn = ldap_get_dn(ldapContext, context.message);    if (dn != NULL) {      str = dn;      ldap_memfree(dn);    }  }  return str;}BOOL PLDAPSession::GetNextSearchResult(SearchContext & context){  if (!IsOpen())    return FALSE;  if (context.result == NULL || context.completed)    return FALSE;  P_timeval tval = timeout;  do {    if (context.message == NULL)      context.message = ldap_first_message(ldapContext, context.result);    else      context.message = ldap_next_message(ldapContext, context.message);    if (context.message != NULL) {      switch (ldap_msgtype(context.message)) {        case LDAP_RES_SEARCH_ENTRY :          context.found = TRUE;          errorNumber = LDAP_SUCCESS;          return TRUE;        case LDAP_RES_SEARCH_RESULT :          errorNumber = ldap_result2error(ldapContext, context.message, FALSE);          if (errorNumber == 0 && !context.found)            errorNumber = LDAP_NO_RESULTS_RETURNED;          context.completed = TRUE;          return FALSE;      }      // Ignore other result message types for now ...    }    ldap_msgfree(context.result);  } while (ldap_result(ldapContext, context.msgid, LDAP_MSG_ONE, tval, &context.result) > 0);  if (context.result)    errorNumber = ldap_result2error(ldapContext, context.result, FALSE);  if (errorNumber == 0)    errorNumber = LDAP_OTHER;  return FALSE;}PList<PStringToString> PLDAPSession::Search(const PString & filter,                                            const PStringArray & attributes,                                            const PString & base,                                            SearchScope scope){  PList<PStringToString> data;  SearchContext context;  if (!Search(context, filter, attributes, base, scope))    return data;  do {    PStringToString * entry = new PStringToString;    if (GetSearchResult(context, *entry))      data.Append(entry);    else {      delete entry;      break;    }  } while (GetNextSearchResult(context));  return data;}PString PLDAPSession::GetErrorText() const{  return ldap_err2string(errorNumber);}///////////////////////////////////////////////////////////////////////////////PLDAPAttributeBase::PLDAPAttributeBase(const char * n, void * ptr, PINDEX sz)  : name(n),    pointer(ptr),    size(sz){  PLDAPStructBase::GetInitialiser().AddAttribute(this);}PString PLDAPAttributeBase::ToString() const{  PStringStream stream;  PrintOn(stream);  return stream;}void PLDAPAttributeBase::FromString(const PString & str){  PStringStream stream(str);  ReadFrom(stream);}PBYTEArray PLDAPAttributeBase::ToBinary() const{  return PBYTEArray((const BYTE *)pointer, size, FALSE);}void PLDAPAttributeBase::FromBinary(const PArray<PBYTEArray> & data){  if (data.GetSize() > 0 && data[0].GetSize() == size)    memcpy(pointer, data[0], size);}///////////////////////////////////////////////////////////////////////////////PMutex            PLDAPStructBase::initialiserMutex;PLDAPStructBase * PLDAPStructBase::initialiserInstance;PLDAPStructBase::PLDAPStructBase(){  attributes.DisallowDeleteObjects();  initialiserMutex.Wait();  initialiserStack = initialiserInstance;  initialiserInstance = this;}PLDAPStructBase & PLDAPStructBase::operator=(const PLDAPStructBase & other){  for (PINDEX i = 0; i < attributes.GetSize(); i++)    attributes.GetDataAt(i).Copy(other.attributes.GetDataAt(i));  return *this;}PLDAPStructBase & PLDAPStructBase::operator=(const PStringArray & array){  for (PINDEX i = 0; i < array.GetSize(); i++) {    PString str = array[i];    PINDEX equal = str.Find('=');    if (equal != P_MAX_INDEX) {      PLDAPAttributeBase * attr = GetAttribute(str.Left(equal));      if (attr != NULL)        attr->FromString(str.Mid(equal+1));    }  }  return *this;}PLDAPStructBase & PLDAPStructBase::operator=(const PStringToString & dict){  for (PINDEX i = 0; i < dict.GetSize(); i++) {    PLDAPAttributeBase * attr = GetAttribute(dict.GetKeyAt(i));    if (attr != NULL)      attr->FromString(dict.GetDataAt(i));  }  return *this;}void PLDAPStructBase::PrintOn(ostream & strm) const{  strm << attributes << '\n';}void PLDAPStructBase::AddAttribute(PLDAPAttributeBase * attr){  attributes.SetAt(attr->GetName(), attr);}void PLDAPStructBase::EndConstructor(){  initialiserInstance = initialiserStack;  initialiserMutex.Signal();}#endif // P_LDAP// End of file ////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -