singrdk/base/Applications/Transforms/ConsoleTransform.sg

168 lines
6.2 KiB
Plaintext
Raw Normal View History

2008-03-05 09:52:00 -05:00
///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: DriverResourceTransform.sg
//
// Creates startup boilerplate code from Resource descriptions.
//
using Microsoft.SingSharp;
using Microsoft.Contracts;
using Microsoft.Singularity;
using Microsoft.Singularity.Channels;
using Microsoft.Singularity.Extending;
using Microsoft.Singularity.Directory;
using Microsoft.Singularity.Configuration;
using Microsoft.Singularity.V1.Services;
using System;
namespace Microsoft.Singularity.Applications{
transform ApplicationResourceTransform
where $EndpointType : unmanaged struct, Endpoint, ITracked
where $EpAttr : EndpointAttribute
{
[ConsoleCategory(*, DefaultAction=true)]
internal class $DefaultCategory
{
// only match, don't implement
internal $DefaultCategory();
internal int AppMain();
// Single entry point
generate public static int Main(string[] args) {
#if SHOW_ARGS
if (args != null) {
foreach(string arg in args) {
DebugStub.WriteLine("startup argument '{0}'", __arglist(arg));
}
}
#endif
if (args == null || args.Length < 2) {
$DefaultCategory config = new $DefaultCategory();
return config.AppMain();
}
string action = args[1];
forall (; $Action in $$NamedCategories ;) {
if ($Action.$name == action) {
$Action config = new $Action();
return config.AppMain();
}
}
throw new Exception(String.Format("Unrecognized action {0}", action));
}
}
[ConsoleCategory(*, Action=$name)]
internal class $$NamedCategories {
// only match, don't implement
internal $$NamedCategories();
internal int AppMain();
}
[ConsoleCategory(*)]
internal class $$Categories {
[$EpAttr(*)]
TRef<$EndpointType,$State> $$endpoints;
[StringParameter(*)]
string $$strings;
[StringArrayParameter(*)]
string[] $$stringArrays;
[LongParameter(*)]
long $$longs;
[BoolParameter(*)]
bool $$bools;
// [NotDelayed]
implement internal $$Categories() {
//DebugStub.WriteLine("ConsoleCategory action '{0}' applied", __arglist(this.GetType().ToString()));
int index;
ParameterCode code;
index = 0;
forall ( ; $s in $$strings ; ) {
string stringParam;
code = Process.GetStartupStringArg(index, out stringParam);
if (code != ParameterCode.Success) {
throw new ArgumentException(String.Format("error acquiring startup string array {0}. code={1}", index, code));
}
this.$s = stringParam;
//DebugStub.WriteLine("got string {0}=({1})",__arglist(index, $s));
++index;
}
index = 0;
forall ( ; $sa in $$stringArrays ; ) {
string[] stringArrayParam;
code = Process.GetStartupStringArrayArg(index, out stringArrayParam );
if (code != ParameterCode.Success) {
throw new ArgumentException(String.Format("error acquiring startup string {0}. code={1}", index, code));
}
this.$sa = stringArrayParam;
//DebugStub.WriteLine("got string {0}=({1})",__arglist(index, $s));
++index;
}
index = 0;
forall ( ; $l in $$longs ; ) {
long longArg;
code = ProcessService.GetStartupLongArg(index, out longArg);
if (code != ParameterCode.Success) {
throw new ArgumentException(String.Format("error acquiring startup integer {0}. code={1}", index, code));
}
this.$l = longArg;
//DebugStub.WriteLine("got long {0}=({1})",__arglist(index, $l));
++index;
}
index = 0;
forall ( ; $b in $$bools ; ) {
bool b;
code = ProcessService.GetStartupBoolArg(index, out b);
if (code != ParameterCode.Success) {
throw new ArgumentException(String.Format("error acquiring startup bool {0}. code={1}", index, code));
}
this.$b = b;
//DebugStub.WriteLine("got bool {0}=({1})",__arglist(index, b));
++index;
}
index = 0;
forall ( ; $e in $$endpoints; ){
if ( index == 0 || index == 1) {
//DebugStub.WriteLine("transform skipping pipe at {0}",__arglist(index));
}
else {
$e.$EndpointType* in ExHeap opt($e.$State) ep = Process.GetStartupEndpoint(index)
as $e.$EndpointType* in ExHeap opt($e.$State);
if (ep == null) {
throw new ArgumentException(String.Format("missing startup endpoint {0}", index));
}
$e = new TRef<$e.$EndpointType, $e.$State> (ep);
//DebugStub.WriteLine("getting endpoint at {0}",__arglist(index));
}
++index;
}
}
// Category specific entry point
internal int AppMain();
}
}
}