#!/usr/bin/ruby
# encoding: utf-8

class CheckScreen
	def initialize(extlayers, simulate=Array.new)
		@layers = Array.new
		@fixed = Gtk::Fixed.new
		@show = false
		@simulate = simulate
		@tilesshown = 0 
		
		text4 = Gtk::Label.new
		text4.width_request = 250
		text4.wrap = true
		text4.set_markup("<span color='white'>Assistent abbrechen und Computer ausschalten.</span>")
		back = Gtk::EventBox.new.add Gtk::Image.new("cancel.png")
		text5 = Gtk::Label.new
		text5.width_request = 250
		text5.wrap = true
		text5.set_markup("<span color='white'>Trotz festgestellter Probleme weiter zum Assistenten.</span>")
		forw  = Gtk::EventBox.new.add Gtk::Image.new("forward.png")
		@fixed.put(forw, 853, 282)
		@fixed.put(text5, 605, 288)
		@fixed.put(back, 852, 332)
		@fixed.put(text4, 605, 338)
		
		forw.signal_connect('button-release-event') { |x, y|
			if y.button == 1 
				extlayers.each { |k,v|v.hide_all }
				extlayers["start"].show_all
			end
		}
		back.signal_connect('button-release-event') { |x, y|
			if y.button == 1 
				system("/usr/bin/shutdown-wrapper.sh") 
			end
		}
		
		check_memory 
		check_hiberfil_imsm
		
		extlayers["checkscreen"] = @fixed
		@layers[0] = @fixed
		@show = true if @tilesshown > 0 
	end
	
	attr_reader :layers, :show
	
	def check_memory
		badmem = false
		IO.popen("dmesg") { |l|
			while l.gets
				badmem = true if $_ =~ / bad mem addr /
			end
		}
		badmem = true if @simulate.include?("badmem")
		return false if badmem == false
		
		icon_memory = Gtk::EventBox.new.add  Gtk::Image.new("neutralwine.png")
		text_memory = TileHelpers.create_label("<b>Defekter Arbeitsspeicher gefunden!</b>\n\nBeim Systemstart wurde defekter Arbeitsspeicher gefunden und <b>für den Verlauf der Sitzung deaktiviert</b>. Da möglicherweise weitere beschädigte Speicherbereiche unentdeckt geblieben sind oder erst mit steigender Betriebstemperatur bemerkbar sind, ist die Systemstabilität gefährdet!", 450)
		icon_memory.signal_connect("button-release-event") { |x,y| }
		
		@fixed.put(icon_memory, 0, @tilesshown * 130)
		@fixed.put(text_memory, 130, @tilesshown * 130)
		@tilesshown += 1 
		
	end
	
	def check_hiberfil_imsm
		imsm = false
		hibernated = false
		auxdrives = Array.new
		Dir.entries("/sys/block").each { |l|
			auxdrives.push(MfsDiskDrive.new(l, false)) if l =~ /[a-z]$/ 
		}
		auxdrives.each { |d|
			imsm = true if d.imsm?
			hibernated = true if d.hibernated? 
		}
		imsm = true if @simulate.include?("imsm")
		hiberfil = true if @simulate.include?("hiberfil")  
		
		icon_imsm =  Gtk::EventBox.new.add  Gtk::Image.new("neutralorange.png")
		text_imsm = TileHelpers.create_label("<b>Intel Smart Cache erkannt!</b>\n\nDer Inhalt eines Laufwerkes weist auf die Verwendung als SSD-Cache hin. Aktiviertes SSD-Caching hat fast immer Datenverlust zur Folge! Bitte deaktivieren Sie das SSD-Caching im BIOS-Setup des Option-ROM oder im Rapid-Storage-Technolgie-Treiber (RST) unter Windows. <b>Achtung:</b> Diese Meldung wird auch bei deaktiviertem SSC-Caching angezeigt.", 450)
		
		icon_hiberfil = Gtk::EventBox.new.add  Gtk::Image.new("neutralred.png")
		text_hiberfil = TileHelpers.create_label("<b>Hyperboot aktiv!</b>\n\nWindows wurde nicht vollständig heruntergefahren. Verwenden Sie die Datei <b>\"shutdown.bat\"</b> auf DVD oder USB-Stick, um Windows vollständig herunterzufahren. Sollte diese Meldung nach dem Neustart erneut angezeigt werden, klicken Sie auf die Kachel, um die <b>Datei \"hiberfil.sys\" zu löschen</b>.", 450)
		icon_hiberfil.signal_connect("button-release-event") { |x,y| 
			remove_hiberfil(auxdrives) 
		}
		
		if hiberfil == true 
			@fixed.put(icon_hiberfil, 0, @tilesshown * 130)
			@fixed.put(text_hiberfil, 130, @tilesshown * 130)
			@tilesshown += 1 
		end
	
		if imsm == true
			@fixed.put(icon_imsm, 0, @tilesshown * 130)
			@fixed.put(text_imsm, 130, @tilesshown * 130)
			@tilesshown += 1 
		end
		
	end

	def remove_hiberfil(drives)
		continue = TileHelpers.yes_no_dialog("Wollen Sie die Datei \"hiberfil.sys\" auf allen NTFS-Laufwerken entfernen?\n\n <b>Achtung:</b> Die Entfernung der hiberfil.sys kann negative Folgen für die Systemstabilität haben. Klicken Sie nur dann auf OK, wenn andere Maßnahmen (Herunterfahren per shutdown.bat oder Abschalten der hiberfil.sys) fehlgeschlagen sind!", "hiberfil.sys entfernen?")
		return false unless continue == true
		drives.each { |d|
			d.partitions.each { |p|
				if p.fs =~ /ntfs/
					p.remove_hiberfil 
				end
			}
		}
		
	end

	
end