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); }
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); }
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)); }
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; }
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); }
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; }