Back to index

lightning-sunbird  0.9+nobinonly
Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes | Private Member Functions
nsAbAutoCompleteSession Class Reference

#include <nsAbAutoCompleteSession.h>

Inheritance diagram for nsAbAutoCompleteSession:
Inheritance graph
[legend]
Collaboration diagram for nsAbAutoCompleteSession:
Collaboration graph
[legend]

List of all members.

Public Member Functions

NS_DECL_ISUPPORTS
NS_DECL_NSIAUTOCOMPLETESESSION
NS_DECL_NSIABAUTOCOMPLETESESSION 
nsAbAutoCompleteSession ()
virtual ~nsAbAutoCompleteSession ()
void onStartLookup (in wstring searchString, in nsIAutoCompleteResults previousSearchResult, in nsIAutoCompleteListener listener)
void onStopLookup ()
void onAutoComplete (in wstring searchString, in nsIAutoCompleteResults previousSearchResult, in nsIAutoCompleteListener listener)

Public Attributes

attribute wstring defaultDomain

Protected Member Functions

PRBool ItsADuplicate (PRUnichar *fullAddrStr, PRInt32 aPopularityIndex, nsIAutoCompleteResults *results)
void AddToResult (const PRUnichar *pNickNameStr, const PRUnichar *pDisplayNameStr, const PRUnichar *pFirstNameStr, const PRUnichar *pLastNameStr, const PRUnichar *pEmailStr, const PRUnichar *pNotes, const PRUnichar *pDirName, PRUint32 aPopularityIndex, PRBool bIsMailList, PRBool pDefaultMatch, nsIAutoCompleteResults *results)
PRBool CheckEntry (nsAbAutoCompleteSearchString *searchStr, const PRUnichar *nickName, const PRUnichar *displayName, const PRUnichar *firstName, const PRUnichar *lastName, const PRUnichar *emailAddress)

Protected Attributes

nsCOMPtr< nsIMsgHeaderParsermParser
nsString mDefaultDomain
PRInt32 mAutoCompleteCommentColumn

Private Member Functions

nsresult SearchCards (nsIAbDirectory *directory, nsAbAutoCompleteSearchString *searchStr, nsIAutoCompleteResults *results)
nsresult SearchDirectory (const nsACString &aURI, nsAbAutoCompleteSearchString *searchStr, PRBool searchSubDirectory, nsIAutoCompleteResults *results)
nsresult SearchPreviousResults (nsAbAutoCompleteSearchString *uSearchString, nsIAutoCompleteResults *previousSearchResult, nsIAutoCompleteResults *results)
nsresult SearchReplicatedLDAPDirectories (nsIPrefBranch *aPrefs, nsAbAutoCompleteSearchString *searchStr, PRBool searchSubDirectory, nsIAutoCompleteResults *results)

Detailed Description

Definition at line 77 of file nsAbAutoCompleteSession.h.


Constructor & Destructor Documentation

Definition at line 60 of file nsAbAutoCompleteSession.cpp.

Here is the call graph for this function:

Definition at line 66 of file nsAbAutoCompleteSession.cpp.

{
}

Member Function Documentation

void nsAbAutoCompleteSession::AddToResult ( const PRUnichar pNickNameStr,
const PRUnichar pDisplayNameStr,
const PRUnichar pFirstNameStr,
const PRUnichar pLastNameStr,
const PRUnichar pEmailStr,
const PRUnichar pNotes,
const PRUnichar pDirName,
PRUint32  aPopularityIndex,
PRBool  bIsMailList,
PRBool  pDefaultMatch,
nsIAutoCompleteResults results 
) [protected]

Definition at line 126 of file nsAbAutoCompleteSession.cpp.

{
  nsresult rv;
  PRUnichar* fullAddrStr = nsnull;

  if (pDefaultMatch)
  {
    if (mDefaultDomain[0] == 0)
      return;

    nsAutoString aStr(pDisplayNameStr);
    if (aStr.FindChar('@') == kNotFound)
    {
      aStr.Append(PRUnichar('@'));
      aStr += mDefaultDomain;
    }
    fullAddrStr = ToNewUnicode(aStr);
  }
  else
  {
    if (mParser)
    {
      nsXPIDLCString fullAddress;
      nsXPIDLCString utf8Email;
      if (bIsMailList)
      {
        if (pNotesStr && pNotesStr[0] != 0)
          utf8Email.Adopt(ToNewUTF8String(nsDependentString(pNotesStr)));
        else
          utf8Email.Adopt(ToNewUTF8String(nsDependentString(pDisplayNameStr)));
      }
      else
        utf8Email.Adopt(ToNewUTF8String(nsDependentString(pEmailStr)));

      mParser->MakeFullAddress(nsnull, NS_ConvertUCS2toUTF8(pDisplayNameStr).get(),
                               utf8Email, getter_Copies(fullAddress));
      if (!fullAddress.IsEmpty())
      {
        /* We need to convert back the result from UTF-8 to Unicode */
        fullAddrStr = nsCRT::strdup(NS_ConvertUTF8toUCS2(fullAddress.get()).get());
      }
    }
  
    if (!fullAddrStr)
    {
      //oops, parser problem! I will try to do my best...
      const PRUnichar * pStr = nsnull;
      if (bIsMailList)
      {
        if (pNotesStr && pNotesStr[0] != 0)
          pStr = pNotesStr;
        else
          pStr = pDisplayNameStr;
      }
      else
        pStr = pEmailStr;
      // check this so we do not get a bogus entry "someName <>"
      if (pStr && pStr[0] != 0) {
        nsAutoString aStr(pDisplayNameStr);
        aStr.AppendLiteral(" <");
        aStr += pStr;
        aStr.AppendLiteral(">");
        fullAddrStr = ToNewUnicode(aStr);
      }
      else
        fullAddrStr = nsnull;
    }
  }
    
  if (fullAddrStr && ! ItsADuplicate(fullAddrStr, aPopularityIndex, results))
  {    
    nsCOMPtr<nsIAutoCompleteItem> newItem = do_CreateInstance(NS_AUTOCOMPLETEITEM_CONTRACTID, &rv);
    if (NS_SUCCEEDED(rv))
    {
      nsAbAutoCompleteParam *param = new nsAbAutoCompleteParam(pNickNameStr, pDisplayNameStr, pFirstNameStr, pLastNameStr, pEmailStr, pNotesStr, pDirName, aPopularityIndex, bIsMailList);
      NS_IF_ADDREF(param);
      newItem->SetParam(param);
      NS_IF_RELEASE(param);

      // how to process the comment column, if at all.  this value
      // comes from "mail.autoComplete.commentColumn", or, if that
      // doesn't exist, defaults to 0
      //
      // 0 = none
      // 1 = name of addressbook this card came from
      // 2 = other per-addressbook format (currrently unused here)
      //
      if (mAutoCompleteCommentColumn == 1) {
        rv = newItem->SetComment(pDirName);
        if (NS_FAILED(rv)) {
          NS_WARNING("nsAbAutoCompleteSession::AddToResult():"
                     " newItem->SetComment() failed\n");
        }
      }

      // if this isn't a default match, set the class name so we can style 
      // this cell with the local addressbook icon (or whatever)
      //
      rv = newItem->SetClassName(pDefaultMatch ? "default-match" :
                                 "local-abook");
      if (NS_FAILED(rv)) {
        NS_WARNING("nsAbAutoCompleteSession::AddToResult():"
                   " newItem->SetClassName() failed\n");
      }

      newItem->SetValue(nsDependentString(fullAddrStr));
      nsCOMPtr<nsISupportsArray> array;
      rv = results->GetItems(getter_AddRefs(array));
      if (NS_SUCCEEDED(rv))
      {
        PRUint32 nbrOfItems;      
        rv = array->Count(&nbrOfItems);

        PRInt32 insertPosition = 0;

        for (; insertPosition < nbrOfItems && !pDefaultMatch; insertPosition++)
        {
          nsCOMPtr<nsISupports> currentItemParams;
          nsCOMPtr<nsIAutoCompleteItem> resultItem;
          nsresult rv = array->QueryElementAt(insertPosition, NS_GET_IID(nsIAutoCompleteItem),
                                           getter_AddRefs(resultItem));
          if (NS_FAILED(rv))
            continue;
          rv = resultItem->GetParam(getter_AddRefs(currentItemParams));
          if (NS_FAILED(rv))
            continue;

          param = (nsAbAutoCompleteParam *)(void *)currentItemParams;
          if (aPopularityIndex > param->mPopularityIndex) // sort the search results by popularity index 
            break;
        }

        rv = array->InsertElementAt(newItem, insertPosition);
      }
    }
  }    
  PR_Free(fullAddrStr);
}

Here is the call graph for this function:

Here is the caller graph for this function:

PRBool nsAbAutoCompleteSession::CheckEntry ( nsAbAutoCompleteSearchString searchStr,
const PRUnichar nickName,
const PRUnichar displayName,
const PRUnichar firstName,
const PRUnichar lastName,
const PRUnichar emailAddress 
) [protected]

Definition at line 286 of file nsAbAutoCompleteSession.cpp.

{
  const PRUnichar * fullString;
  PRUint32 fullStringLen;
  PRBool isAMatch = PR_FALSE;
  
  if (searchStr->mFirstPartLen > 0 && searchStr->mSecondPartLen == 0)
  {
    fullString = searchStr->mFirstPart;
    fullStringLen = searchStr->mFirstPartLen;
  }
  else
  {
    fullString = searchStr->mFullString;
    fullStringLen = searchStr->mFullStringLen;
  }

  nsDependentString fullStringStr(fullString, fullStringLen);
  
  // Compare various properties looking for a match (exact or partial)
  if ( (nickName &&
        fullStringStr.Equals(nsDependentString(nickName), nsCaseInsensitiveStringComparator())) || 
       (displayName &&
        fullStringStr.Equals(nsDependentString(displayName), nsCaseInsensitiveStringComparator())) ||
       (firstName &&
        fullStringStr.Equals(nsDependentString(firstName), nsCaseInsensitiveStringComparator())) ||
       (lastName &&
        fullStringStr.Equals(nsDependentString(lastName), nsCaseInsensitiveStringComparator())) || 
       (emailAddress &&
        fullStringStr.Equals(nsDependentString(emailAddress), nsCaseInsensitiveStringComparator())) ||
       (nickName && CommonPrefix(nickName, fullString, fullStringLen)) ||
       (displayName && CommonPrefix(displayName, fullString, fullStringLen)) || 
       (firstName && CommonPrefix(firstName, fullString, fullStringLen)) ||
       (lastName && CommonPrefix(lastName, fullString, fullStringLen)) ||
       (emailAddress && CommonPrefix(emailAddress, fullString, fullStringLen)) )
    isAMatch = PR_TRUE;
  //If we have a muti-part search string, look for a partial match with first name and last name or reverse
  else if (searchStr->mFirstPartLen && searchStr->mSecondPartLen)
  {
    if (((firstName && CommonPrefix(firstName, searchStr->mFirstPart, searchStr->mFirstPartLen)) &&
        (lastName && CommonPrefix(lastName, searchStr->mSecondPart, searchStr->mSecondPartLen))) ||
        ((lastName && CommonPrefix(lastName, searchStr->mFirstPart, searchStr->mFirstPartLen)) &&
        (firstName && CommonPrefix(firstName, searchStr->mSecondPart, searchStr->mSecondPartLen))))
      isAMatch = PR_TRUE;
  }

  return isAMatch;
}

Here is the call graph for this function:

Here is the caller graph for this function:

PRBool nsAbAutoCompleteSession::ItsADuplicate ( PRUnichar fullAddrStr,
PRInt32  aPopularityIndex,
nsIAutoCompleteResults results 
) [protected]

Definition at line 70 of file nsAbAutoCompleteSession.cpp.

{
    nsresult rv;

    nsCOMPtr<nsISupportsArray> array;
    rv = results->GetItems(getter_AddRefs(array));
    if (NS_SUCCEEDED(rv))
    {
        nsCOMPtr<nsIEnumerator> enumerator;
        rv = array->Enumerate(getter_AddRefs(enumerator));
        if (NS_SUCCEEDED(rv))
        {
            nsCOMPtr<nsISupports> item;
            nsCOMPtr<nsIAutoCompleteItem> resultItem;
            nsAutoString valueStr;

            for (rv = enumerator->First(); NS_SUCCEEDED(rv); rv = enumerator->Next())
            {
                rv = enumerator->CurrentItem(getter_AddRefs(item));
                if (NS_SUCCEEDED(rv) && item)
                {
                    resultItem = do_QueryInterface(item, &rv);
                    if (NS_SUCCEEDED(rv))
                    {
                        rv = resultItem->GetValue(valueStr);
                        if (NS_SUCCEEDED(rv) && !valueStr.IsEmpty() && nsDependentString(fullAddrStr).Equals(valueStr, nsCaseInsensitiveStringComparator()))
                        {
                          // ok, we have a duplicate, but before we ignore the dupe, check the popularity index
                          // and use the card that is the most popular so it gets sorted correctly
                          nsCOMPtr<nsISupports> currentItemParams;
                          rv = resultItem->GetParam(getter_AddRefs(currentItemParams));
                          if (NS_SUCCEEDED(rv))
                          {
                            nsAbAutoCompleteParam *param = (nsAbAutoCompleteParam *)(void *)currentItemParams;
                            if (aPopularityIndex > param->mPopularityIndex)
                            {
                              // remove the current autocomplete result, and return false so our dupe
                              // gets added in its place.
                              array->RemoveElement(item);
                              break; 
                            }
                          }

                          // it's a dupe, ignore it.
                            return PR_TRUE;
                        }
                    }
                }
            }
        }
    }
    
    return PR_FALSE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void nsIAutoCompleteSession::onAutoComplete ( in wstring  searchString,
in nsIAutoCompleteResults  previousSearchResult,
in nsIAutoCompleteListener  listener 
) [inherited]
void nsIAutoCompleteSession::onStartLookup ( in wstring  searchString,
in nsIAutoCompleteResults  previousSearchResult,
in nsIAutoCompleteListener  listener 
) [inherited]

Definition at line 340 of file nsAbAutoCompleteSession.cpp.

{
  nsresult rv;    
  nsCOMPtr<nsIEnumerator> cardsEnumerator;
  nsCOMPtr<nsIAbCard> card;
  PRInt32 i;
  
  rv = directory->GetChildCards(getter_AddRefs(cardsEnumerator));
  if (NS_SUCCEEDED(rv) && cardsEnumerator)
  {
    nsCOMPtr<nsISupports> item;
    for (rv = cardsEnumerator->First(); NS_SUCCEEDED(rv); rv = cardsEnumerator->Next())
    {
      rv = cardsEnumerator->CurrentItem(getter_AddRefs(item));
      if (NS_SUCCEEDED(rv))
      {
        card = do_QueryInterface(item, &rv);
        if (NS_SUCCEEDED(rv))
        {
          // Skip if it's not a normal card (ie, they can't be added as members).
          PRBool isNormal;
          rv = card->GetIsANormalCard(&isNormal);
          if (NS_FAILED(rv) || !isNormal)
            continue;

          nsXPIDLString pEmailStr[MAX_NUMBER_OF_EMAIL_ADDRESSES]; //[0]=primary email, [1]=secondary email (no available with mailing list)
          nsXPIDLString pDisplayNameStr;
          nsXPIDLString pFirstNameStr;
          nsXPIDLString pLastNameStr;
          nsXPIDLString pNickNameStr;
          nsXPIDLString pNotesStr;
          PRUint32 popularityIndex = 0;
          PRBool bIsMailList;

          rv = card->GetIsMailList(&bIsMailList);
          if (NS_FAILED(rv))
            continue;
          if (bIsMailList)
          {
            rv = card->GetNotes(getter_Copies(pNotesStr));
            if (NS_FAILED(rv))
              continue;
          }
          else
          {
            for (i = 0 ; i < MAX_NUMBER_OF_EMAIL_ADDRESSES; i ++)
            {
              switch (i)
              {
                case 0: rv = card->GetPrimaryEmail(getter_Copies(pEmailStr[i]));  break;
                case 1: rv = card->GetSecondEmail(getter_Copies(pEmailStr[i]));   break;
                default: return NS_ERROR_FAILURE;
              }
              if (NS_FAILED(rv))
                continue;

              // Don't bother with card without an email address
              if (pEmailStr[i].IsEmpty())
                continue;

              //...and does it looks like a valid address?
              if (pEmailStr[i].FindChar('@') <= 0)
                pEmailStr[i].SetLength(0);
            }
            if (pEmailStr[0].IsEmpty() && pEmailStr[1].IsEmpty())
              continue;
          }
            
            //Now, retrive the user name and nickname
          rv = card->GetDisplayName(getter_Copies(pDisplayNameStr));
          if (NS_FAILED(rv))
              continue;
          rv = card->GetFirstName(getter_Copies(pFirstNameStr));
          if (NS_FAILED(rv))
              continue;
          rv = card->GetLastName(getter_Copies(pLastNameStr));
          if (NS_FAILED(rv))
              continue;
          rv = card->GetNickName(getter_Copies(pNickNameStr));
          if (NS_FAILED(rv))
              continue;

          (void) card->GetPopularityIndex(&popularityIndex);

          // in the address book a mailing list does not have an email address field. However,
          // we do "fix up" mailing lists in the UI sometimes to look like "My List <My List>"
          // if we are looking up an address and we are comparing it to a mailing list to see if it is a match
          // instead of just looking for an exact match on "My List", hijack the unused email address field 
          // and use that to test against "My List <My List>"
          if (bIsMailList)
            mParser->MakeFullAddressWString (pDisplayNameStr, pDisplayNameStr, getter_Copies(pEmailStr[0]));  
            
          for (i = 0 ; i < MAX_NUMBER_OF_EMAIL_ADDRESSES; i ++)
          {
            if (!bIsMailList && pEmailStr[i].IsEmpty())
              continue;

            if (CheckEntry(searchStr, pNickNameStr.get(), 
                                      pDisplayNameStr.get(), 
                                      pFirstNameStr.get(), 
                                      pLastNameStr.get(), pEmailStr[i].get()))
            {
              nsXPIDLString pDirName;
              if (mAutoCompleteCommentColumn == 1)
              {
                rv = directory->GetDirName(getter_Copies(pDirName));
                if (NS_FAILED(rv))
                  continue;
              }

              AddToResult(pNickNameStr.get(), pDisplayNameStr.get(), 
                          pFirstNameStr.get(), pLastNameStr.get(), 
                          pEmailStr[i].get(), pNotesStr.get(), 
                          pDirName.get(), popularityIndex, bIsMailList, PR_FALSE, results);
            }
          }
        }
      }
    }
  }

  return NS_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

nsresult nsAbAutoCompleteSession::SearchDirectory ( const nsACString &  aURI,
nsAbAutoCompleteSearchString searchStr,
PRBool  searchSubDirectory,
nsIAutoCompleteResults results 
) [private]

Definition at line 519 of file nsAbAutoCompleteSession.cpp.

{
    nsresult rv = NS_OK;
    nsCOMPtr<nsIRDFService> rdfService(do_GetService("@mozilla.org/rdf/rdf-service;1", &rv));
    NS_ENSURE_SUCCESS(rv, rv);

    nsCOMPtr <nsIRDFResource> resource;
    rv = rdfService->GetResource(aURI, getter_AddRefs(resource));
    NS_ENSURE_SUCCESS(rv, rv);

    // query interface 
    nsCOMPtr<nsIAbDirectory> directory(do_QueryInterface(resource, &rv));
    NS_ENSURE_SUCCESS(rv, rv);
    
    // when autocompleteing against directories, 
    // we only want to match against certain directories
    // we ask the directory if it wants to be used
    // for local autocompleting.
    PRBool searchDuringLocalAutocomplete;
    rv = directory->GetSearchDuringLocalAutocomplete(&searchDuringLocalAutocomplete);
    NS_ENSURE_SUCCESS(rv, rv);
    
    if (!searchDuringLocalAutocomplete)
      return NS_OK;

    if (!aURI.EqualsLiteral(kAllDirectoryRoot))
        rv = SearchCards(directory, searchStr, results);
    
    if (!searchSubDirectory)
        return rv;
  
    nsCOMPtr<nsISimpleEnumerator> subDirectories;
    if (NS_SUCCEEDED(directory->GetChildNodes(getter_AddRefs(subDirectories))) && subDirectories)
    {
        nsCOMPtr<nsISupports> item;
        PRBool hasMore;
        while (NS_SUCCEEDED(rv = subDirectories->HasMoreElements(&hasMore)) && hasMore)
        {
            if (NS_SUCCEEDED(subDirectories->GetNext(getter_AddRefs(item))))
            {
              directory = do_QueryInterface(item, &rv);
              if (NS_SUCCEEDED(rv))
              {
                nsCOMPtr<nsIRDFResource> subResource(do_QueryInterface(item, &rv));
                if (NS_SUCCEEDED(rv))
                {
                    nsXPIDLCString URI;
                    subResource->GetValue(getter_Copies(URI));
                    rv = SearchDirectory(URI, searchStr, PR_TRUE, results);
                }
              }
            }
        }
    }
    return rv;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 576 of file nsAbAutoCompleteSession.cpp.

{
    if (!previousSearchResult)
        return NS_ERROR_NULL_POINTER;
        
    nsXPIDLString prevSearchString;
    nsresult rv;

    rv = previousSearchResult->GetSearchString(getter_Copies(prevSearchString));
    NS_ENSURE_SUCCESS(rv, rv);
    
    if (!(const PRUnichar*)prevSearchString || ((const PRUnichar*)prevSearchString)[0] == 0)
        return NS_ERROR_FAILURE;
    
    PRUint32 prevSearchStrLen = nsCRT::strlen(prevSearchString);
    if (searchStr->mFullStringLen < prevSearchStrLen ||
        CommonPrefix(searchStr->mFullString, prevSearchString, prevSearchStrLen))
        return NS_ERROR_ABORT;

    nsCOMPtr<nsISupportsArray> array;
    rv = previousSearchResult->GetItems(getter_AddRefs(array));
    if (NS_SUCCEEDED(rv))
    {
        PRUint32 nbrOfItems;
        PRUint32 i;
        PRUint32 pos;
        
        rv = array->Count(&nbrOfItems);
        if (NS_FAILED(rv) || nbrOfItems <= 0)
            return NS_ERROR_FAILURE;
        
        nsCOMPtr<nsISupports> item;
        nsCOMPtr<nsIAutoCompleteItem> resultItem;
        nsAbAutoCompleteParam *param;

        for (i = 0, pos = 0; i < nbrOfItems; i ++, pos ++)
        {
            rv = array->QueryElementAt(pos, NS_GET_IID(nsIAutoCompleteItem),
                                           getter_AddRefs(resultItem));
            NS_ENSURE_SUCCESS(rv, rv);
              
            rv = resultItem->GetParam(getter_AddRefs(item));
            NS_ENSURE_SUCCESS(rv, rv);
            if (!item)
                return NS_ERROR_FAILURE;

            param = (nsAbAutoCompleteParam *)(void *)item;
            
            if (CheckEntry(searchStr, param->mNickName, param->mDisplayName,  param->mFirstName,  param->mLastName, param->mEmailAddress))
                AddToResult(param->mNickName, param->mDisplayName, 
                            param->mFirstName, param->mLastName, 
                            param->mEmailAddress, param->mNotes, 
                            param->mDirName, param->mPopularityIndex, param->mIsMailList, PR_FALSE,
                            results);
        }
        return NS_OK;
    }

    return NS_ERROR_ABORT;
}

Here is the call graph for this function:

Definition at line 488 of file nsAbAutoCompleteSession.cpp.

{
  NS_ENSURE_ARG_POINTER(aPref);

  nsXPIDLCString prefName;
  nsresult rv = aPref->GetCharPref("ldap_2.autoComplete.directoryServer", getter_Copies(prefName));
  NS_ENSURE_SUCCESS(rv,rv);

  if (prefName.IsEmpty())
    return NS_OK;
    
  // use the prefName to get the fileName pref
  nsCAutoString fileNamePref;
  fileNamePref = prefName + NS_LITERAL_CSTRING(".filename");

  nsXPIDLCString fileName;
  rv = aPref->GetCharPref(fileNamePref.get(), getter_Copies(fileName));
  NS_ENSURE_SUCCESS(rv,rv);

  // if there is no fileName, bail out now.
  if (fileName.IsEmpty())
    return NS_OK;

  // use the fileName to create the URI for the replicated directory
  nsCAutoString URI;
  URI = NS_LITERAL_CSTRING("moz-abmdbdirectory://") + fileName;

  // and then search the replicated directory
  return SearchDirectory(URI, searchStr, searchSubDirectory, results);
}

Here is the call graph for this function:


Member Data Documentation

Definition at line 43 of file nsIAbAutoCompleteSession.idl.

Definition at line 111 of file nsAbAutoCompleteSession.h.

Definition at line 101 of file nsAbAutoCompleteSession.h.

Definition at line 100 of file nsAbAutoCompleteSession.h.


The documentation for this class was generated from the following files: