1#!/usr/bin/env python3
2#
3# SPDX-License-Identifier: GPL-2.0-only
4#
5# This file re-uses code spread throughout other Bitbake source files.
6# As such, all other copyrights belong to their own right holders.
7#
8
9
10import os
11import sys
12import json
13import pickle
14import codecs
15
16
17class EventPlayer:
18    """Emulate a connection to a bitbake server."""
19
20    def __init__(self, eventfile, variables):
21        self.eventfile = eventfile
22        self.variables = variables
23        self.eventmask = []
24
25    def waitEvent(self, _timeout):
26        """Read event from the file."""
27        line = self.eventfile.readline().strip()
28        if not line:
29            return
30        try:
31            decodedline = json.loads(line)
32            if 'allvariables' in decodedline:
33                self.variables = decodedline['allvariables']
34                return
35            if not 'vars' in decodedline:
36                raise ValueError
37            event_str = decodedline['vars'].encode('utf-8')
38            event = pickle.loads(codecs.decode(event_str, 'base64'))
39            event_name = "%s.%s" % (event.__module__, event.__class__.__name__)
40            if event_name not in self.eventmask:
41                return
42            return event
43        except ValueError as err:
44            print("Failed loading ", line)
45            raise err
46
47    def runCommand(self, command_line):
48        """Emulate running a command on the server."""
49        name = command_line[0]
50
51        if name == "getVariable":
52            var_name = command_line[1]
53            variable = self.variables.get(var_name)
54            if variable:
55                return variable['v'], None
56            return None, "Missing variable %s" % var_name
57
58        elif name == "getAllKeysWithFlags":
59            dump = {}
60            flaglist = command_line[1]
61            for key, val in self.variables.items():
62                try:
63                    if not key.startswith("__"):
64                        dump[key] = {
65                            'v': val['v'],
66                            'history' : val['history'],
67                        }
68                        for flag in flaglist:
69                            dump[key][flag] = val[flag]
70                except Exception as err:
71                    print(err)
72            return (dump, None)
73
74        elif name == 'setEventMask':
75            self.eventmask = command_line[-1]
76            return True, None
77
78        else:
79            raise Exception("Command %s not implemented" % command_line[0])
80
81    def getEventHandle(self):
82        """
83        This method is called by toasterui.
84        The return value is passed to self.runCommand but not used there.
85        """
86        pass
87