public ITransmissionHandler createTransmissionHandler(int type) { ITransmissionHandler createdHandler = null; switch (type) { case 3: createdHandler = new ConcreteTransmissionHandler(new HandleRemoveUserTransmissionStrategy()); break; case 4: createdHandler = new ConcreteTransmissionHandler(new HandleAddUserTransmissionStrategy()); break; case 5: createdHandler = new ConcreteTransmissionHandler(new HandleConversationTransmissionStrategy()); break; case 6: createdHandler = new ConcreteTransmissionHandler(new HandleMessageTransmissionStrategy()); break; default: createdHandler = null; break; } return(createdHandler); }
/// <summary> /// Executed by listener thread. /// </summary> private void listen() { try { int headerLength = BitConverter.GetBytes(4).Length + 1; byte[] headerBytes = new byte[headerLength]; ITransmissionHandlerCreator factory = new ConcreteTransmissionHandlerCreator(); //will create context for strategy pattern lock (this) { while (goOn) { int bytesReceived = 0; if (socket.Available == 0) { Thread.Sleep(100); continue; } while (bytesReceived < headerLength) { bytesReceived += socket.Receive(headerBytes, bytesReceived, headerLength - bytesReceived, SocketFlags.None); } byte type = headerBytes[0]; int messageLength = BitConverter.ToInt32(headerBytes, 1); byte[] inBuffer = socketFacade.receiveMessage(messageLength); if (type == (byte)1) //received boolean response { responseStatus = (inBuffer[0] == (byte)0) ? false : true; responseReady = true; Monitor.Pulse(this); Monitor.Wait(this); } else //received transmission of some sort { ITransmissionHandler transmissionHandler = factory.createTransmissionHandler(type); //create strategy pattern context transmissionHandler.handle(this, inBuffer); //thanks to the pattern we don't worry here what transmission exactly it is } } } } catch (Exception ex) { Console.WriteLine("Exception thrown in listener: {0}", ex.Message); Console.WriteLine(ex.StackTrace); } }