Beispiel #1
0
        string GetCommandReturnType(CommandFlavor gen, TpmStruct resp, string methodName,
                                    out string returnFieldName)
        {
            returnFieldName = null;
            if (gen == CommandFlavor.AsyncCommand)
            {
                return("void");
            }

            string returnType = "void";
            var    respFields = resp.NonTagFields;

            if (ForceJustOneReturnParm.Contains(methodName))
            {
                respFields = respFields.Take(1).ToArray();
            }

            if (respFields.Count() > 1)
            {
                return(resp.Name);
            }

            if (respFields.Count() == 1)
            {
                returnFieldName = respFields[0].Name;
                returnType      = TransType(respFields[0]);
            }
            return(returnType);
        }
Beispiel #2
0
        void GenCommand(TpmStruct req, CommandFlavor gen)
        {
            var    resp    = GetRespStruct(req);
            string cmdName = GetCommandName(req);

            if (gen == CommandFlavor.AsyncResponse)
            {
                cmdName += "Complete";
            }

            string annotation = Helpers.WrapText(AsSummary(req.Comment)) + eol;
            var    reqFields  = new StructField[0];

            if (gen != CommandFlavor.AsyncResponse)
            {
                reqFields = req.NonTagFields;
                foreach (var f in reqFields)
                {
                    annotation += GetParamComment(f) + eol;
                }
            }
            WriteComment(annotation + (GetReturnComment(resp.NonTagFields)), false);

            string returnType = GetCommandReturnType(gen, resp, cmdName, out string returnFieldName);

            if (reqFields.Length > 1)
            {
                Write(returnType + " " + cmdName);
                TabIn("(");
                if (gen != CommandFlavor.AsyncResponse)
                {
                    foreach (var f in reqFields)
                    {
                        Write(CtorParamTypeFor(f) + " " + f.Name + Separator(f, reqFields, ", "));
                    }
                }
                TabOut(");");
                Write("");
            }
            else
            {
                string param = reqFields.Length == 1 ? CtorParamTypeFor(reqFields[0]) + " " + reqFields[0].Name : "";
                Write($"{returnType} {cmdName}({param});");
            }
        } // GenCommand()
Beispiel #3
0
        } // GenCommandDispatchers()

        void GenCommandDispatcher(TpmStruct req, CommandFlavor gen)
        {
            var    resp    = GetRespStruct(req);
            string cmdName = GetCommandName(req);
            string cmdCode = "TPM_CC::" + cmdName;

            string inStructId  = req.Name + "_ID";
            string outStructId = resp.Name + "_ID";

            switch (gen)
            {
            case CommandFlavor.AsyncCommand: cmdName += ""; break;

            case CommandFlavor.AsyncResponse: cmdName += "Complete"; break;

            default: break;
            }

            string returnFieldName;
            string returnType = GetCommandReturnType(gen, resp, cmdName, out returnFieldName);

            string      className      = " Tpm2::" + (gen != CommandFlavor.Synch ? "AsyncMethods::" : "");
            bool        paramsPresent  = gen != CommandFlavor.AsyncResponse;
            var         cmdParamFields = paramsPresent ? req.NonTagFields : new StructField[0];
            bool        multiline      = cmdParamFields.Count() > 1;
            StructField lastParm       = cmdParamFields.Count() > 0 ? lastParm = cmdParamFields.Last() : null;

            Write(returnType + className + cmdName + "(" +
                  (cmdParamFields.Count() == 0 ? ")"
                  : (multiline ? ""
                  : CtorParamTypeFor(cmdParamFields[0]) + " " + cmdParamFields[0].Name + ")")));
            if (multiline)
            {
                TabIn();
                foreach (var f in cmdParamFields)
                {
                    Write(CtorParamTypeFor(f) + " " + f.Name + (f == lastParm ? ")" : ", "));
                }
                TabOut();
            }
            TabIn("{");

            string reqParams = "";

            if (paramsPresent && req.Fields.Count() != 0)
            {
                string ctorInitList = string.Join(", ", cmdParamFields.Select(f => f.Name));
                Write($"{req.Name} req({ctorInitList});");
                reqParams = ", req";
            }

            string respParam = "";

            if (returnType != "void")
            {
                Debug.Assert(resp.Fields.Count() != 0);
                Write($"{resp.Name} resp;");
                respParam = ", resp";
            }

            string dispatchCall = gen == CommandFlavor.AsyncCommand ? "theTpm.DispatchOut"
                                : gen == CommandFlavor.AsyncResponse ? "theTpm.DispatchIn"
                                : "Dispatch";

            Write(dispatchCall + $"({cmdCode}{reqParams}{respParam});");

            if (gen != CommandFlavor.AsyncCommand)
            {
                if (returnFieldName != null)
                {
                    Write($"return resp.{returnFieldName};");
                }
                else if (returnType != "void")
                {
                    Write("return resp;");
                }
            }
            TabOut("}");
        } // GenCommandDispatcher()