// // Copyright (C) 2014 Google Inc. // // 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. // namespace GooglePlayGames.BasicApi.SavedGame { using System; using GooglePlayGames.OurUtils; /// /// A struct representing the mutation of saved game metadata. Fields can either have a new value /// or be untouched (in which case the corresponding field in the saved game metadata will be /// untouched). Instances must be built using /// and once created, these instances are immutable and threadsafe. /// public struct SavedGameMetadataUpdate { private readonly bool mDescriptionUpdated; private readonly string mNewDescription; private readonly bool mCoverImageUpdated; private readonly byte[] mNewPngCoverImage; private readonly TimeSpan? mNewPlayedTime; private SavedGameMetadataUpdate(Builder builder) { mDescriptionUpdated = builder.mDescriptionUpdated; mNewDescription = builder.mNewDescription; mCoverImageUpdated = builder.mCoverImageUpdated; mNewPngCoverImage = builder.mNewPngCoverImage; mNewPlayedTime = builder.mNewPlayedTime; } public bool IsDescriptionUpdated { get { return mDescriptionUpdated; } } public string UpdatedDescription { get { return mNewDescription; } } public bool IsCoverImageUpdated { get { return mCoverImageUpdated; } } public byte[] UpdatedPngCoverImage { get { return mNewPngCoverImage; } } public bool IsPlayedTimeUpdated { get { return mNewPlayedTime.HasValue; } } public TimeSpan? UpdatedPlayedTime { get { return mNewPlayedTime; } } public struct Builder { internal bool mDescriptionUpdated; internal string mNewDescription; internal bool mCoverImageUpdated; internal byte[] mNewPngCoverImage; internal TimeSpan? mNewPlayedTime; public Builder WithUpdatedDescription(string description) { mNewDescription = Misc.CheckNotNull(description); mDescriptionUpdated = true; return this; } public Builder WithUpdatedPngCoverImage(byte[] newPngCoverImage) { mCoverImageUpdated = true; mNewPngCoverImage = newPngCoverImage; return this; } public Builder WithUpdatedPlayedTime(TimeSpan newPlayedTime) { if (newPlayedTime.TotalMilliseconds > ulong.MaxValue) { throw new InvalidOperationException("Timespans longer than ulong.MaxValue " + "milliseconds are not allowed"); } mNewPlayedTime = newPlayedTime; return this; } public SavedGameMetadataUpdate Build() { return new SavedGameMetadataUpdate(this); } } } }