namespace MFiles.Grpc.Samples.Recipes;
///
/// Recipe "connect": server version and capabilities before logging in, then log in, read the
/// session, keep it alive and log out.
///
public static class Connect
{
public static async Task RunAsync(MFilesSettings settings, string[] args)
{
// [START connect]
// No session is needed for these calls.
await using var connection = MFilesConnection.Open(settings);
var versionService = new IRPCQueryVersion.IRPCQueryVersionClient(connection.CallInvoker);
var version = await versionService.QueryVersionAsync(new QueryVersionRequest());
Console.WriteLine($"Server version: {DecodeVersion(version.ServerVersion)}");
var login = new IRPCLogin.IRPCLoginClient(connection.CallInvoker);
var capabilities = (await login.GetServerCapabilitiesAsync(new GetServerCapabilitiesRequest()))
.ServerCapabilities;
Console.WriteLine($"Server capabilities: file_streaming={capabilities.FileStreaming}, " +
$"facet_search={capabilities.FacetSearch}");
var session = await connection.LogInAsync(settings, RecipeHelpers.ClientName);
Console.WriteLine($"Logged in as {session.AccountName}; " +
$"keep-alive interval {session.KeepAliveIntervalInSeconds} s");
var info = (await login.GetVaultSessionInfoAsync(new GetVaultSessionInfoRequest())).VaultSessionInfo;
Console.WriteLine($"Vault: {info.VaultDisplayName} {info.VaultGuid}");
Console.WriteLine($"Metadata structure version: {connection.MetadataStructureVersion?.ToString() ?? "not reported"}");
// A long-running program calls KeepAlive within the keep-alive interval.
await login.KeepAliveAsync(new KeepAliveRequest());
Console.WriteLine("KeepAlive: ok");
await connection.LogOutAsync();
Console.WriteLine("Logged out");
// [END connect]
}
// [START decode-version]
///
/// QueryVersion packs a version into 64 bits: major, minor, build and revision, 16 bits each.
///
public static string DecodeVersion(ulong version) =>
$"{version >> 48}.{(version >> 32) & 0xFFFF}.{(version >> 16) & 0xFFFF}.{version & 0xFFFF}";
// [END decode-version]
}