Newer
Older
Import / projects / LGN-IP3870 / t / orig / rss.py
import feedparser, time
import os
import status
import atexit
import time
import threading
import config
import utils
import signal
import runtime
import rss_data_get


#class RSS_reader(threading.Thread):


class RSS_reader:
	def __init__(self):
		self.pid = 0
		self.timer = None
#		self.rss_feed_site = ''				# rss feeding site 
#		self.rss_update_time =  0		# time for rss feed update
#		self.d =None

#	def run(self):
#		print 'Rss read Thread started'
#		self.rss_read()

	def rss_file_get(self):
		if self.pid != 0 :
			ret = self.rss_child_process_check()
			if ret == 256 :
				print 'keck!!!'
			print 'rss_file_get return ret = ', ret
			return ret
		try :
			self.pid = os.fork()
		except :
			print 'rss fork error'
			return 'False'
		if self.pid != 0 : # parent
			print 'parent process gogo!!'
			print 'parent pid', os.getpid()
			print 'child pid', self.pid	
			return 'True'
		
		else :	#child process
		
			print 'child process'
			print 'child pid', os.getpid()
			print 'parent pid', os.getppid()
#			if self.rss_file_check() == True:
#				os.system('rm -f %s'%config.rss_file)
#				os.system('sync')
#				os.system('sync')
#				os.system('sync')		
			cmd = 'python %s &'%(config.rss_file_get_py_file)
#			cmd = 'python %s'%(config.rss_file_get_py_file)
			cmds = cmd.strip()
			cmd = cmds.split(' ')
			print 'cmd=', cmd
			os.execlp('python', *cmd)

			'''
			cmd = 'wget2 %s -O %s -T 10 -t 1'%(config.rss_site, config.rss_file)
			cmds = cmd.strip()
			cmd = cmds.split(' ')
			print 'cmd=', cmd
			os.execlp('wget2', *cmd)
			'''
				
	def rss_file_get_exit(self):
		if self.timer != None :
			self.timer = None
		print 'die child'	
		os._exit(0)
			
	def rss_file_get_stop(self):
		try :
			if self.pid == 0 :
				return True
			print 'rss pid=', self.pid
			#os.kill(fileget_pid, signal.SIGKILL)
			os.system('kill -9 %d'%self.pid)
			os.waitpid(self.pid, 0)
			self.pid = 0
		except :
			print 'error kill rss file get process'
			pass
			

	def get_proc_status(self):
		try:
			strs = open('/proc/%d/stat'%self.pid).read().split(' ')
			#print 'GET PROC_STATUS', strs			
			return strs[2]		
		except:
			print 'exception : get_proc_status', self.pid  # the process finished or file name error
			return 'E'						
	
	def rss_child_process_check(self) :
		print 'rss_process_file_check pid =', self.pid
		print 'parent pid', os.getpid()
		print 'child pid', self.pid		
		
		if self.pid != 0 :
			print 'Process still alive'
			print 'wait pid!!!!!!'
			wpid, ret = os.waitpid(self.pid, os.WNOHANG)
			print 'wait pid = ', wpid
			print 'wait pid ret = ', ret 
			if self.pid != wpid :
				if ret == 256 :
					print 'keck!!!'
					return ret
				elif wpid == 0 and ret == 0:
					procstat = self.get_proc_status()
					if procstat == 'S' or procstat == 'Z' :
						return ret
					elif procstat == 'E' :
						print 'e wait pid = ', wpid
						print 'e self.pid = ', self.pid					
						print 'e wait pid ret = ', ret
						self.pid = 0
						return 'False'
				else :
					return ret
					
			else :	
				if ret != 0 :
					self.pid = 0
					print 'wpid= %d, self pid = %d, ret=%d'%(wpid, self.pid, ret)
					return 'False'
				os.system('sync')		
				os.system('sync')
				os.system('sync')	
				self.pid = 0
				return 'True'			
		else :
			return 'True'

	def rss_file_check(self):
		if not os.access(config.rss_file, os.R_OK):
			print 'rss file check, no file!!!'
			return False
		return True	
	def rss_read(self):
		try :
			
			r = file(config.rss_file , 'r').read()
			d =eval(r)

			'''
			d = feedparser.parse(config.rss_file)
			print 'sort'
			self.rss_quick_sort(d.entries)
			print 'rss_test'
			print d.entries[0].title
			'''


#			print 'sort result!!!'
#			for i in range(len(d.entries)-1) :
#				print d.entries[i].title
#				print d.entries[i].date
#				print d.entries[i].date_parsed
#				print 'sort result finish!!!'

		except :
			print 'rss_read error'
			d = None
			pass
		return d		

# quick sort
	def rss_quick_sort(self, list2):
		self.rss_quick_sort_r(list2, 0, len(list2) - 1)		

# quick_sort_r, recursive (used by quick_sort)
	def rss_quick_sort_r(self, list2 , first, last):
		
		if last > first:
			pivot = self.rss_partition(list2, first, last)
			self.rss_quick_sort_r(list2, first, pivot - 1)
			self.rss_quick_sort_r(list2, pivot + 1, last) 

# partition (used by quick_sort_r)
	def rss_partition(self, list2, first, last):
		sred = (first + last)/2
		if time.mktime(list2[first].date_parsed) < time.mktime(list2 [sred].date_parsed):
			list2[first], list2[sred] = list2[sred], list2[first]  # swap    
		if time.mktime(list2[first].date_parsed) < time.mktime(list2 [last].date_parsed):
			list2[first], list2[last] = list2[last], list2[first]  # swap    
		if time.mktime(list2[sred].date_parsed) < time.mktime(list2[last].date_parsed):        
			list2[sred], list2[last] = list2[last], list2[sred]    # swap    
		list2 [sred], list2 [first] = list2[first], list2[sred]    # swap    
		pivot = first    
		i = first + 1    
		j = last     

		while True:
			while i <= last and time.mktime(list2[i].date_parsed) >= time.mktime(list2[pivot].date_parsed):
				i += 1        
			while j >= first and time.mktime(list2[j].date_parsed) < time.mktime(list2[pivot].date_parsed):
				j -= 1        
			if i >= j:            
				break        
			else:
				list2[i], list2[j] = list2[j], list2[i]  # swap    
		list2[j], list2[pivot] = list2[pivot], list2[j]  # swap    

		return j	



	def destroy(self):
		#RSS
		#print 'idle destroy'
		self.timer = None

class RSS_manager:
	def __init__(self):
		#rss_test MMW 2008.12.09
		self.rss_feed = None
		self.rss_count = 0
		self.rss_num = 0
		self.timer = None					# 1 sec( wait pid), 10sec (wait for data get from web), 60sec( wait network connection) 
		self.rss_data_update_timer = None	# 3 sec (every 3 sec send data to screen)
		self.periodic_update_timer = None	# 15 min, 60 min, 24 hour
		self.Rss_network_check()
	

	def Update_timer_Set(self):
		if self.periodic_update_timer != None :
			self.periodic_update_timer = None
		print 'periodic RSS update timer  set!!!!!!!!!!!!!!!!!!!!'
		self.periodic_update_timer = utils.Timer(config.rss_feed_update_time ,\
			self.start_update_Rss)

	def start_update_Rss(self):
		print 'RSS update called by periodic RSS update timer!!!!!!!!!!!!!!!!!!!!'
		status.Rss_feed_data_get = True
		self.Rss_network_check()				

		
	def Rss_network_check(self ):
		if self.timer != None :
			self.timer = None
			
		if status.network_status != status.NetOk :
			self.timer = utils.Timer(config.RSS_network_ok_wait_time,\
			self.Rss_network_check)
			self.rss_feed == None
		else :			
			if self.rss_feed == None or status.Rss_feed_data_get == True:
#				self.rss_feed = None
#				self.rss_count = 0
				self.Rss_feed_file_get()
			self.update_RSS_data()

	def Rss_feed_file_get(self):
		if self.timer != None :
			self.timer = None
		ret = RSS_Reader.rss_file_get()
		if ret == 'True':
			#10 sec timer run to check file
			self.timer = utils.Timer(config.RSS_data_check_time,\
				self.RSS_feed_file_check)
		elif ret == 'False':
			#fork error
			self.timer = utils.Timer(config.RSS_fork_error_update_time,\
				self.Rss_feed_file_get)
		else :
			#1 sec timer to wait pid
			self.timer = utils.Timer(config.RSS_wait_pid_time,\
				self.Rss_feed_file_get)
			print 'Rss_feed_file_get pid ret = 256!!!!!!!!!'

	def RSS_feed_file_check(self):
		if self.timer != None :
			self.timer = None
		ret = RSS_Reader.rss_child_process_check()	
		if ret == 'True' :
			if RSS_Reader.rss_file_check() == True:
				# parse data from /tmp/rss.xml
				print 'RSS file get success!!!'
				temp_rss_feed = RSS_Reader.rss_read() 
				if temp_rss_feed == None :
					print 'feed data None!!!'
					self.Rss_network_check()
				else :
					if self.rss_data_update_timer != None :
						self.rss_data_update_timer = None				
					#show rss data

					self.rss_feed = temp_rss_feed

					print 'rss ###################', self.rss_feed['entries'][0]['title']
					self.rss_num =  len(self.rss_feed['entries'])
					print 'how many entries this rss got', self.rss_num
					print '*****',  self.rss_feed['entries'][self.rss_num-1]['title']
					self.rss_count = 0
					self.update_RSS_data()
					status.Rss_feed_data_get = False
					self.Update_timer_Set()
			else :
				#There is No file in /tmp/rss.xml. so, start from network check 
				self.Rss_network_check(False)
		elif ret == 'False' :
			self.timer = utils.Timer(config.RSS_wait_pid_time,\
				self.Rss_network_check)
		elif ret == 512 :		# nothing to update python exit(2)
			#nothing to feed
			print 'python exit 2, nothing to update from rss site'
			status.Rss_feed_data_get = False
			self.Update_timer_Set()
		else :	# child process is alive, so wait
			# pid wait error do RSS feed file check
			self.timer = utils.Timer(config.RSS_wait_pid_time,\
				self.RSS_feed_file_check)


				

	def update_RSS_data(self):
#		print '### IdleStage.update_RSS_data() called'
		if self.rss_data_update_timer != None :
			self.rss_data_update_timer = None

		if runtime.manager.stage.get_name() != 'idle' :
			print 'Not idle, Nothing to update idle screen'
#			self.rss_data_update_timer = None
		elif runtime.myannapp != None and runtime.myannapp.is_running() :
			print 'Browser is runnig, so, Nothing to update idle screen'
		else :	
			if self.rss_feed == None :
				runtime.manager.stage.ui.update_RSS_data('Wait for RSS data')
			else :
				runtime.manager.stage.ui.update_RSS_data(self.rss_feed['entries'][self.rss_count]['title'])	
				self.rss_count = self.rss_count + 1
				if self.rss_count == self.rss_num :
					self.rss_count = 0
#			if self.timer != None :
#				self.timer = None
#			if self.rss_data_update_timer != None :
#				self.rss_data_update_timer = None
		self.rss_data_update_timer = utils.Timer(config.RSS_data_update_time,\
		self.update_RSS_data)				

	def destroy(self):
		self.timer = None
		self.rss_data_update_timer = None
		self.periodic_update_timer = None
	
RSS_Reader = RSS_reader()