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
14 #include <afs/param.h>
18 #include <WINNT/afsclass.h>
23 * VARIABLES __________________________________________________________________
27 LPHASHLIST IDENT::x_lIdents = NULL;
28 LPHASHLISTKEY IDENT::x_lkTypeServer = NULL;
29 LPHASHLISTKEY IDENT::x_lkFilesetID = NULL;
30 LPHASHLISTKEY IDENT::x_lkFilesetName = NULL;
31 LPHASHLISTKEY IDENT::x_lkAccountName = NULL;
36 * CONSTRUCTION AND LIST MANAGEMENT ___________________________________________
40 void IDENT::InitClass (void)
42 if (x_lIdents == NULL)
44 x_lIdents = New (HASHLIST);
45 x_lkTypeServer = x_lIdents->CreateKey ("Type and Server", IDENT::KeyTypeServer_Compare, IDENT::KeyTypeServer_HashObject, IDENT::KeyTypeServer_HashData);
46 x_lkFilesetID = x_lIdents->CreateKey ("Fileset ID", IDENT::KeyFilesetID_Compare, IDENT::KeyFilesetID_HashObject, IDENT::KeyFilesetID_HashData);
47 x_lkFilesetName = x_lIdents->CreateKey ("Fileset Name", IDENT::KeyFilesetName_Compare, IDENT::KeyFilesetName_HashObject, IDENT::KeyFilesetName_HashData);
48 x_lkAccountName = x_lIdents->CreateKey ("Account Name", IDENT::KeyAccountName_Compare, IDENT::KeyAccountName_HashObject, IDENT::KeyAccountName_HashData);
52 void IDENT::InitIdent (void)
56 m_szCell[0] = TEXT('\0');
57 m_szServer[0] = TEXT('\0');
58 m_szService[0] = TEXT('\0');
59 m_szAggregate[0] = TEXT('\0');
60 m_szFileset[0] = TEXT('\0');
61 m_szAccount[0] = TEXT('\0');
62 m_szInstance[0] = TEXT('\0');
63 memset (&m_vidFileset, 0x00, sizeof(m_vidFileset));
70 x_lIdents->Remove (this);
74 void IDENT::RemoveIdentsInCell (LPIDENT lpiCell)
77 for (LPENUM pEnum = x_lIdents->FindFirst(); pEnum; pEnum = pEnum->FindNext())
79 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
81 if (!lstrcmpi (lpi->m_szCell, lpiCell->m_szCell))
86 void IDENT::Update (void)
88 x_lIdents->Update (this);
93 * ENUMERATION ________________________________________________________________
97 LPIDENT IDENT::FindFirst (HENUM *phEnum)
101 if ((*phEnum = x_lIdents->FindFirst()) == NULL)
104 return (LPIDENT)( (*phEnum)->GetObject() );
108 LPIDENT IDENT::FindFirst (HENUM *phEnum, VOLUMEID *pvidFileset)
112 if ((*phEnum = x_lkFilesetID->FindFirst(pvidFileset)) == NULL)
116 while ((lpiFound = (LPIDENT)((*phEnum)->GetObject())) != NULL)
118 if (lpiFound->m_iType == itFILESET)
121 if ((*phEnum = (*phEnum)->FindNext()) == NULL)
128 LPIDENT IDENT::FindNext (HENUM *phEnum)
135 if ((*phEnum = (*phEnum)->FindNext()) == NULL)
139 if ((lpiFound = (LPIDENT)((*phEnum)->GetObject())) == NULL)
142 if (lpiFound->m_iType == itFILESET)
149 void IDENT::FindClose (HENUM *phEnum)
160 * CELL IDENT _________________________________________________________________
164 IDENT::IDENT (LPCELL lpCell)
168 if (ASSERT( lpCell != NULL ))
171 lpCell->GetName (m_szCell);
172 x_lIdents->Add (this);
176 BOOL IDENT::fIsCell (void)
178 return (m_iType == itCELL) ? TRUE : FALSE;
181 LPCELL IDENT::OpenCell (ULONG *pStatus)
183 if (!ASSERT( m_iType != itUNUSED ))
186 return CELL::ReopenCell (m_szCell, pStatus);
189 LPIDENT IDENT::GetCell (void)
191 if (!ASSERT( m_iType != itUNUSED ))
193 if (m_iType == itCELL)
196 return FindIdent (itCELL, m_szCell, NULL, NULL, NULL, NULL, NULL);
199 void IDENT::GetCellName (LPTSTR pszName)
201 if (!ASSERT( m_iType != itUNUSED ))
207 lstrcpy (pszName, m_szCell);
212 * USER IDENT _________________________________________________________________
216 IDENT::IDENT (LPUSER lpUser)
220 if (ASSERT( lpUser != NULL ))
223 lstrcpy (m_szCell, lpUser->m_lpiCell->m_szCell);
224 lpUser->GetName (m_szAccount, m_szInstance);
225 x_lIdents->Add (this);
229 BOOL IDENT::fIsUser (void)
231 return (m_iType == itUSER) ? TRUE : FALSE;
234 LPUSER IDENT::OpenUser (ULONG *pStatus)
236 LPUSER lpUser = NULL;
238 if (!ASSERT( m_iType == itUSER ))
242 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
244 lpUser = lpCell->OpenUser (m_szAccount, m_szInstance, pStatus);
251 LPIDENT IDENT::GetUser (void)
253 if (!ASSERT( m_iType == itUSER ))
259 void IDENT::GetUserName (LPTSTR pszName, LPTSTR pszInstance)
261 if (!ASSERT( m_iType == itUSER ))
269 lstrcpy (pszName, m_szAccount);
271 lstrcpy (pszInstance, m_szInstance);
275 void IDENT::GetFullUserName (LPTSTR pszFullName)
277 if (!ASSERT( m_iType == itUSER ))
283 AfsClass_GenFullUserName (pszFullName, m_szAccount, m_szInstance);
288 * GROUP IDENT ________________________________________________________________
292 IDENT::IDENT (LPPTSGROUP lpGroup)
296 if (ASSERT( lpGroup != NULL ))
299 lstrcpy (m_szCell, lpGroup->m_lpiCell->m_szCell);
300 lpGroup->GetName (m_szAccount);
301 x_lIdents->Add (this);
305 BOOL IDENT::fIsGroup (void)
307 return (m_iType == itGROUP) ? TRUE : FALSE;
310 LPPTSGROUP IDENT::OpenGroup (ULONG *pStatus)
312 LPPTSGROUP lpGroup = NULL;
314 if (!ASSERT( m_iType == itGROUP ))
318 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
320 lpGroup = lpCell->OpenGroup (m_szAccount, pStatus);
327 LPIDENT IDENT::GetGroup (void)
329 if (!ASSERT( m_iType == itGROUP ))
335 void IDENT::GetGroupName (LPTSTR pszName)
337 if (!ASSERT( m_iType == itGROUP ))
343 lstrcpy (pszName, m_szAccount);
348 * SERVER IDENT _______________________________________________________________
352 IDENT::IDENT (LPSERVER lpServer)
356 if (ASSERT( lpServer != NULL ))
359 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
360 lpServer->GetLongName (m_szServer);
361 x_lIdents->Add (this);
365 BOOL IDENT::fIsServer (void)
367 return (m_iType == itSERVER) ? TRUE : FALSE;
370 LPSERVER IDENT::OpenServer (ULONG *pStatus)
372 LPSERVER lpServer = NULL;
374 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
378 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
380 lpServer = lpCell->OpenServer (m_szServer, pStatus);
387 LPIDENT IDENT::GetServer (void)
389 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
391 if (m_iType == itSERVER)
394 return FindIdent (itSERVER, m_szCell, m_szServer, NULL, NULL, NULL, NULL);
397 void IDENT::GetLongServerName (LPTSTR pszName)
399 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
405 lstrcpy (pszName, m_szServer);
408 void IDENT::GetShortServerName (LPTSTR pszName)
410 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
416 SERVER::ShortenName (pszName, m_szServer, TRUE);
419 void IDENT::GetServerName (LPTSTR pszName)
421 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
427 SERVER::ShortenName (pszName, m_szServer);
432 * SERVICE IDENT ______________________________________________________________
436 IDENT::IDENT (LPSERVICE lpService)
440 if (ASSERT( lpService != NULL ))
443 if ((lpServer = lpService->OpenServer()) != NULL)
446 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
447 lpServer->GetLongName (m_szServer);
448 lpService->GetName (m_szService);
449 x_lIdents->Add (this);
455 BOOL IDENT::fIsService (void)
457 return (m_iType == itSERVICE) ? TRUE : FALSE;
460 LPSERVICE IDENT::OpenService (ULONG *pStatus)
462 LPSERVICE lpService = NULL;
464 if (!ASSERT( fIsService() ))
468 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
471 if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL)
473 lpService = lpServer->OpenService (m_szService, pStatus);
482 LPIDENT IDENT::GetService (void)
484 if (!ASSERT( fIsService() ))
489 void IDENT::GetServiceName (LPTSTR pszName)
491 if (!ASSERT( fIsService() ))
497 lstrcpy (pszName, m_szService);
502 * AGGREGATE IDENT ____________________________________________________________
506 IDENT::IDENT (LPAGGREGATE lpAggregate)
510 if (ASSERT( lpAggregate != NULL ))
513 if ((lpServer = lpAggregate->OpenServer()) != NULL)
515 m_iType = itAGGREGATE;
516 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
517 lpServer->GetLongName (m_szServer);
518 lpAggregate->GetName (m_szAggregate);
519 x_lIdents->Add (this);
525 BOOL IDENT::fIsAggregate (void)
527 return (m_iType == itAGGREGATE) ? TRUE : FALSE;
530 LPAGGREGATE IDENT::OpenAggregate (ULONG *pStatus)
532 LPAGGREGATE lpAggregate = NULL;
534 if (!ASSERT( fIsAggregate() || fIsFileset() ))
538 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
541 if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL)
543 lpAggregate = lpServer->OpenAggregate (m_szAggregate, pStatus);
552 LPIDENT IDENT::GetAggregate (void)
554 if (!ASSERT( fIsAggregate() || fIsFileset() ))
556 if (m_iType == itAGGREGATE)
559 return FindIdent (itAGGREGATE, m_szCell, m_szServer, NULL, m_szAggregate, NULL, NULL);
562 void IDENT::GetAggregateName (LPTSTR pszName)
564 if (!ASSERT( fIsAggregate() || fIsFileset() ))
570 lstrcpy (pszName, m_szAggregate);
575 * FILESET IDENT ______________________________________________________________
579 IDENT::IDENT (LPFILESET lpFileset)
583 if (ASSERT( lpFileset != NULL ))
585 LPAGGREGATE lpAggregate;
586 if ((lpAggregate = lpFileset->OpenAggregate()) != NULL)
589 if ((lpServer = lpAggregate->OpenServer()) != NULL)
592 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
593 lpServer->GetLongName (m_szServer);
594 lpAggregate->GetName (m_szAggregate);
595 lpFileset->GetName (m_szFileset);
596 lpFileset->GetID (&m_vidFileset);
597 x_lIdents->Add (this);
600 lpAggregate->Close();
605 BOOL IDENT::fIsFileset (void)
607 return (m_iType == itFILESET) ? TRUE : FALSE;
610 LPFILESET IDENT::OpenFileset (ULONG *pStatus)
612 LPFILESET lpFileset = NULL;
614 if (!ASSERT( fIsFileset() ))
618 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
621 if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL)
623 LPAGGREGATE lpAggregate;
624 if ((lpAggregate = lpServer->OpenAggregate (m_szAggregate, pStatus)) != NULL)
626 lpFileset = lpAggregate->OpenFileset (&m_vidFileset, pStatus);
627 lpAggregate->Close();
637 LPIDENT IDENT::GetFileset (void)
639 if (!ASSERT( fIsFileset() ))
644 void IDENT::GetFilesetName (LPTSTR pszName)
646 if (!ASSERT( fIsFileset() ))
652 lstrcpy (pszName, m_szFileset);
655 void IDENT::GetFilesetID (VOLUMEID *pvidFileset)
657 if (!ASSERT( fIsFileset() ))
659 memset (pvidFileset, 0x00, sizeof(VOLUMEID));
663 memcpy (pvidFileset, &m_vidFileset, sizeof(VOLUMEID));
668 * NON- TYPE-SPECIFIC ROUTINES ________________________________________________
672 IDENTTYPE IDENT::GetType (void)
677 PVOID IDENT::GetUserParam (void)
682 void IDENT::SetUserParam (PVOID pUser)
687 size_t IDENT::GetRefCount (void)
694 * HASH KEYS __________________________________________________________________
696 * A list of all IDENT objects is maintained using a HashList, which has two
697 * index keys: one on [type+servername], and another on [filesetid].
707 BOOL CALLBACK IDENT::KeyTypeServer_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
709 if (((LPIDENT)pObject)->m_iType != ((KeyTypeServer*)pData)->iType)
711 if (lstrcmp (((LPIDENT)pObject)->m_szServer, ((KeyTypeServer*)pData)->pszServer))
716 HASHVALUE CALLBACK IDENT::KeyTypeServer_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
719 kts.iType = ((LPIDENT)pObject)->m_iType;
720 kts.pszServer = ((LPIDENT)pObject)->m_szServer;
721 return IDENT::KeyTypeServer_HashData (pKey, &kts);
724 HASHVALUE CALLBACK IDENT::KeyTypeServer_HashData (LPHASHLISTKEY pKey, PVOID pData)
726 return (HashString( ((KeyTypeServer*)pData)->pszServer ) + ((KeyTypeServer*)pData)->iType);
730 BOOL CALLBACK IDENT::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
732 return !memcmp (&((LPIDENT)pObject)->m_vidFileset, (VOLUMEID*)pData, sizeof(VOLUMEID));
735 HASHVALUE CALLBACK IDENT::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
737 return IDENT::KeyFilesetID_HashData (pKey, &((LPIDENT)pObject)->m_vidFileset);
740 HASHVALUE CALLBACK IDENT::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData)
742 return (HASHVALUE)(*((VOLUMEID*)pData));
746 BOOL CALLBACK IDENT::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
748 return !lstrcmpi (((LPIDENT)pObject)->m_szFileset, (LPTSTR)pData);
751 HASHVALUE CALLBACK IDENT::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
753 return IDENT::KeyFilesetName_HashData (pKey, &((LPIDENT)pObject)->m_szFileset);
756 HASHVALUE CALLBACK IDENT::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData)
758 return HashString ((LPTSTR)pData);
762 BOOL CALLBACK IDENT::KeyAccountName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
764 return !lstrcmpi (((LPIDENT)pObject)->m_szAccount, (LPTSTR)pData);
767 HASHVALUE CALLBACK IDENT::KeyAccountName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
769 return IDENT::KeyAccountName_HashData (pKey, &((LPIDENT)pObject)->m_szAccount);
772 HASHVALUE CALLBACK IDENT::KeyAccountName_HashData (LPHASHLISTKEY pKey, PVOID pData)
774 return HashString ((LPTSTR)pData);
779 * SEARCHING __________________________________________________________________
783 LPIDENT IDENT::FindIdent (LPCELL lpCell)
785 TCHAR szCell[ cchNAME ];
786 lpCell->GetName (szCell);
787 return FindIdent (itCELL, szCell, NULL, NULL, NULL, NULL, NULL);
790 LPIDENT IDENT::FindIdent (LPUSER lpUser)
792 TCHAR szCell[ cchNAME ];
793 TCHAR szAccount[ cchNAME ];
794 TCHAR szInstance[ cchNAME ];
795 lpUser->m_lpiCell->GetCellName (szCell);
796 lpUser->GetName (szAccount, szInstance);
797 return FindIdent (itUSER, szCell, szAccount, szInstance);
800 LPIDENT IDENT::FindIdent (LPPTSGROUP lpGroup)
802 TCHAR szCell[ cchNAME ];
803 TCHAR szAccount[ cchNAME ];
804 lpGroup->m_lpiCell->GetCellName (szCell);
805 lpGroup->GetName (szAccount);
806 return FindIdent (itGROUP, szCell, szAccount, NULL);
809 LPIDENT IDENT::FindIdent (LPSERVER lpServer)
811 TCHAR szCell[ cchNAME ];
812 TCHAR szServer[ cchNAME ];
813 lpServer->m_lpiCell->GetCellName (szCell);
814 lpServer->GetLongName (szServer);
815 return FindIdent (itSERVER, szCell, szServer, NULL, NULL, NULL, NULL);
818 LPIDENT IDENT::FindIdent (LPSERVICE lpService)
823 if ((lpServer = lpService->OpenServer()) != NULL)
825 TCHAR szCell[ cchNAME ];
826 TCHAR szServer[ cchNAME ];
827 TCHAR szService[ cchNAME ];
828 lpServer->m_lpiCell->GetCellName (szCell);
829 lpServer->GetLongName (szServer);
830 lpService->GetName (szService);
832 lpi = FindIdent (itSERVICE, szCell, szServer, szService, NULL, NULL, NULL);
840 LPIDENT IDENT::FindIdent (LPAGGREGATE lpAggregate)
845 if ((lpServer = lpAggregate->OpenServer()) != NULL)
847 TCHAR szCell[ cchNAME ];
848 TCHAR szServer[ cchNAME ];
849 TCHAR szAggregate[ cchNAME ];
850 lpServer->m_lpiCell->GetCellName (szCell);
851 lpServer->GetLongName (szServer);
852 lpAggregate->GetName (szAggregate);
854 lpi = FindIdent (itAGGREGATE, szCell, szServer, NULL, szAggregate, NULL, NULL);
862 LPIDENT IDENT::FindIdent (LPFILESET lpFileset)
866 LPAGGREGATE lpAggregate;
867 if ((lpAggregate = lpFileset->OpenAggregate()) != NULL)
870 if ((lpServer = lpAggregate->OpenServer()) != NULL)
872 TCHAR szCell[ cchNAME ];
873 TCHAR szServer[ cchNAME ];
874 TCHAR szAggregate[ cchNAME ];
876 lpServer->m_lpiCell->GetCellName (szCell);
877 lpServer->GetLongName (szServer);
878 lpAggregate->GetName (szAggregate);
879 lpFileset->GetID (&vidFileset);
881 lpi = FindIdent (itFILESET, szCell, szServer, NULL, szAggregate, NULL, &vidFileset);
886 lpAggregate->Close();
892 LPIDENT IDENT::FindIdent (LPFILESET lpFileset, VOLUMEID *pvid)
894 TCHAR szCell[ cchNAME ];
895 lpFileset->m_lpiCell->GetCellName (szCell);
897 // since all read-only replicas of a fileset share the same ID,
898 // you can't use this routine to search for one. BUT, you can
899 // use it to look up a read-write or backup regardless of the
900 // aggregate on which it sits, because there should be only one.
901 // When FindIdent() realizes we didn't supply an aggregate to
902 // match against, it will just skip comparing aggregates and
903 // return the first IDENT it finds which matches the given ID.
905 return FindIdent (itFILESET, szCell, NULL, NULL, NULL, NULL, pvid);
909 LPIDENT IDENT::FindServer (LPIDENT lpiCell, LPTSTR pszServer)
911 TCHAR szCell[ cchNAME ];
912 lpiCell->GetCellName (szCell);
914 return FindIdent (itSERVER, szCell, pszServer, NULL, NULL, NULL, NULL);
918 LPIDENT IDENT::FindAggregate (LPIDENT lpiServer, LPTSTR pszAggregate)
920 TCHAR szCell[ cchNAME ];
921 TCHAR szServer[ cchNAME ];
922 lpiServer->GetCellName (szCell);
923 lpiServer->GetLongServerName (szServer);
925 return FindIdent (itAGGREGATE, szCell, szServer, NULL, pszAggregate, NULL, NULL);
929 LPIDENT IDENT::FindFileset (LPIDENT lpiParent, LPTSTR pszFileset)
931 TCHAR szCell[ cchNAME ];
932 TCHAR szServer[ cchNAME ];
933 TCHAR szAggregate[ cchNAME ];
935 LPTSTR pszServer = NULL;
936 LPTSTR pszAggregate = NULL;
938 lpiParent->GetCellName (szCell);
940 if (!lpiParent->fIsCell())
942 pszServer = szServer;
943 lpiParent->GetLongServerName (szServer);
946 if (lpiParent->fIsAggregate())
948 pszAggregate = szAggregate;
949 lpiParent->GetAggregateName (szAggregate);
952 return FindIdent (itFILESET, szCell, pszServer, NULL, pszAggregate, pszFileset, NULL);
956 LPIDENT IDENT::FindFileset (LPIDENT lpiParent, VOLUMEID *pvidFileset)
958 TCHAR szCell[ cchNAME ];
959 TCHAR szServer[ cchNAME ];
960 TCHAR szAggregate[ cchNAME ];
962 LPTSTR pszServer = NULL;
963 LPTSTR pszAggregate = NULL;
965 lpiParent->GetCellName (szCell);
967 if (!lpiParent->fIsCell())
969 pszServer = szServer;
970 lpiParent->GetLongServerName (szServer);
973 if (lpiParent->fIsAggregate())
975 pszAggregate = szAggregate;
976 lpiParent->GetAggregateName (szAggregate);
979 return FindIdent (itFILESET, szCell, pszServer, NULL, pszAggregate, NULL, pvidFileset);
983 LPIDENT IDENT::FindUser (LPIDENT lpiCell, LPTSTR pszPrincipal, LPTSTR pszInstance)
985 return FindIdent (itUSER, lpiCell->m_szCell, pszPrincipal, pszInstance);
989 LPIDENT IDENT::FindGroup (LPIDENT lpiCell, LPTSTR pszGroup)
991 return FindIdent (itGROUP, lpiCell->m_szCell, pszGroup, NULL);
995 LPIDENT IDENT::FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszAccount, LPTSTR pszInstance)
997 for (LPENUM pEnum = x_lkAccountName->FindFirst (pszAccount); pEnum; pEnum = pEnum->FindNext())
999 LPIDENT lpiFound = (LPIDENT)( pEnum->GetObject() );
1000 if (lpiFound->m_iType != iType)
1002 if (lstrcmpi (pszCell, lpiFound->m_szCell))
1004 if (pszInstance && lstrcmpi (pszInstance, lpiFound->m_szInstance))
1012 LPIDENT IDENT::FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszServer, LPTSTR pszService, LPTSTR pszAggregate, LPTSTR pszFileset, VOLUMEID *pvidFileset)
1016 // Since all IDENTs are maintained in a hashlist, we have several
1017 // possible techniques for finding any given IDENT. For this particular
1018 // hashlist, we have two keys: by type and server, and by volume ID.
1019 // If possible we want to use the latter; otherwise, use the former.
1021 if ((iType == itFILESET) && (pvidFileset))
1023 for (LPENUM pEnum = x_lkFilesetID->FindFirst (pvidFileset); pEnum; pEnum = pEnum->FindNext())
1025 // Only volumes which match this fileset ID will get here.
1027 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
1029 if (lpi->m_iType != itFILESET)
1031 if (pszCell && lstrcmpi (lpi->m_szCell, pszCell))
1033 if (pszServer && lstrcmpi (lpi->m_szServer, pszServer))
1035 if (pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate))
1042 else if ((!pszServer) && (iType != itCELL))
1044 LPTSTR pszFilesetSearch = (pszFileset) ? pszFileset : TEXT("");
1046 for (LPENUM pEnum = x_lkFilesetName->FindFirst (pszFilesetSearch); pEnum; pEnum = pEnum->FindNext())
1048 // Only idents which match this fileset name will get here.
1050 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
1052 if (iType != lpi->m_iType)
1054 if (pszCell && lstrcmpi (lpi->m_szCell, pszCell))
1056 if ((iType == itSERVICE) && lstrcmpi (lpi->m_szService, pszService))
1058 if ((iType == itAGGREGATE) && pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate))
1065 else // Look up the IDENT based on its type and (optional) server name
1069 kts.pszServer = (pszServer) ? pszServer : TEXT("");
1071 for (LPENUM pEnum = x_lkTypeServer->FindFirst (&kts); pEnum; pEnum = pEnum->FindNext())
1073 // Only idents which match this type and server name will get here.
1075 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
1077 if (pszCell && lstrcmpi (lpi->m_szCell, pszCell))
1079 if ((iType == itSERVICE) && lstrcmpi (lpi->m_szService, pszService))
1081 if ((iType == itAGGREGATE) && pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate))
1083 if ((iType == itFILESET) && pszFileset && lstrcmpi (lpi->m_szFileset, pszFileset))