<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>spec/chatjour/application_spec.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1 +1 @@
-require 'chatjour/application'
\ No newline at end of file
+require File.dirname(__FILE__) + '/chatjour/application'
\ No newline at end of file</diff>
      <filename>lib/chatjour.rb</filename>
    </modified>
    <modified>
      <diff>@@ -0,0 +1,50 @@
+require 'dnssd'
+require 'etc'
+require 'ipaddr'
+
+module Chatjour
+  class Application
+    BONJOUR_PORT = 5001
+    MULTICAST_ADDRESS = &quot;225.4.5.6&quot;
+    MULTICAST_PORT = 5000
+    MULTICAST_INTERFACE = &quot;0.0.0.0&quot;
+
+    def say(msg)
+      begin
+        socket = UDPSocket.open
+        socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_TTL, [1].pack('i'))
+        socket.send(msg, 0, MULTICAST_ADDRESS, MULTICAST_PORT)
+      ensure
+        socket.close 
+      end
+    end
+    
+    def receive
+      messages = []
+      loop do
+        messages &lt;&lt; @incoming_socket.recvfrom_nonblock(1024).first
+      end
+      messages
+    rescue Errno::EAGAIN
+      messages
+    end
+  
+    def start
+      broadcast
+      listen_for_incoming_messages
+    end
+    
+  private
+    def broadcast
+      text_record = DNSSD::TextRecord.new
+      @service = DNSSD.register(Etc.getlogin, &quot;_chat._tcp&quot;, 'local', BONJOUR_PORT, text_record.encode) do |resolve_reply|; end
+    end
+    
+    def listen_for_incoming_messages
+      @incoming_socket = UDPSocket.new
+      ip = IPAddr.new(MULTICAST_ADDRESS).hton + IPAddr.new(MULTICAST_INTERFACE).hton
+      @incoming_socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ip)
+      @incoming_socket.bind(Socket::INADDR_ANY, MULTICAST_PORT)
+    end
+  end
+end
\ No newline at end of file</diff>
      <filename>lib/chatjour/application.rb</filename>
    </modified>
    <modified>
      <diff>@@ -0,0 +1,3 @@
+require 'rubygems'
+require 'spec'
+require File.expand_path(File.dirname(__FILE__) + '/../lib/chatjour')</diff>
      <filename>spec/spec_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,11 +9,11 @@ Story: Chatjour
     And Fred starts up Chatjour
     And Mary starts up Chatjour
     When Bob asks for a list of users
-    Then Bob should see a list of users registered to talk over Chatjour
+    Then Bob should see that Mary and Fred are registered to talk over Chatjour
     When Fred asks for a list of users
-    Then Fred should see a list of users registered to talk over Chatjour
+    Then Fred should see that Mary and Bob are registered to talk over Chatjour
     When Mary asks for a list of users
-    Then Mary should see a list of users registered to talk over Chatjour    
+    Then Mary should see that Fred and Bob are registered to talk over Chatjour
   
   Scenario: Sending a message
     Given Bob starts up Chatjour</diff>
      <filename>stories/chatjour/chatjour_story</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,9 @@
 require 'rubygems'
 require 'spec'
 require 'spec/story'
+require 'stringio'
+
+require File.expand_path(File.dirname(__FILE__) + '/../lib/chatjour')
 
 Dir[File.expand_path(File.dirname(__FILE__) + '/steps/*.rb')].each do |f|
   require f</diff>
      <filename>stories/helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,28 @@
 steps_for :chatjour do
+  Given &quot;$user starts up Chatjour&quot; do |user|
+    @portno ||= 25800
+    @users ||= {}
+    @users[user] = {
+      :name =&gt; user,
+      :input =&gt; StringIO.new, 
+      :output =&gt; StringIO.new,
+      :public_port =&gt; @portno+=1,
+      :private_port =&gt; @portno+=1
+    }
+    @users[user][:app] = Chatjour::Application.new(@users[user])
+    @users[user][:app].run
+  end
   
+  
+  When &quot;$user asks for a list of users&quot; do |user|
+    @users[user][:input].puts &quot;users&quot;
+  end
+  
+  
+  Then &quot;$current_user should see that $user1 and $user2 are registered to talk over Chatjour&quot; do |current_user, user1, user2|
+    @users[current_user][:output].string.should =~ /#{user1}/m
+    @users[current_user][:output].string.should =~ /#{user2}/m
+    @users[current_user][:output].string.replace(&quot;&quot;)
+  end
+
 end
\ No newline at end of file</diff>
      <filename>stories/steps/chatjour_steps.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b08156c9bf7d32df69f0fd37ba36a40635ff8f15</id>
    </parent>
  </parents>
  <author>
    <name>Zach Dennis</name>
    <email>zach.dennis@gmail.com</email>
  </author>
  <url>http://github.com/mvanholstyn/chatjour/commit/043b05ac3eb9a55c69ab6e47acf985aef3362022</url>
  <id>043b05ac3eb9a55c69ab6e47acf985aef3362022</id>
  <committed-date>2008-08-15T23:38:01-07:00</committed-date>
  <authored-date>2008-08-15T23:38:01-07:00</authored-date>
  <message>started implementing Chatjour::Application, which registers a DNSSD service and receives/sends multicast messages</message>
  <tree>58afbb9bef3067ee2658d20cfdaf0c69ab9dcfc0</tree>
  <committer>
    <name>Zach Dennis</name>
    <email>zach.dennis@gmail.com</email>
  </committer>
</commit>
