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