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 * DEFINITIONS ________________________________________________________________
29 * VARIABLES __________________________________________________________________
35 * PROTOTYPES _________________________________________________________________
41 * ROUTINES ___________________________________________________________________
46 AGGREGATE::AGGREGATE (LPSERVER lpServerParent, LPTSTR pszName, LPTSTR pszDevice)
48 m_lpiServer = lpServerParent->GetIdentifier();
49 m_lpiCell = lpServerParent->m_lpiCell;
52 lstrcpy (m_szName, pszName);
53 lstrcpy (m_szDevice, pszDevice);
55 m_idPartition = NO_PARTITION;
57 m_fFilesetsOutOfDate = TRUE;
58 m_lFilesets = New (HASHLIST);
59 m_lFilesets->SetCriticalSection (AfsClass_GetCriticalSection());
60 m_lkFilesetName = m_lFilesets->CreateKey ("Fileset Name", AGGREGATE::KeyFilesetName_Compare, AGGREGATE::KeyFilesetName_HashObject, AGGREGATE::KeyFilesetName_HashData);
61 m_lkFilesetID = m_lFilesets->CreateKey ("Fileset ID", AGGREGATE::KeyFilesetID_Compare, AGGREGATE::KeyFilesetID_HashObject, AGGREGATE::KeyFilesetID_HashData);
63 m_fStatusOutOfDate = TRUE;
64 m_fAllocationOutOfDate = TRUE;
65 memset (&m_as, 0x00, sizeof(AGGREGATESTATUS));
69 AGGREGATE::~AGGREGATE (void)
71 for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious())
73 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
74 m_lFilesets->Remove (lpFileset);
84 void AGGREGATE::SendDeleteNotifications (void)
86 for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext())
88 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
89 lpFileset->SendDeleteNotifications();
92 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
96 void AGGREGATE::Close (void)
102 LPIDENT AGGREGATE::GetIdentifier (void)
104 if (m_lpiThis == NULL)
106 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
107 m_lpiThis = New2 (IDENT,(this));
108 m_lpiThis->m_cRef ++;
115 void AGGREGATE::Invalidate (void)
117 if (!m_fStatusOutOfDate || !m_fFilesetsOutOfDate)
119 if (m_wGhost & GHOST_HAS_SERVER_ENTRY)
121 m_fStatusOutOfDate = TRUE;
122 m_fFilesetsOutOfDate = TRUE;
125 NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
130 void AGGREGATE::InvalidateAllocation (void)
132 m_fAllocationOutOfDate = TRUE;
136 BOOL AGGREGATE::RefreshFilesets (BOOL fNotify, ULONG *pStatus)
141 if (m_fFilesetsOutOfDate)
143 m_fFilesetsOutOfDate = FALSE;
145 // We'll need m_as.dwID to do this.
147 if (!RefreshStatus (fNotify, pStatus))
151 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsBegin, GetIdentifier());
153 // First thing is to forget about what filesets we think we have now.
155 for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious())
157 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
158 lpFileset->SendDeleteNotifications();
159 m_lFilesets->Remove (lpFileset);
163 // Next, the harder part: look through the server to find a list
167 if ((lpServer = OpenServer (&status)) == NULL)
173 if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL)
177 WORKERPACKET wpBegin;
178 wpBegin.wpVosVolumeGetBegin.hCell = hCell;
179 wpBegin.wpVosVolumeGetBegin.hServer = hVOS;
180 wpBegin.wpVosVolumeGetBegin.idPartition = m_idPartition;
182 if (!Worker_DoTask (wtaskVosVolumeGetBegin, &wpBegin, &status))
189 wpNext.wpVosVolumeGetNext.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum;
190 if (!Worker_DoTask (wtaskVosVolumeGetNext, &wpNext, &status))
192 if (status == ADMITERATORDONE)
199 LPTSTR pszName = AnsiToString (wpNext.wpVosVolumeGetNext.Data.name);
200 LPFILESET lpFileset = New2 (FILESET,(this, &wpNext.wpVosVolumeGetNext.Data.id, pszName));
201 FreeString (pszName, wpNext.wpVosVolumeGetNext.Data.name);
203 lpFileset->SetStatusFromVOS (&wpNext.wpVosVolumeGetNext.Data);
204 lpFileset->m_wGhost |= GHOST_HAS_SERVER_ENTRY;
205 m_lFilesets->Add (lpFileset);
206 NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpFileset->GetIdentifier());
210 wpDone.wpVosVolumeGetDone.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum;
211 Worker_DoTask (wtaskVosVolumeGetDone, &wpDone);
214 lpServer->CloseVosObject();
220 InvalidateAllocation();
223 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsEnd, GetIdentifier(), ((rc) ? 0 : status));
232 BOOL AGGREGATE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
237 if (m_fStatusOutOfDate)
239 m_fStatusOutOfDate = FALSE;
242 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
245 if ((lpServer = OpenServer (&status)) == NULL)
251 if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL)
256 wp.wpVosPartitionGet.hCell = hCell;
257 wp.wpVosPartitionGet.hServer = hVOS;
258 wp.wpVosPartitionGet.idPartition = m_idPartition;
260 if (!Worker_DoTask (wtaskVosPartitionGet, &wp, &status))
264 m_as.ckStorageTotal = wp.wpVosPartitionGet.Data.totalSpace;
265 m_as.ckStorageFree = wp.wpVosPartitionGet.Data.totalFreeSpace;
269 lpServer->CloseVosObject();
276 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
279 if (rc && m_fAllocationOutOfDate)
282 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
284 m_as.ckStorageAllocated = CalculateAllocation (fNotify);
285 m_fAllocationOutOfDate = FALSE;
288 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier());
297 size_t AGGREGATE::CalculateAllocation (BOOL fNotify)
299 size_t ckAllocated = 0;
301 for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext())
303 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
306 if (lpFileset->GetStatus (&fs))
308 if (fs.Type == ftREADWRITE)
309 ckAllocated += fs.ckQuota;
317 void AGGREGATE::GetName (LPTSTR pszName)
319 lstrcpy (pszName, m_szName);
323 void AGGREGATE::GetDevice (LPTSTR pszDevice)
325 lstrcpy (pszDevice, m_szDevice);
329 LPCELL AGGREGATE::OpenCell (ULONG *pStatus)
331 return m_lpiCell->OpenCell (pStatus);
335 LPSERVER AGGREGATE::OpenServer (ULONG *pStatus)
337 return m_lpiServer->OpenServer (pStatus);
342 * FILESETS ___________________________________________________________________
346 LPFILESET AGGREGATE::OpenFileset (LPTSTR pszName, ULONG *pStatus)
348 if (!RefreshFilesets (TRUE, pStatus))
352 if ((lpFileset = (LPFILESET)(m_lkFilesetName->GetFirstObject (pszName))) != NULL)
359 LPFILESET AGGREGATE::OpenFileset (VOLUMEID *pvidFileset, ULONG *pStatus)
361 if (!RefreshFilesets (TRUE, pStatus))
365 if ((lpFileset = (LPFILESET)(m_lkFilesetID->GetFirstObject (pvidFileset))) != NULL)
372 LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus)
374 return FilesetFindFirst (phEnum, NULL, fNotify, pStatus);
378 LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus)
380 LPFILESET lpFileset = NULL;
382 if (!RefreshFilesets (fNotify, pStatus))
387 lpFileset = lpiFind->OpenFileset();
390 else if ((*phEnum = m_lFilesets->FindFirst()) != NULL)
392 lpFileset = (LPFILESET)( (*phEnum)->GetObject() );
396 if (!lpFileset && pStatus)
397 *pStatus = ERROR_FILE_NOT_FOUND;
402 LPFILESET AGGREGATE::FilesetFindNext (HENUM *phEnum)
404 LPFILESET lpFileset = NULL;
408 if ((*phEnum = (*phEnum)->FindNext()) != NULL)
410 lpFileset = (LPFILESET)( (*phEnum)->GetObject() );
419 void AGGREGATE::FilesetFindClose (HENUM *phEnum)
429 BOOL AGGREGATE::GetStatus (LPAGGREGATESTATUS lpas, BOOL fNotify, ULONG *pStatus)
431 if (!RefreshStatus (fNotify, pStatus))
434 memcpy (lpas, &m_as, sizeof(AGGREGATESTATUS));
439 short AGGREGATE::GetGhostStatus (void)
445 PVOID AGGREGATE::GetUserParam (void)
447 return GetIdentifier()->GetUserParam();
451 void AGGREGATE::SetUserParam (PVOID pUserNew)
453 GetIdentifier()->SetUserParam (pUserNew);
457 int AGGREGATE::GetID (void)
459 if (m_idPartition == NO_PARTITION)
462 wp.wpVosPartitionNameToId.pszPartition = m_szName;
465 if (Worker_DoTask (wtaskVosPartitionNameToId, &wp, &status))
466 m_idPartition = wp.wpVosPartitionNameToId.idPartition;
469 return m_idPartition;
474 * HASH KEYS __________________________________________________________________
478 BOOL CALLBACK AGGREGATE::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
480 return !lstrcmp (((LPFILESET)pObject)->m_szName, (LPTSTR)pData);
483 HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
485 return AGGREGATE::KeyFilesetName_HashData (pKey, ((LPFILESET)pObject)->m_szName);
488 HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData)
490 return HashString ((LPTSTR)pData);
494 BOOL CALLBACK AGGREGATE::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
496 return !memcmp (&((LPFILESET)pObject)->m_idVolume, (LPVOLUMEID)pData, sizeof(VOLUMEID));
499 HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
501 return AGGREGATE::KeyFilesetID_HashData (pKey, &((LPFILESET)pObject)->m_idVolume);
504 HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData)
506 return (HASHVALUE)*((LPVOLUMEID)pData);