You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PlumberUltimateAds/Assets/GoogleSignIn/Future.cs

84 lines
2.8 KiB
C#

// <copyright file="Future.cs" company="Google Inc.">
// Copyright (C) 2017 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
namespace Google {
using System.Collections;
using System.Threading.Tasks;
using UnityEngine;
/// <summary>
/// Interface for implementations of the Future<T> API.
/// </summary>
internal interface FutureAPIImpl<T> {
bool Pending { get; }
GoogleSignInStatusCode Status { get; }
T Result { get; }
}
/// <summary>
/// Future return value.
/// </summary>
/// <remarks>This class provides a promise of a result from a method call.
/// The typical usage is to check the Pending property until it is false.
/// At this time either the Status or Result will be available for use.
/// Result is only set if the operation was successful.
/// As a convience, a coroutine to complete a Task is provided.
/// </remarks>
public class Future<T> {
private FutureAPIImpl<T> apiImpl;
internal Future(FutureAPIImpl<T> impl) {
apiImpl = impl;
}
/// <summary>
/// Gets a value indicating whether this
/// <see cref="T:Google.Future`1"/> is pending.
/// </summary>
/// <value><c>true</c> if pending; otherwise, <c>false</c>.</value>
public bool Pending { get { return apiImpl.Pending; } }
/// <summary>
/// Gets the status.
/// </summary>
/// <value>The status is set when Pending == false.</value>
GoogleSignInStatusCode Status { get { return apiImpl.Status; } }
/// <summary>
/// Gets the result.
/// </summary>
/// <value>The result is set when Pending == false and there is no error.
/// </value>
T Result { get { return apiImpl.Result; } }
/// <summary>
/// Waits for result then completes the TaskCompleationSource.
/// </summary>
/// <returns>The for result.</returns>
/// <param name="tcs">Tcs.</param>
internal IEnumerator WaitForResult(TaskCompletionSource<T> tcs) {
yield return new WaitUntil(() => !Pending);
if (Status == GoogleSignInStatusCode.Canceled) {
tcs.SetCanceled();
} else if (Status == GoogleSignInStatusCode.Success ||
Status == GoogleSignInStatusCode.SuccessCached) {
tcs.SetResult(Result);
} else {
tcs.SetException(new GoogleSignIn.SignInException(Status));
}
}
}
}