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 * DEFINITIONS ________________________________________________________________
31 * VARIABLES __________________________________________________________________
37 * PROTOTYPES _________________________________________________________________
43 * ROUTINES ___________________________________________________________________
48 AGGREGATE::AGGREGATE (LPSERVER lpServerParent, LPTSTR pszName, LPTSTR pszDevice)
50 m_lpiServer = lpServerParent->GetIdentifier();
51 m_lpiCell = lpServerParent->m_lpiCell;
54 lstrcpy (m_szName, pszName);
55 lstrcpy (m_szDevice, pszDevice);
57 m_idPartition = NO_PARTITION;
59 m_fFilesetsOutOfDate = TRUE;
60 m_lFilesets = New (HASHLIST);
61 m_lFilesets->SetCriticalSection (AfsClass_GetCriticalSection());
62 m_lkFilesetName = m_lFilesets->CreateKey ("Fileset Name", AGGREGATE::KeyFilesetName_Compare, AGGREGATE::KeyFilesetName_HashObject, AGGREGATE::KeyFilesetName_HashData);
63 m_lkFilesetID = m_lFilesets->CreateKey ("Fileset ID", AGGREGATE::KeyFilesetID_Compare, AGGREGATE::KeyFilesetID_HashObject, AGGREGATE::KeyFilesetID_HashData);
65 m_fStatusOutOfDate = TRUE;
66 m_fAllocationOutOfDate = TRUE;
67 memset (&m_as, 0x00, sizeof(AGGREGATESTATUS));
71 AGGREGATE::~AGGREGATE (void)
73 for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious())
75 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
76 m_lFilesets->Remove (lpFileset);
86 void AGGREGATE::SendDeleteNotifications (void)
88 for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext())
90 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
91 lpFileset->SendDeleteNotifications();
94 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
98 void AGGREGATE::Close (void)
104 LPIDENT AGGREGATE::GetIdentifier (void)
106 if (m_lpiThis == NULL)
108 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
109 m_lpiThis = New2 (IDENT,(this));
110 m_lpiThis->m_cRef ++;
117 void AGGREGATE::Invalidate (void)
119 if (!m_fStatusOutOfDate || !m_fFilesetsOutOfDate)
121 if (m_wGhost & GHOST_HAS_SERVER_ENTRY)
123 m_fStatusOutOfDate = TRUE;
124 m_fFilesetsOutOfDate = TRUE;
127 NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
132 void AGGREGATE::InvalidateAllocation (void)
134 m_fAllocationOutOfDate = TRUE;
138 BOOL AGGREGATE::RefreshFilesets (BOOL fNotify, ULONG *pStatus)
143 if (m_fFilesetsOutOfDate)
145 m_fFilesetsOutOfDate = FALSE;
147 // We'll need m_as.dwID to do this.
149 if (!RefreshStatus (fNotify, pStatus))
153 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsBegin, GetIdentifier());
155 // First thing is to forget about what filesets we think we have now.
157 for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious())
159 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
160 lpFileset->SendDeleteNotifications();
161 m_lFilesets->Remove (lpFileset);
165 // Next, the harder part: look through the server to find a list
169 if ((lpServer = OpenServer (&status)) == NULL)
175 if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL)
179 WORKERPACKET wpBegin;
180 wpBegin.wpVosVolumeGetBegin.hCell = hCell;
181 wpBegin.wpVosVolumeGetBegin.hServer = hVOS;
182 wpBegin.wpVosVolumeGetBegin.idPartition = m_idPartition;
184 if (!Worker_DoTask (wtaskVosVolumeGetBegin, &wpBegin, &status))
191 wpNext.wpVosVolumeGetNext.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum;
192 if (!Worker_DoTask (wtaskVosVolumeGetNext, &wpNext, &status))
194 if (status == ADMITERATORDONE)
201 LPTSTR pszName = AnsiToString (wpNext.wpVosVolumeGetNext.Data.name);
202 LPFILESET lpFileset = New2 (FILESET,(this, &wpNext.wpVosVolumeGetNext.Data.id, pszName));
203 FreeString (pszName, wpNext.wpVosVolumeGetNext.Data.name);
205 lpFileset->SetStatusFromVOS (&wpNext.wpVosVolumeGetNext.Data);
206 lpFileset->m_wGhost |= GHOST_HAS_SERVER_ENTRY;
207 m_lFilesets->Add (lpFileset);
208 NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpFileset->GetIdentifier());
212 wpDone.wpVosVolumeGetDone.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum;
213 Worker_DoTask (wtaskVosVolumeGetDone, &wpDone);
216 lpServer->CloseVosObject();
222 InvalidateAllocation();
225 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsEnd, GetIdentifier(), ((rc) ? 0 : status));
234 BOOL AGGREGATE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
239 if (m_fStatusOutOfDate)
241 m_fStatusOutOfDate = FALSE;
244 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
247 if ((lpServer = OpenServer (&status)) == NULL)
253 if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL)
258 wp.wpVosPartitionGet.hCell = hCell;
259 wp.wpVosPartitionGet.hServer = hVOS;
260 wp.wpVosPartitionGet.idPartition = m_idPartition;
262 if (!Worker_DoTask (wtaskVosPartitionGet, &wp, &status))
266 m_as.ckStorageTotal = wp.wpVosPartitionGet.Data.totalSpace;
267 m_as.ckStorageFree = wp.wpVosPartitionGet.Data.totalFreeSpace;
271 lpServer->CloseVosObject();
278 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
281 if (rc && m_fAllocationOutOfDate)
284 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
286 m_as.ckStorageAllocated = CalculateAllocation (fNotify);
287 m_fAllocationOutOfDate = FALSE;
290 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier());
299 size_t AGGREGATE::CalculateAllocation (BOOL fNotify)
301 size_t ckAllocated = 0;
303 for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext())
305 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
308 if (lpFileset->GetStatus (&fs))
310 if (fs.Type == ftREADWRITE)
311 ckAllocated += fs.ckQuota;
319 void AGGREGATE::GetName (LPTSTR pszName)
321 lstrcpy (pszName, m_szName);
325 void AGGREGATE::GetDevice (LPTSTR pszDevice)
327 lstrcpy (pszDevice, m_szDevice);
331 LPCELL AGGREGATE::OpenCell (ULONG *pStatus)
333 return m_lpiCell->OpenCell (pStatus);
337 LPSERVER AGGREGATE::OpenServer (ULONG *pStatus)
339 return m_lpiServer->OpenServer (pStatus);
344 * FILESETS ___________________________________________________________________
348 LPFILESET AGGREGATE::OpenFileset (LPTSTR pszName, ULONG *pStatus)
350 if (!RefreshFilesets (TRUE, pStatus))
354 if ((lpFileset = (LPFILESET)(m_lkFilesetName->GetFirstObject (pszName))) != NULL)
361 LPFILESET AGGREGATE::OpenFileset (VOLUMEID *pvidFileset, ULONG *pStatus)
363 if (!RefreshFilesets (TRUE, pStatus))
367 if ((lpFileset = (LPFILESET)(m_lkFilesetID->GetFirstObject (pvidFileset))) != NULL)
374 LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus)
376 return FilesetFindFirst (phEnum, NULL, fNotify, pStatus);
380 LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus)
382 LPFILESET lpFileset = NULL;
384 if (!RefreshFilesets (fNotify, pStatus))
389 lpFileset = lpiFind->OpenFileset();
392 else if ((*phEnum = m_lFilesets->FindFirst()) != NULL)
394 lpFileset = (LPFILESET)( (*phEnum)->GetObject() );
398 if (!lpFileset && pStatus)
399 *pStatus = ERROR_FILE_NOT_FOUND;
404 LPFILESET AGGREGATE::FilesetFindNext (HENUM *phEnum)
406 LPFILESET lpFileset = NULL;
410 if ((*phEnum = (*phEnum)->FindNext()) != NULL)
412 lpFileset = (LPFILESET)( (*phEnum)->GetObject() );
421 void AGGREGATE::FilesetFindClose (HENUM *phEnum)
431 BOOL AGGREGATE::GetStatus (LPAGGREGATESTATUS lpas, BOOL fNotify, ULONG *pStatus)
433 if (!RefreshStatus (fNotify, pStatus))
436 memcpy (lpas, &m_as, sizeof(AGGREGATESTATUS));
441 short AGGREGATE::GetGhostStatus (void)
447 PVOID AGGREGATE::GetUserParam (void)
449 return GetIdentifier()->GetUserParam();
453 void AGGREGATE::SetUserParam (PVOID pUserNew)
455 GetIdentifier()->SetUserParam (pUserNew);
459 int AGGREGATE::GetID (void)
461 if (m_idPartition == NO_PARTITION)
464 wp.wpVosPartitionNameToId.pszPartition = m_szName;
467 if (Worker_DoTask (wtaskVosPartitionNameToId, &wp, &status))
468 m_idPartition = wp.wpVosPartitionNameToId.idPartition;
471 return m_idPartition;
476 * HASH KEYS __________________________________________________________________
480 BOOL CALLBACK AGGREGATE::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
482 return !lstrcmp (((LPFILESET)pObject)->m_szName, (LPTSTR)pData);
485 HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
487 return AGGREGATE::KeyFilesetName_HashData (pKey, ((LPFILESET)pObject)->m_szName);
490 HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData)
492 return HashString ((LPTSTR)pData);
496 BOOL CALLBACK AGGREGATE::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
498 return !memcmp (&((LPFILESET)pObject)->m_idVolume, (LPVOLUMEID)pData, sizeof(VOLUMEID));
501 HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
503 return AGGREGATE::KeyFilesetID_HashData (pKey, &((LPFILESET)pObject)->m_idVolume);
506 HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData)
508 return (HASHVALUE)*((LPVOLUMEID)pData);