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