tried to reorder the program structure and build process
[NeonServV5.git] / src / ChanUser.c
diff --git a/src/ChanUser.c b/src/ChanUser.c
new file mode 100644 (file)
index 0000000..c31e202
--- /dev/null
@@ -0,0 +1,157 @@
+
+#include "ChanUser.h"
+#include "ChanNode.h"
+#include "UserNode.h"
+
+struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
+    struct ChanUser *chanuser = malloc(sizeof(*chan));
+    if (!chanuser)
+    {
+        perror("malloc() failed");
+        return NULL;
+    }
+    chanuser->flags = 0;
+    chanuser->user = user;
+    chanuser->chan = chan;
+    
+    chanuser->changeTime = 0;
+
+    chanuser->next_user = chan->user;
+    chan->user = chanuser;
+    chan->usercount++;
+
+    chanuser->next_chan = user->channel;
+    user->channel = chanuser;
+
+    return chanuser;
+}
+
+struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
+    struct ChanUser *chanuser = malloc(sizeof(*chan));
+    if (!chanuser)
+    {
+        perror("malloc() failed");
+        return NULL;
+    }
+    chanuser->flags = CHANUSERFLAG_INVISIBLE;
+    chanuser->user = user;
+    chanuser->chan = chan;
+    
+    chanuser->changeTime = 0;
+
+    chanuser->next_user = chan->user;
+    chan->user = chanuser;
+    chan->usercount++;
+
+    return chanuser;
+}
+
+int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
+    struct ChanUser *chanuser;
+    for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
+        if(chanuser->chan == chan)
+            return 1;
+    }
+    return 0;
+}
+
+struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
+    struct ChanUser *chanuser;
+    for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
+        if(chanuser->chan == chan)
+            return chanuser;
+    }
+    return NULL;
+}
+
+struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
+    if(last == NULL)
+        return chan->user;
+    else
+        return last->next_user;
+}
+
+struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
+    if(last == NULL)
+        return user->channel;
+    else
+        return last->next_chan;
+}
+
+void delChanUser(struct ChanUser *chanuser, int freeChanUser) {
+    struct ChanUser *cchanuser, *last;
+    //remove it from the user's channel-list
+    if(!(chanuser->flags & CHANUSERFLAG_INVISIBLE)) {
+        last = NULL;
+        for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
+            if(cchanuser == chanuser) {
+                if(last) 
+                    last->next_chan = chanuser->next_chan;
+                else
+                    chanuser->user->channel = chanuser->next_chan;
+                break;
+            } else
+                last = cchanuser;
+        }
+    }
+
+    //remove it from the channel's user-list
+    last = NULL;
+    for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
+        if(cchanuser == chanuser) {
+            chanuser->chan->usercount--;
+            if(last) 
+                last->next_user = chanuser->next_user;
+            else
+                chanuser->chan->user = chanuser->next_user;
+            break;
+        } else
+            last = cchanuser;
+    }
+    
+    if(freeChanUser)
+        free(chanuser);
+    else {
+        chanuser->next_chan = NULL;
+        chanuser->next_user = NULL;
+    }
+}
+
+void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int freeChanUser) {
+    struct ChanUser *cchanuser, *last;
+    if(remove_from_userlist) {
+        //remove it from the channel's user-list
+        last = NULL;
+        for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
+            if(cchanuser == chanuser) {
+                chanuser->chan->usercount--;
+                if(last) 
+                    last->next_user = chanuser->next_user;
+                else
+                    chanuser->chan->user = chanuser->next_user;
+                break;
+            } else
+                last = cchanuser;
+        }
+        chanuser->next_user = NULL;
+    }
+    if(remove_from_channellist) {
+        //remove it from the user's channel-list
+        last = NULL;
+        for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
+            if(cchanuser == chanuser) {
+                if(last) 
+                    last->next_chan = chanuser->next_chan;
+                else
+                    chanuser->user->channel = chanuser->next_chan;
+                break;
+            } else
+                last = cchanuser;
+        }
+        chanuser->next_chan = NULL;
+    }
+    
+    if(freeChanUser)
+        free(chanuser);
+}
+