Exemplo n.º 1
0
    public void Can_create_record_zone_with_zone_id()
    {
        var zoneId = new CKRecordZoneID("zoneName", "ownerName");
        var zone   = new CKRecordZone(zoneId);

        Assert.AreEqual(zoneId, zone.ZoneID);
    }
		public async override Task<Results> Run ()
		{
			var location = Location;
			if (location == null)
				return null;

			var container = CKContainer.DefaultContainer;
			var publicDB = container.PublicCloudDatabase;
			var query = new CKQuery ("Items", NSPredicate.FromValue (true)) {
				SortDescriptors = new NSSortDescriptor [] {
					new CKLocationSortDescriptor ("location", location)
				}
			};

			var defaultZoneId = new CKRecordZoneID (CKRecordZone.DefaultName, CKContainer.OwnerDefaultName);
			CKRecord [] recordArray = await publicDB.PerformQueryAsync (query, defaultZoneId);
			var results = new Results (alwaysShowAsList: true);

			var len = recordArray.Length;
			if(len == 0)
				ListHeading = "No matching items";
			else if (len == 1)
				ListHeading = "Found 1 matching item:";
			else
				ListHeading = $"Found {recordArray.Length} matching items:";

			results.Items.AddRange (recordArray.Select (r => new CKRecordWrapper (r)));
			return results;
		}
		public async override Task<Results> Run ()
		{
			string subscriptionType;
			if (!TryGetString ("subscriptionType", out subscriptionType))
				throw new InvalidProgramException ();

			var container = CKContainer.DefaultContainer;
			var privateDB = container.PrivateCloudDatabase;

			CKSubscription subscription;
			var notificationInfo = new CKNotificationInfo {
				ShouldBadge = true
			};

			var recordType = "Items";

			string zoneName;
			if (TryGetString ("zoneName", out zoneName) && subscriptionType == "RecordZone") {
				notificationInfo.AlertBody = $"Zone {zoneName} has changed.";
				var zoneID = new CKRecordZoneID (zoneName, CKContainer.OwnerDefaultName);
				subscription = new CKSubscription (zoneID, 0) {
					NotificationInfo = notificationInfo
				};
			} else {
				var subscriptionOptions = (CKSubscriptionOptions)0;

				bool firesOnRecordCreation;
				if (TryGetBool ("FiresOnRecordCreation", out firesOnRecordCreation) && firesOnRecordCreation)
					subscriptionOptions |= CKSubscriptionOptions.FiresOnRecordCreation;

				bool firesOnRecordUpdate;
				if (TryGetBool ("FiresOnRecordUpdate", out firesOnRecordUpdate) && firesOnRecordUpdate)
					subscriptionOptions |= CKSubscriptionOptions.FiresOnRecordUpdate;

				bool firesOnRecordDeletion;
				if (TryGetBool ("FiresOnRecordDeletion", out firesOnRecordDeletion) && firesOnRecordDeletion)
					subscriptionOptions |= CKSubscriptionOptions.FiresOnRecordDeletion;

				bool firesOnce;
				if (TryGetBool ("FiresOnce", out firesOnce) && firesOnce)
					subscriptionOptions |= CKSubscriptionOptions.FiresOnce;

				string beginsWithText;
				NSPredicate predicate = TryGetString ("name BEGINSWITH", out beginsWithText)
							? NSPredicate.FromFormat ("name BEGINSWITH %@", (NSString)beginsWithText)
							: NSPredicate.FromValue (true);

				notificationInfo.AlertBody = $"Changed {recordType} satisfying {predicate.PredicateFormat}";
				subscription = new CKSubscription (recordType, predicate, subscriptionOptions) {
					NotificationInfo = notificationInfo
				};
			}

			var sub = await privateDB.SaveSubscriptionAsync (subscription);
			var results = new Results ();
			if (sub != null)
				results.Items.Add (new CKSubscriptionWrapper (sub));

			return results;
		}
 public void SetUp()
 {
     TestRuntime.AssertXcodeVersion(6, 0);
     TestRuntime.AssertSystemVersion(ApplePlatform.MacOSX, 10, 10, throwIfOtherPlatform: false);
     zoneID = new CKRecordZoneID("foo", "xamarin");
     op     = new CKFetchRecordChangesOperation(zoneID, null);
 }
Exemplo n.º 5
0
        public async override Task <Results> Run()
        {
            string zoneName, recordName;

            if (!TryGetString("zoneName", out zoneName) || !TryGetString("recordName", out recordName))
            {
                throw new InvalidProgramException();
            }

            var container = CKContainer.DefaultContainer;
            var privateDB = container.PrivateCloudDatabase;

            var zoneId   = new CKRecordZoneID(zoneName, CKContainer.OwnerDefaultName);
            var recordId = new CKRecordID(recordName, zoneId);

            var record = await privateDB.FetchRecordAsync(recordId);

            var results = new Results();

            if (record != null)
            {
                results.Items.Add(new CKRecordWrapper(record));
            }

            return(results);
        }
    public void Can_create_record_id_with_zone_id()
    {
        var zoneId   = new CKRecordZoneID("zone_id", "zone_owner");
        var recordId = new CKRecordID("record_name", zoneId);

        Assert.AreEqual(recordId.ZoneID, zoneId);
    }
		public static CKFetchRecordChangesOperation GetOperation (CKRecordZoneID recordZoneID, CKServerChangeToken previousServerChangeToken)
		{
			IntPtr classPtr = Class.GetHandle ("CKFetchRecordChangesOperation");
			IntPtr allocSel = Selector.GetHandle ("alloc");
			IntPtr objPtr = IntPtr_objc_msgSend (classPtr, allocSel);

			IntPtr ret = IntPtr_objc_msgSend_IntPtr_IntPtr (objPtr, Selector.GetHandle ("initWithRecordZoneID:previousServerChangeToken:"), recordZoneID.Handle, previousServerChangeToken == null ? IntPtr.Zero : previousServerChangeToken.Handle);
			return Runtime.GetNSObject<CKFetchRecordChangesOperation> (ret);
		}
Exemplo n.º 8
0
    public void Cant_create_record_with_no_zone_id()
    {
        TestDelegate sut = () => {
            CKRecordZoneID zoneId = null;
            var            zone   = new CKRecordZone(zoneId);
        };

        Assert.Throws <ArgumentNullException>(sut);
    }
        public static CKFetchRecordChangesOperation GetOperation(CKRecordZoneID recordZoneID, CKServerChangeToken previousServerChangeToken)
        {
            IntPtr classPtr = Class.GetHandle("CKFetchRecordChangesOperation");
            IntPtr allocSel = Selector.GetHandle("alloc");
            IntPtr objPtr   = IntPtr_objc_msgSend(classPtr, allocSel);

            IntPtr ret = IntPtr_objc_msgSend_IntPtr_IntPtr(objPtr, Selector.GetHandle("initWithRecordZoneID:previousServerChangeToken:"), recordZoneID.Handle, previousServerChangeToken == null ? IntPtr.Zero : previousServerChangeToken.Handle);

            return(Runtime.GetNSObject <CKFetchRecordChangesOperation> (ret));
        }
Exemplo n.º 10
0
		public async override Task<Results> Run ()
		{
			string recordName, zoneName;
			if (!TryGetString ("recordName", out recordName) || !TryGetString ("zoneName", out zoneName))
				throw new InvalidProgramException ();

			var container = CKContainer.DefaultContainer;
			var privateDB = container.PrivateCloudDatabase;

			var recordType = "Items";

			CKRecord record;
			if (string.IsNullOrWhiteSpace(zoneName)) {
				record = string.IsNullOrWhiteSpace (recordName)
						? new CKRecord (recordType)
						: new CKRecord (recordType, new CKRecordID (recordName));
			} else {
				var zoneID = new CKRecordZoneID (zoneName, CKContainer.OwnerDefaultName);
				record = string.IsNullOrWhiteSpace (recordName)
						? new CKRecord (recordType, zoneID)
						: new CKRecord (recordType, new CKRecordID (recordName, zoneID));
			}

			string name;
			if (TryGetString ("name", out name))
				record ["name"] = (NSString)name;

			CLLocation location;
			if (TryGetLocation("location", out location))
				record ["location"] = location;

			NSUrl url;
			if (TryGetUrl ("asset", out url))
				record ["asset"] = new CKAsset (url);

			try {
				CKRecord rec = await privateDB.SaveRecordAsync (record);
				return ProcessResult (rec);
			} catch (NSErrorException ex) {
				// In this case we are trying to overwrite an existing record so let's fetch it and modify it.
				if (ex.Error.Code == 14) {
					var rec = await privateDB.FetchRecordAsync (record.Id);
					if (rec != null) {
						foreach (var key in record.AllKeys ())
							rec [key] = record [key];
						rec = await privateDB.SaveRecordAsync (rec);
						return ProcessResult (rec);
					}
				}
				throw ex;
			}
		}
		public async override Task<Results> Run ()
		{
			object recordName, zoneName;
			if (Data.TryGetValue ("recordName", out recordName) && Data.TryGetValue ("zoneName", out zoneName)) {
				var container = CKContainer.DefaultContainer;
				var zoneId = new CKRecordZoneID ((string)zoneName, CKContainer.OwnerDefaultName);
				var userRecordID = new CKRecordID ((string)recordName, zoneId);

				CKDiscoveredUserInfo userInfo = await container.DiscoverUserInfoAsync (userRecordID);
				return new Results (new IResult [] { new CKDiscoveredUserInfoWrapper (userInfo) });
			}
			throw new InvalidProgramException ("there are no recordName and zoneName");
		}
    public IEnumerator Can_run_query()
    {
        var database  = CKContainer.DefaultContainer().PrivateCloudDatabase;
        var query     = new CKQuery("mytype", NSPredicate.PredicateWithValue(true));
        var wasCalled = false;
        var zoneId    = new CKRecordZoneID("zoneid", "me");

        database.PerformQuery(query, zoneId, (records, error) => {
            wasCalled = true;
        });

        yield return(WaitUntilWithTimeout(() => wasCalled, DefaultTimeout));

        Assert.IsTrue(wasCalled);
    }
        public async override Task <Results> Run()
        {
            object recordName, zoneName;

            if (Data.TryGetValue("recordName", out recordName) && Data.TryGetValue("zoneName", out zoneName))
            {
                var container    = CKContainer.DefaultContainer;
                var zoneId       = new CKRecordZoneID((string)zoneName, CKContainer.OwnerDefaultName);
                var userRecordID = new CKRecordID((string)recordName, zoneId);

                CKDiscoveredUserInfo userInfo = await container.DiscoverUserInfoAsync(userRecordID);

                return(new Results(new IResult [] { new CKDiscoveredUserInfoWrapper(userInfo) }));
            }
            throw new InvalidProgramException("there are no recordName and zoneName");
        }
    public IEnumerator Can_fetch_a_record_zone_by_its_id()
    {
        var database  = CKContainer.DefaultContainer().PrivateCloudDatabase;
        var wasCalled = false;

        var          recordZoneId = new CKRecordZoneID("zonename", "me");
        CKRecordZone returnedZone = null;

        database.FetchRecordZoneWithID(recordZoneId, (zone, error) => {
            wasCalled    = true;
            returnedZone = zone;
        });

        yield return(WaitUntilWithTimeout(() => wasCalled, DefaultTimeout));

        Assert.IsTrue(wasCalled);
        Assert.AreEqual(recordZoneId, returnedZone.ZoneID);
    }
		public async override Task<Results> Run ()
		{
			string zoneName;
			if (!TryGetString ("zoneName", out zoneName))
				throw new InvalidProgramException ();

			var container = CKContainer.DefaultContainer;
			var privateDB = container.PrivateCloudDatabase;

			var id = new CKRecordZoneID (zoneName, CKContainer.OwnerDefaultName);
			CKRecordZoneID zoneId = await privateDB.DeleteRecordZoneAsync (id);
			var results = new Results ();

			if (zoneId != null)
				results.Items.Add (new CKRecordZoneIdWrapper (zoneId));

			return results;
		}
Exemplo n.º 16
0
        public async override Task <Results> Run()
        {
            var location = Location;

            if (location == null)
            {
                return(null);
            }

            var container = CKContainer.DefaultContainer;
            var publicDB  = container.PublicCloudDatabase;
            var query     = new CKQuery("Items", NSPredicate.FromValue(true))
            {
                SortDescriptors = new NSSortDescriptor [] {
                    new CKLocationSortDescriptor("location", location)
                }
            };

            var defaultZoneId = new CKRecordZoneID(CKRecordZone.DefaultName, CKContainer.OwnerDefaultName);

            CKRecord [] recordArray = await publicDB.PerformQueryAsync(query, defaultZoneId);

            var results = new Results(alwaysShowAsList: true);

            var len = recordArray.Length;

            if (len == 0)
            {
                ListHeading = "No matching items";
            }
            else if (len == 1)
            {
                ListHeading = "Found 1 matching item:";
            }
            else
            {
                ListHeading = $"Found {recordArray.Length} matching items:";
            }

            results.Items.AddRange(recordArray.Select(r => new CKRecordWrapper(r)));
            return(results);
        }
    public IEnumerator Can_delete_a_record_zone_by_its_id()
    {
        var database  = CKContainer.DefaultContainer().PrivateCloudDatabase;
        var wasCalled = false;

        var            zone          = new CKRecordZone(new CKRecordZoneID("zonename", "me"));
        CKRecordZoneID deletedZoneId = null;
        NSError        returnedError = null;

        database.SaveRecordZone(zone, (zone2, error) => {
            database.DeleteRecordZoneWithID(zone2.ZoneID, (recordZoneId, error2) => {
                wasCalled     = true;
                deletedZoneId = recordZoneId;
            });
        });

        yield return(WaitUntilWithTimeout(() => wasCalled, DefaultTimeout));

        Assert.IsTrue(wasCalled);
        Assert.IsNull(returnedError);
        Assert.AreEqual(zone.ZoneID, deletedZoneId);
    }
		public override Task<Results> Run ()
		{
			string zoneName;
			bool shouldCache;
			if (!TryGetString ("zoneName", out zoneName) || !TryGetBool ("cache", out shouldCache))
				throw new InvalidProgramException ();

			var zoneId = new CKRecordZoneID (zoneName, CKContainer.OwnerDefaultName);
			ChangedRecords cache;
			if (!recordCache.TryGetValue (zoneId, out cache))
				recordCache [zoneId] = cache = new ChangedRecords ();

			cache.RemoveChanges ();

			if (!cache.Results.MoreComing && !shouldCache)
				cache.Reset ();

			CKServerChangeToken changeToken = null;

			var token = cache.ChangeToken;
			if (token != null && (shouldCache || cache.Results.MoreComing))
				changeToken = token;

			// TODO: https://bugzilla.xamarin.com/show_bug.cgi?id=42163
			//var operation = new CKFetchRecordChangesOperation (zoneId, changeToken);
			var operation = CKFetchRecordChangesOperationFactory.GetOperation (zoneId, changeToken);

			operation.DesiredKeys = new string [] { "name", "location" };
			operation.ResultsLimit = 2;
			operation.RecordChanged = (record) => {
				CKRecord cachedRecord = cache.GetRecordById (record.Id);
				if (cachedRecord != null) {
					foreach (var key in record.AllKeys ())
						cachedRecord [key] = record [key];
					cache.MarkRecordAsModified (cachedRecord);
				} else {
					cache.AddRecord (record);
				}
			};

			operation.RecordDeleted = cache.MarkRecordAsDeleted;

			var tcs = new TaskCompletionSource<Results> ();
			operation.AllChangesReported = (chToken, nsData, nsError) => {
				if (nsError == null) {
					cache.ChangeToken = chToken;
					cache.SetMoreComing (operation.MoreComing);
				}
				tcs.SetResult (cache.GetRecords ());
			};

			operation.Start ();
			return tcs.Task;
		}
        public override Task <Results> Run()
        {
            string zoneName;
            bool   shouldCache;

            if (!TryGetString("zoneName", out zoneName) || !TryGetBool("cache", out shouldCache))
            {
                throw new InvalidProgramException();
            }

            var            zoneId = new CKRecordZoneID(zoneName, CKContainer.OwnerDefaultName);
            ChangedRecords cache;

            if (!recordCache.TryGetValue(zoneId, out cache))
            {
                recordCache [zoneId] = cache = new ChangedRecords();
            }

            cache.RemoveChanges();

            if (!cache.Results.MoreComing && !shouldCache)
            {
                cache.Reset();
            }

            CKServerChangeToken changeToken = null;

            var token = cache.ChangeToken;

            if (token != null && (shouldCache || cache.Results.MoreComing))
            {
                changeToken = token;
            }

            // TODO: https://bugzilla.xamarin.com/show_bug.cgi?id=42163
            //var operation = new CKFetchRecordChangesOperation (zoneId, changeToken);
            var operation = CKFetchRecordChangesOperationFactory.GetOperation(zoneId, changeToken);

            operation.DesiredKeys   = new string [] { "name", "location" };
            operation.ResultsLimit  = 2;
            operation.RecordChanged = (record) => {
                CKRecord cachedRecord = cache.GetRecordById(record.Id);
                if (cachedRecord != null)
                {
                    foreach (var key in record.AllKeys())
                    {
                        cachedRecord [key] = record [key];
                    }
                    cache.MarkRecordAsModified(cachedRecord);
                }
                else
                {
                    cache.AddRecord(record);
                }
            };

            operation.RecordDeleted = cache.MarkRecordAsDeleted;

            var tcs = new TaskCompletionSource <Results> ();

            operation.AllChangesReported = (chToken, nsData, nsError) => {
                if (nsError == null)
                {
                    cache.ChangeToken = chToken;
                    cache.SetMoreComing(operation.MoreComing);
                }
                tcs.SetResult(cache.GetRecords());
            };

            operation.Start();
            return(tcs.Task);
        }
		public CKRecordZoneIdWrapper (CKRecordZoneID zoneId)
		{
			this.zoneId = zoneId;
		}
        public async override Task <Results> Run()
        {
            string subscriptionType;

            if (!TryGetString("subscriptionType", out subscriptionType))
            {
                throw new InvalidProgramException();
            }

            var container = CKContainer.DefaultContainer;
            var privateDB = container.PrivateCloudDatabase;

            CKSubscription subscription;
            var            notificationInfo = new CKNotificationInfo {
                ShouldBadge = true
            };

            var recordType = "Items";

            string zoneName;

            if (TryGetString("zoneName", out zoneName) && subscriptionType == "RecordZone")
            {
                notificationInfo.AlertBody = $"Zone {zoneName} has changed.";
                var zoneID = new CKRecordZoneID(zoneName, CKContainer.OwnerDefaultName);
                subscription = new CKSubscription(zoneID, 0)
                {
                    NotificationInfo = notificationInfo
                };
            }
            else
            {
                var subscriptionOptions = (CKSubscriptionOptions)0;

                bool firesOnRecordCreation;
                if (TryGetBool("FiresOnRecordCreation", out firesOnRecordCreation) && firesOnRecordCreation)
                {
                    subscriptionOptions |= CKSubscriptionOptions.FiresOnRecordCreation;
                }

                bool firesOnRecordUpdate;
                if (TryGetBool("FiresOnRecordUpdate", out firesOnRecordUpdate) && firesOnRecordUpdate)
                {
                    subscriptionOptions |= CKSubscriptionOptions.FiresOnRecordUpdate;
                }

                bool firesOnRecordDeletion;
                if (TryGetBool("FiresOnRecordDeletion", out firesOnRecordDeletion) && firesOnRecordDeletion)
                {
                    subscriptionOptions |= CKSubscriptionOptions.FiresOnRecordDeletion;
                }

                bool firesOnce;
                if (TryGetBool("FiresOnce", out firesOnce) && firesOnce)
                {
                    subscriptionOptions |= CKSubscriptionOptions.FiresOnce;
                }

                string      beginsWithText;
                NSPredicate predicate = TryGetString("name BEGINSWITH", out beginsWithText)
                                                        ? NSPredicate.FromFormat("name BEGINSWITH %@", (NSString)beginsWithText)
                                                        : NSPredicate.FromValue(true);

                notificationInfo.AlertBody = $"Changed {recordType} satisfying {predicate.PredicateFormat}";
                subscription = new CKSubscription(recordType, predicate, subscriptionOptions)
                {
                    NotificationInfo = notificationInfo
                };
            }

            var sub = await privateDB.SaveSubscriptionAsync(subscription);

            var results = new Results();

            if (sub != null)
            {
                results.Items.Add(new CKSubscriptionWrapper(sub));
            }

            return(results);
        }
 public void SetUp()
 {
     TestRuntime.AssertXcodeVersion(6, 0);
     zoneID = new CKRecordZoneID("foo", "xamarin");
     op     = new CKFetchRecordChangesOperation(zoneID, null);
 }
Exemplo n.º 23
0
        public async override Task <Results> Run()
        {
            string recordName, zoneName;

            if (!TryGetString("recordName", out recordName) || !TryGetString("zoneName", out zoneName))
            {
                throw new InvalidProgramException();
            }

            var container = CKContainer.DefaultContainer;
            var privateDB = container.PrivateCloudDatabase;

            var recordType = "Items";

            CKRecord record;

            if (string.IsNullOrWhiteSpace(zoneName))
            {
                record = string.IsNullOrWhiteSpace(recordName)
                                                ? new CKRecord(recordType)
                                                : new CKRecord(recordType, new CKRecordID(recordName));
            }
            else
            {
                var zoneID = new CKRecordZoneID(zoneName, CKContainer.OwnerDefaultName);
                record = string.IsNullOrWhiteSpace(recordName)
                                                ? new CKRecord(recordType, zoneID)
                                                : new CKRecord(recordType, new CKRecordID(recordName, zoneID));
            }

            string name;

            if (TryGetString("name", out name))
            {
                record ["name"] = (NSString)name;
            }

            CLLocation location;

            if (TryGetLocation("location", out location))
            {
                record ["location"] = location;
            }

            NSUrl url;

            if (TryGetUrl("asset", out url))
            {
                record ["asset"] = new CKAsset(url);
            }

            try {
                CKRecord rec = await privateDB.SaveRecordAsync(record);

                return(ProcessResult(rec));
            } catch (NSErrorException ex) {
                // In this case we are trying to overwrite an existing record so let's fetch it and modify it.
                if (ex.Error.Code == 14)
                {
                    var rec = await privateDB.FetchRecordAsync(record.Id);

                    if (rec != null)
                    {
                        foreach (var key in record.AllKeys())
                        {
                            rec [key] = record [key];
                        }
                        rec = await privateDB.SaveRecordAsync(rec);

                        return(ProcessResult(rec));
                    }
                }
                throw ex;
            }
        }
 public CKRecordZoneIdWrapper(CKRecordZoneID zoneId)
 {
     this.zoneId = zoneId;
 }