#!/usr/bin/env python

import sys
import cPickle
import os
import Openbmc
import gobject
import dbus
import dbus.service
import dbus.mainloop.glib


SAVE_PATH = 'data/'

def loadProperties(bus,bus_name,obj_path,properties):
	## Load properties from system config
	obj = bus.get_object(bus_name,obj_path)
	dbus_properties = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
	for prop_interface in properties.keys():
		print "Intf: "+prop_interface
		for prop in properties[prop_interface]:
			tmp_val = dbus_properties.Get(prop_interface,prop)
			dbus_prop = Openbmc.DbusProperty(prop,tmp_val)
			value = properties[prop_interface][prop]
			dbus_prop.changeValue(value)
			dbus_properties.Set(prop_interface,prop,dbus_prop.getValue())
		
		## if save file exists, overlay properties from file
		directory = obj_path.replace('/','.')
		directory = SAVE_PATH+directory.lstrip('.')
		filename = directory+"/"+prop_interface
		if (os.path.isfile(filename) == False):
			## not an error	
			print "No cache available for: "+filename
		else:
			try:
				print "Loading from disk: "+obj_path
				output = open(filename, 'rb')
				dbus_props = cPickle.load(output)
				output.close()
				save_properties = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
				for dbus_prop in dbus_props:
					save_properties.Set(prop_interface,dbus_prop.getName(),dbus_prop.getValue())
		
			except Exception as e:
				## TODO: Error handling
				print "Error loadFru: "+str(e)

	return None

def saveProperties(bus,bus_name,obj_path,interface_name,cache,properties):
	obj = bus.get_object(bus_name,obj_path)
	prop_intf = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')

	for prop in properties.keys():
		print "Saving properties: "+prop
		prop_intf.Set(interface_name,prop,properties[prop])


	dbus_props = []
	if (cache):
		print "Caching: "+obj_path
		all_properties = prop_intf.GetAll(interface_name)
		for prop in all_properties.keys():
			dbus_prop = Openbmc.DbusProperty(prop,all_properties[prop])
			dbus_props.append(dbus_prop)
		
		try:
			directory = obj_path.replace('/','.')
			directory = SAVE_PATH+directory.lstrip('.')
			filename = directory+"/"+interface_name	
			if not os.path.exists(directory):
   				os.makedirs(directory)

			output = open(filename, 'wb')
			cPickle.dump(dbus_props,output)
			output.close()	
		except Exception as e:
			## TODO: error handling
			print str(e)
		
	return None


