############################################################################
#    Copyright (C) 2005 by Ian Monroe                                      #
#    ian@monroe.nu                                                         #
#                                                                          #
#    This program is free software; you can redistribute it and#or modify  #
#    it under the terms of the GNU General Public License as published by  #
#    the Free Software Foundation; either version 2 of the License, or     #
#    (at your option) any later version.                                   #
#                                                                          #
#    This program is distributed in the hope that it will be useful,       #
#    but WITHOUT ANY WARRANTY; without even the implied warranty of        #
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         #
#    GNU General Public License for more details.                          #
#                                                                          #
#    You should have received a copy of the GNU General Public License     #
#    along with this program; if not, write to the                         #
#    Free Software Foundation, Inc.,                                       #
#    51 Franklin Steet, Fifth Floor, Boston, MA  02110-1301, USA.             #
############################################################################

class QtIoListener < Qt::Object
	Q_SLOTS 'dataRecieved()'
	def initialize(app, iostream, lineHandler)
		super(app)
		@lineHandler = lineHandler
		@iostream = iostream
		streamListener = Qt::SocketNotifier.new(iostream.fileno, Qt::SocketNotifier.Read, app, 'stdinWatcher')
		Qt::Object.connect(streamListener, SIGNAL("activated(int)"), self, SLOT("dataRecieved()") )

	end
	def dataRecieved
		line = @iostream.gets
		line.chomp!
		@lineHandler.call(line)
	end
end

class AmaroKLib
#Either way, AmaroKLib depends of QtRuby by virtue of using the QtIoListener.
#Making a non-Qt alternative to QtIoListener shouldn't be too difficult,
#you'll just have to get your hands dirty with threads and then modify the definition of
#@listen in this class. And send me the class for inclusion in this template. :)
   def initialize(app, commandSlots)
		@listener = QtIoListener.new(app, STDIN, Proc.new { |line|
		#puts "Recieved command #{line}"
		case line
			when 'configure' then commandSlots.configure
			when 'trackChange' then commandSlots.trackChange
			when 'engineStateChange: empty' then commandSlots.stateChange_empty
			when 'engineStateChange: idle' then commandSlots.stateChange_idle
			when 'engineStateChange: paused' then commandSlots.stateChange_paused
			when 'engineStateChange: playing' then commandSlots.stateChange_playing
			#not a command given by Amarok, helpful when debugging
			when 'exit' then commandSlots.exit
			else $stderr.print "Illegal command: #{line}"
		end	
} )
   end
end

#make your own child class of AmaroKSlots to send to AmaroKLib.
class AmaroKSlots
	def configure
		nil
	end
	def stateChange_empty
		nil
	end	
	def stateChange_idle
		nil
	end
	def stateChange_paused
		nil
	end
	def stateChange_playing
		nil
	end
	def trackChange
		nil
	end
	#not a command given by Amarok, used when debugging
	def exit
		nil
	end
end
