#!/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("memorycorrupt.png")
		text_memory = TileHelpers.create_label("<b>Defekter Arbeitsspeicher gefunden!</b>\n\nBeim Start des Computers wurden defekte Bereiche im Arbeitsspeicher (RAM) entdeckt und bis zum Neustart des Computers deaktiviert. Da möglicherweise weitere RAM-Bereiche betroffen sind, ist die Systemstabilität gefährdet. Sie sollten den defekten Arbeitsspeicher demnächst ersetzen. Wie das geht, lesen Sie in der Anleitung \"Arbeitsspeicherwechsel.pdf\" auf DVD.", 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? == true 
			hibernated = true if d.hibernated? == true
		}
		imsm = true if @simulate.include?("imsm")
		hibernated = true if @simulate.include?("hiberfil")  
		
		icon_imsm =  Gtk::EventBox.new.add  Gtk::Image.new("imsmactive.png")
		text_imsm = TileHelpers.create_label("<b>Intel Smart Cache erkannt!</b>\n\nIhre SSD-Festplatte wird zwecks Optimierung der PC-Geschwindigkeit als Zwischenspeicher verwendet (SSD-Caching). Sie sollten mit dieser Notfall-DVD keine Schreiboperationen auf der Festplatte durchführen, etwa die Virenprüfung nutzen oder Daten auf dem Laufwerk sichern! Alternativ können Sie SSD-Caching im BIOS oder im Rapid-Storage-Technologie-Treiber (RST) unter Windows abschalten. Konsultieren Sie dazu das PC-Handbuch oder den Kundendienst des PC-Herstellers. <b>Achtung:</b> Diese Meldung wird auch bei deaktiviertem SSD-Caching angezeigt.", 450)
		
		icon_hiberfil = Gtk::EventBox.new.add  Gtk::Image.new("hyperboot.png")
		text_hiberfil = TileHelpers.create_label("<b>Windows wurde nicht heruntergefahren</b>\n\nAchtung: Windows wurde beim letzten Mal nicht vollständig heruntergefahren. Um Datenverlust zu vermeiden, sollten Sie das Betriebssystem zuerst vollständig beenden. Starten Sie dazu Windows, und klicken Sie doppelt auf die Datei <b>\"shutdown.bat\"</b> im Hauptverzeichnis der Notfall-DVD beziehungsweise des Notfall-Sticks. Erscheint diese Meldung beim nächsten Start der Notfall-DVD erneut, klicken Sie auf die Kachel, um die Windows-Ruhezustandsdatei <b> \"hiberfil.sys\" zu löschen</b>.", 450)
		icon_hiberfil.signal_connect("button-release-event") { |x,y| 
			remove_hiberfil(auxdrives) 
		}
		if hibernated == 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("Erscheint die Meldung \"Windows wurde nicht heruntergefahren\" trotz Ausführen der Datei \"shutdown.bat\" weiterhin, bleibt nur die Möglichkeit, die Windows-Ruhezustandsdatei \"hiberfil.sys\" auf der Festplatte zu entfernen.\n\n <b>Achtung:</b> Dadurch gehen möglicherweise ungesicherte Dateien verloren. Klicken Sie auf OK, um die Datei \"hiberfil.sys\" zu entfernen.", "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