예제 #1
0
 /// <summary>
 /// The run checks.
 /// </summary>
 private void RunChecks()
 {
     while (this.pendingChecks.Any())
     {
         LicenseValidator validator = this.pendingChecks.Dequeue();
         try
         {
             Debug.WriteLine("Calling CheckLicense on service for " + validator.GetPackageName());
             this.licensingService.CheckLicense(
                 validator.GetNumberUsedOnce(), validator.GetPackageName(), new ResultListener(validator, this));
             this.checksInProgress.Add(validator);
         }
         catch (RemoteException e)
         {
             Debug.WriteLine("RemoteException in CheckLicense call. " + e.Message);
             this.HandleServiceConnectionError(validator);
         }
     }
 }
            /// <summary>
            /// Initializes a new instance of the <see cref="ResultListener"/> class.
            /// </summary>
            /// <param name="validator">
            /// The validator.
            /// </param>
            /// <param name="checker">
            /// The checker.
            /// </param>
            public ResultListener(LicenseValidator validator, LicenseChecker checker)
            {
                this.checker = checker;
                this.licenseValidator = validator;
                this.onTimeout = delegate
                    {
                        Debug.WriteLine("License check timed out.");

                        this.checker.HandleServiceConnectionError(this.licenseValidator);
                        this.checker.FinishCheck(this.licenseValidator);
                    };
                this.StartTimeout();
            }
 /// <summary>
 /// The finish check.
 /// </summary>
 /// <param name="validator">
 /// The validator.
 /// </param>
 private void FinishCheck(LicenseValidator validator)
 {
     lock (this.locker)
     {
         this.checksInProgress.Remove(validator);
         if (this.checksInProgress.Any())
         {
             this.CleanupService();
         }
     }
 }
        /// <summary>
        /// Generates policy response for service connection errors, as a result of disconnections or timeouts.
        /// </summary>
        /// <param name="validator">
        /// The validator.
        /// </param>
        private void HandleServiceConnectionError(LicenseValidator validator)
        {
            lock (this.locker)
            {
                this.policy.ProcessServerResponse(PolicyServerResponse.Retry, null);

                if (this.policy.AllowAccess())
                {
                    validator.GetCallback().Allow(PolicyServerResponse.Retry);
                }
                else
                {
                    validator.GetCallback().DontAllow(PolicyServerResponse.Retry);
                }
            }
        }
        /// <summary>
        /// Checks if the user should have access to the app. Binds the service if necessary.
        /// </summary>
        /// <param name="callback">
        /// The callback.
        /// </param>
        public void CheckAccess(ILicenseCheckerCallback callback)
        {
            lock (this.locker)
            {
                // If we have a valid recent LICENSED response, we can skip asking Market/Play.
                if (this.policy.AllowAccess())
                {
                    System.Diagnostics.Debug.WriteLine("Using cached license response");
                    callback.Allow(PolicyServerResponse.Licensed);
                }
                else
                {
                    var validator = new LicenseValidator(
                        this.policy, 
                        new NullDeviceLimiter(), 
                        callback, 
                        GenerateNumberUsedOnce(), 
                        this.packageName, 
                        this.versionCode);

                    if (this.licensingService == null)
                    {
                        try
                        {
                            var i = new Intent(LicensingServiceIntentString);
                            i.SetPackage(LicensingServicePackageString);

                            if (this.context.BindService(i, this, Bind.AutoCreate))
                            {
                                this.pendingChecks.Enqueue(validator);
                            }
                            else
                            {
                                Debug.WriteLine("Could not bind to service.");
                                this.HandleServiceConnectionError(validator);
                            }
                        }
                        catch (Java.Lang.SecurityException)
                        {
                            callback.ApplicationError(CallbackErrorCode.MissingPermission);
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine(ex.StackTrace);
                        }
                    }
                    else
                    {
                        this.pendingChecks.Enqueue(validator);
                        this.RunChecks();
                    }
                }
            }
        }