Пример #1
0
        internal void UpdateWithLocalInfo(ConflictHandling conflictHandling, Guid correlationId)
        {
            Logger.LogDebug(correlationId, Id, "(UpdateWithLocalInfo) Name={0}, LocalFolder={1}, Type={2}", Name, LocalFolder, Type);
            if (Type == ItemType.File)
            {
                var mod = File.GetLastWriteTimeUtc(Path.Combine(LocalFolder, Name));
                if (mod == LastModified)
                {
                    // means something went wrong on initial sync, so reset status to updatedlocal
                    if (SharePointId == -1)
                    {
                        Logger.LogDebug(correlationId, Id, "(UpdateWithLocalInfo) Possibly error: LastWriteTime=LastModified but SharePointId=-1");
                        Status = ItemStatus.UpdatedLocal;
                    }
                    else
                    {
                        Logger.LogDebug(correlationId, Id, "(UpdateWithLocalInfo) Nothing to do");
                    }

                    return;
                }

                if (mod > LastModified)
                {
                    Logger.LogDebug(correlationId, Id, "(UpdateWithLocalInfo) File is greater than metadata LastModified. Status={0}", Status);
                    if (Status == ItemStatus.UpdatedRemote || Status == ItemStatus.Conflict)
                    {
                        switch (conflictHandling)
                        {
                        case ConflictHandling.ManualConflictHandling:
                            ConflictData = new ConflictData()
                            {
                                LocalLastModified  = mod,
                                RemoteLastModified = LastModified
                            };
                            Logger.LogDebug(correlationId, Id, "(UpdateWithLocalInfo) Set status to 'Conflict'");
                            Status = ItemStatus.Conflict;
                            return;

                        case ConflictHandling.OverwriteLocalChanges:
                            Logger.LogDebug(correlationId, Id, "(UpdateWithLocalInfo) Set status to 'UpdatedRemote'");
                            Status = ItemStatus.UpdatedRemote;
                            return;

                        case ConflictHandling.OverwriteRemoteChanges:
                            break;
                        }
                    }

                    Logger.LogDebug(correlationId, Id, "(UpdateWithLocalInfo) Set status to 'UpdatedLocal' and LastModified to {0}", mod);
                    LastModified = mod;
                    Status       = ItemStatus.UpdatedLocal;
                }
                else
                {
                    Logger.LogDebug(correlationId, Id, "(UpdateWithLocalInfo) File is older than metadata LastModified. Status set to 'UpdatedRemote'");
                    Status = ItemStatus.UpdatedRemote;
                }
            }
        }
Пример #2
0
        internal void UpdateWithRemoteInfo(int sharePointId, int etag, DateTime lastModified, ConflictHandling conflictHandling, Guid correlationId)
        {
            Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) SharePointId={0}, ETag={1}, Name={2}, LocalFolder={3}, Type={4}, CurrentStatus={5}", sharePointId, etag, Name, LocalFolder, Type, Status);

            if (Type == ItemType.File)
            {
                Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) SharePointId old={0}, SharePointId new={1}", SharePointId, sharePointId);
                SharePointId = sharePointId;

                if (ETag == -1)
                {
                    Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) Current ETag=-1, new ETag={0}", etag);
                    ETag = etag;
                    if (lastModified > LastModified)
                    {
                        Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) RemoteLastModified is greater than current LastModified. Status={0}", Status);
                        if (Status == ItemStatus.UpdatedLocal || Status == ItemStatus.Conflict)
                        {
                            switch (conflictHandling)
                            {
                            case ConflictHandling.ManualConflictHandling:
                                ConflictData = new ConflictData()
                                {
                                    LocalLastModified  = LastModified,
                                    RemoteLastModified = lastModified
                                };
                                Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) Set status to 'Conflict'");
                                Status = ItemStatus.Conflict;
                                return;

                            case ConflictHandling.OverwriteRemoteChanges:
                                Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) Set status to 'UpdatedLocal'");
                                Status = ItemStatus.UpdatedLocal;
                                return;

                            case ConflictHandling.OverwriteLocalChanges:
                                break;
                            }
                        }

                        Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) Set status to 'UpdatedRemote' and LastModified to {0}", lastModified);
                        LastModified = lastModified;
                        Status       = ItemStatus.UpdatedRemote;
                        return;
                    }
                    if (lastModified < LastModified)
                    {
                        Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) RemoteLastModified is less than current LasModified. Set status to 'UpdatedLocal'");
                        Status = ItemStatus.UpdatedLocal;
                        return;
                    }
                    Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) LastModified dates are equal");
                    Status = ItemStatus.Unchanged;
                    return;
                }

                if (File.Exists(Path.Combine(LocalFolder, Name) + ".spsync"))
                {
                    Status = ItemStatus.Unchanged;
                    return;
                }

                if (ETag < etag)
                {
                    Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) Current ETag is less than remote etag. Status={0}", Status);
                    if (Status == ItemStatus.UpdatedLocal || Status == ItemStatus.Conflict)
                    {
                        switch (conflictHandling)
                        {
                        case ConflictHandling.ManualConflictHandling:
                            ConflictData = new ConflictData()
                            {
                                LocalLastModified  = LastModified,
                                RemoteLastModified = lastModified
                            };
                            Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) Set status to 'Conflict'");
                            Status = ItemStatus.Conflict;
                            return;

                        case ConflictHandling.OverwriteRemoteChanges:
                            Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) Set status to 'UpdatedLocal'");
                            Status = ItemStatus.UpdatedLocal;
                            return;

                        case ConflictHandling.OverwriteLocalChanges:
                            break;
                        }
                    }

                    Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) Set status to 'UpdatedRemote' and ETag to {0}", etag);
                    ETag   = etag;
                    Status = ItemStatus.UpdatedRemote;
                    return;
                }
                if (ETag > etag)
                {
                    Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) Current ETag is greater than remote etag. Set Status to 'UpdatedLocal'");
                    Status = ItemStatus.UpdatedLocal;
                    return;
                }
                Logger.LogDebug(correlationId, Id, "(UpdateWithRemoteInfo) ETags are equal.");
            }
        }