Exemple #1
0
        public static void Test(HashSet <ArgMatchTest> a, Message msg)
        {
            List <Signature> sigs = new List <Signature> ();

            sigs.AddRange(msg.Signature.GetParts());

            if (sigs.Count == 0)
            {
                a.Clear();
                return;
            }

            a.RemoveWhere(delegate(ArgMatchTest t) { return(t.ArgNum >= sigs.Count || t.Signature != sigs[t.ArgNum]); });

            // Sorting the list here is not ideal
            List <ArgMatchTest> tests = new List <ArgMatchTest> (a);

            tests.Sort(delegate(ArgMatchTest aa, ArgMatchTest bb) { return(aa.ArgNum - bb.ArgNum); });

            if (tests.Count == 0)
            {
                a.Clear();
                return;
            }

            MessageReader reader = new MessageReader(msg);

            int argNum = 0;

            foreach (ArgMatchTest test in tests)
            {
                if (argNum > test.ArgNum)
                {
                    // This test cannot pass because a previous test already did.
                    // So we already know it will fail without even trying.
                    // This logic will need to be changed to support wildcards.
                    a.Remove(test);
                    continue;
                }

                while (argNum != test.ArgNum)
                {
                    Signature sig = sigs[argNum];
                    if (!reader.StepOver(sig))
                    {
                        throw new Exception();
                    }
                    argNum++;
                }

                // TODO: Avoid re-reading values
                int savedPos = reader.pos;
                if (!reader.ReadValue(test.Signature[0]).Equals(test.Value))
                {
                    a.Remove(test);
                    reader.pos = savedPos;
                    continue;
                }

                argNum++;
            }
        }
Exemple #2
0
        public static void Test(HashSet<ArgMatchTest> a, Message msg)
        {
            List<Signature> sigs = new List<Signature> ();
            sigs.AddRange (msg.Signature.GetParts ());

            if (sigs.Count == 0) {
                a.Clear ();
                return;
            }

            a.RemoveWhere ( delegate (ArgMatchTest t) { return t.ArgNum >= sigs.Count || t.Signature != sigs[t.ArgNum]; } );

            // Sorting the list here is not ideal
            List<ArgMatchTest> tests = new List<ArgMatchTest> (a);
            tests.Sort ( delegate (ArgMatchTest aa, ArgMatchTest bb) { return aa.ArgNum - bb.ArgNum; } );

            if (tests.Count == 0) {
                a.Clear ();
                return;
            }

            MessageReader reader = new MessageReader (msg);

            int argNum = 0;
            foreach (ArgMatchTest test in tests) {
                if (argNum > test.ArgNum) {
                    // This test cannot pass because a previous test already did.
                    // So we already know it will fail without even trying.
                    // This logic will need to be changed to support wildcards.
                    a.Remove (test);
                    continue;
                }

                while (argNum != test.ArgNum) {
                    Signature sig = sigs[argNum];
                    if (!reader.StepOver (sig))
                        throw new Exception ();
                    argNum++;
                }

                // TODO: Avoid re-reading values
                int savedPos = reader.pos;
                if (!reader.ReadValue (test.Signature[0]).Equals (test.Value)) {
                    a.Remove (test);
                    reader.pos = savedPos;
                    continue;
                }

                argNum++;
            }
        }
Exemple #3
0
	static void PrintValue (MessageReader reader, Signature sig, int depth)
	{
		string indent = new String (' ', depth * 2);
		indent += "  ";

		//Console.Write (indent + indent + "arg" + argNum + " " + sig + ": ");
		Console.Write (indent);
		if (sig == Signature.VariantSig) {
			foreach (Signature elemSig in reader.StepInto (sig)) {
				Console.WriteLine ("Variant '{0}' (", elemSig);
				PrintValue (reader, elemSig, depth + 1);
				Console.WriteLine (indent + ")");
			}
		} else if (sig.IsPrimitive) {
			object arg = reader.ReadValue (sig[0]);
			Type argType = sig.ToType ();
			if (sig == Signature.StringSig || sig == Signature.ObjectPathSig)
				Console.WriteLine ("{0} \"{1}\"", argType.Name, arg);
			else if (sig == Signature.SignatureSig)
				Console.WriteLine ("{0} '{1}'", argType.Name, arg);
			else
				Console.WriteLine ("{0} {1}", argType.Name, arg);
		} else if (sig.IsArray) {
			Console.WriteLine ("Array [");
			foreach (Signature elemSig in reader.StepInto (sig))
				PrintValue (reader, elemSig, depth + 1);
			Console.WriteLine (indent + "]");
		} else if (sig.IsDictEntry) {
			Console.WriteLine ("DictEntry {");
			foreach (Signature elemSig in reader.StepInto (sig))
				PrintValue (reader, elemSig, depth + 1);
			Console.WriteLine (indent + "}");
		} else if (sig.IsStruct) {
			Console.WriteLine ("Struct {");
			foreach (Signature elemSig in reader.StepInto (sig))
				PrintValue (reader, elemSig, depth + 1);
			Console.WriteLine (indent + "}");
		} else {
			reader.StepOver (sig);
			Console.WriteLine ("'{0}'?", sig);
		}
	}