from pycel import * #pyPcCommon,pyMessageReceiver,fromid,getid,Reporter
import traceback

NoneParBlock = parblock({})

class ApricotPropertyClass(pyPcCommon,pyMessageReceiver):
    def __init__(self,oreg):
        pyPcCommon.__init__(self,oreg)
        pyMessageReceiver.__init__(self,oreg)
        self._callbacks = {}
        self._filtercallbacks = {}
        self.entity = None
    def AddCallback(self,mask,func):
        self.SubscribeMessage(mask,func)
        print "AddCallback deprecated, please use SubscribeMessage"
    def RemoveCallback(self,mask,func):
        self.UnsubscribeMessage(mask,func)
        print "RemoveCallback deprecated, please use UnsubscribeMessage"
    def SendMessage(self,mask,parblock=NoneParBlock):
        return self.entity.MessageChannel.SendMessage(mask, self, parblock)
    def SubscribeMessage(self,mask,func,filter=None):
        if filter:
            maskid = getid(mask)
            if not maskid in self._filtercallbacks:
                self._filtercallbacks[maskid] = {}
            self._filtercallbacks[maskid][filter] = func
        else:
            self._callbacks[getid(mask)] = func
        if self.entity:
            self.entity.MessageChannel.Subscribe(self,mask)
    def UnsubscribeMessage(self,mask,func):
        maskid = getid(mask)
        if maskid in self._callbacks:
            self._callbacks.pop(maskid)
        elif maskid in self._filtercallbacks:
            self._filtercallbacks.pop(maskid)
        if self.entity:
            self.entity.MessageChannel.Unsubscribe(self,mask)
    def SetEntity(self,entity):
        pyPcCommon.SetEntity(self,entity)
        if entity:
            Reporter.ReportDebug("apricot","["+entity.Name+"] init "+self.GetName())
            for maskid in self._callbacks:
                entity.MessageChannel.Subscribe(self,fromid(maskid))
            for maskid in self._filtercallbacks:
                entity.MessageChannel.Subscribe(self,fromid(maskid))
        else:
            for mask,value in self._callbacks.iteritems():
                self.entity.MessageChannel.Unsubscribe(self)
            for mask in self._filtercallbacks:
                self.entity.MessageChannel.Unsubscribe(self)
        self.entity = entity
    def ReceiveMessage(self,msgid,sender,ret,params):
        func = self._callbacks.get(msgid)
        if func:
            try:
                func(params)
            except:
                traceback.print_exc()
                return False
            return True
        else:
            filterkeys = self._filtercallbacks.get(msgid)
            if filterkeys:
                pc = sender.QueryInterface(iCelPropertyClass)
                if not pc:
                    return False
                for filter in filterkeys:
                    if pc.Tag == filter:
                        func = self._filtercallbacks[msgid][filter]
                        try:
                            func(params)
                        except:
                            traceback.print_exc()
                            return False
                        return True
        return False

