--- /usr/bin/ardour2-session_exchange.py	2009-04-19 19:45:31.000000000 +0200
+++ exchange.py	2009-05-27 21:25:43.000000000 +0200
@@ -3,7 +3,7 @@
 # Session Exchange
 # By Taybin Rutkin
 # Copyright 2004, under the GPL
-
+# Modified by Martin Raspaud, 2009
 VERSION='0.1.1'
 
 #twisted libraries
@@ -61,6 +61,16 @@
 	dialog.run()
 	dialog.destroy()
 
+def session_name_from_path(session_path): 
+	if session_path[len(session_path)-1] == '/':
+		return session_path[session_path.rfind('/', 0, len(session_path)-2)+1: -1]
+	else:
+		return session_path[session_path.rfind('/', 0, len(session_path)-2)+1: ]
+
+
+
+# Generic data object for the session exchange
+# contains sessions, collabs, and snapshots
 class Data(object):
 	def delete_snap(self, session, collab, snap):
 		sessions = self._data['sessions']
@@ -100,10 +110,13 @@
 		
 		g_display.update_collab_view()
 	
+
+	# adds a session to the list	
 	def add_session(self, session_path):
 		sessions = self._data['sessions']
 		
-		session_name = session_path[session_path.rfind('/', 0, len(session_path)-2)+1: -1]
+		session_name = session_name_from_path(session_path)
+                #session_path[session_path.rfind('/', 0, len(session_path)-2)+1: -1]
 		sessions[session_name] = {}
 		sessions[session_name]['path'] = session_path 
 		sessions[session_name]['collabs'] = {}
@@ -131,14 +144,16 @@
 	def create_session(self, session_path):
 		try:
 			os.mkdir(session_path)
-			os.mkdir(session_path+"/sounds")
+			session_name = session_name_from_path(session_path) 
+			#session_path[session_path.rfind('/', 0, len(session_path)-2)+1: ]
+			audiofiles_path = session_path+'/interchange/'+session_name+'/audiofiles'
+			os.makedirs(audiofiles_path)
 		except OSError:
 			raise_error("Could not create session directory", g_display.window)
 			return
 		
 		sessions = self._data['sessions']
 		
-		session_name = session_path[session_path.rfind('/', 0, len(session_path)-2)+1: ]
 		sessions[session_name] = {}
 		sessions[session_name]['path'] = session_path
 		sessions[session_name]['collabs'] = {}
@@ -209,9 +224,11 @@
 				print file[0:-7]
 		return snaps
 	
-	def _scan_sounds(self, session):
+
+	def _scan_sounds(self, session_path):
 		sounds = []
-		files = os.listdir(session+'/sounds')
+		session_name = session_name_from_path(session_path)
+		files = os.listdir(session_path+'/interchange/'+session_name+'/audiofiles')
 		pattern = re.compile(r'\.peak$')
 		for file in files:
 			if not pattern.search(file):
@@ -237,7 +254,8 @@
 		self.transform = transform
 		
 		self.consumer.registerProducer(self, False)
-		self.deferred = defer.Deferred()
+		if not self.deferred:
+			self.deferred = twisted.internet.defer.Deferred()
 		return self.deferred
 	
 	def resumeProducing(self):
@@ -251,6 +269,8 @@
 		self.lastSent = chunk[-1]
 		self.file = None
 		self.consumer.unregisterProducer()
+		if not self.deferred:
+			self.deferred = twisted.internet.defer.Deferred()
 		self.deferred.callback(self.lastSent)
 		self.deferred = None
 
@@ -271,8 +291,7 @@
 		print "server: connection made"
 	
 	def lineReceived(self, data):
-		print "server: ", data
-		
+		print "server: '"+ data +"'"
 		if self.state == "SESSION":
 			if g_data.get_sessions().count(data):
 				self.session_name = data
@@ -283,7 +302,6 @@
 		elif self.state == "SNAPSHOT":
 			if g_data.get_snaps(self.session_name, g_data.get_user()).count(data):
 				filename = g_data.get_session_path(self.session_name)+data+'.ardour'
-				print filename
 				self.sendLine(str(os.stat(filename).st_size))
 				self.sendLine("OK")
 				self.file = open(filename, 'r')
@@ -294,8 +312,8 @@
 				self.error("snapshot: " + data + " doesn't exist on server")
 		elif self.state == "SOUNDFILE" or self.state == "SOUNDFILE_HEADER":
 			if g_data.get_sounds(self.session_name, g_data.get_user()).count(data):
-				filename = g_data.get_session_path(self.session_name)+"/sounds/"+data
-				print filename
+				#filename = g_data.get_session_path(self.session_name)+"/sounds/"+data
+				filename = g_data.get_session_path(self.session_name)+"/interchange/"+self.session_name+"/audiofiles/"+data
 				if self.state == "SOUNDFILE":
 					self.sendLine(str(os.stat(filename).st_size))
 				else:	#SOUNDFILE_HEADER
@@ -313,12 +331,14 @@
 					file_sender = FileSenderLimited()
 					cb = file_sender.beginFileTransfer(self.file, self.transport, header_size)
 				cb.addCallback(self.file_done)
+			elif data == "SOUNDFILE_SIZE":
+				self.state = "SOUNDFILE_SIZE"
 			else:
-				self.error("soundfile: " + data + "doesn't exist on server")
+				self.error("soundfile: " + data + " doesn't exist on server")
 		elif self.state == "SOUNDFILE_SIZE":
 			if g_data.get_sounds(self.session_name, g_data.get_user()).count(data):
-				filename = g_data.get_session_path(self.session_name)+"/sounds/"+data
-				print filename
+				#filename = g_data.get_session_path(self.session_name)+"/sounds/"+data
+				filename = g_data.get_session_path(self.session_name)+"/interchange/"+self.session_name+"/audiofiles/"+data
 				self.sendLine(str(os.stat(filename).st_size))
 				self.state = "IDLE"
 		elif data == "SESSION":
@@ -335,9 +355,7 @@
 			self.state = "SOUNDFILE"
 		elif data == "SOUNDFILE_HEADER":
 			self.state = "SOUNDFILE_HEADER"
-		elif data == "SOUNDFILE_SIZE":
-			self.state = "SOUNDFILE_SIZE"
-	
+
 	def file_done(self, data):
 		print "server: file done"
 		self.file.close()
@@ -406,6 +424,7 @@
 			self.state = "ERROR"
 		elif data == "OK":
 			if self.state == "SESSION":
+				print "snap name ='"+self.snap_name+"'"
 				if self.snap_name:
 					self.state = "SNAPSHOT"
 					self.sendLine("SNAPSHOT")
@@ -422,7 +441,8 @@
 				self.received = 0
 			elif self.state == "SOUNDFILE" or self.state == "SOUNDFILE_HEADER":
 				self.setRawMode()
-				self.filename = g_data.get_session_path(self.session_name)+'/sounds/'+self.sounds[self.sound_index]
+				#self.filename = g_data.get_session_path(self.session_name)+'/sounds/'+self.sounds[self.sound_index]
+				self.filename = g_data.get_session_path(self.session_name)+'/interchange/'+self.session_name+'/audiofiles/'+self.sounds[self.sound_index]
 				self.file = open(self.filename, 'w')
 				self.received = 0
 		elif self.state == "ERROR":
@@ -436,7 +456,8 @@
 		elif self.state == "SOUNDFILE_HEADER":
 			self.filesize = int(data)
 		elif self.state == "SOUNDFILE_SIZE":
-			append_empty_data(self.filename, int(data))
+			print "SOUNDFILE_SIZE = " + data
+			append_empty_data(self,self.filename, int(data))
 			self.sound_index += 1
 			if self.sound_index > len(self.sounds)-1:
 				self.transport.loseConnection()
@@ -459,6 +480,8 @@
 		self.snap_name = snap_name
 		self.debug_mode = debug_mode
 
+# GUI stuff
+
 class HelperWin(object):
 	def delete_me(self, window):
 		self = 0
@@ -574,6 +597,7 @@
 	def show_all(self):
 		self.window.show_all()
 
+
 class ArdourShareWindow(object):
 	def menuitem_cb(self, window, action, widget):
 		print self, window, action, widget
@@ -733,21 +757,21 @@
 		#need to hold a reference to the item_factory or the menubar will disappear.
 		self.item_factory = gtk.ItemFactory(gtk.MenuBar, '<main>', accel_group)
 		self.item_factory.create_items(menu_items, self.window)
-		main_box.pack_start(self.item_factory.get_widget('<main>'), gtk.FALSE)
+		main_box.pack_start(self.item_factory.get_widget('<main>'), False)
 		
 		pane1 = gtk.HPaned()
 		pane2 = gtk.HPaned()
-		pane1.pack2(pane2, gtk.TRUE, gtk.FALSE)
+		pane1.pack2(pane2, True, False)
 		
 		scroll1 = gtk.ScrolledWindow()
 		scroll1.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		pane1.pack1(scroll1, gtk.TRUE, gtk.FALSE)
+		pane1.pack1(scroll1, True, False)
 		scroll2 = gtk.ScrolledWindow()
 		scroll2.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		pane2.pack1(scroll2, gtk.TRUE, gtk.FALSE)
+		pane2.pack1(scroll2, True, False)
 		scroll3 = gtk.ScrolledWindow()
 		scroll3.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		pane2.pack2(scroll3, gtk.TRUE, gtk.FALSE)
+		pane2.pack2(scroll3, True, False)
 		
 		self.session_model = gtk.ListStore(gobject.TYPE_STRING)
 		view1 = gtk.TreeView(self.session_model)
@@ -775,10 +799,10 @@
 		self.snap_selection.connect("changed", self.cb_snap_selection_changed)
 		scroll3.add(view3)
 		
-		main_box.pack_start(pane1, gtk.TRUE, gtk.TRUE)
+		main_box.pack_start(pane1, True, True)
 		
 		self.status_bar = gtk.Statusbar()
-		main_box.pack_start(self.status_bar, gtk.FALSE)
+		main_box.pack_start(self.status_bar, False)
 		self._status_cid = self.status_bar.get_context_id('display')
 		self._status_mid = ''
 		
