cddcd9574a3b7859e299ea119a9c6ed58681a446
[openafs.git] / src / WINNT / afsclass / c_grp.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
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
8  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include <WINNT/afsclass.h>
16 #include "internal.h"
17
18
19 /*
20  * DEFINITIONS ________________________________________________________________
21  *
22  */
23
24 #define PTSGROUPACCESS_TO_ACCOUNTACCESS(_ga) \
25    ( ((_ga) == PTS_GROUP_OWNER_ACCESS) ? aaOWNER_ONLY : \
26      ((_ga) == PTS_GROUP_ACCESS) ? aaGROUP_ONLY : aaANYONE )
27
28
29 /*
30  * ROUTINES ___________________________________________________________________
31  *
32  */
33
34 PTSGROUP::PTSGROUP (LPCELL lpCellParent, LPTSTR pszGroup)
35 {
36    m_lpiCell = lpCellParent->GetIdentifier();
37    lstrcpy (m_szName, pszGroup);
38
39    m_lpiThis = NULL;
40    m_fStatusOutOfDate = TRUE;
41    m_mszMembers = NULL;
42    m_mszMemberOf = NULL;
43    m_mszOwnerOf = NULL;
44 }
45
46
47 PTSGROUP::~PTSGROUP (void)
48 {
49    if (m_lpiThis)
50       m_lpiThis->m_cRef --;
51
52    FreeString (m_mszMembers);
53    FreeString (m_mszMemberOf);
54    FreeString (m_mszOwnerOf);
55 }
56
57
58 void PTSGROUP::SendDeleteNotifications (void)
59 {
60    NOTIFYCALLBACK::SendNotificationToAll (evtDestroy, GetIdentifier());
61 }
62
63
64 void PTSGROUP::Close (void)
65 {
66    AfsClass_Leave();
67 }
68
69
70 LPIDENT PTSGROUP::GetIdentifier (void)
71 {
72    if (m_lpiThis == NULL)
73       {
74       if ((m_lpiThis = IDENT::FindIdent (this)) == NULL)
75          m_lpiThis = New2 (IDENT,(this));
76       m_lpiThis->m_cRef ++;
77       }
78
79    return m_lpiThis;
80 }
81
82
83 void PTSGROUP::Invalidate (void)
84 {
85    m_fStatusOutOfDate = TRUE;
86 }
87
88
89 LPCELL PTSGROUP::OpenCell (ULONG *pStatus)
90 {
91    return m_lpiCell->OpenCell (pStatus);
92 }
93
94
95 void PTSGROUP::GetName (LPTSTR pszGroup)
96 {
97    if (pszGroup)
98       lstrcpy (pszGroup, m_szName);
99 }
100
101
102 BOOL PTSGROUP::GetStatus (LPPTSGROUPSTATUS lpgs, BOOL fNotify, ULONG *pStatus)
103 {
104    if (!RefreshStatus (fNotify, pStatus))
105       return FALSE;
106
107    memcpy (lpgs, &m_gs, sizeof(PTSGROUPSTATUS));
108    return TRUE;
109 }
110
111
112 PVOID PTSGROUP::GetUserParam (void)
113 {
114    return GetIdentifier()->GetUserParam();
115 }
116
117
118 void PTSGROUP::SetUserParam (PVOID pUserParam)
119 {
120    GetIdentifier()->SetUserParam (pUserParam);
121 }
122
123
124 BOOL PTSGROUP::GetMembers (LPTSTR *ppmsz, ULONG *pStatus)
125 {
126    if (!RefreshStatus (TRUE, pStatus))
127       return FALSE;
128    *ppmsz = CloneMultiString (m_mszMembers);
129    return TRUE;
130 }
131
132
133 BOOL PTSGROUP::GetMemberOf (LPTSTR *ppmsz, ULONG *pStatus)
134 {
135    if (!RefreshStatus (TRUE, pStatus))
136       return FALSE;
137    *ppmsz = CloneMultiString (m_mszMemberOf);
138    return TRUE;
139 }
140
141
142 BOOL PTSGROUP::GetOwnerOf (LPTSTR *ppmsz, ULONG *pStatus)
143 {
144    if (!RefreshStatus (TRUE, pStatus))
145       return FALSE;
146    *ppmsz = CloneMultiString (m_mszOwnerOf);
147    return TRUE;
148 }
149
150
151 void PTSGROUP::ChangeIdentName (LPTSTR pszNewName)
152 {
153    LPIDENT lpi;
154    if ((lpi = GetIdentifier()) != NULL)
155       {
156       lstrcpy (lpi->m_szAccount, pszNewName);
157       lpi->Update();
158       }
159    lstrcpy (m_szName, pszNewName);
160
161    LPCELL lpCell;
162    if ((lpCell = OpenCell()) != NULL)
163       {
164       lpCell->m_lGroups->Update(this);
165       lpCell->Close();
166       }
167 }
168
169
170 BOOL PTSGROUP::RefreshStatus (BOOL fNotify, ULONG *pStatus)
171 {
172    BOOL rc = TRUE;
173    DWORD status = 0;
174
175    if (m_fStatusOutOfDate)
176       {
177       m_fStatusOutOfDate = FALSE;
178
179       if (fNotify)
180          NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier());
181
182       memset (&m_gs, 0x00, sizeof(m_gs));
183
184       FreeString (m_mszOwnerOf);
185       m_mszOwnerOf = NULL;
186
187       FreeString (m_mszMemberOf);
188       m_mszMemberOf = NULL;
189
190       FreeString (m_mszMembers);
191       m_mszMembers = NULL;
192
193       LPCELL lpCell;
194       if ((lpCell = OpenCell (&status)) == NULL)
195          rc = FALSE;
196       else
197          {
198          PVOID hCell;
199          if ((hCell = lpCell->GetCellObject (&status)) == NULL)
200             rc = FALSE;
201          else
202             {
203             WORKERPACKET wpGet;
204             wpGet.wpPtsGroupGet.hCell = hCell;
205             wpGet.wpPtsGroupGet.pszGroup = m_szName;
206             if (!Worker_DoTask (wtaskPtsGroupGet, &wpGet, &status))
207                rc = FALSE;
208             else
209                {
210                m_gs.nMembers = wpGet.wpPtsGroupGet.Entry.membershipCount;
211                m_gs.uidName = wpGet.wpPtsGroupGet.Entry.nameUid;
212                m_gs.uidOwner = wpGet.wpPtsGroupGet.Entry.ownerUid;
213                m_gs.uidCreator = wpGet.wpPtsGroupGet.Entry.creatorUid;
214
215                m_gs.aaListStatus = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listStatus);
216                m_gs.aaListGroupsOwned = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listGroupsOwned);
217                m_gs.aaListMembers = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listMembership);
218                m_gs.aaAddMember = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listAdd);
219                m_gs.aaDeleteMember = PTSGROUPACCESS_TO_ACCOUNTACCESS (wpGet.wpPtsGroupGet.Entry.listDelete);
220                CopyAnsiToString (m_gs.szOwner, wpGet.wpPtsGroupGet.Entry.owner);
221                CopyAnsiToString (m_gs.szCreator, wpGet.wpPtsGroupGet.Entry.creator);
222                }
223
224             // Grab the list of users which belong to this group
225             //
226             WORKERPACKET wpBegin;
227             wpBegin.wpPtsGroupMemberListBegin.hCell = hCell;
228             wpBegin.wpPtsGroupMemberListBegin.pszGroup = m_szName;
229             if (Worker_DoTask (wtaskPtsGroupMemberListBegin, &wpBegin, &status))
230                {
231                for (;;)
232                   {
233                   TCHAR szMember[ cchNAME ];
234
235                   WORKERPACKET wpNext;
236                   wpNext.wpPtsGroupMemberListNext.hEnum = wpBegin.wpPtsGroupMemberListBegin.hEnum;
237                   wpNext.wpPtsGroupMemberListNext.pszMember = szMember;
238                   if (!Worker_DoTask (wtaskPtsGroupMemberListNext, &wpNext))
239                      break;
240
241                   FormatMultiString (&m_mszMembers, FALSE, TEXT("%1"), TEXT("%s"), szMember);
242                   }
243
244                WORKERPACKET wpDone;
245                wpDone.wpPtsGroupMemberListDone.hEnum = wpBegin.wpPtsGroupMemberListBegin.hEnum;
246                Worker_DoTask (wtaskPtsGroupMemberListDone, &wpDone);
247                }
248
249             // Grab the list of groups which this group owns
250             //
251             wpBegin.wpPtsOwnedGroupListBegin.hCell = hCell;
252             wpBegin.wpPtsOwnedGroupListBegin.pszOwner = m_szName;
253             if (Worker_DoTask (wtaskPtsOwnedGroupListBegin, &wpBegin, &status))
254                {
255                for (;;)
256                   {
257                   TCHAR szGroup[ cchNAME ];
258
259                   WORKERPACKET wpNext;
260                   wpNext.wpPtsOwnedGroupListNext.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
261                   wpNext.wpPtsOwnedGroupListNext.pszGroup = szGroup;
262                   if (!Worker_DoTask (wtaskPtsOwnedGroupListNext, &wpNext))
263                      break;
264
265                   FormatMultiString (&m_mszOwnerOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
266                   }
267
268                WORKERPACKET wpDone;
269                wpDone.wpPtsOwnedGroupListDone.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum;
270                Worker_DoTask (wtaskPtsOwnedGroupListDone, &wpDone);
271                }
272
273             // Grab the list of groups to which this group belongs
274             //
275             wpBegin.wpPtsUserMemberListBegin.hCell = hCell;
276             wpBegin.wpPtsUserMemberListBegin.pszUser = m_szName;
277             if (Worker_DoTask (wtaskPtsUserMemberListBegin, &wpBegin, &status))
278                {
279                for (;;)
280                   {
281                   TCHAR szGroup[ cchNAME ];
282
283                   WORKERPACKET wpNext;
284                   wpNext.wpPtsUserMemberListNext.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
285                   wpNext.wpPtsUserMemberListNext.pszGroup = szGroup;
286                   if (!Worker_DoTask (wtaskPtsUserMemberListNext, &wpNext))
287                      break;
288
289                   FormatMultiString (&m_mszMemberOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup);
290                   }
291
292                WORKERPACKET wpDone;
293                wpDone.wpPtsUserMemberListDone.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum;
294                Worker_DoTask (wtaskPtsUserMemberListDone, &wpDone);
295                }
296             }
297
298          lpCell->Close();
299          }
300
301       if (fNotify)
302          NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status));
303       }
304
305    if (pStatus && !rc)
306       *pStatus = status;
307    return TRUE;
308 }
309