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 <afsconfig.h>
15 #include <afs/param.h>
20 #include <WINNT/afsclass.h>
25 * VARIABLES __________________________________________________________________
29 LPHASHLIST IDENT::x_lIdents = NULL;
30 LPHASHLISTKEY IDENT::x_lkTypeServer = NULL;
31 LPHASHLISTKEY IDENT::x_lkFilesetID = NULL;
32 LPHASHLISTKEY IDENT::x_lkFilesetName = NULL;
33 LPHASHLISTKEY IDENT::x_lkAccountName = NULL;
38 * CONSTRUCTION AND LIST MANAGEMENT ___________________________________________
42 void IDENT::InitClass (void)
44 if (x_lIdents == NULL)
46 x_lIdents = New (HASHLIST);
47 x_lkTypeServer = x_lIdents->CreateKey ("Type and Server", IDENT::KeyTypeServer_Compare, IDENT::KeyTypeServer_HashObject, IDENT::KeyTypeServer_HashData);
48 x_lkFilesetID = x_lIdents->CreateKey ("Fileset ID", IDENT::KeyFilesetID_Compare, IDENT::KeyFilesetID_HashObject, IDENT::KeyFilesetID_HashData);
49 x_lkFilesetName = x_lIdents->CreateKey ("Fileset Name", IDENT::KeyFilesetName_Compare, IDENT::KeyFilesetName_HashObject, IDENT::KeyFilesetName_HashData);
50 x_lkAccountName = x_lIdents->CreateKey ("Account Name", IDENT::KeyAccountName_Compare, IDENT::KeyAccountName_HashObject, IDENT::KeyAccountName_HashData);
54 void IDENT::InitIdent (void)
58 m_szCell[0] = TEXT('\0');
59 m_szServer[0] = TEXT('\0');
60 m_szService[0] = TEXT('\0');
61 m_szAggregate[0] = TEXT('\0');
62 m_szFileset[0] = TEXT('\0');
63 m_szAccount[0] = TEXT('\0');
64 m_szInstance[0] = TEXT('\0');
65 memset (&m_vidFileset, 0x00, sizeof(m_vidFileset));
72 x_lIdents->Remove (this);
76 void IDENT::RemoveIdentsInCell (LPIDENT lpiCell)
79 for (LPENUM pEnum = x_lIdents->FindFirst(); pEnum; pEnum = pEnum->FindNext())
81 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
83 if (!lstrcmpi (lpi->m_szCell, lpiCell->m_szCell))
88 void IDENT::Update (void)
90 x_lIdents->Update (this);
95 * ENUMERATION ________________________________________________________________
99 LPIDENT IDENT::FindFirst (HENUM *phEnum)
103 if ((*phEnum = x_lIdents->FindFirst()) == NULL)
106 return (LPIDENT)( (*phEnum)->GetObject() );
110 LPIDENT IDENT::FindFirst (HENUM *phEnum, VOLUMEID *pvidFileset)
114 if ((*phEnum = x_lkFilesetID->FindFirst(pvidFileset)) == NULL)
118 while ((lpiFound = (LPIDENT)((*phEnum)->GetObject())) != NULL)
120 if (lpiFound->m_iType == itFILESET)
123 if ((*phEnum = (*phEnum)->FindNext()) == NULL)
130 LPIDENT IDENT::FindNext (HENUM *phEnum)
137 if ((*phEnum = (*phEnum)->FindNext()) == NULL)
141 if ((lpiFound = (LPIDENT)((*phEnum)->GetObject())) == NULL)
144 if (lpiFound->m_iType == itFILESET)
151 void IDENT::FindClose (HENUM *phEnum)
162 * CELL IDENT _________________________________________________________________
166 IDENT::IDENT (LPCELL lpCell)
170 if (ASSERT( lpCell != NULL ))
173 lpCell->GetName (m_szCell);
174 x_lIdents->Add (this);
178 BOOL IDENT::fIsCell (void)
180 return (m_iType == itCELL) ? TRUE : FALSE;
183 LPCELL IDENT::OpenCell (ULONG *pStatus)
185 if (!ASSERT( m_iType != itUNUSED ))
188 return CELL::ReopenCell (m_szCell, pStatus);
191 LPIDENT IDENT::GetCell (void)
193 if (!ASSERT( m_iType != itUNUSED ))
195 if (m_iType == itCELL)
198 return FindIdent (itCELL, m_szCell, NULL, NULL, NULL, NULL, NULL);
201 void IDENT::GetCellName (LPTSTR pszName)
203 if (!ASSERT( m_iType != itUNUSED ))
209 lstrcpy (pszName, m_szCell);
214 * USER IDENT _________________________________________________________________
218 IDENT::IDENT (LPUSER lpUser)
222 if (ASSERT( lpUser != NULL ))
225 lstrcpy (m_szCell, lpUser->m_lpiCell->m_szCell);
226 lpUser->GetName (m_szAccount, m_szInstance);
227 x_lIdents->Add (this);
231 BOOL IDENT::fIsUser (void)
233 return (m_iType == itUSER) ? TRUE : FALSE;
236 LPUSER IDENT::OpenUser (ULONG *pStatus)
238 LPUSER lpUser = NULL;
240 if (!ASSERT( m_iType == itUSER ))
244 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
246 lpUser = lpCell->OpenUser (m_szAccount, m_szInstance, pStatus);
253 LPIDENT IDENT::GetUser (void)
255 if (!ASSERT( m_iType == itUSER ))
261 void IDENT::GetUserName (LPTSTR pszName, LPTSTR pszInstance)
263 if (!ASSERT( m_iType == itUSER ))
271 lstrcpy (pszName, m_szAccount);
273 lstrcpy (pszInstance, m_szInstance);
277 void IDENT::GetFullUserName (LPTSTR pszFullName)
279 if (!ASSERT( m_iType == itUSER ))
285 AfsClass_GenFullUserName (pszFullName, m_szAccount, m_szInstance);
290 * GROUP IDENT ________________________________________________________________
294 IDENT::IDENT (LPPTSGROUP lpGroup)
298 if (ASSERT( lpGroup != NULL ))
301 lstrcpy (m_szCell, lpGroup->m_lpiCell->m_szCell);
302 lpGroup->GetName (m_szAccount);
303 x_lIdents->Add (this);
307 BOOL IDENT::fIsGroup (void)
309 return (m_iType == itGROUP) ? TRUE : FALSE;
312 LPPTSGROUP IDENT::OpenGroup (ULONG *pStatus)
314 LPPTSGROUP lpGroup = NULL;
316 if (!ASSERT( m_iType == itGROUP ))
320 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
322 lpGroup = lpCell->OpenGroup (m_szAccount, pStatus);
329 LPIDENT IDENT::GetGroup (void)
331 if (!ASSERT( m_iType == itGROUP ))
337 void IDENT::GetGroupName (LPTSTR pszName)
339 if (!ASSERT( m_iType == itGROUP ))
345 lstrcpy (pszName, m_szAccount);
350 * SERVER IDENT _______________________________________________________________
354 IDENT::IDENT (LPSERVER lpServer)
358 if (ASSERT( lpServer != NULL ))
361 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
362 lpServer->GetLongName (m_szServer);
363 x_lIdents->Add (this);
367 BOOL IDENT::fIsServer (void)
369 return (m_iType == itSERVER) ? TRUE : FALSE;
372 LPSERVER IDENT::OpenServer (ULONG *pStatus)
374 LPSERVER lpServer = NULL;
376 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
380 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
382 lpServer = lpCell->OpenServer (m_szServer, pStatus);
389 LPIDENT IDENT::GetServer (void)
391 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
393 if (m_iType == itSERVER)
396 return FindIdent (itSERVER, m_szCell, m_szServer, NULL, NULL, NULL, NULL);
399 void IDENT::GetLongServerName (LPTSTR pszName)
401 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
407 lstrcpy (pszName, m_szServer);
410 void IDENT::GetShortServerName (LPTSTR pszName)
412 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
418 SERVER::ShortenName (pszName, m_szServer, TRUE);
421 void IDENT::GetServerName (LPTSTR pszName)
423 if (!ASSERT( m_iType != itUNUSED && m_iType != itCELL ))
429 SERVER::ShortenName (pszName, m_szServer);
434 * SERVICE IDENT ______________________________________________________________
438 IDENT::IDENT (LPSERVICE lpService)
442 if (ASSERT( lpService != NULL ))
445 if ((lpServer = lpService->OpenServer()) != NULL)
448 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
449 lpServer->GetLongName (m_szServer);
450 lpService->GetName (m_szService);
451 x_lIdents->Add (this);
457 BOOL IDENT::fIsService (void)
459 return (m_iType == itSERVICE) ? TRUE : FALSE;
462 LPSERVICE IDENT::OpenService (ULONG *pStatus)
464 LPSERVICE lpService = NULL;
466 if (!ASSERT( fIsService() ))
470 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
473 if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL)
475 lpService = lpServer->OpenService (m_szService, pStatus);
484 LPIDENT IDENT::GetService (void)
486 if (!ASSERT( fIsService() ))
491 void IDENT::GetServiceName (LPTSTR pszName)
493 if (!ASSERT( fIsService() ))
499 lstrcpy (pszName, m_szService);
504 * AGGREGATE IDENT ____________________________________________________________
508 IDENT::IDENT (LPAGGREGATE lpAggregate)
512 if (ASSERT( lpAggregate != NULL ))
515 if ((lpServer = lpAggregate->OpenServer()) != NULL)
517 m_iType = itAGGREGATE;
518 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
519 lpServer->GetLongName (m_szServer);
520 lpAggregate->GetName (m_szAggregate);
521 x_lIdents->Add (this);
527 BOOL IDENT::fIsAggregate (void)
529 return (m_iType == itAGGREGATE) ? TRUE : FALSE;
532 LPAGGREGATE IDENT::OpenAggregate (ULONG *pStatus)
534 LPAGGREGATE lpAggregate = NULL;
536 if (!ASSERT( fIsAggregate() || fIsFileset() ))
540 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
543 if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL)
545 lpAggregate = lpServer->OpenAggregate (m_szAggregate, pStatus);
554 LPIDENT IDENT::GetAggregate (void)
556 if (!ASSERT( fIsAggregate() || fIsFileset() ))
558 if (m_iType == itAGGREGATE)
561 return FindIdent (itAGGREGATE, m_szCell, m_szServer, NULL, m_szAggregate, NULL, NULL);
564 void IDENT::GetAggregateName (LPTSTR pszName)
566 if (!ASSERT( fIsAggregate() || fIsFileset() ))
572 lstrcpy (pszName, m_szAggregate);
577 * FILESET IDENT ______________________________________________________________
581 IDENT::IDENT (LPFILESET lpFileset)
585 if (ASSERT( lpFileset != NULL ))
587 LPAGGREGATE lpAggregate;
588 if ((lpAggregate = lpFileset->OpenAggregate()) != NULL)
591 if ((lpServer = lpAggregate->OpenServer()) != NULL)
594 lstrcpy (m_szCell, lpServer->m_lpiCell->m_szCell);
595 lpServer->GetLongName (m_szServer);
596 lpAggregate->GetName (m_szAggregate);
597 lpFileset->GetName (m_szFileset);
598 lpFileset->GetID (&m_vidFileset);
599 x_lIdents->Add (this);
602 lpAggregate->Close();
607 BOOL IDENT::fIsFileset (void)
609 return (m_iType == itFILESET) ? TRUE : FALSE;
612 LPFILESET IDENT::OpenFileset (ULONG *pStatus)
614 LPFILESET lpFileset = NULL;
616 if (!ASSERT( fIsFileset() ))
620 if ((lpCell = CELL::ReopenCell (m_szCell, pStatus)) != NULL)
623 if ((lpServer = lpCell->OpenServer (m_szServer, pStatus)) != NULL)
625 LPAGGREGATE lpAggregate;
626 if ((lpAggregate = lpServer->OpenAggregate (m_szAggregate, pStatus)) != NULL)
628 lpFileset = lpAggregate->OpenFileset (&m_vidFileset, pStatus);
629 lpAggregate->Close();
639 LPIDENT IDENT::GetFileset (void)
641 if (!ASSERT( fIsFileset() ))
646 void IDENT::GetFilesetName (LPTSTR pszName)
648 if (!ASSERT( fIsFileset() ))
654 lstrcpy (pszName, m_szFileset);
657 void IDENT::GetFilesetID (VOLUMEID *pvidFileset)
659 if (!ASSERT( fIsFileset() ))
661 memset (pvidFileset, 0x00, sizeof(VOLUMEID));
665 memcpy (pvidFileset, &m_vidFileset, sizeof(VOLUMEID));
670 * NON- TYPE-SPECIFIC ROUTINES ________________________________________________
674 IDENTTYPE IDENT::GetType (void)
679 PVOID IDENT::GetUserParam (void)
684 void IDENT::SetUserParam (PVOID pUser)
689 size_t IDENT::GetRefCount (void)
696 * HASH KEYS __________________________________________________________________
698 * A list of all IDENT objects is maintained using a HashList, which has two
699 * index keys: one on [type+servername], and another on [filesetid].
709 BOOL CALLBACK IDENT::KeyTypeServer_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
711 if (((LPIDENT)pObject)->m_iType != ((KeyTypeServer*)pData)->iType)
713 if (lstrcmp (((LPIDENT)pObject)->m_szServer, ((KeyTypeServer*)pData)->pszServer))
718 HASHVALUE CALLBACK IDENT::KeyTypeServer_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
721 kts.iType = ((LPIDENT)pObject)->m_iType;
722 kts.pszServer = ((LPIDENT)pObject)->m_szServer;
723 return IDENT::KeyTypeServer_HashData (pKey, &kts);
726 HASHVALUE CALLBACK IDENT::KeyTypeServer_HashData (LPHASHLISTKEY pKey, PVOID pData)
728 return (HashString( ((KeyTypeServer*)pData)->pszServer ) + ((KeyTypeServer*)pData)->iType);
732 BOOL CALLBACK IDENT::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
734 return !memcmp (&((LPIDENT)pObject)->m_vidFileset, (VOLUMEID*)pData, sizeof(VOLUMEID));
737 HASHVALUE CALLBACK IDENT::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
739 return IDENT::KeyFilesetID_HashData (pKey, &((LPIDENT)pObject)->m_vidFileset);
742 HASHVALUE CALLBACK IDENT::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData)
744 return (HASHVALUE)(*((VOLUMEID*)pData));
748 BOOL CALLBACK IDENT::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
750 return !lstrcmpi (((LPIDENT)pObject)->m_szFileset, (LPTSTR)pData);
753 HASHVALUE CALLBACK IDENT::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
755 return IDENT::KeyFilesetName_HashData (pKey, &((LPIDENT)pObject)->m_szFileset);
758 HASHVALUE CALLBACK IDENT::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData)
760 return HashString ((LPTSTR)pData);
764 BOOL CALLBACK IDENT::KeyAccountName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
766 return !lstrcmpi (((LPIDENT)pObject)->m_szAccount, (LPTSTR)pData);
769 HASHVALUE CALLBACK IDENT::KeyAccountName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
771 return IDENT::KeyAccountName_HashData (pKey, &((LPIDENT)pObject)->m_szAccount);
774 HASHVALUE CALLBACK IDENT::KeyAccountName_HashData (LPHASHLISTKEY pKey, PVOID pData)
776 return HashString ((LPTSTR)pData);
781 * SEARCHING __________________________________________________________________
785 LPIDENT IDENT::FindIdent (LPCELL lpCell)
787 TCHAR szCell[ cchNAME ];
788 lpCell->GetName (szCell);
789 return FindIdent (itCELL, szCell, NULL, NULL, NULL, NULL, NULL);
792 LPIDENT IDENT::FindIdent (LPUSER lpUser)
794 TCHAR szCell[ cchNAME ];
795 TCHAR szAccount[ cchNAME ];
796 TCHAR szInstance[ cchNAME ];
797 lpUser->m_lpiCell->GetCellName (szCell);
798 lpUser->GetName (szAccount, szInstance);
799 return FindIdent (itUSER, szCell, szAccount, szInstance);
802 LPIDENT IDENT::FindIdent (LPPTSGROUP lpGroup)
804 TCHAR szCell[ cchNAME ];
805 TCHAR szAccount[ cchNAME ];
806 lpGroup->m_lpiCell->GetCellName (szCell);
807 lpGroup->GetName (szAccount);
808 return FindIdent (itGROUP, szCell, szAccount, NULL);
811 LPIDENT IDENT::FindIdent (LPSERVER lpServer)
813 TCHAR szCell[ cchNAME ];
814 TCHAR szServer[ cchNAME ];
815 lpServer->m_lpiCell->GetCellName (szCell);
816 lpServer->GetLongName (szServer);
817 return FindIdent (itSERVER, szCell, szServer, NULL, NULL, NULL, NULL);
820 LPIDENT IDENT::FindIdent (LPSERVICE lpService)
825 if ((lpServer = lpService->OpenServer()) != NULL)
827 TCHAR szCell[ cchNAME ];
828 TCHAR szServer[ cchNAME ];
829 TCHAR szService[ cchNAME ];
830 lpServer->m_lpiCell->GetCellName (szCell);
831 lpServer->GetLongName (szServer);
832 lpService->GetName (szService);
834 lpi = FindIdent (itSERVICE, szCell, szServer, szService, NULL, NULL, NULL);
842 LPIDENT IDENT::FindIdent (LPAGGREGATE lpAggregate)
847 if ((lpServer = lpAggregate->OpenServer()) != NULL)
849 TCHAR szCell[ cchNAME ];
850 TCHAR szServer[ cchNAME ];
851 TCHAR szAggregate[ cchNAME ];
852 lpServer->m_lpiCell->GetCellName (szCell);
853 lpServer->GetLongName (szServer);
854 lpAggregate->GetName (szAggregate);
856 lpi = FindIdent (itAGGREGATE, szCell, szServer, NULL, szAggregate, NULL, NULL);
864 LPIDENT IDENT::FindIdent (LPFILESET lpFileset)
868 LPAGGREGATE lpAggregate;
869 if ((lpAggregate = lpFileset->OpenAggregate()) != NULL)
872 if ((lpServer = lpAggregate->OpenServer()) != NULL)
874 TCHAR szCell[ cchNAME ];
875 TCHAR szServer[ cchNAME ];
876 TCHAR szAggregate[ cchNAME ];
878 lpServer->m_lpiCell->GetCellName (szCell);
879 lpServer->GetLongName (szServer);
880 lpAggregate->GetName (szAggregate);
881 lpFileset->GetID (&vidFileset);
883 lpi = FindIdent (itFILESET, szCell, szServer, NULL, szAggregate, NULL, &vidFileset);
888 lpAggregate->Close();
894 LPIDENT IDENT::FindIdent (LPFILESET lpFileset, VOLUMEID *pvid)
896 TCHAR szCell[ cchNAME ];
897 lpFileset->m_lpiCell->GetCellName (szCell);
899 // since all read-only replicas of a fileset share the same ID,
900 // you can't use this routine to search for one. BUT, you can
901 // use it to look up a read-write or backup regardless of the
902 // aggregate on which it sits, because there should be only one.
903 // When FindIdent() realizes we didn't supply an aggregate to
904 // match against, it will just skip comparing aggregates and
905 // return the first IDENT it finds which matches the given ID.
907 return FindIdent (itFILESET, szCell, NULL, NULL, NULL, NULL, pvid);
911 LPIDENT IDENT::FindServer (LPIDENT lpiCell, LPTSTR pszServer)
913 TCHAR szCell[ cchNAME ];
914 lpiCell->GetCellName (szCell);
916 return FindIdent (itSERVER, szCell, pszServer, NULL, NULL, NULL, NULL);
920 LPIDENT IDENT::FindAggregate (LPIDENT lpiServer, LPTSTR pszAggregate)
922 TCHAR szCell[ cchNAME ];
923 TCHAR szServer[ cchNAME ];
924 lpiServer->GetCellName (szCell);
925 lpiServer->GetLongServerName (szServer);
927 return FindIdent (itAGGREGATE, szCell, szServer, NULL, pszAggregate, NULL, NULL);
931 LPIDENT IDENT::FindFileset (LPIDENT lpiParent, LPTSTR pszFileset)
933 TCHAR szCell[ cchNAME ];
934 TCHAR szServer[ cchNAME ];
935 TCHAR szAggregate[ cchNAME ];
937 LPTSTR pszServer = NULL;
938 LPTSTR pszAggregate = NULL;
940 lpiParent->GetCellName (szCell);
942 if (!lpiParent->fIsCell())
944 pszServer = szServer;
945 lpiParent->GetLongServerName (szServer);
948 if (lpiParent->fIsAggregate())
950 pszAggregate = szAggregate;
951 lpiParent->GetAggregateName (szAggregate);
954 return FindIdent (itFILESET, szCell, pszServer, NULL, pszAggregate, pszFileset, NULL);
958 LPIDENT IDENT::FindFileset (LPIDENT lpiParent, VOLUMEID *pvidFileset)
960 TCHAR szCell[ cchNAME ];
961 TCHAR szServer[ cchNAME ];
962 TCHAR szAggregate[ cchNAME ];
964 LPTSTR pszServer = NULL;
965 LPTSTR pszAggregate = NULL;
967 lpiParent->GetCellName (szCell);
969 if (!lpiParent->fIsCell())
971 pszServer = szServer;
972 lpiParent->GetLongServerName (szServer);
975 if (lpiParent->fIsAggregate())
977 pszAggregate = szAggregate;
978 lpiParent->GetAggregateName (szAggregate);
981 return FindIdent (itFILESET, szCell, pszServer, NULL, pszAggregate, NULL, pvidFileset);
985 LPIDENT IDENT::FindUser (LPIDENT lpiCell, LPTSTR pszPrincipal, LPTSTR pszInstance)
987 return FindIdent (itUSER, lpiCell->m_szCell, pszPrincipal, pszInstance);
991 LPIDENT IDENT::FindGroup (LPIDENT lpiCell, LPTSTR pszGroup)
993 return FindIdent (itGROUP, lpiCell->m_szCell, pszGroup, NULL);
997 LPIDENT IDENT::FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszAccount, LPTSTR pszInstance)
999 for (LPENUM pEnum = x_lkAccountName->FindFirst (pszAccount); pEnum; pEnum = pEnum->FindNext())
1001 LPIDENT lpiFound = (LPIDENT)( pEnum->GetObject() );
1002 if (lpiFound->m_iType != iType)
1004 if (lstrcmpi (pszCell, lpiFound->m_szCell))
1006 if (pszInstance && lstrcmpi (pszInstance, lpiFound->m_szInstance))
1014 LPIDENT IDENT::FindIdent (IDENTTYPE iType, LPTSTR pszCell, LPTSTR pszServer, LPTSTR pszService, LPTSTR pszAggregate, LPTSTR pszFileset, VOLUMEID *pvidFileset)
1018 // Since all IDENTs are maintained in a hashlist, we have several
1019 // possible techniques for finding any given IDENT. For this particular
1020 // hashlist, we have two keys: by type and server, and by volume ID.
1021 // If possible we want to use the latter; otherwise, use the former.
1023 if ((iType == itFILESET) && (pvidFileset))
1025 for (LPENUM pEnum = x_lkFilesetID->FindFirst (pvidFileset); pEnum; pEnum = pEnum->FindNext())
1027 // Only volumes which match this fileset ID will get here.
1029 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
1031 if (lpi->m_iType != itFILESET)
1033 if (pszCell && lstrcmpi (lpi->m_szCell, pszCell))
1035 if (pszServer && lstrcmpi (lpi->m_szServer, pszServer))
1037 if (pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate))
1044 else if ((!pszServer) && (iType != itCELL))
1046 LPTSTR pszFilesetSearch = (pszFileset) ? pszFileset : TEXT("");
1048 for (LPENUM pEnum = x_lkFilesetName->FindFirst (pszFilesetSearch); pEnum; pEnum = pEnum->FindNext())
1050 // Only idents which match this fileset name will get here.
1052 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
1054 if (iType != lpi->m_iType)
1056 if (pszCell && lstrcmpi (lpi->m_szCell, pszCell))
1058 if ((iType == itSERVICE) && lstrcmpi (lpi->m_szService, pszService))
1060 if ((iType == itAGGREGATE) && pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate))
1067 else // Look up the IDENT based on its type and (optional) server name
1071 kts.pszServer = (pszServer) ? pszServer : TEXT("");
1073 for (LPENUM pEnum = x_lkTypeServer->FindFirst (&kts); pEnum; pEnum = pEnum->FindNext())
1075 // Only idents which match this type and server name will get here.
1077 LPIDENT lpi = (LPIDENT)( pEnum->GetObject() );
1079 if (pszCell && lstrcmpi (lpi->m_szCell, pszCell))
1081 if ((iType == itSERVICE) && lstrcmpi (lpi->m_szService, pszService))
1083 if ((iType == itAGGREGATE) && pszAggregate && lstrcmpi (lpi->m_szAggregate, pszAggregate))
1085 if ((iType == itFILESET) && pszFileset && lstrcmpi (lpi->m_szFileset, pszFileset))