Commit 77d17785 authored by Anael Beutot's avatar Anael Beutot
Browse files

Tag update.

parent 6db59a18
Loading
Loading
Loading
Loading
+56 −11
Original line number Diff line number Diff line
@@ -61,6 +61,38 @@ class Tag(object):
            self.value = None
        # logger.debug('Calculate Tag(%s) = %s', self.name, self.value)

    def update_value(self):
        """Called when the tag value may change."""
        prev_value = self.value
        self.calculate_value()
        # if tag is not pushed
        # if self.ttl is not None:
        if self.ttl != -1:
            return
        if prev_value == self.value:
            return
        if prev_value is None:
            # we need to register tag again
            if self.sub_id == '__main__':
                logger.debug('Register tag %s', self.name)
                self.db.rpc_register_tag(self)
            else:
                logger.debug('Register sub tag %s.%s', self.sub_id,
                             self.name)
                self.db.rpc_register_sub_tag(self.sub_id, self)
        elif self.value is None:
            # we drop the tag
            if self.sub_id == '__main__':
                logger.debug('Unregister tag %s', self.name)
                self.db.rpc_unregister_tag(self.name)
            else:
                logger.debug('Unregister sub tag %s.%s', self.sub_id, self.name)
                self.db.rpc_unregister_sub_tag(self.sub_id, self.name)
        else:
            # update the tag value
            logger.debug('Update tag value %s', self.name)
            self.db.rpc_update_tag(self.sub_id, self)

    def start(self, loop):
        """
        :param loop: pyev loop
@@ -74,7 +106,7 @@ class Tag(object):

        # TODO more sophisticated calculation with event propagation
        self.watcher = loop.timer(.0, float(self.refresh), lambda *args:
                                  self.calculate_value())
                                  self.update_value())
        self.watcher.start()

    def stop(self):
@@ -249,11 +281,13 @@ class TagDB(object):

        # register tags on the cc-server
        for tag in self.db['__main__'].itervalues():
            if tag.value is not None:
                self.rpc_register_tag(tag)

        # register sub tags on the cc-server
        for tag in chain.from_iterable(
            db.itervalues() for name, db in self.db.iteritems() if name != '__main__'):
            if tag.value is not None:
                self.rpc_register_sub_tag(tag.sub_id, tag)


@@ -280,6 +314,15 @@ class TagDB(object):
        self.rpc_call(tag_name, self.rpc_tag_unregister_cb, 'tags_unregister',
                      tag_name)

    def rpc_update_tag(self, sub_id, tag):
        """Update tag value on cc-server."""
        if sub_id == '__main__':
            self.rpc_call(sub_id + tag.name, self.rpc_update_tag_cb,
                          'tags_update', tag.name, tag.value)
        else:
            self.rpc_call(sub_id + tag.name, self.rpc_update_tag_cb,
                          'sub_tags_update', tag.name, tag.value)

    def rpc_register_sub_tag(self, sub_id, tag):
        self.rpc_call(tag.name, self.rpc_sub_tag_register_cb,
                      'sub_tags_register', sub_id, tag.name, tag.ttl, tag.value)
@@ -297,6 +340,8 @@ class TagDB(object):
        'Error while registering sub tag %s, %s("%s")')
    rpc_sub_tag_unregister_cb = rpc_simple_cb(
        'Error while unregistering sub tag %s, %s("%s")')
    rpc_update_tag_cb = rpc_simple_cb(
        'Error while trying to update tag %s, %s("%s")')
    # end RPC part

    # tag handling part, used by plugins
@@ -325,6 +370,7 @@ class TagDB(object):
            tag.sub_id = '__main__'
            tag.start(self.main.evloop)
            # register tag on the cc-server
            if tag.value is not None:
                self.rpc_register_tag(tag)
        else:
            self.parent.add_tag(tag)
@@ -337,6 +383,7 @@ class TagDB(object):
            tag.sub_id = None
            tag.stop()
            # unregister tag on the cc-server
            if tag.value is not None:
                self.rpc_unregister_tag(tag_name)
        else:
            self.parent.remove_tag(tag_name)
@@ -347,6 +394,7 @@ class TagDB(object):
            tag.sub_id = sub_id
            tag.start(self.main.evloop)
            # register tag to the cc-server
            if tag.value is not None:
                self.rpc_register_sub_tag(sub_id, tag)
        else:
            self.parent.add_sub_tag(sub_id, tag)
@@ -359,6 +407,7 @@ class TagDB(object):
            tag.sub_id = None
            tag.stop()
            # unregister tag to the cc-server
            if tag.value is not None:
                self.rpc_unregister_sub_tag(sub_id, tag_name)
        else:
            self.parent.remove_sub_tag(sub_id, tag_name)
@@ -383,10 +432,6 @@ class TagDB(object):
            sub_tags = self.db.pop(sub_id)
            self.parent.remove_sub_object(sub_id)

    def update_tag_value(self, tag):
        """Update tag value on cc-server."""
        # TODO

    # dict like
    def get(self, key, default=None):
        return self.db.get(key, default)