2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 #include <afs/param.h>
15 #include <WINNT/afsclass.h>
20 * VARIABLES __________________________________________________________________
24 LPHASHLIST IDENT::x_lIdents = NULL;
25 LPHASHLISTKEY IDENT::x_lkTypeServer = NULL;
26 LPHASHLISTKEY IDENT::x_lkFilesetID = NULL;
27 LPHASHLISTKEY IDENT::x_lkFilesetName = NULL;
28 LPHASHLISTKEY IDENT::x_lkAccountName = NULL;
33 * CONSTRUCTION AND LIST MANAGEMENT ___________________________________________
37 void IDENT::InitClass (void)
39 if (x_lIdents == NULL)
41 x_lIdents = New (HASHLIST);
42 x_lkTypeServer = x_lIdents->CreateKey ("Type and Server", IDENT::KeyTypeServer_Compare, IDENT::KeyTypeServer_HashObject, IDENT::KeyTypeServer_HashData);
43 x_lkFilesetID = x_lIdents->CreateKey ("Fileset ID", IDENT::KeyFilesetID_Compare, IDENT::KeyFilesetID_HashObject, IDENT::KeyFilesetID_HashData);
44 x_lkFilesetName = x_lIdents->CreateKey ("Fileset Name", IDENT::KeyFilesetName_Compare, IDENT::KeyFilesetName_HashObject, IDENT::KeyFilesetName_HashData);
45 x_lkAccountName = x_lIdents->CreateKey ("Account Name", IDENT::KeyAccountName_Compare, IDENT::KeyAccountName_HashObject, IDENT::KeyAccountName_HashData);
49 void IDENT::InitIdent (void)
53 m_szCell[0] = TEXT('\0');
54 m_szServer[0] = TEXT('\0');
55 m_szService[0] = TEXT('\0');
56 m_szAggregate[0] = TEXT('\0');
57 m_szFileset[0] = TEXT('\0');
58 m_szAccount[0] = TEXT('\0');
59 m_szInstance[0] = TEXT('\0');
60 memset (&m_vidFileset, 0x00, sizeof(m_vidFileset));
67 x_lIdents->Remove (this);
71 void IDENT::RemoveIdentsInCell (LPIDENT lpiCell)
74 for (LPENUM pEnum = x_lIdents->FindFirst(); pEnum; pEnum = pEnum->FindNext())
76 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
78 if (!lstrcmpi (lpi->m_szCell, lpiCell->m_szCell))
83 void IDENT::Update (void)
85 x_lIdents->Update (this);
90 * ENUMERATION ________________________________________________________________
94 LPIDENT IDENT::FindFirst (HENUM *phEnum)
98 if ((*phEnum = x_lIdents->FindFirst()) == NULL)
101 return (LPIDENT)( (*phEnum)->GetObject() );
105 LPIDENT IDENT::FindFirst (HENUM *phEnum, VOLUMEID *pvidFileset)
109 if ((*phEnum = x_lkFilesetID->FindFirst(pvidFileset)) == NULL)
113 while ((lpiFound = (LPIDENT)((*phEnum)->GetObject())) != NULL)
115 if (lpiFound->m_iType == itFILESET)
118 if ((*phEnum = (*phEnum)->FindNext()) == NULL)
125 LPIDENT IDENT::FindNext (HENUM *phEnum)
132 if ((*phEnum = (*phEnum)->FindNext()) == NULL)
136 if ((lpiFound = (LPIDENT)((*phEnum)->GetObject())) == NULL)
139 if (lpiFound->m_iType == itFILESET)
146 void IDENT::FindClose (HENUM *phEnum)
157 * CELL IDENT _________________________________________________________________
161 IDENT::IDENT (LPCELL lpCell)
165 if (ASSERT( lpCell != NULL ))
168 lpCell->GetName (m_szCell);
169 x_lIdents->Add (this);
173 BOOL IDENT::fIsCell (void)
175 return (m_iType == itCELL) ? TRUE : FALSE;
178 LPCELL IDENT::OpenCell (ULONG *pStatus)
180 if (!ASSERT( m_iType != itUNUSED ))
183 return CELL::ReopenCell (m_szCell, pStatus);
186 LPIDENT IDENT::GetCell (void)
188 if (!ASSERT( m_iType != itUNUSED ))
190 if (m_iType == itCELL)
193 return FindIdent (itCELL, m_szCell, NULL, NULL, NULL, NULL, NULL);
196 void IDENT::GetCellName (LPTSTR pszName)
198 if (!ASSERT( m_iType != itUNUSED ))
204 lstrcpy (pszName, m_szCell);
209 * USER IDENT _________________________________________________________________
213 IDENT::IDENT (LPUSER lpUser)
217 if (ASSERT( lpUser != NULL ))
220 lstrcpy (m_szCell, lpUser->m_lpiCell->m_szCell);
221 lpUser->GetName (m_szAccount, m_szInstance);
222 x_lIdents->Add (this);
226 BOOL IDENT::fIsUser (void)
228 return (m_iType == itUSER) ? TRUE : FALSE;
231 LPUSER IDENT::OpenUser (ULONG *pStatus)
233 LPUSER lpUser = NULL;
235 if (!ASSERT( m_iType == itUSER ))
239 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
241 lpUser = lpCell->OpenUser (m_szAccount, m_szInstance, pStatus);
248 LPIDENT IDENT::GetUser (void)
250 if (!ASSERT( m_iType == itUSER ))
256 void IDENT::GetUserName (LPTSTR pszName, LPTSTR pszInstance)
258 if (!ASSERT( m_iType == itUSER ))
266 lstrcpy (pszName, m_szAccount);
268 lstrcpy (pszInstance, m_szInstance);
272 void IDENT::GetFullUserName (LPTSTR pszFullName)
274 if (!ASSERT( m_iType == itUSER ))
280 AfsClass_GenFullUserName (pszFullName, m_szAccount, m_szInstance);
285 * GROUP IDENT ________________________________________________________________
289 IDENT::IDENT (LPPTSGROUP lpGroup)
293 if (ASSERT( lpGroup != NULL ))
296 lstrcpy (m_szCell, lpGroup->m_lpiCell->m_szCell);
297 lpGroup->GetName (m_szAccount);
298 x_lIdents->Add (this);
302 BOOL IDENT::fIsGroup (void)
304 return (m_iType == itGROUP) ? TRUE : FALSE;
307 LPPTSGROUP IDENT::OpenGroup (ULONG *pStatus)
309 LPPTSGROUP lpGroup = NULL;
311 if (!ASSERT( m_iType == itGROUP ))
315 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
317 lpGroup = lpCell->OpenGroup (m_szAccount, pStatus);
324 LPIDENT IDENT::GetGroup (void)
326 if (!ASSERT( m_iType == itGROUP ))
332 void IDENT::GetGroupName (LPTSTR pszName)
334 if (!ASSERT( m_iType == itGROUP ))
340 lstrcpy (pszName, m_szAccount);
345 * SERVER IDENT _______________________________________________________________
349 IDENT::IDENT (LPSERVER lpServer)
353 if (ASSERT( lpServer != NULL ))
356 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
357 lpServer->GetLongName (m_szServer);
358 x_lIdents->Add (this);
362 BOOL IDENT::fIsServer (void)
364 return (m_iType == itSERVER) ? TRUE : FALSE;
367 LPSERVER IDENT::OpenServer (ULONG *pStatus)
369 LPSERVER lpServer = NULL;
371 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
375 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
377 lpServer = lpCell->OpenServer (m_szServer, pStatus);
384 LPIDENT IDENT::GetServer (void)
386 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
388 if (m_iType == itSERVER)
391 return FindIdent (itSERVER, m_szCell, m_szServer, NULL, NULL, NULL, NULL);
394 void IDENT::GetLongServerName (LPTSTR pszName)
396 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
402 lstrcpy (pszName, m_szServer);
405 void IDENT::GetShortServerName (LPTSTR pszName)
407 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
413 SERVER::ShortenName (pszName, m_szServer, TRUE);
416 void IDENT::GetServerName (LPTSTR pszName)
418 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
424 SERVER::ShortenName (pszName, m_szServer);
429 * SERVICE IDENT ______________________________________________________________
433 IDENT::IDENT (LPSERVICE lpService)
437 if (ASSERT( lpService != NULL ))
440 if ((lpServer = lpService->OpenServer()) != NULL)
443 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
444 lpServer->GetLongName (m_szServer);
445 lpService->GetName (m_szService);
446 x_lIdents->Add (this);
452 BOOL IDENT::fIsService (void)
454 return (m_iType == itSERVICE) ? TRUE : FALSE;
457 LPSERVICE IDENT::OpenService (ULONG *pStatus)
459 LPSERVICE lpService = NULL;
461 if (!ASSERT( fIsService() ))
465 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
468 if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL)
470 lpService = lpServer->OpenService (m_szService, pStatus);
479 LPIDENT IDENT::GetService (void)
481 if (!ASSERT( fIsService() ))
486 void IDENT::GetServiceName (LPTSTR pszName)
488 if (!ASSERT( fIsService() ))
494 lstrcpy (pszName, m_szService);
499 * AGGREGATE IDENT ____________________________________________________________
503 IDENT::IDENT (LPAGGREGATE lpAggregate)
507 if (ASSERT( lpAggregate != NULL ))
510 if ((lpServer = lpAggregate->OpenServer()) != NULL)
512 m_iType = itAGGREGATE;
513 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
514 lpServer->GetLongName (m_szServer);
515 lpAggregate->GetName (m_szAggregate);
516 x_lIdents->Add (this);
522 BOOL IDENT::fIsAggregate (void)
524 return (m_iType == itAGGREGATE) ? TRUE : FALSE;
527 LPAGGREGATE IDENT::OpenAggregate (ULONG *pStatus)
529 LPAGGREGATE lpAggregate = NULL;
531 if (!ASSERT( fIsAggregate() || fIsFileset() ))
535 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
538 if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL)
540 lpAggregate = lpServer->OpenAggregate (m_szAggregate, pStatus);
549 LPIDENT IDENT::GetAggregate (void)
551 if (!ASSERT( fIsAggregate() || fIsFileset() ))
553 if (m_iType == itAGGREGATE)
556 return FindIdent (itAGGREGATE, m_szCell, m_szServer, NULL, m_szAggregate, NULL, NULL);
559 void IDENT::GetAggregateName (LPTSTR pszName)
561 if (!ASSERT( fIsAggregate() || fIsFileset() ))
567 lstrcpy (pszName, m_szAggregate);
572 * FILESET IDENT ______________________________________________________________
576 IDENT::IDENT (LPFILESET lpFileset)
580 if (ASSERT( lpFileset != NULL ))
582 LPAGGREGATE lpAggregate;
583 if ((lpAggregate = lpFileset->OpenAggregate()) != NULL)
586 if ((lpServer = lpAggregate->OpenServer()) != NULL)
589 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
590 lpServer->GetLongName (m_szServer);
591 lpAggregate->GetName (m_szAggregate);
592 lpFileset->GetName (m_szFileset);
593 lpFileset->GetID (&m_vidFileset);
594 x_lIdents->Add (this);
597 lpAggregate->Close();
602 BOOL IDENT::fIsFileset (void)
604 return (m_iType == itFILESET) ? TRUE : FALSE;
607 LPFILESET IDENT::OpenFileset (ULONG *pStatus)
609 LPFILESET lpFileset = NULL;
611 if (!ASSERT( fIsFileset() ))
615 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
618 if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL)
620 LPAGGREGATE lpAggregate;
621 if ((lpAggregate = lpServer->OpenAggregate (m_szAggregate, pStatus)) != NULL)
623 lpFileset = lpAggregate->OpenFileset (&m_vidFileset, pStatus);
624 lpAggregate->Close();
634 LPIDENT IDENT::GetFileset (void)
636 if (!ASSERT( fIsFileset() ))
641 void IDENT::GetFilesetName (LPTSTR pszName)
643 if (!ASSERT( fIsFileset() ))
649 lstrcpy (pszName, m_szFileset);
652 void IDENT::GetFilesetID (VOLUMEID *pvidFileset)
654 if (!ASSERT( fIsFileset() ))
656 memset (pvidFileset, 0x00, sizeof(VOLUMEID));
660 memcpy (pvidFileset, &m_vidFileset, sizeof(VOLUMEID));
665 * NON- TYPE-SPECIFIC ROUTINES ________________________________________________
669 IDENTTYPE IDENT::GetType (void)
674 PVOID IDENT::GetUserParam (void)
679 void IDENT::SetUserParam (PVOID pUser)
684 size_t IDENT::GetRefCount (void)
691 * HASH KEYS __________________________________________________________________
693 * A list of all IDENT objects is maintained using a HashList, which has two
694 * index keys: one on [type+servername], and another on [filesetid].
704 BOOL CALLBACK IDENT::KeyTypeServer_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
706 if (((LPIDENT)pObject)->m_iType != ((KeyTypeServer*)pData)->iType)
708 if (lstrcmp (((LPIDENT)pObject)->m_szServer, ((KeyTypeServer*)pData)->pszServer))
713 HASHVALUE CALLBACK IDENT::KeyTypeServer_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
716 kts.iType = ((LPIDENT)pObject)->m_iType;
717 kts.pszServer = ((LPIDENT)pObject)->m_szServer;
718 return IDENT::KeyTypeServer_HashData (pKey, &kts);
721 HASHVALUE CALLBACK IDENT::KeyTypeServer_HashData (LPHASHLISTKEY pKey, PVOID pData)
723 return (HashString( ((KeyTypeServer*)pData)->pszServer ) + ((KeyTypeServer*)pData)->iType);
727 BOOL CALLBACK IDENT::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
729 return !memcmp (&((LPIDENT)pObject)->m_vidFileset, (VOLUMEID*)pData, sizeof(VOLUMEID));
732 HASHVALUE CALLBACK IDENT::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
734 return IDENT::KeyFilesetID_HashData (pKey, &((LPIDENT)pObject)->m_vidFileset);
737 HASHVALUE CALLBACK IDENT::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData)
739 return (HASHVALUE)(*((VOLUMEID*)pData));
743 BOOL CALLBACK IDENT::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
745 return !lstrcmpi (((LPIDENT)pObject)->m_szFileset, (LPTSTR)pData);
748 HASHVALUE CALLBACK IDENT::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
750 return IDENT::KeyFilesetName_HashData (pKey, &((LPIDENT)pObject)->m_szFileset);
753 HASHVALUE CALLBACK IDENT::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData)
755 return HashString ((LPTSTR)pData);
759 BOOL CALLBACK IDENT::KeyAccountName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
761 return !lstrcmpi (((LPIDENT)pObject)->m_szAccount, (LPTSTR)pData);
764 HASHVALUE CALLBACK IDENT::KeyAccountName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
766 return IDENT::KeyAccountName_HashData (pKey, &((LPIDENT)pObject)->m_szAccount);
769 HASHVALUE CALLBACK IDENT::KeyAccountName_HashData (LPHASHLISTKEY pKey, PVOID pData)
771 return HashString ((LPTSTR)pData);
776 * SEARCHING __________________________________________________________________
780 LPIDENT IDENT::FindIdent (LPCELL lpCell)
782 TCHAR szCell[ cchNAME ];
783 lpCell->GetName (szCell);
784 return FindIdent (itCELL, szCell, NULL, NULL, NULL, NULL, NULL);
787 LPIDENT IDENT::FindIdent (LPUSER lpUser)
789 TCHAR szCell[ cchNAME ];
790 TCHAR szAccount[ cchNAME ];
791 TCHAR szInstance[ cchNAME ];
792 lpUser->m_lpiCell->GetCellName (szCell);
793 lpUser->GetName (szAccount, szInstance);
794 return FindIdent (itUSER, szCell, szAccount, szInstance);
797 LPIDENT IDENT::FindIdent (LPPTSGROUP lpGroup)
799 TCHAR szCell[ cchNAME ];
800 TCHAR szAccount[ cchNAME ];
801 lpGroup->m_lpiCell->GetCellName (szCell);
802 lpGroup->GetName (szAccount);
803 return FindIdent (itGROUP, szCell, szAccount, NULL);
806 LPIDENT IDENT::FindIdent (LPSERVER lpServer)
808 TCHAR szCell[ cchNAME ];
809 TCHAR szServer[ cchNAME ];
810 lpServer->m_lpiCell->GetCellName (szCell);
811 lpServer->GetLongName (szServer);
812 return FindIdent (itSERVER, szCell, szServer, NULL, NULL, NULL, NULL);
815 LPIDENT IDENT::FindIdent (LPSERVICE lpService)
820 if ((lpServer = lpService->OpenServer()) != NULL)
822 TCHAR szCell[ cchNAME ];
823 TCHAR szServer[ cchNAME ];
824 TCHAR szService[ cchNAME ];
825 lpServer->m_lpiCell->GetCellName (szCell);
826 lpServer->GetLongName (szServer);
827 lpService->GetName (szService);
829 lpi = FindIdent (itSERVICE, szCell, szServer, szService, NULL, NULL, NULL);
837 LPIDENT IDENT::FindIdent (LPAGGREGATE lpAggregate)
842 if ((lpServer = lpAggregate->OpenServer()) != NULL)
844 TCHAR szCell[ cchNAME ];
845 TCHAR szServer[ cchNAME ];
846 TCHAR szAggregate[ cchNAME ];
847 lpServer->m_lpiCell->GetCellName (szCell);
848 lpServer->GetLongName (szServer);
849 lpAggregate->GetName (szAggregate);
851 lpi = FindIdent (itAGGREGATE, szCell, szServer, NULL, szAggregate, NULL, NULL);
859 LPIDENT IDENT::FindIdent (LPFILESET lpFileset)
863 LPAGGREGATE lpAggregate;
864 if ((lpAggregate = lpFileset->OpenAggregate()) != NULL)
867 if ((lpServer = lpAggregate->OpenServer()) != NULL)
869 TCHAR szCell[ cchNAME ];
870 TCHAR szServer[ cchNAME ];
871 TCHAR szAggregate[ cchNAME ];
873 lpServer->m_lpiCell->GetCellName (szCell);
874 lpServer->GetLongName (szServer);
875 lpAggregate->GetName (szAggregate);
876 lpFileset->GetID (&vidFileset);
878 lpi = FindIdent (itFILESET, szCell, szServer, NULL, szAggregate, NULL, &vidFileset);
883 lpAggregate->Close();
889 LPIDENT IDENT::FindIdent (LPFILESET lpFileset, VOLUMEID *pvid)
891 TCHAR szCell[ cchNAME ];
892 lpFileset->m_lpiCell->GetCellName (szCell);
894 // since all read-only replicas of a fileset share the same ID,
895 // you can't use this routine to search for one. BUT, you can
896 // use it to look up a read-write or backup regardless of the
897 // aggregate on which it sits, because there should be only one.
898 // When FindIdent() realizes we didn't supply an aggregate to
899 // match against, it will just skip comparing aggregates and
900 // return the first IDENT it finds which matches the given ID.
902 return FindIdent (itFILESET, szCell, NULL, NULL, NULL, NULL, pvid);
906 LPIDENT IDENT::FindServer (LPIDENT lpiCell, LPTSTR pszServer)
908 TCHAR szCell[ cchNAME ];
909 lpiCell->GetCellName (szCell);
911 return FindIdent (itSERVER, szCell, pszServer, NULL, NULL, NULL, NULL);
915 LPIDENT IDENT::FindAggregate (LPIDENT lpiServer, LPTSTR pszAggregate)
917 TCHAR szCell[ cchNAME ];
918 TCHAR szServer[ cchNAME ];
919 lpiServer->GetCellName (szCell);
920 lpiServer->GetLongServerName (szServer);
922 return FindIdent (itAGGREGATE, szCell, szServer, NULL, pszAggregate, NULL, NULL);
926 LPIDENT IDENT::FindFileset (LPIDENT lpiParent, LPTSTR pszFileset)
928 TCHAR szCell[ cchNAME ];
929 TCHAR szServer[ cchNAME ];
930 TCHAR szAggregate[ cchNAME ];
932 LPTSTR pszServer = NULL;
933 LPTSTR pszAggregate = NULL;
935 lpiParent->GetCellName (szCell);
937 if (!lpiParent->fIsCell())
939 pszServer = szServer;
940 lpiParent->GetLongServerName (szServer);
943 if (lpiParent->fIsAggregate())
945 pszAggregate = szAggregate;
946 lpiParent->GetAggregateName (szAggregate);
949 return FindIdent (itFILESET, szCell, pszServer, NULL, pszAggregate, pszFileset, NULL);
953 LPIDENT IDENT::FindFileset (LPIDENT lpiParent, VOLUMEID *pvidFileset)
955 TCHAR szCell[ cchNAME ];
956 TCHAR szServer[ cchNAME ];
957 TCHAR szAggregate[ cchNAME ];
959 LPTSTR pszServer = NULL;
960 LPTSTR pszAggregate = NULL;
962 lpiParent->GetCellName (szCell);
964 if (!lpiParent->fIsCell())
966 pszServer = szServer;
967 lpiParent->GetLongServerName (szServer);
970 if (lpiParent->fIsAggregate())
972 pszAggregate = szAggregate;
973 lpiParent->GetAggregateName (szAggregate);
976 return FindIdent (itFILESET, szCell, pszServer, NULL, pszAggregate, NULL, pvidFileset);
980 LPIDENT IDENT::FindUser (LPIDENT lpiCell, LPTSTR pszPrincipal, LPTSTR pszInstance)
982 return FindIdent (itUSER, lpiCell->m_szCell, pszPrincipal, pszInstance);
986 LPIDENT IDENT::FindGroup (LPIDENT lpiCell, LPTSTR pszGroup)
988 return FindIdent (itGROUP, lpiCell->m_szCell, pszGroup, NULL);
992 LPIDENT IDENT::FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszAccount, LPTSTR pszInstance)
994 for (LPENUM pEnum = x_lkAccountName->FindFirst (pszAccount); pEnum; pEnum = pEnum->FindNext())
996 LPIDENT lpiFound = (LPIDENT)( pEnum->GetObject() );
997 if (lpiFound->m_iType != iType)
999 if (lstrcmpi (pszCell, lpiFound->m_szCell))
1001 if (pszInstance && lstrcmpi (pszInstance, lpiFound->m_szInstance))
1009 LPIDENT IDENT::FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszServer, LPTSTR pszService, LPTSTR pszAggregate, LPTSTR pszFileset, VOLUMEID *pvidFileset)
1013 // Since all IDENTs are maintained in a hashlist, we have several
1014 // possible techniques for finding any given IDENT. For this particular
1015 // hashlist, we have two keys: by type and server, and by volume ID.
1016 // If possible we want to use the latter; otherwise, use the former.
1018 if ((iType == itFILESET) && (pvidFileset))
1020 for (LPENUM pEnum = x_lkFilesetID->FindFirst (pvidFileset); pEnum; pEnum = pEnum->FindNext())
1022 // Only volumes which match this fileset ID will get here.
1024 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
1026 if (lpi->m_iType != itFILESET)
1028 if (pszCell && lstrcmpi (lpi->m_szCell, pszCell))
1030 if (pszServer && lstrcmpi (lpi->m_szServer, pszServer))
1032 if (pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate))
1039 else if ((!pszServer) && (iType != itCELL))
1041 LPTSTR pszFilesetSearch = (pszFileset) ? pszFileset : TEXT("");
1043 for (LPENUM pEnum = x_lkFilesetName->FindFirst (pszFilesetSearch); pEnum; pEnum = pEnum->FindNext())
1045 // Only idents which match this fileset name will get here.
1047 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
1049 if (iType != lpi->m_iType)
1051 if (pszCell && lstrcmpi (lpi->m_szCell, pszCell))
1053 if ((iType == itSERVICE) && lstrcmpi (lpi->m_szService, pszService))
1055 if ((iType == itAGGREGATE) && pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate))
1062 else // Look up the IDENT based on its type and (optional) server name
1066 kts.pszServer = (pszServer) ? pszServer : TEXT("");
1068 for (LPENUM pEnum = x_lkTypeServer->FindFirst (&kts); pEnum; pEnum = pEnum->FindNext())
1070 // Only idents which match this type and server name will get here.
1072 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
1074 if (pszCell && lstrcmpi (lpi->m_szCell, pszCell))
1076 if ((iType == itSERVICE) && lstrcmpi (lpi->m_szService, pszService))
1078 if ((iType == itAGGREGATE) && pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate))
1080 if ((iType == itFILESET) && pszFileset && lstrcmpi (lpi->m_szFileset, pszFileset))