6 #include <WINNT/afsclass.h>
11 * DEFINITIONS ________________________________________________________________
17 * VARIABLES __________________________________________________________________
23 * PROTOTYPES _________________________________________________________________
29 * ROUTINES ___________________________________________________________________
34 AGGREGATE::AGGREGATE (LPSERVER lpServerParent, LPTSTR pszName, LPTSTR pszDevice)
36 m_lpiServer = lpServerParent->GetIdentifier();
37 m_lpiCell = lpServerParent->m_lpiCell;
40 lstrcpy (m_szName, pszName);
41 lstrcpy (m_szDevice, pszDevice);
43 m_idPartition = NO_PARTITION;
45 m_fFilesetsOutOfDate = TRUE;
46 m_lFilesets = New (HASHLIST);
47 m_lFilesets->SetCriticalSection (AfsClass_GetCriticalSection());
48 m_lkFilesetName = m_lFilesets->CreateKey ("Fileset Name", AGGREGATE::KeyFilesetName_Compare, AGGREGATE::KeyFilesetName_HashObject, AGGREGATE::KeyFilesetName_HashData);
49 m_lkFilesetID = m_lFilesets->CreateKey ("Fileset ID", AGGREGATE::KeyFilesetID_Compare, AGGREGATE::KeyFilesetID_HashObject, AGGREGATE::KeyFilesetID_HashData);
51 m_fStatusOutOfDate = TRUE;
52 m_fAllocationOutOfDate = TRUE;
53 memset (&m_as, 0x00, sizeof(AGGREGATESTATUS));
57 AGGREGATE::~AGGREGATE (void)
59 for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious())
61 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
62 m_lFilesets->Remove (lpFileset);
72 void AGGREGATE::SendDeleteNotifications (void)
74 for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext())
76 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
77 lpFileset->SendDeleteNotifications();
80 NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
84 void AGGREGATE::Close (void)
90 LPIDENT AGGREGATE::GetIdentifier (void)
92 if (m_lpiThis == NULL)
94 if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
95 m_lpiThis = New2 (IDENT,(this));
103 void AGGREGATE::Invalidate (void)
105 if (!m_fStatusOutOfDate || !m_fFilesetsOutOfDate)
107 if (m_wGhost & GHOST_HAS_SERVER_ENTRY)
109 m_fStatusOutOfDate = TRUE;
110 m_fFilesetsOutOfDate = TRUE;
113 NOTIFYCALLBACK::SendNotificationToAll (evtInvalidate, GetIdentifier());
118 void AGGREGATE::InvalidateAllocation (void)
120 m_fAllocationOutOfDate = TRUE;
124 BOOL AGGREGATE::RefreshFilesets (BOOL fNotify, ULONG *pStatus)
129 if (m_fFilesetsOutOfDate)
131 m_fFilesetsOutOfDate = FALSE;
133 // We'll need m_as.dwID to do this.
135 if (!RefreshStatus (fNotify, pStatus))
139 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsBegin, GetIdentifier());
141 // First thing is to forget about what filesets we think we have now.
143 for (LPENUM pEnum = m_lFilesets->FindLast(); pEnum; pEnum = pEnum->FindPrevious())
145 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
146 lpFileset->SendDeleteNotifications();
147 m_lFilesets->Remove (lpFileset);
151 // Next, the harder part: look through the server to find a list
155 if ((lpServer = OpenServer (&status)) == NULL)
161 if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL)
165 WORKERPACKET wpBegin;
166 wpBegin.wpVosVolumeGetBegin.hCell = hCell;
167 wpBegin.wpVosVolumeGetBegin.hServer = hVOS;
168 wpBegin.wpVosVolumeGetBegin.idPartition = m_idPartition;
170 if (!Worker_DoTask (wtaskVosVolumeGetBegin, &wpBegin, &status))
177 wpNext.wpVosVolumeGetNext.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum;
178 if (!Worker_DoTask (wtaskVosVolumeGetNext, &wpNext, &status))
180 if (status == ADMITERATORDONE)
187 LPTSTR pszName = AnsiToString (wpNext.wpVosVolumeGetNext.Data.name);
188 LPFILESET lpFileset = New2 (FILESET,(this, &wpNext.wpVosVolumeGetNext.Data.id, pszName));
189 FreeString (pszName, wpNext.wpVosVolumeGetNext.Data.name);
191 lpFileset->SetStatusFromVOS (&wpNext.wpVosVolumeGetNext.Data);
192 lpFileset->m_wGhost |= GHOST_HAS_SERVER_ENTRY;
193 m_lFilesets->Add (lpFileset);
194 NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpFileset->GetIdentifier());
198 wpDone.wpVosVolumeGetDone.hEnum = wpBegin.wpVosVolumeGetBegin.hEnum;
199 Worker_DoTask (wtaskVosVolumeGetDone, &wpDone);
202 lpServer->CloseVosObject();
208 InvalidateAllocation();
211 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshFilesetsEnd, GetIdentifier(), ((rc) ? 0 : status));
220 BOOL AGGREGATE::RefreshStatus (BOOL fNotify, ULONG *pStatus)
225 if (m_fStatusOutOfDate)
227 m_fStatusOutOfDate = FALSE;
230 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
233 if ((lpServer = OpenServer (&status)) == NULL)
239 if ((hVOS = lpServer->OpenVosObject (&hCell, &status)) == NULL)
244 wp.wpVosPartitionGet.hCell = hCell;
245 wp.wpVosPartitionGet.hServer = hVOS;
246 wp.wpVosPartitionGet.idPartition = m_idPartition;
248 if (!Worker_DoTask (wtaskVosPartitionGet, &wp, &status))
252 m_as.ckStorageTotal = wp.wpVosPartitionGet.Data.totalSpace;
253 m_as.ckStorageFree = wp.wpVosPartitionGet.Data.totalFreeSpace;
257 lpServer->CloseVosObject();
264 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
267 if (rc && m_fAllocationOutOfDate)
270 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
272 m_as.ckStorageAllocated = CalculateAllocation (fNotify);
273 m_fAllocationOutOfDate = FALSE;
276 NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier());
285 ULONG AGGREGATE::CalculateAllocation (BOOL fNotify)
287 ULONG ckAllocated = 0;
289 for (LPENUM pEnum = m_lFilesets->FindFirst(); pEnum; pEnum = pEnum->FindNext())
291 LPFILESET lpFileset = (LPFILESET)(pEnum->GetObject());
294 if (lpFileset->GetStatus (&fs))
296 if (fs.Type == ftREADWRITE)
297 ckAllocated += fs.ckQuota;
305 void AGGREGATE::GetName (LPTSTR pszName)
307 lstrcpy (pszName, m_szName);
311 void AGGREGATE::GetDevice (LPTSTR pszDevice)
313 lstrcpy (pszDevice, m_szDevice);
317 LPCELL AGGREGATE::OpenCell (ULONG *pStatus)
319 return m_lpiCell->OpenCell (pStatus);
323 LPSERVER AGGREGATE::OpenServer (ULONG *pStatus)
325 return m_lpiServer->OpenServer (pStatus);
330 * FILESETS ___________________________________________________________________
334 LPFILESET AGGREGATE::OpenFileset (LPTSTR pszName, ULONG *pStatus)
336 if (!RefreshFilesets (TRUE, pStatus))
340 if ((lpFileset = (LPFILESET)(m_lkFilesetName->GetFirstObject (pszName))) != NULL)
347 LPFILESET AGGREGATE::OpenFileset (VOLUMEID *pvidFileset, ULONG *pStatus)
349 if (!RefreshFilesets (TRUE, pStatus))
353 if ((lpFileset = (LPFILESET)(m_lkFilesetID->GetFirstObject (pvidFileset))) != NULL)
360 LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, BOOL fNotify, ULONG *pStatus)
362 return FilesetFindFirst (phEnum, NULL, fNotify, pStatus);
366 LPFILESET AGGREGATE::FilesetFindFirst (HENUM *phEnum, LPIDENT lpiFind, BOOL fNotify, ULONG *pStatus)
368 LPFILESET lpFileset = NULL;
370 if (!RefreshFilesets (fNotify, pStatus))
375 lpFileset = lpiFind->OpenFileset();
378 else if ((*phEnum = m_lFilesets->FindFirst()) != NULL)
380 lpFileset = (LPFILESET)( (*phEnum)->GetObject() );
384 if (!lpFileset && pStatus)
385 *pStatus = ERROR_FILE_NOT_FOUND;
390 LPFILESET AGGREGATE::FilesetFindNext (HENUM *phEnum)
392 LPFILESET lpFileset = NULL;
396 if ((*phEnum = (*phEnum)->FindNext()) != NULL)
398 lpFileset = (LPFILESET)( (*phEnum)->GetObject() );
407 void AGGREGATE::FilesetFindClose (HENUM *phEnum)
417 BOOL AGGREGATE::GetStatus (LPAGGREGATESTATUS lpas, BOOL fNotify, ULONG *pStatus)
419 if (!RefreshStatus (fNotify, pStatus))
422 memcpy (lpas, &m_as, sizeof(AGGREGATESTATUS));
427 short AGGREGATE::GetGhostStatus (void)
433 PVOID AGGREGATE::GetUserParam (void)
435 return GetIdentifier()->GetUserParam();
439 void AGGREGATE::SetUserParam (PVOID pUserNew)
441 GetIdentifier()->SetUserParam (pUserNew);
445 int AGGREGATE::GetID (void)
447 if (m_idPartition == NO_PARTITION)
450 wp.wpVosPartitionNameToId.pszPartition = m_szName;
453 if (Worker_DoTask (wtaskVosPartitionNameToId, &wp, &status))
454 m_idPartition = wp.wpVosPartitionNameToId.idPartition;
457 return m_idPartition;
462 * HASH KEYS __________________________________________________________________
466 BOOL CALLBACK AGGREGATE::KeyFilesetName_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
468 return !lstrcmp (((LPFILESET)pObject)->m_szName, (LPTSTR)pData);
471 HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
473 return AGGREGATE::KeyFilesetName_HashData (pKey, ((LPFILESET)pObject)->m_szName);
476 HASHVALUE CALLBACK AGGREGATE::KeyFilesetName_HashData (LPHASHLISTKEY pKey, PVOID pData)
478 return HashString ((LPTSTR)pData);
482 BOOL CALLBACK AGGREGATE::KeyFilesetID_Compare (LPHASHLISTKEY pKey, PVOID pObject, PVOID pData)
484 return !memcmp (&((LPFILESET)pObject)->m_idVolume, (LPVOLUMEID)pData, sizeof(VOLUMEID));
487 HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashObject (LPHASHLISTKEY pKey, PVOID pObject)
489 return AGGREGATE::KeyFilesetID_HashData (pKey, &((LPFILESET)pObject)->m_idVolume);
492 HASHVALUE CALLBACK AGGREGATE::KeyFilesetID_HashData (LPHASHLISTKEY pKey, PVOID pData)
494 return (HASHVALUE)*((LPVOLUMEID)pData);