]> code.citadel.org Git - citadel.git/blobdiff - webcit/useredit.c
* iterate_load_userlist() zeroed out the wrong struct; fixed
[citadel.git] / webcit / useredit.c
index 312dc65ab98efba853d4954b0265a70e517e4a50..0c758fe9e7e7fdd7d72debecbfcd9eec6ec687bc 100644 (file)
@@ -93,16 +93,22 @@ UserListEntry* NewUserListEntry(StrBuf *SerializedUserList)
  */
 int CompareUserListName(const void *vUser1, const void *vUser2)
 {
-       UserListEntry *u1 = (UserListEntry*) vUser1;
-       UserListEntry *u2 = (UserListEntry*) vUser2;
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
 
        return strcmp(ChrPtr(u1->UserName), ChrPtr(u2->UserName));
 }
 int CompareUserListNameRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+       return strcmp(ChrPtr(u2->UserName), ChrPtr(u1->UserName));
+}
+int GroupchangeUserListName(const void *vUser1, const void *vUser2)
 {
        UserListEntry *u1 = (UserListEntry*) vUser1;
        UserListEntry *u2 = (UserListEntry*) vUser2;
-       return strcmp(ChrPtr(u2->UserName), ChrPtr(u1->UserName));
+       return ChrPtr(u2->UserName)[0] != ChrPtr(u1->UserName)[0];
 }
 
 /*
@@ -110,17 +116,24 @@ int CompareUserListNameRev(const void *vUser1, const void *vUser2)
  */
 int CompareAccessLevel(const void *vUser1, const void *vUser2)
 {
-       UserListEntry *u1 = (UserListEntry*) vUser1;
-       UserListEntry *u2 = (UserListEntry*) vUser2;
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
 
        return (u1->AccessLevel > u2->AccessLevel);
 }
 int CompareAccessLevelRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->AccessLevel > u1->AccessLevel);
+}
+int GroupchangeAccessLevel(const void *vUser1, const void *vUser2)
 {
        UserListEntry *u1 = (UserListEntry*) vUser1;
        UserListEntry *u2 = (UserListEntry*) vUser2;
 
-       return (u2->AccessLevel > u1->AccessLevel);
+       return u2->AccessLevel != u1->AccessLevel;
 }
 
 
@@ -129,17 +142,24 @@ int CompareAccessLevelRev(const void *vUser1, const void *vUser2)
  */
 int CompareUID(const void *vUser1, const void *vUser2)
 {
-       UserListEntry *u1 = (UserListEntry*) vUser1;
-       UserListEntry *u2 = (UserListEntry*) vUser2;
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
 
        return (u1->UID > u2->UID);
 }
 int CompareUIDRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->UID > u1->UID);
+}
+int GroupchangeUID(const void *vUser1, const void *vUser2)
 {
        UserListEntry *u1 = (UserListEntry*) vUser1;
        UserListEntry *u2 = (UserListEntry*) vUser2;
 
-       return (u2->UID > u1->UID);
+       return (u2->UID / 10) != (u1->UID / 10);
 }
 
 /*
@@ -147,17 +167,24 @@ int CompareUIDRev(const void *vUser1, const void *vUser2)
  */
 int CompareLastLogon(const void *vUser1, const void *vUser2)
 {
-       UserListEntry *u1 = (UserListEntry*) vUser1;
-       UserListEntry *u2 = (UserListEntry*) vUser2;
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
 
        return (u1->LastLogonT > u2->LastLogonT);
 }
 int CompareLastLogonRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->LastLogonT > u1->LastLogonT);
+}
+int GroupchangeLastLogon(const void *vUser1, const void *vUser2)
 {
        UserListEntry *u1 = (UserListEntry*) vUser1;
        UserListEntry *u2 = (UserListEntry*) vUser2;
 
-       return (u2->LastLogonT > u1->LastLogonT);
+       return (u2->LastLogonT != u1->LastLogonT);
 }
 
 /*
@@ -165,17 +192,24 @@ int CompareLastLogonRev(const void *vUser1, const void *vUser2)
  */
 int ComparenLogons(const void *vUser1, const void *vUser2)
 {
-       UserListEntry *u1 = (UserListEntry*) vUser1;
-       UserListEntry *u2 = (UserListEntry*) vUser2;
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
 
        return (u1->nLogons > u2->nLogons);
 }
 int ComparenLogonsRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->nLogons > u1->nLogons);
+}
+int GroupchangenLogons(const void *vUser1, const void *vUser2)
 {
        UserListEntry *u1 = (UserListEntry*) vUser1;
        UserListEntry *u2 = (UserListEntry*) vUser2;
 
-       return (u2->nLogons > u1->nLogons);
+       return (u2->nLogons / 100) != (u1->nLogons / 100);
 }
 
 /*
@@ -183,31 +217,40 @@ int ComparenLogonsRev(const void *vUser1, const void *vUser2)
  */
 int ComparenPosts(const void *vUser1, const void *vUser2)
 {
-       UserListEntry *u1 = (UserListEntry*) vUser1;
-       UserListEntry *u2 = (UserListEntry*) vUser2;
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
 
        return (u1->nPosts > u2->nPosts);
 }
 int ComparenPostsRev(const void *vUser1, const void *vUser2)
+{
+       UserListEntry *u1 = (UserListEntry*) GetSearchPayload(vUser1);
+       UserListEntry *u2 = (UserListEntry*) GetSearchPayload(vUser2);
+
+       return (u2->nPosts > u1->nPosts);
+}
+int GroupchangenPosts(const void *vUser1, const void *vUser2)
 {
        UserListEntry *u1 = (UserListEntry*) vUser1;
        UserListEntry *u2 = (UserListEntry*) vUser2;
 
-       return (u2->nPosts > u1->nPosts);
+       return (u2->nPosts / 100) != (u1->nPosts / 100);
 }
 
 
-HashList *iterate_load_userlist(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+HashList *iterate_load_userlist(StrBuf *Target, WCTemplputParams *TP)
 {
+       CompareFunc SortIt;
        HashList *Hash;
        char buf[SIZ];
        StrBuf *Buf;
        UserListEntry* ul;
        char nnn[64];
        int nUsed;
-       int Order;
        int len;
-       
+       WCTemplputParams SubTP;
+
+       memset(&SubTP, 0, sizeof(WCTemplputParams));    
         serv_puts("LIST");
         serv_getln(buf, sizeof buf);
         if (buf[0] == '1') {
@@ -224,120 +267,88 @@ HashList *iterate_load_userlist(StrBuf *Target, int nArgs, WCTemplateToken *Toke
                        Put(Hash, nnn, nUsed, ul, DeleteUserListEntry); 
                }
                FreeStrBuf(&Buf);
-               Order = ibstr("SortOrder");
-               switch (ibstr("SortBy")){
-               case 1: /*NAME*/
-                       SortByPayload(Hash, (Order)? 
-                                     CompareUserListName:
-                                     CompareUserListNameRev);
-                       break;
-               case 2: /*AccessLevel*/
-                       SortByPayload(Hash, (Order)? 
-                                     CompareAccessLevel:
-                                     CompareAccessLevelRev);
-                       break;
-               case 3: /*nLogons*/
-                       SortByPayload(Hash, (Order)? 
-                                     ComparenLogons:
-                                     ComparenLogonsRev);
-                       break;
-               case 4: /*UID*/
-                       SortByPayload(Hash, (Order)? 
-                                     CompareUID:
-                                     CompareUIDRev);
-                       break;
-               case 5: /*LastLogon*/
-                       SortByPayload(Hash, (Order)? 
-                                     CompareLastLogon:
-                                     CompareLastLogonRev);
-                       break;
-               case 6: /* nLogons */
-                       SortByPayload(Hash, (Order)? 
-                                     ComparenLogons:
-                                     ComparenLogonsRev);
-                       break;
-               case 7: /* Posts */
-                       SortByPayload(Hash, (Order)? 
-                                     ComparenPosts:
-                                     ComparenPostsRev);
-                       break;
-               }
+               SubTP.Filter.ContextType = CTX_USERLIST;
+               SortIt = RetrieveSort(&SubTP, HKEY("USER"), HKEY("user:uid"), 0);
+               if (SortIt != NULL)
+                       SortByPayload(Hash, SortIt);
+               else 
+                       SortByPayload(Hash, CompareUID);
                return Hash;
         }
        return NULL;
 }
 
 
-void tmplput_USERLIST_UserName(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_UserName(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
-       StrBufAppendTemplate(Target, nArgs, Tokens, Context, ContextType, ul->UserName, 0);
+       UserListEntry *ul = (UserListEntry*) CTX;
+       StrBufAppendTemplate(Target, TP, ul->UserName, 0);
 }
 
-void tmplput_USERLIST_AccessLevelNo(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_AccessLevelNo(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
 
        StrBufAppendPrintf(Target, "%d", ul->AccessLevel, 0);
 }
 
-void tmplput_USERLIST_AccessLevelStr(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_AccessLevelStr(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
        
        StrBufAppendBufPlain(Target, _(axdefs[ul->AccessLevel]), -1, 0);
 }
 
-void tmplput_USERLIST_UID(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_UID(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
 
        StrBufAppendPrintf(Target, "%d", ul->UID, 0);
 }
 
-void tmplput_USERLIST_LastLogonNo(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_LastLogonNo(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
 
        StrBufAppendPrintf(Target,"%ld", ul->LastLogonT, 0);
 }
-void tmplput_USERLIST_LastLogonStr(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_LastLogonStr(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
        StrEscAppend(Target, NULL, asctime(localtime(&ul->LastLogonT)), 0, 0);
 }
 
-void tmplput_USERLIST_nLogons(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_nLogons(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
 
        StrBufAppendPrintf(Target, "%d", ul->nLogons, 0);
 }
 
-void tmplput_USERLIST_nPosts(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_nPosts(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
 
        StrBufAppendPrintf(Target, "%d", ul->nPosts, 0);
 }
 
-void tmplput_USERLIST_Flags(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_Flags(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
 
        StrBufAppendPrintf(Target, "%d", ul->Flags, 0);
 }
 
-void tmplput_USERLIST_DaysTillPurge(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+void tmplput_USERLIST_DaysTillPurge(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
 
        StrBufAppendPrintf(Target, "%d", ul->DaysTillPurge, 0);
 }
 
-int ConditionalUser(WCTemplateToken *Tokens, void *Context, int ContextType)
+int ConditionalUser(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
        if (havebstr("usernum")) {
                return ibstr("usernum") == ul->UID;
        }
@@ -348,29 +359,27 @@ int ConditionalUser(WCTemplateToken *Tokens, void *Context, int ContextType)
                return 0;
 }
 
-int ConditionalFlagINetEmail(WCTemplateToken *Tokens, void *Context, int ContextType)
+int ConditionalFlagINetEmail(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
        return (ul->Flags & US_INTERNET) != 0;
 }
 
-int ConditionalUserAccess(WCTemplateToken *Tokens, void *Context, int ContextType)
+int ConditionalUserAccess(StrBuf *Target, WCTemplputParams *TP)
 {
-       UserListEntry *ul = (UserListEntry*) Context;
+       UserListEntry *ul = (UserListEntry*) CTX;
 
-       if (Tokens->Params[3]->Type == TYPE_LONG)
-               return (Tokens->Params[3]->lvalue == ul->AccessLevel);
+       if (TP->Tokens->Params[3]->Type == TYPE_LONG)
+               return (TP->Tokens->Params[3]->lvalue == ul->AccessLevel);
        else
                return 0;
 }
 
-/**
+/*
  *  Locate the message number of a user's vCard in the current room
- *  username the plaintext name of the user
- *  usernum the number of the user on the citadel server
- * \return the message id of his vcard
+ *  Returns the message id of his vcard
  */
-long locate_user_vcard(char *username, long usernum) {
+long locate_user_vcard_in_this_room() {
        char buf[SIZ];
        long vcard_msgnum = (-1L);
        char content_type[SIZ];
@@ -466,7 +475,7 @@ void display_edit_address_book_entry(char *username, long usernum) {
                }
        }
 
-       vcard_msgnum = locate_user_vcard(username, usernum);
+       vcard_msgnum = locate_user_vcard_in_this_room();
 
        if (vcard_msgnum < 0) {
                sprintf(error_message,
@@ -518,8 +527,12 @@ void display_edituser(char *supplied_username, int is_new) {
                        delete_user(username);
                }
                else {
+                       WCTemplputParams SubTP;
+                       memset(&SubTP, 0, sizeof(WCTemplputParams));
+                       SubTP.Filter.ContextType = CTX_USERLIST;
+                       SubTP.Context = UL;
                        output_headers(1, 0, 0, 0, 1, 0);
-                       DoTemplate(HKEY("userlist_detailview"), NULL, (void*) UL, CTX_USERLIST);
+                       DoTemplate(HKEY("userlist_detailview"), NULL, &SubTP);
                        end_burst();
                }
                DeleteUserListEntry(UL);
@@ -688,5 +701,48 @@ InitModule_USEREDIT
        RegisterConditional(HKEY("COND:USERACCESS"), 0,   ConditionalUserAccess, CTX_USERLIST);
        RegisterConditional(HKEY("COND:USERLIST:FLAG:USE_INTERNET"), 0, ConditionalFlagINetEmail, CTX_USERLIST);
 
-       RegisterIterator("USERLIST", 0, NULL, iterate_load_userlist, NULL, DeleteHash, CTX_USERLIST, CTX_NONE);
+       RegisterIterator("USERLIST", 0, NULL, iterate_load_userlist, NULL, DeleteHash, CTX_USERLIST, CTX_NONE, IT_NOFLAG);
+
+
+       RegisterSortFunc(HKEY("user:name"),
+                        HKEY("userlist"),
+                        CompareUserListName,
+                        CompareUserListNameRev,
+                        GroupchangeUserListName,
+                        CTX_USERLIST);
+       RegisterSortFunc(HKEY("user:accslvl"),
+                        HKEY("userlist"),
+                        CompareAccessLevel,
+                        CompareAccessLevelRev,
+                        GroupchangeAccessLevel,
+                        CTX_USERLIST);
+
+       RegisterSortFunc(HKEY("user:nlogons"),
+                        HKEY("userlist"),
+                        ComparenLogons,
+                        ComparenLogonsRev,
+                        GroupchangenLogons,
+                        CTX_USERLIST);
+
+       RegisterSortFunc(HKEY("user:uid"),
+                        HKEY("userlist"),
+                        CompareUID,
+                        CompareUIDRev,
+                        GroupchangeUID,
+                        CTX_USERLIST);
+
+       RegisterSortFunc(HKEY("user:lastlogon"),
+                        HKEY("userlist"),
+                        CompareLastLogon,
+                        CompareLastLogonRev,
+                        GroupchangeLastLogon,
+                        CTX_USERLIST);
+
+       RegisterSortFunc(HKEY("user:nmsgposts"),
+                        HKEY("userlist"),
+                        ComparenPosts,
+                        ComparenPostsRev,
+                        GroupchangenPosts,
+                        CTX_USERLIST);
+
 }