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); }
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()
} // 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()