Skip to content

Commit 2257b99

Browse files
authored
Refactor XDG Desktop Portal services. (#45)
* Refactor xdg portal services. * Fix service resolution. * Refactor cloning extensions. * Refactor screen grabber implementation to use factories and async disposal pattern * Add Kiota. * Add OpenApiStrictSchemaTypeTransformer
1 parent 1df045b commit 2257b99

File tree

174 files changed

+11849
-858
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

174 files changed

+11849
-858
lines changed

ControlR.Agent.Common/Services/AgentHeartbeatTimer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public async Task SendDeviceHeartbeat()
4040

4141
var device = await _deviceDataGenerator.CreateDevice(_settingsProvider.DeviceId);
4242

43-
var dto = device.CloneAs<DeviceModel, DeviceDto>();
43+
var dto = device.CloneAs<DeviceDto>();
4444

4545
var updateResult = await _hubConnection.Server.UpdateDevice(dto);
4646

ControlR.Agent.Common/Services/Base/AgentInstallerBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ protected async Task<Result> CreateDeviceOnServer(Guid? installerKeyId, string?
4343
var device = await _deviceDataGenerator.CreateDevice(currentOptions.DeviceId);
4444
device.TenantId = currentOptions.TenantId;
4545
device.TagIds = tagIds;
46-
var deviceDto = device.CloneAs<DeviceModel, DeviceDto>();
46+
var deviceDto = device.CloneAs<DeviceDto>();
4747

4848
Logger.LogInformation("Requesting device creation on the server with tags {TagIds}.", string.Join(", ", tagIds));
4949
var createResult = await _controlrApi.CreateDevice(deviceDto, installerKeyId.Value, installerKeySecret);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"version": 1,
3+
"isRoot": true,
4+
"tools": {
5+
"microsoft.openapi.kiota": {
6+
"version": "1.29.0",
7+
"commands": [
8+
"kiota"
9+
],
10+
"rollForward": false
11+
}
12+
}
13+
}

ControlR.ApiClient/ControlR.ApiClient.csproj

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
<Description>The API client for ControlR, an open-source remote control and remote access solution.</Description>
77
<PackageIcon>appicon.png</PackageIcon>
88
<PackageReadmeFile>README.md</PackageReadmeFile>
9-
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
9+
<PackageLicenseExpression>MIT</PackageLicenseExpression>
10+
<OpenApiSpecPath>../ControlR.Web.Server/ControlR.Web.Server.json</OpenApiSpecPath>
1011
</PropertyGroup>
1112
<ItemGroup>
1213
<None Include="..\.assets\appicon.png">
@@ -19,13 +20,15 @@
1920
</None>
2021
</ItemGroup>
2122
<ItemGroup>
22-
<OpenApiReference Include="..\ControlR.Web.Server\ControlR.Web.Server.json" ClassName="ControlrApiClient" Link="OpenAPIs\ControlR.Web.Server.json" />
23-
</ItemGroup>
24-
<ItemGroup>
25-
<PackageReference Include="Newtonsoft.Json" />
23+
<PackageReference Include="Microsoft.Kiota.Bundle" />
2624
<PackageReference Update="Bitbound.Analyzers.MemberOrder">
2725
<PrivateAssets>all</PrivateAssets>
2826
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2927
</PackageReference>
3028
</ItemGroup>
29+
<Target Name="GenerateKiotaClient" BeforeTargets="BeforeBuild">
30+
<Exec Command="dotnet tool restore" />
31+
<Message Importance="high" Text="Kiota: Generating client from $(OpenApiSpecPath)..." />
32+
<Exec Command="dotnet kiota generate -d $(OpenApiSpecPath) -l CSharp -o ./Output -n ControlR.ApiClient -c ControlrApiClient --clean-output" />
33+
</Target>
3134
</Project>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// <auto-generated/>
2+
#pragma warning disable CS0618
3+
using ControlR.ApiClient.Account.Logout;
4+
using ControlR.ApiClient.Account.Manage;
5+
using ControlR.ApiClient.Account.PasskeyCreationOptions;
6+
using ControlR.ApiClient.Account.PasskeyRequestOptions;
7+
using ControlR.ApiClient.Account.PerformExternalLogin;
8+
using Microsoft.Kiota.Abstractions.Extensions;
9+
using Microsoft.Kiota.Abstractions;
10+
using System.Collections.Generic;
11+
using System.IO;
12+
using System.Threading.Tasks;
13+
using System;
14+
namespace ControlR.ApiClient.Account
15+
{
16+
/// <summary>
17+
/// Builds and executes requests for operations under \Account
18+
/// </summary>
19+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
20+
public partial class AccountRequestBuilder : BaseRequestBuilder
21+
{
22+
/// <summary>The Logout property</summary>
23+
public global::ControlR.ApiClient.Account.Logout.LogoutRequestBuilder Logout
24+
{
25+
get => new global::ControlR.ApiClient.Account.Logout.LogoutRequestBuilder(PathParameters, RequestAdapter);
26+
}
27+
/// <summary>The Manage property</summary>
28+
public global::ControlR.ApiClient.Account.Manage.ManageRequestBuilder Manage
29+
{
30+
get => new global::ControlR.ApiClient.Account.Manage.ManageRequestBuilder(PathParameters, RequestAdapter);
31+
}
32+
/// <summary>The PasskeyCreationOptions property</summary>
33+
public global::ControlR.ApiClient.Account.PasskeyCreationOptions.PasskeyCreationOptionsRequestBuilder PasskeyCreationOptions
34+
{
35+
get => new global::ControlR.ApiClient.Account.PasskeyCreationOptions.PasskeyCreationOptionsRequestBuilder(PathParameters, RequestAdapter);
36+
}
37+
/// <summary>The PasskeyRequestOptions property</summary>
38+
public global::ControlR.ApiClient.Account.PasskeyRequestOptions.PasskeyRequestOptionsRequestBuilder PasskeyRequestOptions
39+
{
40+
get => new global::ControlR.ApiClient.Account.PasskeyRequestOptions.PasskeyRequestOptionsRequestBuilder(PathParameters, RequestAdapter);
41+
}
42+
/// <summary>The PerformExternalLogin property</summary>
43+
public global::ControlR.ApiClient.Account.PerformExternalLogin.PerformExternalLoginRequestBuilder PerformExternalLogin
44+
{
45+
get => new global::ControlR.ApiClient.Account.PerformExternalLogin.PerformExternalLoginRequestBuilder(PathParameters, RequestAdapter);
46+
}
47+
/// <summary>
48+
/// Instantiates a new <see cref="global::ControlR.ApiClient.Account.AccountRequestBuilder"/> and sets the default values.
49+
/// </summary>
50+
/// <param name="pathParameters">Path parameters for the request</param>
51+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
52+
public AccountRequestBuilder(Dictionary<string, object> pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/Account", pathParameters)
53+
{
54+
}
55+
/// <summary>
56+
/// Instantiates a new <see cref="global::ControlR.ApiClient.Account.AccountRequestBuilder"/> and sets the default values.
57+
/// </summary>
58+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
59+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
60+
public AccountRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/Account", rawUrl)
61+
{
62+
}
63+
}
64+
}
65+
#pragma warning restore CS0618
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// <auto-generated/>
2+
#pragma warning disable CS0618
3+
using Microsoft.Kiota.Abstractions.Extensions;
4+
using Microsoft.Kiota.Abstractions.Serialization;
5+
using System.Collections.Generic;
6+
using System.IO;
7+
using System;
8+
namespace ControlR.ApiClient.Account.Logout
9+
{
10+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
11+
#pragma warning disable CS1591
12+
public partial class LogoutPostRequestBody : IAdditionalDataHolder, IParsable
13+
#pragma warning restore CS1591
14+
{
15+
/// <summary>Stores additional data not described in the OpenAPI description found when deserializing. Can be used for serialization as well.</summary>
16+
public IDictionary<string, object> AdditionalData { get; set; }
17+
/// <summary>The returnUrl property</summary>
18+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
19+
#nullable enable
20+
public string? ReturnUrl { get; set; }
21+
#nullable restore
22+
#else
23+
public string ReturnUrl { get; set; }
24+
#endif
25+
/// <summary>
26+
/// Instantiates a new <see cref="global::ControlR.ApiClient.Account.Logout.LogoutPostRequestBody"/> and sets the default values.
27+
/// </summary>
28+
public LogoutPostRequestBody()
29+
{
30+
AdditionalData = new Dictionary<string, object>();
31+
}
32+
/// <summary>
33+
/// Creates a new instance of the appropriate class based on discriminator value
34+
/// </summary>
35+
/// <returns>A <see cref="global::ControlR.ApiClient.Account.Logout.LogoutPostRequestBody"/></returns>
36+
/// <param name="parseNode">The parse node to use to read the discriminator value and create the object</param>
37+
public static global::ControlR.ApiClient.Account.Logout.LogoutPostRequestBody CreateFromDiscriminatorValue(IParseNode parseNode)
38+
{
39+
if(ReferenceEquals(parseNode, null)) throw new ArgumentNullException(nameof(parseNode));
40+
return new global::ControlR.ApiClient.Account.Logout.LogoutPostRequestBody();
41+
}
42+
/// <summary>
43+
/// The deserialization information for the current model
44+
/// </summary>
45+
/// <returns>A IDictionary&lt;string, Action&lt;IParseNode&gt;&gt;</returns>
46+
public virtual IDictionary<string, Action<IParseNode>> GetFieldDeserializers()
47+
{
48+
return new Dictionary<string, Action<IParseNode>>
49+
{
50+
{ "returnUrl", n => { ReturnUrl = n.GetStringValue(); } },
51+
};
52+
}
53+
/// <summary>
54+
/// Serializes information the current object
55+
/// </summary>
56+
/// <param name="writer">Serialization writer to use to serialize this model</param>
57+
public virtual void Serialize(ISerializationWriter writer)
58+
{
59+
if(ReferenceEquals(writer, null)) throw new ArgumentNullException(nameof(writer));
60+
writer.WriteStringValue("returnUrl", ReturnUrl);
61+
writer.WriteAdditionalData(AdditionalData);
62+
}
63+
}
64+
}
65+
#pragma warning restore CS0618
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// <auto-generated/>
2+
#pragma warning disable CS0618
3+
using Microsoft.Kiota.Abstractions.Extensions;
4+
using Microsoft.Kiota.Abstractions.Serialization;
5+
using Microsoft.Kiota.Abstractions;
6+
using System.Collections.Generic;
7+
using System.IO;
8+
using System.Threading.Tasks;
9+
using System.Threading;
10+
using System;
11+
namespace ControlR.ApiClient.Account.Logout
12+
{
13+
/// <summary>
14+
/// Builds and executes requests for operations under \Account\Logout
15+
/// </summary>
16+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
17+
public partial class LogoutRequestBuilder : BaseRequestBuilder
18+
{
19+
/// <summary>
20+
/// Instantiates a new <see cref="global::ControlR.ApiClient.Account.Logout.LogoutRequestBuilder"/> and sets the default values.
21+
/// </summary>
22+
/// <param name="pathParameters">Path parameters for the request</param>
23+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
24+
public LogoutRequestBuilder(Dictionary<string, object> pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/Account/Logout", pathParameters)
25+
{
26+
}
27+
/// <summary>
28+
/// Instantiates a new <see cref="global::ControlR.ApiClient.Account.Logout.LogoutRequestBuilder"/> and sets the default values.
29+
/// </summary>
30+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
31+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
32+
public LogoutRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/Account/Logout", rawUrl)
33+
{
34+
}
35+
/// <returns>A <see cref="Stream"/></returns>
36+
/// <param name="body">The request body</param>
37+
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
38+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
39+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
40+
#nullable enable
41+
public async Task<Stream?> PostAsync(global::ControlR.ApiClient.Account.Logout.LogoutPostRequestBody body, Action<RequestConfiguration<DefaultQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default)
42+
{
43+
#nullable restore
44+
#else
45+
public async Task<Stream> PostAsync(global::ControlR.ApiClient.Account.Logout.LogoutPostRequestBody body, Action<RequestConfiguration<DefaultQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default)
46+
{
47+
#endif
48+
if(ReferenceEquals(body, null)) throw new ArgumentNullException(nameof(body));
49+
var requestInfo = ToPostRequestInformation(body, requestConfiguration);
50+
return await RequestAdapter.SendPrimitiveAsync<Stream>(requestInfo, default, cancellationToken).ConfigureAwait(false);
51+
}
52+
/// <returns>A <see cref="RequestInformation"/></returns>
53+
/// <param name="body">The request body</param>
54+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
55+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
56+
#nullable enable
57+
public RequestInformation ToPostRequestInformation(global::ControlR.ApiClient.Account.Logout.LogoutPostRequestBody body, Action<RequestConfiguration<DefaultQueryParameters>>? requestConfiguration = default)
58+
{
59+
#nullable restore
60+
#else
61+
public RequestInformation ToPostRequestInformation(global::ControlR.ApiClient.Account.Logout.LogoutPostRequestBody body, Action<RequestConfiguration<DefaultQueryParameters>> requestConfiguration = default)
62+
{
63+
#endif
64+
if(ReferenceEquals(body, null)) throw new ArgumentNullException(nameof(body));
65+
var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
66+
requestInfo.Configure(requestConfiguration);
67+
requestInfo.SetContentFromParsable(RequestAdapter, "multipart/form-data", body);
68+
return requestInfo;
69+
}
70+
/// <summary>
71+
/// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
72+
/// </summary>
73+
/// <returns>A <see cref="global::ControlR.ApiClient.Account.Logout.LogoutRequestBuilder"/></returns>
74+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
75+
public global::ControlR.ApiClient.Account.Logout.LogoutRequestBuilder WithUrl(string rawUrl)
76+
{
77+
return new global::ControlR.ApiClient.Account.Logout.LogoutRequestBuilder(rawUrl, RequestAdapter);
78+
}
79+
/// <summary>
80+
/// Configuration for the request such as headers, query parameters, and middleware options.
81+
/// </summary>
82+
[Obsolete("This class is deprecated. Please use the generic RequestConfiguration class generated by the generator.")]
83+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
84+
public partial class LogoutRequestBuilderPostRequestConfiguration : RequestConfiguration<DefaultQueryParameters>
85+
{
86+
}
87+
}
88+
}
89+
#pragma warning restore CS0618
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// <auto-generated/>
2+
#pragma warning disable CS0618
3+
using Microsoft.Kiota.Abstractions.Extensions;
4+
using Microsoft.Kiota.Abstractions.Serialization;
5+
using Microsoft.Kiota.Abstractions;
6+
using System.Collections.Generic;
7+
using System.IO;
8+
using System.Threading.Tasks;
9+
using System.Threading;
10+
using System;
11+
namespace ControlR.ApiClient.Account.Manage.DownloadPersonalData
12+
{
13+
/// <summary>
14+
/// Builds and executes requests for operations under \Account\Manage\DownloadPersonalData
15+
/// </summary>
16+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
17+
public partial class DownloadPersonalDataRequestBuilder : BaseRequestBuilder
18+
{
19+
/// <summary>
20+
/// Instantiates a new <see cref="global::ControlR.ApiClient.Account.Manage.DownloadPersonalData.DownloadPersonalDataRequestBuilder"/> and sets the default values.
21+
/// </summary>
22+
/// <param name="pathParameters">Path parameters for the request</param>
23+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
24+
public DownloadPersonalDataRequestBuilder(Dictionary<string, object> pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/Account/Manage/DownloadPersonalData", pathParameters)
25+
{
26+
}
27+
/// <summary>
28+
/// Instantiates a new <see cref="global::ControlR.ApiClient.Account.Manage.DownloadPersonalData.DownloadPersonalDataRequestBuilder"/> and sets the default values.
29+
/// </summary>
30+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
31+
/// <param name="requestAdapter">The request adapter to use to execute the requests.</param>
32+
public DownloadPersonalDataRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/Account/Manage/DownloadPersonalData", rawUrl)
33+
{
34+
}
35+
/// <returns>A <see cref="Stream"/></returns>
36+
/// <param name="cancellationToken">Cancellation token to use when cancelling requests</param>
37+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
38+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
39+
#nullable enable
40+
public async Task<Stream?> PostAsync(Action<RequestConfiguration<DefaultQueryParameters>>? requestConfiguration = default, CancellationToken cancellationToken = default)
41+
{
42+
#nullable restore
43+
#else
44+
public async Task<Stream> PostAsync(Action<RequestConfiguration<DefaultQueryParameters>> requestConfiguration = default, CancellationToken cancellationToken = default)
45+
{
46+
#endif
47+
var requestInfo = ToPostRequestInformation(requestConfiguration);
48+
return await RequestAdapter.SendPrimitiveAsync<Stream>(requestInfo, default, cancellationToken).ConfigureAwait(false);
49+
}
50+
/// <returns>A <see cref="RequestInformation"/></returns>
51+
/// <param name="requestConfiguration">Configuration for the request such as headers, query parameters, and middleware options.</param>
52+
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
53+
#nullable enable
54+
public RequestInformation ToPostRequestInformation(Action<RequestConfiguration<DefaultQueryParameters>>? requestConfiguration = default)
55+
{
56+
#nullable restore
57+
#else
58+
public RequestInformation ToPostRequestInformation(Action<RequestConfiguration<DefaultQueryParameters>> requestConfiguration = default)
59+
{
60+
#endif
61+
var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
62+
requestInfo.Configure(requestConfiguration);
63+
return requestInfo;
64+
}
65+
/// <summary>
66+
/// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
67+
/// </summary>
68+
/// <returns>A <see cref="global::ControlR.ApiClient.Account.Manage.DownloadPersonalData.DownloadPersonalDataRequestBuilder"/></returns>
69+
/// <param name="rawUrl">The raw URL to use for the request builder.</param>
70+
public global::ControlR.ApiClient.Account.Manage.DownloadPersonalData.DownloadPersonalDataRequestBuilder WithUrl(string rawUrl)
71+
{
72+
return new global::ControlR.ApiClient.Account.Manage.DownloadPersonalData.DownloadPersonalDataRequestBuilder(rawUrl, RequestAdapter);
73+
}
74+
/// <summary>
75+
/// Configuration for the request such as headers, query parameters, and middleware options.
76+
/// </summary>
77+
[Obsolete("This class is deprecated. Please use the generic RequestConfiguration class generated by the generator.")]
78+
[global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
79+
public partial class DownloadPersonalDataRequestBuilderPostRequestConfiguration : RequestConfiguration<DefaultQueryParameters>
80+
{
81+
}
82+
}
83+
}
84+
#pragma warning restore CS0618

0 commit comments

Comments
 (0)