public virtual SessionToken CheckForUpdate(string currentVersion) { UninterruptableMonitor.Enter(syncLock); try { EnsureOpen(); if (currentRevision is null) { return(null); // no published revisions yet } if (currentVersion != null && currentRevision.Revision.CompareTo(currentVersion) <= 0) { return(null); // currentVersion is newer or equal to latest published revision } // currentVersion is either null or older than latest published revision currentRevision.IncRef(); string sessionID = sessionToken.IncrementAndGet().ToString(); SessionToken token = new SessionToken(sessionID, currentRevision.Revision); sessions[sessionID] = new ReplicationSession(token, currentRevision); return(token); } finally { UninterruptableMonitor.Exit(syncLock); } }
public virtual Stream ObtainFile(string sessionId, string source, string fileName) { lock (padlock) { EnsureOpen(); ReplicationSession session = sessions[sessionId]; if (session != null && session.IsExpired(ExpirationThreshold)) { ReleaseSession(sessionId); session = null; } // session either previously expired, or we just expired it if (session == null) { throw new SessionExpiredException(string.Format("session ({0}) expired while obtaining file: source={1} file={2}", sessionId, source, fileName)); } sessions[sessionId].MarkAccessed(); return(session.Revision.Revision.Open(source, fileName)); } }