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] }