diff --git a/source/dnetd/dchannel.d b/source/dnetd/dchannel.d index 981784b..bc40249 100644 --- a/source/dnetd/dchannel.d +++ b/source/dnetd/dchannel.d @@ -46,10 +46,12 @@ public class DChannel public bool join(DConnection client) { /* Send a message stating the user has joined (TODO: This should be done later, possibly, how defensive should we program) */ - broadcastJoin(client); - + //broadcastJoin(client); + /* Lock the members list */ + writeln("join: mutex lock (about to call)"); memberLock.lock(); + writeln("join: mutex lock (completed)"); /** * Don't allow the user to join a channel he @@ -78,9 +80,10 @@ public class DChannel members ~= client; } - /* Unlock the members list */ + writeln("join: mutex unlock (about to call)"); memberLock.unlock(); + writeln("join: mutex unlock (completed)"); return isPresent; } @@ -156,7 +159,7 @@ public class DChannel memberLock.unlock(); /* Send broadcast leave message */ - broadcastLeave(client); + //broadcastLeave(client); } /** diff --git a/source/dnetd/dconnection.d b/source/dnetd/dconnection.d index f812eec..fbea882 100644 --- a/source/dnetd/dconnection.d +++ b/source/dnetd/dconnection.d @@ -109,6 +109,7 @@ public class DConnection : Thread * * (Does decoding for bformat too) */ + writeln("waiting"); bool status = receiveMessage(socket, receivedBytes); /* TODO: Check status */ @@ -180,15 +181,19 @@ public class DConnection : Thread /* Create the tagged message */ DataMessage message = new DataMessage(tag, data); + writeln("writeSocket: mutex lock"); /* Lock the write mutex */ writeLock.lock(); /* Send the message */ + writeln("writeSocket: Data: "~to!(string)(data)~" Tag: "~to!(string)(tag)); status = sendMessage(socket, message.encode()); /* Unlock the write mutex */ writeLock.unlock(); + writeln("writeSocket: mutex unlock"); + return status; } @@ -246,6 +251,7 @@ public class DConnection : Thread * between commands and async notifications */ long tag = message.tag; + writeln("tag:", tag); /* The reply */ byte[] reply; @@ -302,6 +308,8 @@ public class DConnection : Thread string channelList = cast(string)message.data[1..message.data.length]; string[] channels = split(channelList, ","); + writeln("channels, ", channels); + /** * Loop through each channel, check if it * exists, if so join it, else create it @@ -310,17 +318,19 @@ public class DConnection : Thread bool isPresentInfo = false; foreach(string channelName; channels) { - /* Attempt to find the channel */ - DChannel channel = server.getChannelByName(channelName); + // /* Attempt to find the channel */ + // DChannel channel = server.getChannelByName(channelName); +// + // /* Create the channel if it doesn't exist */ + // if(channel is null) + // { + // /* TODO: Thread safety for name choice */ + // channel = new DChannel(channelName); + // + // server.addChannel(this, channel); + // } + DChannel channel = server.getChannel(this, channelName); - /* Create the channel if it doesn't exist */ - if(channel is null) - { - /* TODO: Thread safety for name choice */ - channel = new DChannel(channelName); - - server.addChannel(this, channel); - } /* Join the channel */ isPresentInfo = channel.join(this); diff --git a/source/dnetd/dserver.d b/source/dnetd/dserver.d index 0bc62c9..2a98f9e 100644 --- a/source/dnetd/dserver.d +++ b/source/dnetd/dserver.d @@ -125,14 +125,14 @@ public class DServer : Thread public void addChannel(DConnection causer, DChannel channel) { /* Lock the channels list */ - channelLock.lock(); + // channelLock.lock(); channels ~= channel; /* TODO: Use causer */ /* Unlock the channels list */ - channelLock.unlock(); + // channelLock.unlock(); } public void addConnection(DConnection connection) @@ -174,6 +174,41 @@ public class DServer : Thread connectionLock.unlock(); } + /* TODO: neew method */ + public DChannel getChannel(DConnection causer, string channelName) + { + DChannel channel = null; + + channelLock.lock(); + + + foreach(DChannel currentChannel; channels) + { + if(cmp(currentChannel.getName(), channelName) == 0) + { + channel = currentChannel; + break; + } + } + + if(channel) + { + + } + else + { + channel = new DChannel(channelName); + + this.addChannel(causer, channel); + } + + channelLock.unlock(); + + + return channel; + } + + public DChannel getChannelByName(string channelName) { /* The channel */