示例#1
0
        /// <summary>
        /// Execute method.
        /// If not already bound, this variable will be assigned a vaule.
        /// The variable may be bound when it is "built" or "interpreted".
        /// If bound when built, the variable may only reference preceding
        /// instruction settings (not results) and other built-bound vars.
        ///
        /// When there is reg, env or set data, it replaces the old data.
        /// When there is add data, it is added if old and add are numbers,
        /// or it is appended to the old data.
        /// When there is set and add data, set replaces the old data and
        /// add is added or appended.
        /// @env and @reg get values from the environment and the registry.
        /// The order of concatenation is @reg, @env, @set then @add.
        /// </summary>
        public override void Execute()
        {                                 // Bind the variable to a value if not already bound
            if (!m_bound)
            {                             // not already bound.
                m_log = Logger.getOnly(); // the log set in Instruction creation may be in another TestState
                TestState   ts  = TestState.getOnly();
                Instruction ins = ts.Instruction(m_id);
                if (ins != null)
                {                 // already one with this name
                    m_val = ins.GetDataImage(null);
                    m_log.paragraph("Found var " + m_id + " with value=" + m_val);
                    // remove the old ins from ts
                    ts.RemoveInstruction(m_id);
                    if (m_reg != null || m_env != null || m_set != null)
                    {
                        m_val = null;                         // don't use previous value
                    }
                }
                if (m_reg != null)
                {
                    string      value = null;
                    string      key;
                    RegistryKey regkey = Utilities.parseRegKey(m_reg, out key);
                    if (regkey != null)
                    {
                        RegistryValueKind rvk = regkey.GetValueKind(key);
                        switch (rvk)
                        {
                        case RegistryValueKind.Binary:
                            m_log.paragraph("Reg key is Binary");
                            value = Convert.ToString(regkey.GetValue(key));
                            break;

                        case RegistryValueKind.DWord:
                            m_log.paragraph("Reg key is DWord");
                            value = Convert.ToString(regkey.GetValue(key));
                            break;

                        case RegistryValueKind.ExpandString:
                            m_log.paragraph("Reg key is ExpandString");
                            value = Convert.ToString(regkey.GetValue(key));
                            break;

                        case RegistryValueKind.MultiString:
                            m_log.paragraph("Reg key is MultiString");
                            value = Convert.ToString(regkey.GetValue(key));
                            break;

                        case RegistryValueKind.QWord:
                            m_log.paragraph("Reg key is QWord");
                            value = Convert.ToString(regkey.GetValue(key));
                            break;

                        case RegistryValueKind.String:
                            value = (string)regkey.GetValue(key);
                            break;

                        case RegistryValueKind.Unknown:
                            m_log.paragraph("Reg key is Unknown");
                            break;
                        }
                        regkey.Close();
                    }
                    else
                    {
                        m_log.paragraph("Invalid Reisitry path: " + m_reg);
                    }
                    if (value != null)
                    {
                        m_val += value;
                    }
                }
                if (m_env != null)
                {                 // try the process then the user then the machine environment variables.
                    string value = Environment.GetEnvironmentVariable(m_env, EnvironmentVariableTarget.Process);
                    if (value == null)
                    {
                        value = Environment.GetEnvironmentVariable(m_env, EnvironmentVariableTarget.User);
                    }
                    if (value == null)
                    {
                        value = Environment.GetEnvironmentVariable(m_env, EnvironmentVariableTarget.Machine);
                    }
                    if (value != null)
                    {
                        m_val += value;
                    }
                }
                if (m_set != null)
                {
                    m_val += Utilities.evalExpr(m_set);
                }
                if (m_add != null)
                {                 // add the old and new
                    string newVal = Utilities.evalExpr(m_add);
                    if (Utilities.IsNumber(newVal) && Utilities.IsNumber(m_val))
                    {
                        try
                        {
                            double old = double.Parse(m_val);
                            double add = double.Parse(newVal);
                            double sum = old + add;
                            m_log.paragraph("Variable(" + m_id + ") = " + old + " + " + add + " = " + sum);
                            m_val = System.Convert.ToString(sum);
                        }
                        catch
                        {
                            fail("Variable(" + m_id + ") = " + m_val + " + " + m_add + " does not compute!");
                        }
                    }
                    else
                    {
                        m_log.paragraph("Text add: Variable(" + m_id + ") = " + m_val + " + " + newVal);
                        m_val += newVal;                         // append as strings
                    }
                }
                else
                // even if there was a previous var, but m_add was null,
                // then m_val is null if nothing was m_set!
                if (m_set == null)
                {
                    m_val = null;
                }
                if (m_file_exists != null && m_val != null)
                {                 // append the file name to the reg and/or env value.
                    if (File.Exists(m_val))
                    {
                        m_val = m_file_exists;
                    }
                    else
                    {
                        m_val = "#not-exists#";
                    }
                }
                ts.AddNamedInstruction(m_id, this);
            }
            m_bound = true;
            base.Execute();
            Finished = true;             // tell do-once it's done
        }