mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2026-06-27 22:59:05 +00:00
Enable full trimming
Enables full trimming for Ryujinx, and in doing so removes many usages of reflection, namely: IUserService no longer uses reflection to find possible service types, and now has a generated switch based on name Ryujinx.HLE.HOS.Tamper no longer uses dynamic to do operations, now using INumber<T> and friends Cmif and Tipc commands in Ryujinx.HLE.HOS.Services no longer get resolved via reflection and are now done via generated virtual methods Fix things broken by trimming (profile panel, DiscordRPC)
This commit is contained in:
committed by
KeatonTheBot
parent
32ee806070
commit
c76f65904d
3
.gitignore
vendored
3
.gitignore
vendored
@@ -185,3 +185,6 @@ PublishProfiles/
|
|||||||
# Ignore distribution build files
|
# Ignore distribution build files
|
||||||
distribution/macos/temp/
|
distribution/macos/temp/
|
||||||
distribution/macos/output/
|
distribution/macos/output/
|
||||||
|
|
||||||
|
# MSBuild logs
|
||||||
|
*.binlog
|
||||||
|
|||||||
6
Directory.Build.targets
Normal file
6
Directory.Build.targets
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<Project>
|
||||||
|
<PropertyGroup>
|
||||||
|
<IsTrimmable Condition="'$(IsTrimmable)' == '' AND $([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">true</IsTrimmable>
|
||||||
|
<EnableTrimAnalyzer Condition="'$(EnableTrimAnalyzer)' == '' AND $([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">true</EnableTrimAnalyzer>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
<PackageVersion Include="DiscordRichPresence" Version="1.6.1.70" />
|
<PackageVersion Include="DiscordRichPresence" Version="1.6.1.70" />
|
||||||
<PackageVersion Include="DynamicData" Version="9.4.1" />
|
<PackageVersion Include="DynamicData" Version="9.4.1" />
|
||||||
<PackageVersion Include="FluentAvaloniaUI" Version="2.5.0" />
|
<PackageVersion Include="FluentAvaloniaUI" Version="2.5.0" />
|
||||||
<PackageVersion Include="Humanizer" Version="2.14.1" />
|
<PackageVersion Include="Humanizer" Version="3.0.1" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
|
||||||
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.3.0" />
|
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.3.0" />
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
<PackageVersion Include="OpenTK.Audio.OpenAL" Version="4.8.2" />
|
<PackageVersion Include="OpenTK.Audio.OpenAL" Version="4.8.2" />
|
||||||
<PackageVersion Include="OpenTK.Windowing.GraphicsLibraryFramework" Version="4.8.2" />
|
<PackageVersion Include="OpenTK.Windowing.GraphicsLibraryFramework" Version="4.8.2" />
|
||||||
<PackageVersion Include="Open.NAT.Core" Version="2.1.0.5" />
|
<PackageVersion Include="Open.NAT.Core" Version="2.1.0.5" />
|
||||||
|
<PackageVersion Include="PolySharp" Version="1.15.0" />
|
||||||
<PackageVersion Include="Ryujinx.Audio.OpenAL.Dependencies" Version="1.21.0.1" />
|
<PackageVersion Include="Ryujinx.Audio.OpenAL.Dependencies" Version="1.21.0.1" />
|
||||||
<PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies.AllArch" Version="6.1.2-build3" />
|
<PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies.AllArch" Version="6.1.2-build3" />
|
||||||
<PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" />
|
<PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" />
|
||||||
|
|||||||
@@ -2,12 +2,14 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
|
<IsTrimmable>false</IsTrimmable>
|
||||||
|
<EnableTrimAnalyzer>false</EnableTrimAnalyzer>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<Target Name="PostBuildTarget" AfterTargets="AfterBuild">
|
<Target Name="PostBuildTarget" AfterTargets="AfterBuild">
|
||||||
<Message Text="Running Validation Project" Importance="high" />
|
<Message Text="Running Validation Project" Importance="high" />
|
||||||
|
|
||||||
<Exec WorkingDirectory="$(ProjectDir)bin\Debug\$(TargetFramework)\"
|
<Exec WorkingDirectory="$(OutDir)"
|
||||||
Command="dotnet Ryujinx.BuildValidationTasks.dll "$(ProjectDir)..\..\\""
|
Command="dotnet Ryujinx.BuildValidationTasks.dll "$(ProjectDir)..\..\\""
|
||||||
ConsoleToMsBuild="true"
|
ConsoleToMsBuild="true"
|
||||||
Condition="'$(RuntimeIdentifier)' == ''"
|
Condition="'$(RuntimeIdentifier)' == ''"
|
||||||
|
|||||||
@@ -37,7 +37,9 @@ namespace Ryujinx.Common.Logging.Formatters
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma warning disable IL2075 // GetProperties is *probably* fine here, it only really matters what exists anyway
|
||||||
PropertyInfo[] props = dynamicObject.GetType().GetProperties();
|
PropertyInfo[] props = dynamicObject.GetType().GetProperties();
|
||||||
|
#pragma warning restore IL2075
|
||||||
|
|
||||||
sb.Append('{');
|
sb.Append('{');
|
||||||
|
|
||||||
|
|||||||
173
src/Ryujinx.HLE.Generators/IpcCommandGenerator.cs
Normal file
173
src/Ryujinx.HLE.Generators/IpcCommandGenerator.cs
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Immutable;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.Generators
|
||||||
|
{
|
||||||
|
[Generator]
|
||||||
|
public class IpcCommandGenerator : IIncrementalGenerator
|
||||||
|
{
|
||||||
|
private sealed class CommandData : IEquatable<CommandData>
|
||||||
|
{
|
||||||
|
public required string Namespace { get; init; }
|
||||||
|
public required string TypeName { get; init; }
|
||||||
|
public required string MethodName { get; init; }
|
||||||
|
public required ImmutableArray<int> CommandIds { get; init; }
|
||||||
|
|
||||||
|
public bool Equals(CommandData other)
|
||||||
|
{
|
||||||
|
return Namespace == other.Namespace && TypeName == other.TypeName && MethodName == other.MethodName && CommandIds.SequenceEqual(other.CommandIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
=> obj is CommandData other && Equals(other);
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
unchecked
|
||||||
|
{
|
||||||
|
var hashCode = (Namespace != null ? Namespace.GetHashCode() : 0);
|
||||||
|
hashCode = (hashCode * 397) ^ (TypeName != null ? TypeName.GetHashCode() : 0);
|
||||||
|
hashCode = (hashCode * 397) ^ (MethodName != null ? MethodName.GetHashCode() : 0);
|
||||||
|
return hashCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class ServiceData : IEquatable<ServiceData>
|
||||||
|
{
|
||||||
|
public required string Namespace { get; init; }
|
||||||
|
public required string TypeName { get; init; }
|
||||||
|
public required ImmutableArray<CommandData> CmifCommands { get; init; }
|
||||||
|
public required ImmutableArray<CommandData> TipcCommands { get; init; }
|
||||||
|
|
||||||
|
|
||||||
|
public bool Equals(ServiceData other)
|
||||||
|
{
|
||||||
|
return Namespace == other.Namespace && TypeName == other.TypeName && CmifCommands.SequenceEqual(other.CmifCommands) && TipcCommands.SequenceEqual(other.TipcCommands);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
return obj is ServiceData other && Equals(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
unchecked
|
||||||
|
{
|
||||||
|
var hashCode = (Namespace != null ? Namespace.GetHashCode() : 0);
|
||||||
|
hashCode = (hashCode * 397) ^ (TypeName != null ? TypeName.GetHashCode() : 0);
|
||||||
|
return hashCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialize(IncrementalGeneratorInitializationContext context)
|
||||||
|
{
|
||||||
|
Func<SyntaxNode, CancellationToken, bool> predicate = (node, _) => node is MethodDeclarationSyntax;
|
||||||
|
Func<GeneratorAttributeSyntaxContext, CancellationToken, CommandData> transform = (ctx, _) =>
|
||||||
|
{
|
||||||
|
var target = (IMethodSymbol)ctx.TargetSymbol;
|
||||||
|
return new CommandData
|
||||||
|
{
|
||||||
|
Namespace = target.ContainingType.ContainingNamespace?.ToDisplayString(),
|
||||||
|
TypeName = target.ContainingType.Name,
|
||||||
|
MethodName = target.Name,
|
||||||
|
CommandIds = ctx.Attributes.Select(attr => (int)attr.ConstructorArguments[0].Value!).ToImmutableArray(),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
IncrementalValuesProvider<CommandData> cmifCommands =
|
||||||
|
context.SyntaxProvider.ForAttributeWithMetadataName("Ryujinx.HLE.HOS.Services.CommandCmifAttribute",
|
||||||
|
predicate,
|
||||||
|
transform
|
||||||
|
);
|
||||||
|
IncrementalValuesProvider<CommandData> tipcCommands =
|
||||||
|
context.SyntaxProvider.ForAttributeWithMetadataName("Ryujinx.HLE.HOS.Services.CommandTipcAttribute",
|
||||||
|
predicate,
|
||||||
|
transform
|
||||||
|
);
|
||||||
|
|
||||||
|
IncrementalValueProvider<(ImmutableArray<CommandData> Left, ImmutableArray<CommandData> Right)> allCommands =
|
||||||
|
cmifCommands.Collect().Combine(tipcCommands.Collect());
|
||||||
|
|
||||||
|
IncrementalValuesProvider<ServiceData> types = allCommands.SelectMany((commands, _) =>
|
||||||
|
{
|
||||||
|
ILookup<(string Namespace, string TypeName), CommandData> cmif = commands.Left.ToLookup(c => (c.Namespace, c.TypeName));
|
||||||
|
ILookup<(string Namespace, string TypeName), CommandData> tipc = commands.Right.ToLookup(c => (c.Namespace, c.TypeName));
|
||||||
|
|
||||||
|
ImmutableArray<ServiceData>.Builder builder = ImmutableArray.CreateBuilder<ServiceData>();
|
||||||
|
|
||||||
|
foreach ((string Namespace, string TypeName) type in cmif.Select(c => c.Key).Union(tipc.Select(t => t.Key)))
|
||||||
|
{
|
||||||
|
builder.Add(new ServiceData
|
||||||
|
{
|
||||||
|
Namespace = type.Namespace,
|
||||||
|
TypeName = type.TypeName,
|
||||||
|
CmifCommands = cmif.Contains(type) ? cmif[type].ToImmutableArray() : [],
|
||||||
|
TipcCommands = tipc.Contains(type) ? tipc[type].ToImmutableArray() : [],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.DrainToImmutable();
|
||||||
|
});
|
||||||
|
|
||||||
|
context.RegisterSourceOutput(types, (ctx, data) =>
|
||||||
|
{
|
||||||
|
var generator = new CodeGenerator();
|
||||||
|
|
||||||
|
generator.AppendLine("using Ryujinx.HLE.HOS;");
|
||||||
|
generator.AppendLine("using RC = global::Ryujinx.HLE.HOS.ResultCode;");
|
||||||
|
|
||||||
|
generator.EnterScope($"namespace {data.Namespace}");
|
||||||
|
generator.EnterScope($"partial class {data.TypeName}");
|
||||||
|
|
||||||
|
if (!data.CmifCommands.IsEmpty)
|
||||||
|
{
|
||||||
|
GenerateCommandMethod("Cmif", data.CmifCommands);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data.TipcCommands.IsEmpty)
|
||||||
|
{
|
||||||
|
GenerateCommandMethod("Tipc", data.TipcCommands);
|
||||||
|
}
|
||||||
|
|
||||||
|
generator.LeaveScope();
|
||||||
|
generator.LeaveScope();
|
||||||
|
|
||||||
|
ctx.AddSource($"{data.Namespace}.{data.TypeName}.g.cs", generator.ToString());
|
||||||
|
|
||||||
|
void GenerateCommandMethod(string commandType, ImmutableArray<CommandData> commands)
|
||||||
|
{
|
||||||
|
generator.EnterScope($"protected override RC Invoke{commandType}Method(int id, ServiceCtx context)");
|
||||||
|
generator.EnterScope("switch (id)");
|
||||||
|
foreach (CommandData command in commands)
|
||||||
|
{
|
||||||
|
generator.AppendLine($"case {string.Join(" or ", command.CommandIds)}:");
|
||||||
|
generator.IncreaseIndentation();
|
||||||
|
generator.AppendLine($"LogInvoke(\"{command.MethodName}\");");
|
||||||
|
generator.AppendLine($"return (RC){command.MethodName}(context);");
|
||||||
|
generator.DecreaseIndentation();
|
||||||
|
}
|
||||||
|
generator.AppendLine($"default: return base.Invoke{commandType}Method(id, context);");
|
||||||
|
generator.LeaveScope();
|
||||||
|
generator.LeaveScope();
|
||||||
|
|
||||||
|
generator.EnterScope($"public override int {commandType}CommandIdByMethodName(string name)");
|
||||||
|
generator.EnterScope("return name switch");
|
||||||
|
foreach (CommandData command in commands)
|
||||||
|
{
|
||||||
|
// just return the first command with this name
|
||||||
|
generator.AppendLine($"\"{command.MethodName}\" => {command.CommandIds[0]},");
|
||||||
|
}
|
||||||
|
generator.AppendLine($"_ => base.{commandType}CommandIdByMethodName(name),");
|
||||||
|
generator.LeaveScope(";");
|
||||||
|
generator.LeaveScope();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
using Microsoft.CodeAnalysis;
|
|
||||||
using Microsoft.CodeAnalysis.CSharp;
|
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace Ryujinx.HLE.Generators
|
|
||||||
{
|
|
||||||
[Generator]
|
|
||||||
public class IpcServiceGenerator : ISourceGenerator
|
|
||||||
{
|
|
||||||
public void Execute(GeneratorExecutionContext context)
|
|
||||||
{
|
|
||||||
ServiceSyntaxReceiver syntaxReceiver = (ServiceSyntaxReceiver)context.SyntaxReceiver;
|
|
||||||
CodeGenerator generator = new();
|
|
||||||
|
|
||||||
generator.AppendLine("#nullable enable");
|
|
||||||
generator.AppendLine("using System;");
|
|
||||||
generator.EnterScope($"namespace Ryujinx.HLE.HOS.Services.Sm");
|
|
||||||
generator.EnterScope($"partial class IUserInterface");
|
|
||||||
|
|
||||||
generator.EnterScope($"public IpcService? GetServiceInstance(Type type, ServiceCtx context, object? parameter = null)");
|
|
||||||
foreach (ClassDeclarationSyntax className in syntaxReceiver.Types)
|
|
||||||
{
|
|
||||||
if (className.Modifiers.Any(SyntaxKind.AbstractKeyword) || className.Modifiers.Any(SyntaxKind.PrivateKeyword) || !className.AttributeLists.Any(x => x.Attributes.Any(y => y.ToString().StartsWith("Service"))))
|
|
||||||
continue;
|
|
||||||
string name = GetFullName(className, context).Replace("global::", string.Empty);
|
|
||||||
if (!name.StartsWith("Ryujinx.HLE.HOS.Services"))
|
|
||||||
continue;
|
|
||||||
ConstructorDeclarationSyntax[] constructors = className.ChildNodes().Where(x => x.IsKind(SyntaxKind.ConstructorDeclaration)).Select(y => y as ConstructorDeclarationSyntax).ToArray();
|
|
||||||
|
|
||||||
if (!constructors.Any(x => x.ParameterList.Parameters.Count >= 1))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (constructors.Where(x => x.ParameterList.Parameters.Count >= 1).FirstOrDefault().ParameterList.Parameters[0].Type.ToString() == "ServiceCtx")
|
|
||||||
{
|
|
||||||
generator.EnterScope($"if (type == typeof({GetFullName(className, context)}))");
|
|
||||||
if (constructors.Any(x => x.ParameterList.Parameters.Count == 2))
|
|
||||||
{
|
|
||||||
TypeSyntax type = constructors.Where(x => x.ParameterList.Parameters.Count == 2).FirstOrDefault().ParameterList.Parameters[1].Type;
|
|
||||||
SemanticModel model = context.Compilation.GetSemanticModel(type.SyntaxTree);
|
|
||||||
INamedTypeSymbol typeSymbol = model.GetSymbolInfo(type).Symbol as INamedTypeSymbol;
|
|
||||||
string fullName = typeSymbol.ToString();
|
|
||||||
generator.EnterScope("if (parameter != null)");
|
|
||||||
generator.AppendLine($"return new {GetFullName(className, context)}(context, ({fullName})parameter);");
|
|
||||||
generator.LeaveScope();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (constructors.Any(x => x.ParameterList.Parameters.Count == 1))
|
|
||||||
{
|
|
||||||
generator.AppendLine($"return new {GetFullName(className, context)}(context);");
|
|
||||||
}
|
|
||||||
|
|
||||||
generator.LeaveScope();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
generator.AppendLine("return null;");
|
|
||||||
generator.LeaveScope();
|
|
||||||
|
|
||||||
generator.LeaveScope();
|
|
||||||
generator.LeaveScope();
|
|
||||||
generator.AppendLine("#nullable disable");
|
|
||||||
context.AddSource($"IUserInterface.g.cs", generator.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GetFullName(ClassDeclarationSyntax syntaxNode, GeneratorExecutionContext context)
|
|
||||||
{
|
|
||||||
INamedTypeSymbol typeSymbol = context.Compilation.GetSemanticModel(syntaxNode.SyntaxTree).GetDeclaredSymbol(syntaxNode);
|
|
||||||
|
|
||||||
return typeSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Initialize(GeneratorInitializationContext context)
|
|
||||||
{
|
|
||||||
context.RegisterForSyntaxNotifications(() => new ServiceSyntaxReceiver());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,8 +3,6 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
||||||
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
|
|
||||||
<CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>
|
|
||||||
<IsRoslynComponent>true</IsRoslynComponent>
|
<IsRoslynComponent>true</IsRoslynComponent>
|
||||||
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@@ -15,6 +13,10 @@
|
|||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" />
|
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" />
|
||||||
|
<PackageReference Include="PolySharp">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
using Microsoft.CodeAnalysis;
|
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Ryujinx.HLE.Generators
|
|
||||||
{
|
|
||||||
internal class ServiceSyntaxReceiver : ISyntaxReceiver
|
|
||||||
{
|
|
||||||
public HashSet<ClassDeclarationSyntax> Types = [];
|
|
||||||
|
|
||||||
public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
|
|
||||||
{
|
|
||||||
if (syntaxNode is ClassDeclarationSyntax classDeclaration)
|
|
||||||
{
|
|
||||||
if (classDeclaration.BaseList == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Types.Add(classDeclaration);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
93
src/Ryujinx.HLE.Generators/UserServiceGenerator.cs
Normal file
93
src/Ryujinx.HLE.Generators/UserServiceGenerator.cs
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
using Microsoft.CodeAnalysis.CSharp;
|
||||||
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.Generators
|
||||||
|
{
|
||||||
|
[Generator]
|
||||||
|
public sealed class UserServiceGenerator : IIncrementalGenerator
|
||||||
|
{
|
||||||
|
private sealed class ServiceData : IEquatable<ServiceData>
|
||||||
|
{
|
||||||
|
public required string FullName { get; init; }
|
||||||
|
public required IReadOnlyList<(string ServiceName, string ParameterValue)> Instances { get; init; }
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
=> obj is ServiceData data && Equals(data);
|
||||||
|
|
||||||
|
public bool Equals(ServiceData other)
|
||||||
|
{
|
||||||
|
return this.FullName == other.FullName && this.Instances.SequenceEqual(other.Instances);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode() => FullName.GetHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialize(IncrementalGeneratorInitializationContext context)
|
||||||
|
{
|
||||||
|
IncrementalValuesProvider<ServiceData> pipeline = context.SyntaxProvider.ForAttributeWithMetadataName("Ryujinx.HLE.HOS.Services.ServiceAttribute",
|
||||||
|
predicate: (node, _) => node is ClassDeclarationSyntax decl && !decl.Modifiers.Any(SyntaxKind.AbstractKeyword) && !decl.Modifiers.Any(SyntaxKind.PrivateKeyword),
|
||||||
|
transform: (ctx, _) =>
|
||||||
|
{
|
||||||
|
var target = (INamedTypeSymbol)ctx.TargetSymbol;
|
||||||
|
IEnumerable<(string, string param)> instances = ctx.Attributes.Select(attr =>
|
||||||
|
{
|
||||||
|
string param = attr.ConstructorArguments is [_, { IsNull: false } arg] ? arg.ToCSharpString() : null;
|
||||||
|
return ((string)attr.ConstructorArguments[0].Value, param);
|
||||||
|
});
|
||||||
|
return new ServiceData
|
||||||
|
{
|
||||||
|
FullName = target.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
|
||||||
|
Instances = instances.ToList(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
context.RegisterSourceOutput(pipeline.Collect(),
|
||||||
|
(ctx, data) =>
|
||||||
|
{
|
||||||
|
var generator = new CodeGenerator();
|
||||||
|
|
||||||
|
generator.AppendLine("#nullable enable");
|
||||||
|
generator.AppendLine("using System;");
|
||||||
|
generator.EnterScope("namespace Ryujinx.HLE.HOS.Services.Sm");
|
||||||
|
generator.EnterScope("partial class IUserInterface");
|
||||||
|
|
||||||
|
generator.EnterScope("public IpcService? GetServiceInstance(string name, ServiceCtx context)");
|
||||||
|
|
||||||
|
generator.EnterScope("return name switch");
|
||||||
|
|
||||||
|
foreach (ServiceData serviceImpl in data)
|
||||||
|
{
|
||||||
|
foreach ((string ServiceName, string ParameterValue) instance in serviceImpl.Instances)
|
||||||
|
{
|
||||||
|
if (instance.ParameterValue == null)
|
||||||
|
{
|
||||||
|
generator.AppendLine($"\"{instance.ServiceName}\" => new {serviceImpl.FullName}(context),");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
generator.AppendLine($"\"{instance.ServiceName}\" => new {serviceImpl.FullName}(context, {instance.ParameterValue}),");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
generator.AppendLine("_ => null,");
|
||||||
|
|
||||||
|
generator.LeaveScope(";");
|
||||||
|
|
||||||
|
generator.LeaveScope();
|
||||||
|
|
||||||
|
generator.LeaveScope();
|
||||||
|
generator.LeaveScope();
|
||||||
|
|
||||||
|
generator.AppendLine("#nullable disable");
|
||||||
|
|
||||||
|
ctx.AddSource("IUserInterface.g.cs", generator.ToString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace Ryujinx.HLE.Exceptions
|
namespace Ryujinx.HLE.Exceptions
|
||||||
@@ -17,22 +18,22 @@ namespace Ryujinx.HLE.Exceptions
|
|||||||
public IpcService Service { get; }
|
public IpcService Service { get; }
|
||||||
public ServiceCtx Context { get; }
|
public ServiceCtx Context { get; }
|
||||||
public IpcMessage Request { get; }
|
public IpcMessage Request { get; }
|
||||||
|
private string MethodName { get; }
|
||||||
|
|
||||||
public ServiceNotImplementedException(IpcService service, ServiceCtx context)
|
public ServiceNotImplementedException(IpcService service, ServiceCtx context, string message = "The service call is not implemented.", [CallerMemberName] string methodName = null) : base(message)
|
||||||
: this(service, context, "The service call is not implemented.") { }
|
|
||||||
|
|
||||||
public ServiceNotImplementedException(IpcService service, ServiceCtx context, string message) : base(message)
|
|
||||||
{
|
{
|
||||||
Service = service;
|
Service = service;
|
||||||
Context = context;
|
Context = context;
|
||||||
Request = context.Request;
|
Request = context.Request;
|
||||||
|
MethodName = methodName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ServiceNotImplementedException(IpcService service, ServiceCtx context, string message, Exception inner) : base(message, inner)
|
public ServiceNotImplementedException(IpcService service, ServiceCtx context, string message, Exception inner, [CallerMemberName] string methodName = null) : base(message, inner)
|
||||||
{
|
{
|
||||||
Service = service;
|
Service = service;
|
||||||
Context = context;
|
Context = context;
|
||||||
Request = context.Request;
|
Request = context.Request;
|
||||||
|
MethodName = methodName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string Message
|
public override string Message
|
||||||
@@ -47,25 +48,12 @@ namespace Ryujinx.HLE.Exceptions
|
|||||||
{
|
{
|
||||||
StringBuilder sb = new();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
// Print the IPC command details (service name, command ID, and handler)
|
int commandId = Request.Type > IpcMessageType.TipcCloseSession
|
||||||
(Type callingType, MethodBase callingMethod) = WalkStackTrace(new StackTrace(this));
|
? Service.TipcCommandIdByMethodName(MethodName)
|
||||||
|
: Service.CmifCommandIdByMethodName(MethodName);
|
||||||
|
|
||||||
if (callingType != null && callingMethod != null)
|
sb.AppendLine($"Service Command: {Service.GetType().FullName}: {commandId} ({MethodName})");
|
||||||
{
|
sb.AppendLine();
|
||||||
// If the type is past 0xF, we are using TIPC
|
|
||||||
IReadOnlyDictionary<int, MethodInfo> ipcCommands = Request.Type > IpcMessageType.TipcCloseSession ? Service.TipcCommands : Service.CmifCommands;
|
|
||||||
|
|
||||||
// Find the handler for the method called
|
|
||||||
KeyValuePair<int, MethodInfo> ipcHandler = ipcCommands.FirstOrDefault(x => x.Value == callingMethod);
|
|
||||||
int ipcCommandId = ipcHandler.Key;
|
|
||||||
MethodInfo ipcMethod = ipcHandler.Value;
|
|
||||||
|
|
||||||
if (ipcMethod != null)
|
|
||||||
{
|
|
||||||
sb.AppendLine($"Service Command: {Service.GetType().FullName}: {ipcCommandId} ({ipcMethod.Name})");
|
|
||||||
sb.AppendLine();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sb.AppendLine("Guest Stack Trace:");
|
sb.AppendLine("Guest Stack Trace:");
|
||||||
sb.AppendLine(Context.Thread.GetGuestStackTrace());
|
sb.AppendLine(Context.Thread.GetGuestStackTrace());
|
||||||
@@ -137,26 +125,5 @@ namespace Ryujinx.HLE.Exceptions
|
|||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static (Type, MethodBase) WalkStackTrace(StackTrace trace)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
StackFrame frame;
|
|
||||||
|
|
||||||
// Find the IIpcService method that threw this exception
|
|
||||||
while ((frame = trace.GetFrame(i++)) != null)
|
|
||||||
{
|
|
||||||
MethodBase method = frame.GetMethod();
|
|
||||||
Type declType = method.DeclaringType;
|
|
||||||
|
|
||||||
if (typeof(IpcService).IsAssignableFrom(declType))
|
|
||||||
{
|
|
||||||
return (declType, method);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (null, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
||||||
{
|
{
|
||||||
class IManagerForApplication : IpcService
|
partial class IManagerForApplication : IpcService
|
||||||
{
|
{
|
||||||
private readonly ManagerServer _managerServer;
|
private readonly ManagerServer _managerServer;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
||||||
{
|
{
|
||||||
class IManagerForSystemService : IpcService
|
partial class IManagerForSystemService : IpcService
|
||||||
{
|
{
|
||||||
private readonly ManagerServer _managerServer;
|
private readonly ManagerServer _managerServer;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
||||||
{
|
{
|
||||||
class IProfile : IpcService
|
partial class IProfile : IpcService
|
||||||
{
|
{
|
||||||
private readonly ProfileServer _profileServer;
|
private readonly ProfileServer _profileServer;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
||||||
{
|
{
|
||||||
class IProfileEditor : IpcService
|
partial class IProfileEditor : IpcService
|
||||||
{
|
{
|
||||||
private readonly ProfileServer _profileServer;
|
private readonly ProfileServer _profileServer;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Ryujinx.HLE.HOS.Services.Account.Acc.AccountService;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
{
|
{
|
||||||
[Service("acc:su", AccountServiceFlag.Administrator)] // Max Sessions: 8
|
[Service("acc:su", AccountServiceFlag.Administrator)] // Max Sessions: 8
|
||||||
class IAccountServiceForAdministrator : IpcService
|
partial class IAccountServiceForAdministrator : IpcService
|
||||||
{
|
{
|
||||||
private readonly ApplicationServiceServer _applicationServiceServer;
|
private readonly ApplicationServiceServer _applicationServiceServer;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Ryujinx.HLE.HOS.Services.Arp;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
{
|
{
|
||||||
[Service("acc:u0", AccountServiceFlag.Application)] // Max Sessions: 4
|
[Service("acc:u0", AccountServiceFlag.Application)] // Max Sessions: 4
|
||||||
class IAccountServiceForApplication : IpcService
|
partial class IAccountServiceForApplication : IpcService
|
||||||
{
|
{
|
||||||
private readonly ApplicationServiceServer _applicationServiceServer;
|
private readonly ApplicationServiceServer _applicationServiceServer;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Ryujinx.HLE.HOS.Services.Account.Acc.AccountService;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
{
|
{
|
||||||
[Service("acc:u1", AccountServiceFlag.SystemService)] // Max Sessions: 16
|
[Service("acc:u1", AccountServiceFlag.SystemService)] // Max Sessions: 16
|
||||||
class IAccountServiceForSystemService : IpcService
|
partial class IAccountServiceForSystemService : IpcService
|
||||||
{
|
{
|
||||||
private readonly ApplicationServiceServer _applicationServiceServer;
|
private readonly ApplicationServiceServer _applicationServiceServer;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
{
|
{
|
||||||
class IAsyncContext : IpcService
|
partial class IAsyncContext : IpcService
|
||||||
{
|
{
|
||||||
protected AsyncExecution AsyncExecution;
|
protected AsyncExecution AsyncExecution;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using Ryujinx.HLE.HOS.Services.Account.Acc.AsyncContext;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
{
|
{
|
||||||
class IAsyncNetworkServiceLicenseKindContext : IAsyncContext
|
partial class IAsyncNetworkServiceLicenseKindContext : IAsyncContext
|
||||||
{
|
{
|
||||||
private readonly NetworkServiceLicenseKind? _serviceLicenseKind;
|
private readonly NetworkServiceLicenseKind? _serviceLicenseKind;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
|||||||
[Service("acc:aa", AccountServiceFlag.BaasAccessTokenAccessor)] // Max Sessions: 4
|
[Service("acc:aa", AccountServiceFlag.BaasAccessTokenAccessor)] // Max Sessions: 4
|
||||||
class IBaasAccessTokenAccessor : IpcService
|
class IBaasAccessTokenAccessor : IpcService
|
||||||
{
|
{
|
||||||
public IBaasAccessTokenAccessor(ServiceCtx context) { }
|
public IBaasAccessTokenAccessor(ServiceCtx context, AccountServiceFlag serviceFlag) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemA
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService
|
||||||
{
|
{
|
||||||
class ILibraryAppletProxy : IpcService
|
partial class ILibraryAppletProxy : IpcService
|
||||||
{
|
{
|
||||||
private readonly ulong _pid;
|
private readonly ulong _pid;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemA
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService
|
||||||
{
|
{
|
||||||
class ISystemAppletProxy : IpcService
|
partial class ISystemAppletProxy : IpcService
|
||||||
{
|
{
|
||||||
private readonly ulong _pid;
|
private readonly ulong _pid;
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.LibraryAppletCreator
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.LibraryAppletCreator
|
||||||
{
|
{
|
||||||
class ILibraryAppletAccessor : DisposableIpcService
|
partial class ILibraryAppletAccessor : DisposableIpcService
|
||||||
{
|
{
|
||||||
private readonly KernelContext _kernelContext;
|
private readonly KernelContext _kernelContext;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.LibraryAppletProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.LibraryAppletProxy
|
||||||
{
|
{
|
||||||
class ILibraryAppletSelfAccessor : IpcService
|
partial class ILibraryAppletSelfAccessor : IpcService
|
||||||
{
|
{
|
||||||
private readonly AppletStandalone _appletStandalone = new();
|
private readonly AppletStandalone _appletStandalone = new();
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using Ryujinx.Common;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.LibraryAppletProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.LibraryAppletProxy
|
||||||
{
|
{
|
||||||
class IProcessWindingController : IpcService
|
partial class IProcessWindingController : IpcService
|
||||||
{
|
{
|
||||||
public IProcessWindingController() { }
|
public IProcessWindingController() { }
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using Ryujinx.Common.Logging;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
||||||
{
|
{
|
||||||
class IAudioController : IpcService
|
partial class IAudioController : IpcService
|
||||||
{
|
{
|
||||||
public IAudioController() { }
|
public IAudioController() { }
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
||||||
{
|
{
|
||||||
class ICommonStateGetter : DisposableIpcService
|
partial class ICommonStateGetter : DisposableIpcService
|
||||||
{
|
{
|
||||||
private readonly ServiceCtx _context;
|
private readonly ServiceCtx _context;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
||||||
{
|
{
|
||||||
class IDisplayController : IpcService
|
partial class IDisplayController : IpcService
|
||||||
{
|
{
|
||||||
private readonly KTransferMemory _transferMem;
|
private readonly KTransferMemory _transferMem;
|
||||||
private bool _lastApplicationCaptureBufferAcquired;
|
private bool _lastApplicationCaptureBufferAcquired;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
||||||
{
|
{
|
||||||
class IHomeMenuFunctions : IpcService
|
partial class IHomeMenuFunctions : IpcService
|
||||||
{
|
{
|
||||||
private readonly KEvent _channelEvent;
|
private readonly KEvent _channelEvent;
|
||||||
private int _channelEventHandle;
|
private int _channelEventHandle;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Library
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
||||||
{
|
{
|
||||||
class ILibraryAppletCreator : IpcService
|
partial class ILibraryAppletCreator : IpcService
|
||||||
{
|
{
|
||||||
public ILibraryAppletCreator() { }
|
public ILibraryAppletCreator() { }
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using System.Threading;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
||||||
{
|
{
|
||||||
class ISelfController : IpcService
|
partial class ISelfController : IpcService
|
||||||
{
|
{
|
||||||
private readonly ulong _pid;
|
private readonly ulong _pid;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using Ryujinx.Common.Logging;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
|
||||||
{
|
{
|
||||||
class IWindowController : IpcService
|
partial class IWindowController : IpcService
|
||||||
{
|
{
|
||||||
private readonly ulong _pid;
|
private readonly ulong _pid;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
||||||
{
|
{
|
||||||
[Service("appletAE")]
|
[Service("appletAE")]
|
||||||
class IAllSystemAppletProxiesService : IpcService
|
partial class IAllSystemAppletProxiesService : IpcService
|
||||||
{
|
{
|
||||||
public IAllSystemAppletProxiesService(ServiceCtx context) { }
|
public IAllSystemAppletProxiesService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
||||||
{
|
{
|
||||||
class IStorage : IpcService
|
partial class IStorage : IpcService
|
||||||
{
|
{
|
||||||
public bool IsReadOnly { get; private set; }
|
public bool IsReadOnly { get; private set; }
|
||||||
public byte[] Data { get; private set; }
|
public byte[] Data { get; private set; }
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
||||||
{
|
{
|
||||||
class IStorageAccessor : IpcService
|
partial class IStorageAccessor : IpcService
|
||||||
{
|
{
|
||||||
private readonly IStorage _storage;
|
private readonly IStorage _storage;
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ using ApplicationId = LibHac.Ncm.ApplicationId;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy
|
||||||
{
|
{
|
||||||
class IApplicationFunctions : IpcService
|
partial class IApplicationFunctions : IpcService
|
||||||
{
|
{
|
||||||
private long _defaultSaveDataSize = 200000000;
|
private long _defaultSaveDataSize = 200000000;
|
||||||
private long _defaultJournalSaveDataSize = 200000000;
|
private long _defaultJournalSaveDataSize = 200000000;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationPr
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService
|
||||||
{
|
{
|
||||||
class IApplicationProxy : IpcService
|
partial class IApplicationProxy : IpcService
|
||||||
{
|
{
|
||||||
private readonly ulong _pid;
|
private readonly ulong _pid;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Am
|
namespace Ryujinx.HLE.HOS.Services.Am
|
||||||
{
|
{
|
||||||
[Service("appletOE")]
|
[Service("appletOE")]
|
||||||
class IApplicationProxyService : IpcService
|
partial class IApplicationProxyService : IpcService
|
||||||
{
|
{
|
||||||
public IApplicationProxyService(ServiceCtx context) { }
|
public IApplicationProxyService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Apm
|
namespace Ryujinx.HLE.HOS.Services.Apm
|
||||||
{
|
{
|
||||||
abstract class IManager : IpcService
|
abstract partial class IManager : IpcService
|
||||||
{
|
{
|
||||||
public IManager(ServiceCtx context) { }
|
public IManager(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ namespace Ryujinx.HLE.HOS.Services.Apm
|
|||||||
// NOTE: This service doesn’t exist anymore after firmware 7.0.1. But some outdated homebrew still uses it.
|
// NOTE: This service doesn’t exist anymore after firmware 7.0.1. But some outdated homebrew still uses it.
|
||||||
|
|
||||||
[Service("apm:p")] // 1.0.0-7.0.1
|
[Service("apm:p")] // 1.0.0-7.0.1
|
||||||
class IManagerPrivileged : IpcService
|
partial class IManagerPrivileged : IpcService
|
||||||
{
|
{
|
||||||
public IManagerPrivileged(ServiceCtx context) { }
|
public IManagerPrivileged(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Apm
|
namespace Ryujinx.HLE.HOS.Services.Apm
|
||||||
{
|
{
|
||||||
abstract class ISession : IpcService
|
abstract partial class ISession : IpcService
|
||||||
{
|
{
|
||||||
public ISession(ServiceCtx context) { }
|
public ISession(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Apm
|
namespace Ryujinx.HLE.HOS.Services.Apm
|
||||||
{
|
{
|
||||||
abstract class ISystemManager : IpcService
|
abstract partial class ISystemManager : IpcService
|
||||||
{
|
{
|
||||||
public ISystemManager(ServiceCtx context) { }
|
public ISystemManager(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using System;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Bluetooth
|
namespace Ryujinx.HLE.HOS.Services.Bluetooth
|
||||||
{
|
{
|
||||||
[Service("btdrv")]
|
[Service("btdrv")]
|
||||||
class IBluetoothDriver : IpcService
|
partial class IBluetoothDriver : IpcService
|
||||||
{
|
{
|
||||||
#pragma warning disable CS0414, IDE0052 // Remove unread private member
|
#pragma warning disable CS0414, IDE0052 // Remove unread private member
|
||||||
private string _unknownLowEnergy;
|
private string _unknownLowEnergy;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Ryujinx.HLE.HOS.Services.Settings;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Bluetooth
|
namespace Ryujinx.HLE.HOS.Services.Bluetooth
|
||||||
{
|
{
|
||||||
[Service("bt")]
|
[Service("bt")]
|
||||||
class IBluetoothUser : IpcService
|
partial class IBluetoothUser : IpcService
|
||||||
{
|
{
|
||||||
public IBluetoothUser(ServiceCtx context) { }
|
public IBluetoothUser(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Ryujinx.Horizon.Common;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser
|
namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser
|
||||||
{
|
{
|
||||||
class IBtmUserCore : IpcService
|
partial class IBtmUserCore : IpcService
|
||||||
{
|
{
|
||||||
public KEvent _bleScanEvent;
|
public KEvent _bleScanEvent;
|
||||||
public int _bleScanEventHandle;
|
public int _bleScanEventHandle;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.BluetoothManager
|
namespace Ryujinx.HLE.HOS.Services.BluetoothManager
|
||||||
{
|
{
|
||||||
[Service("btm:u")] // 5.0.0+
|
[Service("btm:u")] // 5.0.0+
|
||||||
class IBtmUser : IpcService
|
partial class IBtmUser : IpcService
|
||||||
{
|
{
|
||||||
public IBtmUser(ServiceCtx context) { }
|
public IBtmUser(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Ryujinx.HLE.HOS.Services.Caps.Types;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Caps
|
namespace Ryujinx.HLE.HOS.Services.Caps
|
||||||
{
|
{
|
||||||
[Service("caps:u")]
|
[Service("caps:u")]
|
||||||
class IAlbumApplicationService : IpcService
|
partial class IAlbumApplicationService : IpcService
|
||||||
{
|
{
|
||||||
public IAlbumApplicationService(ServiceCtx context) { }
|
public IAlbumApplicationService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Caps
|
namespace Ryujinx.HLE.HOS.Services.Caps
|
||||||
{
|
{
|
||||||
[Service("caps:c")]
|
[Service("caps:c")]
|
||||||
class IAlbumControlService : IpcService
|
partial class IAlbumControlService : IpcService
|
||||||
{
|
{
|
||||||
public IAlbumControlService(ServiceCtx context) { }
|
public IAlbumControlService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Ryujinx.HLE.HOS.Services.Caps.Types;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Caps
|
namespace Ryujinx.HLE.HOS.Services.Caps
|
||||||
{
|
{
|
||||||
[Service("caps:su")] // 6.0.0+
|
[Service("caps:su")] // 6.0.0+
|
||||||
class IScreenShotApplicationService : IpcService
|
partial class IScreenShotApplicationService : IpcService
|
||||||
{
|
{
|
||||||
public IScreenShotApplicationService(ServiceCtx context) { }
|
public IScreenShotApplicationService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Ryujinx.Horizon.Common;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Ectx
|
namespace Ryujinx.HLE.HOS.Services.Ectx
|
||||||
{
|
{
|
||||||
class IContextRegistrar : DisposableIpcService
|
partial class IContextRegistrar : DisposableIpcService
|
||||||
{
|
{
|
||||||
public IContextRegistrar(ServiceCtx context) { }
|
public IContextRegistrar(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Ectx
|
namespace Ryujinx.HLE.HOS.Services.Ectx
|
||||||
{
|
{
|
||||||
[Service("ectx:aw")] // 11.0.0+
|
[Service("ectx:aw")] // 11.0.0+
|
||||||
class IWriterForApplication : IpcService
|
partial class IWriterForApplication : IpcService
|
||||||
{
|
{
|
||||||
public IWriterForApplication(ServiceCtx context) { }
|
public IWriterForApplication(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using System.Text;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Fatal
|
namespace Ryujinx.HLE.HOS.Services.Fatal
|
||||||
{
|
{
|
||||||
[Service("fatal:u")]
|
[Service("fatal:u")]
|
||||||
class IService : IpcService
|
partial class IService : IpcService
|
||||||
{
|
{
|
||||||
public IService(ServiceCtx context) { }
|
public IService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Ryujinx.Memory;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
{
|
{
|
||||||
class IDirectory : DisposableIpcService
|
partial class IDirectory : DisposableIpcService
|
||||||
{
|
{
|
||||||
private SharedRef<LibHac.FsSrv.Sf.IDirectory> _baseDirectory;
|
private SharedRef<LibHac.FsSrv.Sf.IDirectory> _baseDirectory;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using Ryujinx.Memory;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
{
|
{
|
||||||
class IFile : DisposableIpcService
|
partial class IFile : DisposableIpcService
|
||||||
{
|
{
|
||||||
private SharedRef<LibHac.FsSrv.Sf.IFile> _baseFile;
|
private SharedRef<LibHac.FsSrv.Sf.IFile> _baseFile;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using Path = LibHac.FsSrv.Sf.Path;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
{
|
{
|
||||||
class IFileSystem : DisposableIpcService
|
partial class IFileSystem : DisposableIpcService
|
||||||
{
|
{
|
||||||
private SharedRef<LibHac.FsSrv.Sf.IFileSystem> _fileSystem;
|
private SharedRef<LibHac.FsSrv.Sf.IFileSystem> _fileSystem;
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using System.Threading;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
{
|
{
|
||||||
class IStorage : DisposableIpcService
|
partial class IStorage : DisposableIpcService
|
||||||
{
|
{
|
||||||
private SharedRef<LibHac.FsSrv.Sf.IStorage> _baseStorage;
|
private SharedRef<LibHac.FsSrv.Sf.IStorage> _baseStorage;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using GameCardHandle = System.UInt32;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Fs
|
namespace Ryujinx.HLE.HOS.Services.Fs
|
||||||
{
|
{
|
||||||
class IDeviceOperator : DisposableIpcService
|
partial class IDeviceOperator : DisposableIpcService
|
||||||
{
|
{
|
||||||
private SharedRef<LibHac.FsSrv.Sf.IDeviceOperator> _baseOperator;
|
private SharedRef<LibHac.FsSrv.Sf.IDeviceOperator> _baseOperator;
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ using IStorage = LibHac.FsSrv.Sf.IStorage;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Fs
|
namespace Ryujinx.HLE.HOS.Services.Fs
|
||||||
{
|
{
|
||||||
[Service("fsp-srv")]
|
[Service("fsp-srv")]
|
||||||
class IFileSystemProxy : DisposableIpcService
|
partial class IFileSystemProxy : DisposableIpcService
|
||||||
{
|
{
|
||||||
private SharedRef<LibHac.FsSrv.Sf.IFileSystemProxy> _baseFileSystemProxy;
|
private SharedRef<LibHac.FsSrv.Sf.IFileSystemProxy> _baseFileSystemProxy;
|
||||||
private ulong _pid;
|
private ulong _pid;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Fs
|
namespace Ryujinx.HLE.HOS.Services.Fs
|
||||||
{
|
{
|
||||||
class IMultiCommitManager : DisposableIpcService // 6.0.0+
|
partial class IMultiCommitManager : DisposableIpcService // 6.0.0+
|
||||||
{
|
{
|
||||||
private SharedRef<LibHac.FsSrv.Sf.IMultiCommitManager> _baseCommitManager;
|
private SharedRef<LibHac.FsSrv.Sf.IMultiCommitManager> _baseCommitManager;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Ryujinx.Memory;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Fs
|
namespace Ryujinx.HLE.HOS.Services.Fs
|
||||||
{
|
{
|
||||||
class ISaveDataInfoReader : DisposableIpcService
|
partial class ISaveDataInfoReader : DisposableIpcService
|
||||||
{
|
{
|
||||||
private SharedRef<LibHac.FsSrv.Sf.ISaveDataInfoReader> _baseReader;
|
private SharedRef<LibHac.FsSrv.Sf.ISaveDataInfoReader> _baseReader;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Hid.HidServer
|
namespace Ryujinx.HLE.HOS.Services.Hid.HidServer
|
||||||
{
|
{
|
||||||
class IActiveApplicationDeviceList : IpcService
|
partial class IActiveApplicationDeviceList : IpcService
|
||||||
{
|
{
|
||||||
public IActiveApplicationDeviceList() { }
|
public IActiveApplicationDeviceList() { }
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Hid.HidServer
|
namespace Ryujinx.HLE.HOS.Services.Hid.HidServer
|
||||||
{
|
{
|
||||||
class IAppletResource : IpcService
|
partial class IAppletResource : IpcService
|
||||||
{
|
{
|
||||||
private readonly KSharedMemory _hidSharedMem;
|
private readonly KSharedMemory _hidSharedMem;
|
||||||
private int _hidSharedMemHandle;
|
private int _hidSharedMemHandle;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ using System.Runtime.InteropServices;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Hid
|
namespace Ryujinx.HLE.HOS.Services.Hid
|
||||||
{
|
{
|
||||||
[Service("hid")]
|
[Service("hid")]
|
||||||
class IHidServer : IpcService
|
partial class IHidServer : IpcService
|
||||||
{
|
{
|
||||||
private readonly KEvent _xpadIdEvent;
|
private readonly KEvent _xpadIdEvent;
|
||||||
private readonly KEvent _palmaOperationCompleteEvent;
|
private readonly KEvent _palmaOperationCompleteEvent;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Ryujinx.HLE.HOS.Services.Hid.Types;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Hid
|
namespace Ryujinx.HLE.HOS.Services.Hid
|
||||||
{
|
{
|
||||||
[Service("hid:sys")]
|
[Service("hid:sys")]
|
||||||
class IHidSystemServer : IpcService
|
partial class IHidSystemServer : IpcService
|
||||||
{
|
{
|
||||||
public IHidSystemServer(ServiceCtx context) { }
|
public IHidSystemServer(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Ryujinx.Common.Logging;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Hid
|
namespace Ryujinx.HLE.HOS.Services.Hid
|
||||||
{
|
{
|
||||||
[Service("hidbus")]
|
[Service("hidbus")]
|
||||||
class IHidbusServer : IpcService
|
partial class IHidbusServer : IpcService
|
||||||
{
|
{
|
||||||
public IHidbusServer(ServiceCtx context) { }
|
public IHidbusServer(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ using System;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Hid.Irs
|
namespace Ryujinx.HLE.HOS.Services.Hid.Irs
|
||||||
{
|
{
|
||||||
[Service("irs")]
|
[Service("irs")]
|
||||||
class IIrSensorServer : IpcService
|
partial class IIrSensorServer : IpcService
|
||||||
{
|
{
|
||||||
private int _irsensorSharedMemoryHandle = 0;
|
private int _irsensorSharedMemoryHandle = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -13,9 +13,6 @@ namespace Ryujinx.HLE.HOS.Services
|
|||||||
{
|
{
|
||||||
abstract class IpcService
|
abstract class IpcService
|
||||||
{
|
{
|
||||||
public IReadOnlyDictionary<int, MethodInfo> CmifCommands { get; }
|
|
||||||
public IReadOnlyDictionary<int, MethodInfo> TipcCommands { get; }
|
|
||||||
|
|
||||||
public ServerBase Server { get; private set; }
|
public ServerBase Server { get; private set; }
|
||||||
|
|
||||||
private IpcService _parent;
|
private IpcService _parent;
|
||||||
@@ -23,46 +20,8 @@ namespace Ryujinx.HLE.HOS.Services
|
|||||||
private int _selfId;
|
private int _selfId;
|
||||||
private bool _isDomain;
|
private bool _isDomain;
|
||||||
|
|
||||||
// cache array so we don't recreate it all the time
|
public IpcService(ServerBase server = null)
|
||||||
private object[] _parameters = [null];
|
|
||||||
|
|
||||||
public IpcService(ServerBase server = null, bool registerTipc = false)
|
|
||||||
{
|
{
|
||||||
Stopwatch sw = Stopwatch.StartNew();
|
|
||||||
|
|
||||||
CmifCommands = GetType()
|
|
||||||
.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
|
|
||||||
.SelectMany(methodInfo => methodInfo.GetCustomAttributes<CommandCmifAttribute>()
|
|
||||||
.Select(command => (command.Id, methodInfo)))
|
|
||||||
.ToDictionary(command => command.Id, command => command.methodInfo);
|
|
||||||
|
|
||||||
sw.Stop();
|
|
||||||
|
|
||||||
Logger.Debug?.Print(
|
|
||||||
LogClass.Emulation,
|
|
||||||
$"{CmifCommands.Count} Cmif commands loaded in {sw.ElapsedTicks} ticks ({Stopwatch.Frequency} tps).",
|
|
||||||
GetType().AsPrettyString()
|
|
||||||
);
|
|
||||||
|
|
||||||
if (registerTipc)
|
|
||||||
{
|
|
||||||
sw.Start();
|
|
||||||
|
|
||||||
TipcCommands = GetType()
|
|
||||||
.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)
|
|
||||||
.SelectMany(methodInfo => methodInfo.GetCustomAttributes<CommandTipcAttribute>()
|
|
||||||
.Select(command => (command.Id, methodInfo)))
|
|
||||||
.ToDictionary(command => command.Id, command => command.methodInfo);
|
|
||||||
|
|
||||||
sw.Stop();
|
|
||||||
|
|
||||||
Logger.Debug?.Print(
|
|
||||||
LogClass.Emulation,
|
|
||||||
$"{TipcCommands.Count} Tipc commands loaded in {sw.ElapsedTicks} ticks ({Stopwatch.Frequency} tps).",
|
|
||||||
GetType().AsPrettyString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Server = server;
|
Server = server;
|
||||||
|
|
||||||
_parent = this;
|
_parent = this;
|
||||||
@@ -87,6 +46,49 @@ namespace Ryujinx.HLE.HOS.Services
|
|||||||
_isDomain = false;
|
_isDomain = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected virtual ResultCode InvokeCmifMethod(int id, ServiceCtx context)
|
||||||
|
{
|
||||||
|
if (!context.Device.Configuration.IgnoreMissingServices)
|
||||||
|
{
|
||||||
|
string dbgMessage = $"{this.GetType().FullName}: {id}";
|
||||||
|
|
||||||
|
throw new ServiceNotImplementedException(this, context, dbgMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
string serviceName = (this is not DummyService dummyService)
|
||||||
|
? this.GetType().FullName
|
||||||
|
: dummyService.ServiceName;
|
||||||
|
|
||||||
|
Logger.Warning?.Print(LogClass.KernelIpc, $"Missing service {serviceName}: {id} ignored");
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual int CmifCommandIdByMethodName(string name) => -1;
|
||||||
|
|
||||||
|
protected virtual ResultCode InvokeTipcMethod(int id, ServiceCtx context)
|
||||||
|
{
|
||||||
|
if (!context.Device.Configuration.IgnoreMissingServices)
|
||||||
|
{
|
||||||
|
string dbgMessage = $"{this.GetType().FullName}: {id}";
|
||||||
|
|
||||||
|
throw new ServiceNotImplementedException(this, context, dbgMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
string serviceName = (this is not DummyService dummyService)
|
||||||
|
? this.GetType().FullName
|
||||||
|
: dummyService.ServiceName;
|
||||||
|
|
||||||
|
Logger.Warning?.Print(LogClass.KernelIpc, $"Missing service {serviceName}: {id} ignored");
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual int TipcCommandIdByMethodName(string name) => -1;
|
||||||
|
|
||||||
|
protected void LogInvoke(string name)
|
||||||
|
=> Logger.Trace?.Print(LogClass.KernelIpc, $"{this.GetType().Name}: {name}");
|
||||||
|
|
||||||
public void CallCmifMethod(ServiceCtx context)
|
public void CallCmifMethod(ServiceCtx context)
|
||||||
{
|
{
|
||||||
IpcService service = this;
|
IpcService service = this;
|
||||||
@@ -137,93 +139,39 @@ namespace Ryujinx.HLE.HOS.Services
|
|||||||
#pragma warning restore IDE0059
|
#pragma warning restore IDE0059
|
||||||
int commandId = (int)context.RequestData.ReadInt64();
|
int commandId = (int)context.RequestData.ReadInt64();
|
||||||
|
|
||||||
bool serviceExists = service.CmifCommands.TryGetValue(commandId, out MethodInfo processRequest);
|
context.ResponseData.BaseStream.Seek(_isDomain ? 0x20 : 0x10, SeekOrigin.Begin);
|
||||||
|
|
||||||
if (context.Device.Configuration.IgnoreMissingServices || serviceExists)
|
ResultCode result = service.InvokeCmifMethod(commandId, context);
|
||||||
|
|
||||||
|
if (_isDomain)
|
||||||
{
|
{
|
||||||
ResultCode result = ResultCode.Success;
|
foreach (int id in context.Response.ObjectIds)
|
||||||
|
|
||||||
context.ResponseData.BaseStream.Seek(_isDomain ? 0x20 : 0x10, SeekOrigin.Begin);
|
|
||||||
|
|
||||||
if (serviceExists)
|
|
||||||
{
|
{
|
||||||
Logger.Trace?.Print(LogClass.KernelIpc, $"{service.GetType().Name}: {processRequest.Name}");
|
context.ResponseData.Write(id);
|
||||||
|
|
||||||
_parameters[0] = context;
|
|
||||||
|
|
||||||
result = (ResultCode)processRequest.Invoke(service, _parameters);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
string serviceName = (service is not DummyService dummyService) ? service.GetType().FullName : dummyService.ServiceName;
|
|
||||||
|
|
||||||
Logger.Warning?.Print(LogClass.KernelIpc, $"Missing service {serviceName}: {commandId} ignored");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_isDomain)
|
context.ResponseData.BaseStream.Seek(0, SeekOrigin.Begin);
|
||||||
{
|
|
||||||
foreach (int id in context.Response.ObjectIds)
|
|
||||||
{
|
|
||||||
context.ResponseData.Write(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
context.ResponseData.BaseStream.Seek(0, SeekOrigin.Begin);
|
context.ResponseData.Write(context.Response.ObjectIds.Count);
|
||||||
|
|
||||||
context.ResponseData.Write(context.Response.ObjectIds.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
context.ResponseData.BaseStream.Seek(_isDomain ? 0x10 : 0, SeekOrigin.Begin);
|
|
||||||
|
|
||||||
context.ResponseData.Write(IpcMagic.Sfco);
|
|
||||||
context.ResponseData.Write((long)result);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
string dbgMessage = $"{service.GetType().FullName}: {commandId}";
|
|
||||||
|
|
||||||
throw new ServiceNotImplementedException(service, context, dbgMessage);
|
context.ResponseData.BaseStream.Seek(_isDomain ? 0x10 : 0, SeekOrigin.Begin);
|
||||||
}
|
|
||||||
|
context.ResponseData.Write(IpcMagic.Sfco);
|
||||||
|
context.ResponseData.Write((long)result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CallTipcMethod(ServiceCtx context)
|
public void CallTipcMethod(ServiceCtx context)
|
||||||
{
|
{
|
||||||
int commandId = (int)context.Request.Type - 0x10;
|
int commandId = (int)context.Request.Type - 0x10;
|
||||||
|
|
||||||
bool serviceExists = TipcCommands.TryGetValue(commandId, out MethodInfo processRequest);
|
context.ResponseData.BaseStream.Seek(0x4, SeekOrigin.Begin);
|
||||||
|
|
||||||
if (context.Device.Configuration.IgnoreMissingServices || serviceExists)
|
ResultCode result = InvokeTipcMethod(commandId, context);
|
||||||
{
|
|
||||||
ResultCode result = ResultCode.Success;
|
|
||||||
|
|
||||||
context.ResponseData.BaseStream.Seek(0x4, SeekOrigin.Begin);
|
context.ResponseData.BaseStream.Seek(0, SeekOrigin.Begin);
|
||||||
|
|
||||||
if (serviceExists)
|
context.ResponseData.Write((uint)result);
|
||||||
{
|
|
||||||
Logger.Debug?.Print(LogClass.KernelIpc, $"{GetType().Name}: {processRequest.Name}");
|
|
||||||
|
|
||||||
_parameters[0] = context;
|
|
||||||
|
|
||||||
result = (ResultCode)processRequest.Invoke(this, _parameters);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
string serviceName;
|
|
||||||
|
|
||||||
serviceName = (this is not DummyService dummyService) ? GetType().FullName : dummyService.ServiceName;
|
|
||||||
|
|
||||||
Logger.Warning?.Print(LogClass.KernelIpc, $"Missing service {serviceName}: {commandId} ignored");
|
|
||||||
}
|
|
||||||
|
|
||||||
context.ResponseData.BaseStream.Seek(0, SeekOrigin.Begin);
|
|
||||||
|
|
||||||
context.ResponseData.Write((uint)result);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
string dbgMessage = $"{GetType().FullName}: {commandId}";
|
|
||||||
|
|
||||||
throw new ServiceNotImplementedException(this, context, dbgMessage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void MakeObject(ServiceCtx context, IpcService obj)
|
protected void MakeObject(ServiceCtx context, IpcService obj)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Ldn
|
namespace Ryujinx.HLE.HOS.Services.Ldn
|
||||||
{
|
{
|
||||||
[Service("ldn:u")]
|
[Service("ldn:u")]
|
||||||
class IUserServiceCreator : IpcService
|
partial class IUserServiceCreator : IpcService
|
||||||
{
|
{
|
||||||
public IUserServiceCreator(ServiceCtx context) : base(context.Device.System.LdnServer) { }
|
public IUserServiceCreator(ServiceCtx context) : base(context.Device.System.LdnServer) { }
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p
|
|||||||
{
|
{
|
||||||
[Service("lp2p:app")] // 9.0.0+
|
[Service("lp2p:app")] // 9.0.0+
|
||||||
[Service("lp2p:sys")] // 9.0.0+
|
[Service("lp2p:sys")] // 9.0.0+
|
||||||
class IServiceCreator : IpcService
|
partial class IServiceCreator : IpcService
|
||||||
{
|
{
|
||||||
public IServiceCreator(ServiceCtx context) { }
|
public IServiceCreator(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using Ryujinx.Common.Logging;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p
|
namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p
|
||||||
{
|
{
|
||||||
class ISfService : IpcService
|
partial class ISfService : IpcService
|
||||||
{
|
{
|
||||||
public ISfService(ServiceCtx context) { }
|
public ISfService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p
|
namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p
|
||||||
{
|
{
|
||||||
class ISfServiceMonitor : IpcService
|
partial class ISfServiceMonitor : IpcService
|
||||||
{
|
{
|
||||||
private readonly KEvent _stateChangeEvent;
|
private readonly KEvent _stateChangeEvent;
|
||||||
private readonly KEvent _jointEvent;
|
private readonly KEvent _jointEvent;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using Ryujinx.Common.Logging;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator
|
namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator
|
||||||
{
|
{
|
||||||
class IClientProcessMonitor : DisposableIpcService
|
partial class IClientProcessMonitor : DisposableIpcService
|
||||||
{
|
{
|
||||||
public IClientProcessMonitor(ServiceCtx context) { }
|
public IClientProcessMonitor(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ using System.Runtime.InteropServices;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator
|
namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator
|
||||||
{
|
{
|
||||||
class IUserLocalCommunicationService : IpcService, IDisposable
|
partial class IUserLocalCommunicationService : IpcService, IDisposable
|
||||||
{
|
{
|
||||||
public INetworkClient NetworkClient { get; private set; }
|
public INetworkClient NetworkClient { get; private set; }
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.Common.Logging;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Mii
|
namespace Ryujinx.HLE.HOS.Services.Mii
|
||||||
{
|
{
|
||||||
[Service("miiimg")] // 5.0.0+
|
[Service("miiimg")] // 5.0.0+
|
||||||
class IImageDatabaseService : IpcService
|
partial class IImageDatabaseService : IpcService
|
||||||
{
|
{
|
||||||
private uint _imageCount;
|
private uint _imageCount;
|
||||||
private bool _isDirty;
|
private bool _isDirty;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii
|
|||||||
{
|
{
|
||||||
[Service("mii:e", true)]
|
[Service("mii:e", true)]
|
||||||
[Service("mii:u", false)]
|
[Service("mii:u", false)]
|
||||||
class IStaticService : IpcService
|
partial class IStaticService : IpcService
|
||||||
{
|
{
|
||||||
private readonly DatabaseImpl _databaseImpl;
|
private readonly DatabaseImpl _databaseImpl;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using System.Runtime.InteropServices;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Mii.StaticService
|
namespace Ryujinx.HLE.HOS.Services.Mii.StaticService
|
||||||
{
|
{
|
||||||
abstract class IDatabaseService : IpcService
|
abstract partial class IDatabaseService : IpcService
|
||||||
{
|
{
|
||||||
[CommandCmif(0)]
|
[CommandCmif(0)]
|
||||||
// IsUpdated(SourceFlag flag) -> bool
|
// IsUpdated(SourceFlag flag) -> bool
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using Ryujinx.HLE.HOS.Services.Account.Acc;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Mnpp
|
namespace Ryujinx.HLE.HOS.Services.Mnpp
|
||||||
{
|
{
|
||||||
[Service("mnpp:app")] // 13.0.0+
|
[Service("mnpp:app")] // 13.0.0+
|
||||||
class IServiceForApplication : IpcService
|
partial class IServiceForApplication : IpcService
|
||||||
{
|
{
|
||||||
public IServiceForApplication(ServiceCtx context) { }
|
public IServiceForApplication(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Ncm.Lr
|
namespace Ryujinx.HLE.HOS.Services.Ncm.Lr
|
||||||
{
|
{
|
||||||
[Service("lr")]
|
[Service("lr")]
|
||||||
class ILocationResolverManager : IpcService
|
partial class ILocationResolverManager : IpcService
|
||||||
{
|
{
|
||||||
public ILocationResolverManager(ServiceCtx context) { }
|
public ILocationResolverManager(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using static Ryujinx.HLE.Utilities.StringUtils;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
{
|
{
|
||||||
class ILocationResolver : IpcService
|
partial class ILocationResolver : IpcService
|
||||||
{
|
{
|
||||||
private readonly StorageId _storageId;
|
private readonly StorageId _storageId;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Nfc.NfcManager;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Nfc
|
namespace Ryujinx.HLE.HOS.Services.Nfc
|
||||||
{
|
{
|
||||||
[Service("nfc:sys")]
|
[Service("nfc:sys")]
|
||||||
class ISystemManager : IpcService
|
partial class ISystemManager : IpcService
|
||||||
{
|
{
|
||||||
public ISystemManager(ServiceCtx context) { }
|
public ISystemManager(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Nfc.NfcManager;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Nfc
|
namespace Ryujinx.HLE.HOS.Services.Nfc
|
||||||
{
|
{
|
||||||
[Service("nfc:user")]
|
[Service("nfc:user")]
|
||||||
class IUserManager : IpcService
|
partial class IUserManager : IpcService
|
||||||
{
|
{
|
||||||
public IUserManager(ServiceCtx context) { }
|
public IUserManager(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Nfc.Mifare.MifareManager;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Nfc.Mifare
|
namespace Ryujinx.HLE.HOS.Services.Nfc.Mifare
|
||||||
{
|
{
|
||||||
[Service("nfc:mf:u")]
|
[Service("nfc:mf:u")]
|
||||||
class IUserManager : IpcService
|
partial class IUserManager : IpcService
|
||||||
{
|
{
|
||||||
public IUserManager(ServiceCtx context) { }
|
public IUserManager(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Nfc.Mifare.MifareManager
|
namespace Ryujinx.HLE.HOS.Services.Nfc.Mifare.MifareManager
|
||||||
{
|
{
|
||||||
class IMifare : IpcService
|
partial class IMifare : IpcService
|
||||||
{
|
{
|
||||||
private State _state;
|
private State _state;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using Ryujinx.Common.Logging;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Nfc.NfcManager
|
namespace Ryujinx.HLE.HOS.Services.Nfc.NfcManager
|
||||||
{
|
{
|
||||||
class INfc : IpcService
|
partial class INfc : IpcService
|
||||||
{
|
{
|
||||||
private readonly NfcPermissionLevel _permissionLevel;
|
private readonly NfcPermissionLevel _permissionLevel;
|
||||||
private State _state;
|
private State _state;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
{
|
{
|
||||||
[Service("nfp:dbg")]
|
[Service("nfp:dbg")]
|
||||||
class IAmManager : IpcService
|
partial class IAmManager : IpcService
|
||||||
{
|
{
|
||||||
public IAmManager(ServiceCtx context) { }
|
public IAmManager(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
{
|
{
|
||||||
[Service("nfp:sys")]
|
[Service("nfp:sys")]
|
||||||
class ISystemManager : IpcService
|
partial class ISystemManager : IpcService
|
||||||
{
|
{
|
||||||
public ISystemManager(ServiceCtx context) { }
|
public ISystemManager(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
{
|
{
|
||||||
[Service("nfp:user")]
|
[Service("nfp:user")]
|
||||||
class IUserManager : IpcService
|
partial class IUserManager : IpcService
|
||||||
{
|
{
|
||||||
public IUserManager(ServiceCtx context) { }
|
public IUserManager(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
{
|
{
|
||||||
class INfp : IpcService
|
partial class INfp : IpcService
|
||||||
{
|
{
|
||||||
#pragma warning disable IDE0052 // Remove unread private member
|
#pragma warning disable IDE0052 // Remove unread private member
|
||||||
private ulong _appletResourceUserId;
|
private ulong _appletResourceUserId;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Ngct
|
namespace Ryujinx.HLE.HOS.Services.Ngct
|
||||||
{
|
{
|
||||||
[Service("ngct:u")] // 9.0.0+
|
[Service("ngct:u")] // 9.0.0+
|
||||||
class IService : IpcService
|
partial class IService : IpcService
|
||||||
{
|
{
|
||||||
public IService(ServiceCtx context) { }
|
public IService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Ngct
|
namespace Ryujinx.HLE.HOS.Services.Ngct
|
||||||
{
|
{
|
||||||
[Service("ngct:s")] // 9.0.0+
|
[Service("ngct:s")] // 9.0.0+
|
||||||
class IServiceWithManagementApi : IpcService
|
partial class IServiceWithManagementApi : IpcService
|
||||||
{
|
{
|
||||||
public IServiceWithManagementApi(ServiceCtx context) { }
|
public IServiceWithManagementApi(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm
|
|||||||
[Service("nifm:a")] // Max sessions: 2
|
[Service("nifm:a")] // Max sessions: 2
|
||||||
[Service("nifm:s")] // Max sessions: 16
|
[Service("nifm:s")] // Max sessions: 16
|
||||||
[Service("nifm:u")] // Max sessions: 5
|
[Service("nifm:u")] // Max sessions: 5
|
||||||
class IStaticService : IpcService
|
partial class IStaticService : IpcService
|
||||||
{
|
{
|
||||||
public IStaticService(ServiceCtx context) { }
|
public IStaticService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using System.Runtime.CompilerServices;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
||||||
{
|
{
|
||||||
class IGeneralService : DisposableIpcService
|
partial class IGeneralService : DisposableIpcService
|
||||||
{
|
{
|
||||||
private readonly GeneralServiceDetail _generalServiceDetail;
|
private readonly GeneralServiceDetail _generalServiceDetail;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
||||||
{
|
{
|
||||||
class IRequest : IpcService
|
partial class IRequest : IpcService
|
||||||
{
|
{
|
||||||
private enum RequestState
|
private enum RequestState
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServiceA
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface
|
namespace Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface
|
||||||
{
|
{
|
||||||
class IShopServiceAccessServer : IpcService
|
partial class IShopServiceAccessServer : IpcService
|
||||||
{
|
{
|
||||||
public IShopServiceAccessServer() { }
|
public IShopServiceAccessServer() { }
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Nim
|
namespace Ryujinx.HLE.HOS.Services.Nim
|
||||||
{
|
{
|
||||||
[Service("nim:eca")] // 5.0.0+
|
[Service("nim:eca")] // 5.0.0+
|
||||||
class IShopServiceAccessServerInterface : IpcService
|
partial class IShopServiceAccessServerInterface : IpcService
|
||||||
{
|
{
|
||||||
public IShopServiceAccessServerInterface(ServiceCtx context) { }
|
public IShopServiceAccessServerInterface(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServiceAccessServer
|
namespace Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServiceAccessServer
|
||||||
{
|
{
|
||||||
class IShopServiceAccessor : IpcService
|
partial class IShopServiceAccessor : IpcService
|
||||||
{
|
{
|
||||||
private readonly KEvent _event;
|
private readonly KEvent _event;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Ryujinx.HLE.HOS.Services.Nim.Ntc.StaticService;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Nim.Ntc
|
namespace Ryujinx.HLE.HOS.Services.Nim.Ntc
|
||||||
{
|
{
|
||||||
[Service("ntc")]
|
[Service("ntc")]
|
||||||
class IStaticService : IpcService
|
partial class IStaticService : IpcService
|
||||||
{
|
{
|
||||||
public IStaticService(ServiceCtx context) { }
|
public IStaticService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Nim.Ntc.StaticService
|
namespace Ryujinx.HLE.HOS.Services.Nim.Ntc.StaticService
|
||||||
{
|
{
|
||||||
class IEnsureNetworkClockAvailabilityService : IpcService
|
partial class IEnsureNetworkClockAvailabilityService : IpcService
|
||||||
{
|
{
|
||||||
private readonly KEvent _finishNotificationEvent;
|
private readonly KEvent _finishNotificationEvent;
|
||||||
private ResultCode _taskResultCode;
|
private ResultCode _taskResultCode;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using System.Collections.Generic;
|
|||||||
namespace Ryujinx.HLE.HOS.Services.Ns.Aoc
|
namespace Ryujinx.HLE.HOS.Services.Ns.Aoc
|
||||||
{
|
{
|
||||||
[Service("aoc:u")]
|
[Service("aoc:u")]
|
||||||
class IAddOnContentManager : IpcService
|
partial class IAddOnContentManager : IpcService
|
||||||
{
|
{
|
||||||
private readonly KEvent _addOnContentListChangedEvent;
|
private readonly KEvent _addOnContentListChangedEvent;
|
||||||
private int _addOnContentListChangedEventHandle;
|
private int _addOnContentListChangedEventHandle;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user