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 * DEFINITIONS ________________________________________________________________
26 * VARIABLES __________________________________________________________________
32 * PROTOTYPES _________________________________________________________________
38 * ROUTINES ___________________________________________________________________
43 AGGREGATE::AGGREGATE (LPSERVER lpServerParent, LPTSTR pszName, LPTSTR pszDevice)
45 m_lpiServer = lpServerParent->GetIdentifier();
46 m_lpiCell = lpServerParent->m_lpiCell;
49 lstrcpy (m_szName, pszName);
50 lstrcpy (m_szDevice, pszDevice);
52 m_idPartition = NO_PARTITION;
54 m_fFilesetsOutOfDate = TRUE;
55 m_lFilesets = New (HASHLIST);
56 m_lFilesets->SetCriticalSection (AfsClass_GetCriticalSection());
57 m_lkFilesetName = m_lFilesets->CreateKey ("Fileset Name", AGGREGATE::KeyFilesetName_Compare, AGGREGATE::KeyFilesetName_HashObject, AGGREGATE::KeyFilesetName_HashData);
58 m_lkFilesetID = m_lFilesets->CreateKey ("Fileset ID", AGGREGATE::KeyFilesetID_Compare, AGGREGATE::KeyFilesetID_HashObject, AGGREGATE::KeyFilesetID_HashData);
60 m_fStatusOutOfDate = TRUE;
61 m_fAllocationOutOfDate = TRUE;
62 memset (&m_as, 0x00, sizeof(AGGREGATESTATUS));
66 AGGREGATE::~AGGREGATE (void)
68 for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious())
70 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
71 m_lFilesets->Remove (lpFileset);
81 void AGGREGATE::SendDeleteNotifications (void)
83 for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext())
85 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
86 lpFileset->SendDeleteNotifications();
89 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
93 void AGGREGATE::Close (void)
99 LPIDENT AGGREGATE::GetIdentifier (void)
101 if (m_lpiThis == NULL)
103 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
104 m_lpiThis = New2 (IDENT,(this));
105 m_lpiThis->m_cRef ++;
112 void AGGREGATE::Invalidate (void)
114 if (!m_fStatusOutOfDate || !m_fFilesetsOutOfDate)
116 if (m_wGhost & GHOST_HAS_SERVER_ENTRY)
118 m_fStatusOutOfDate = TRUE;
119 m_fFilesetsOutOfDate = TRUE;
122 NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
127 void AGGREGATE::InvalidateAllocation (void)
129 m_fAllocationOutOfDate = TRUE;
133 BOOL AGGREGATE::RefreshFilesets (BOOL fNotify, ULONG *pStatus)
138 if (m_fFilesetsOutOfDate)
140 m_fFilesetsOutOfDate = FALSE;
142 // We'll need m_as.dwID to do this.
144 if (!RefreshStatus (fNotify, pStatus))
148 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsBegin, GetIdentifier());
150 // First thing is to forget about what filesets we think we have now.
152 for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious())
154 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
155 lpFileset->SendDeleteNotifications();
156 m_lFilesets->Remove (lpFileset);
160 // Next, the harder part: look through the server to find a list
164 if ((lpServer = OpenServer (&status)) == NULL)
170 if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL)
174 WORKERPACKET wpBegin;
175 wpBegin.wpVosVolumeGetBegin.hCell = hCell;
176 wpBegin.wpVosVolumeGetBegin.hServer = hVOS;
177 wpBegin.wpVosVolumeGetBegin.idPartition = m_idPartition;
179 if (!Worker_DoTask (wtaskVosVolumeGetBegin, &wpBegin, &status))
186 wpNext.wpVosVolumeGetNext.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum;
187 if (!Worker_DoTask (wtaskVosVolumeGetNext, &wpNext, &status))
189 if (status == ADMITERATORDONE)
196 LPTSTR pszName = AnsiToString (wpNext.wpVosVolumeGetNext.Data.name);
197 LPFILESET lpFileset = New2 (FILESET,(this, &wpNext.wpVosVolumeGetNext.Data.id, pszName));
198 FreeString (pszName, wpNext.wpVosVolumeGetNext.Data.name);
200 lpFileset->SetStatusFromVOS (&wpNext.wpVosVolumeGetNext.Data);
201 lpFileset->m_wGhost |= GHOST_HAS_SERVER_ENTRY;
202 m_lFilesets->Add (lpFileset);
203 NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpFileset->GetIdentifier());
207 wpDone.wpVosVolumeGetDone.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum;
208 Worker_DoTask (wtaskVosVolumeGetDone, &wpDone);
211 lpServer->CloseVosObject();
217 InvalidateAllocation();
220 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsEnd, GetIdentifier(), ((rc) ? 0 : status));
229 BOOL AGGREGATE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
234 if (m_fStatusOutOfDate)
236 m_fStatusOutOfDate = FALSE;
239 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
242 if ((lpServer = OpenServer (&status)) == NULL)
248 if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL)
253 wp.wpVosPartitionGet.hCell = hCell;
254 wp.wpVosPartitionGet.hServer = hVOS;
255 wp.wpVosPartitionGet.idPartition = m_idPartition;
257 if (!Worker_DoTask (wtaskVosPartitionGet, &wp, &status))
261 m_as.ckStorageTotal = wp.wpVosPartitionGet.Data.totalSpace;
262 m_as.ckStorageFree = wp.wpVosPartitionGet.Data.totalFreeSpace;
266 lpServer->CloseVosObject();
273 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
276 if (rc && m_fAllocationOutOfDate)
279 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
281 m_as.ckStorageAllocated = CalculateAllocation (fNotify);
282 m_fAllocationOutOfDate = FALSE;
285 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier());
294 ULONG AGGREGATE::CalculateAllocation (BOOL fNotify)
296 ULONG ckAllocated = 0;
298 for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext())
300 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
303 if (lpFileset->GetStatus (&fs))
305 if (fs.Type == ftREADWRITE)
306 ckAllocated += fs.ckQuota;
314 void AGGREGATE::GetName (LPTSTR pszName)
316 lstrcpy (pszName, m_szName);
320 void AGGREGATE::GetDevice (LPTSTR pszDevice)
322 lstrcpy (pszDevice, m_szDevice);
326 LPCELL AGGREGATE::OpenCell (ULONG *pStatus)
328 return m_lpiCell->OpenCell (pStatus);
332 LPSERVER AGGREGATE::OpenServer (ULONG *pStatus)
334 return m_lpiServer->OpenServer (pStatus);
339 * FILESETS ___________________________________________________________________
343 LPFILESET AGGREGATE::OpenFileset (LPTSTR pszName, ULONG *pStatus)
345 if (!RefreshFilesets (TRUE, pStatus))
349 if ((lpFileset = (LPFILESET)(m_lkFilesetName->GetFirstObject (pszName))) != NULL)
356 LPFILESET AGGREGATE::OpenFileset (VOLUMEID *pvidFileset, ULONG *pStatus)
358 if (!RefreshFilesets (TRUE, pStatus))
362 if ((lpFileset = (LPFILESET)(m_lkFilesetID->GetFirstObject (pvidFileset))) != NULL)
369 LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus)
371 return FilesetFindFirst (phEnum, NULL, fNotify, pStatus);
375 LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus)
377 LPFILESET lpFileset = NULL;
379 if (!RefreshFilesets (fNotify, pStatus))
384 lpFileset = lpiFind->OpenFileset();
387 else if ((*phEnum = m_lFilesets->FindFirst()) != NULL)
389 lpFileset = (LPFILESET)( (*phEnum)->GetObject() );
393 if (!lpFileset && pStatus)
394 *pStatus = ERROR_FILE_NOT_FOUND;
399 LPFILESET AGGREGATE::FilesetFindNext (HENUM *phEnum)
401 LPFILESET lpFileset = NULL;
405 if ((*phEnum = (*phEnum)->FindNext()) != NULL)
407 lpFileset = (LPFILESET)( (*phEnum)->GetObject() );
416 void AGGREGATE::FilesetFindClose (HENUM *phEnum)
426 BOOL AGGREGATE::GetStatus (LPAGGREGATESTATUS lpas, BOOL fNotify, ULONG *pStatus)
428 if (!RefreshStatus (fNotify, pStatus))
431 memcpy (lpas, &m_as, sizeof(AGGREGATESTATUS));
436 short AGGREGATE::GetGhostStatus (void)
442 PVOID AGGREGATE::GetUserParam (void)
444 return GetIdentifier()->GetUserParam();
448 void AGGREGATE::SetUserParam (PVOID pUserNew)
450 GetIdentifier()->SetUserParam (pUserNew);
454 int AGGREGATE::GetID (void)
456 if (m_idPartition == NO_PARTITION)
459 wp.wpVosPartitionNameToId.pszPartition = m_szName;
462 if (Worker_DoTask (wtaskVosPartitionNameToId, &wp, &status))
463 m_idPartition = wp.wpVosPartitionNameToId.idPartition;
466 return m_idPartition;
471 * HASH KEYS __________________________________________________________________
475 BOOL CALLBACK AGGREGATE::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
477 return !lstrcmp (((LPFILESET)pObject)->m_szName, (LPTSTR)pData);
480 HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
482 return AGGREGATE::KeyFilesetName_HashData (pKey, ((LPFILESET)pObject)->m_szName);
485 HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData)
487 return HashString ((LPTSTR)pData);
491 BOOL CALLBACK AGGREGATE::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
493 return !memcmp (&((LPFILESET)pObject)->m_idVolume, (LPVOLUMEID)pData, sizeof(VOLUMEID));
496 HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
498 return AGGREGATE::KeyFilesetID_HashData (pKey, &((LPFILESET)pObject)->m_idVolume);
501 HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData)
503 return (HASHVALUE)*((LPVOLUMEID)pData);