protected virtual void OnConflictOccur(ConflictsEventArgs args)
 {
     if (this.ConflictOccur != null)
     {
         this.ConflictOccur(this, args);
     }
 }
        public override void OnChangeSetUploaded(Guid state, ChangeSetResponse response)
        {
            if (response == null)
            {
                throw new ArgumentNullException("response");
            }

            if (response.Error != null)
            {
                throw response.Error;
            }
            this.OnSyncProgress(new SyncProgressEventArgs("Upload finished,mark local entities as uploaded..."));

            siaqodb.StartBulkInsert(CacheController.ControllerBehavior.KnownTypes.ToArray());
            try
            {
                if (null != response.UpdatedItems && 0 != response.UpdatedItems.Count)
                {
                    List <string> IdsWithError = new List <string>();
                    foreach (Conflict cf in response.Conflicts)
                    {
                        if (cf is SyncError)
                        {
                            IdsWithError.Add(cf.LiveEntity.ServiceMetadata.Id);
                        }
                    }

                    foreach (var item in response.UpdatedItems)
                    {
                        if (IdsWithError.Contains(item.ServiceMetadata.Id))
                        {
                            continue;
                        }
                        var offlineEntity = (SiaqodbOfflineEntity)item;
                        offlineEntity.IsDirty     = false;
                        offlineEntity.IsTombstone = false;
                        this.SaveEntityByPK(offlineEntity);
                    }
                }

                if (response.Conflicts != null && response.Conflicts.Count > 0)
                {
                    ConflictsEventArgs ceArgs = new ConflictsEventArgs(response.Conflicts);
                    this.OnConflictOccur(ceArgs);
                    if (!ceArgs.CancelResolvingConflicts)
                    {
                        foreach (var conflict in response.Conflicts)
                        {
                            if (conflict is SyncError)
                            {
                                continue;
                            }
                            var offlineEntity = (SiaqodbOfflineEntity)conflict.LiveEntity;
                            offlineEntity.IsDirty     = false;
                            offlineEntity.IsTombstone = false;
                            this.SaveEntity(offlineEntity);
                        }
                    }
                }

                ICollection <IOfflineEntity> changesJustUploaded = this.currentChanges[state];
                foreach (IOfflineEntity enI in changesJustUploaded)
                {
                    SiaqodbOfflineEntity en = enI as SiaqodbOfflineEntity;
                    //check if we did not updated above
                    if (null != response.UpdatedItems && 0 != response.UpdatedItems.Count)
                    {
                        bool existsUpdated = false;
                        foreach (var item in response.UpdatedItems)
                        {
                            var offlineEntity = (SiaqodbOfflineEntity)item;
                            if (EntitiesEqualByPK(offlineEntity, en))
                            {
                                existsUpdated = true;
                            }
                        }
                        if (existsUpdated)
                        {
                            continue;
                        }
                    }
                    if (response.Conflicts != null && response.Conflicts.Count > 0)
                    {
                        bool existsUpdated = false;
                        foreach (var conflict in response.Conflicts)
                        {
                            var offlineEntity = (SiaqodbOfflineEntity)conflict.LiveEntity;
                            if (EntitiesEqualByPK(offlineEntity, en))
                            {
                                existsUpdated = true;
                            }
                        }
                        if (existsUpdated)
                        {
                            continue;
                        }
                    }

                    if (en.IsTombstone)
                    {
                        en.IsDirty     = false;
                        en.IsTombstone = false;
                        //reset flags first
                        siaqodb.StoreObjectBase(en);

                        siaqodb.DeleteBase(en);
                    }
                    else
                    {
                        en.IsDirty = false;
                        siaqodb.StoreObjectBase(en);
                    }
                }
            }
            finally
            {
                siaqodb.EndBulkInsert(CacheController.ControllerBehavior.KnownTypes.ToArray());
                siaqodb.Flush();
            }

            this.SaveAnchor(response.ServerBlob);

            this.OnSyncProgress(new SyncProgressEventArgs("Downloading changes from server..."));
            currentChanges.Remove(state);
        }