/// <summary>Transmits a packet.</summary> public Task<ReadonlySessionVariables> Transmit(CsspIdentity packet) { lock (this) { PreProcessPacket(packet); } var t = new Task<ReadonlySessionVariables>(() => { var session = CsGlobal.Transmission.Http.Secured.ClientSession(CsGlobal.Transmission.Http.CsServer.Rsa, CsGlobal.Transmission.Http.CsServer.Website); session.Request.Data = GetJson_FromPacket(packet); session.SendRequest(); return session.Response; }, TaskCreationOptions.LongRunning); var continuationTask = t.ContinueWith(t1 => { lock (this) { LastPacketTransmitted = DateTime.Now; PostProcessPacket(packet, t1.Exception == null); } return t1.Result; }, TaskScheduler.Default); t.Start(TaskScheduler.Default); return continuationTask; }
private Task<CssPacket> TransmitAndProcess(CsspIdentity packet) { return CsGlobal.Transmission.Http.CsServer.Receive.Process(SendContext.Transmit(packet)); }
private void PreProcessPacket(CsspIdentity packet) { var identityInfoPacket = packet.InnerPackets.FirstOrDefault(x => x is CsspInfoIdentity); var newPackets = packet.InnerPackets.ToArray(); foreach (var bufferedPacket in Entries.Where(x => x.CurrentlyTransmiting == false).ToArray()) { if (bufferedPacket.Packet is CsspInfoIdentity && identityInfoPacket != null) { Entries.Remove(bufferedPacket); } packet.InnerPackets.Add(bufferedPacket.Packet); bufferedPacket.CurrentlyTransmiting = true; } Entries.AddRange(newPackets.Select(x => new Entry(x) {CurrentlyTransmiting = true})); }
private void PostProcessPacket(CsspIdentity packet, bool succeeded) { if (succeeded) Entries.RemoveAll(e => packet.InnerPackets.Contains(e.Packet)); else { foreach (var entry in Entries.Where(x => packet.InnerPackets.Contains(x.Packet))) { entry.CurrentlyTransmiting = false; } } }
private static Application ParseApplication(CsspIdentity packet, AtSackChristianService db) { var application = db.Applications.FindOrLoad(packet.ApplicationId); if (application != null) return application; application = db.Applications.NewRow(); packet.CopyInto(application); db.Applications.Add(application); return application; }
private static ApplicationRelease ParseApplicationRelease(CsspIdentity packet, AtSackChristianService db) { var selector = $"{ApplicationReleasesTable.ApplicationIdCol} = '{packet.ApplicationId}' AND {ApplicationReleasesTable.VersionCol} LIKE '{packet.ApplicationVersion}'"; var localReleases = db.ApplicationReleases.Select(selector); var appRelease = localReleases.Length == 0 ? null : localReleases[0]; if (appRelease != null) return appRelease; var remoteReleases = db.ApplicationReleases.DownloadRows($"SELECT {db.ApplicationReleases.DefaultSqlSelector} FROM {ApplicationReleasesTable.NativeName} WHERE {selector}"); appRelease = remoteReleases.Length == 0 ? null : remoteReleases[0]; if (appRelease != null) return appRelease; appRelease = db.ApplicationReleases.NewRow(); packet.CopyInto(appRelease); appRelease.Application = ParseApplication(packet, db); db.ApplicationReleases.Add(appRelease); return appRelease; }
private static RComputer ParseRComputer(CsspIdentity packet, AtSackChristianService db) { var computer = db.RComputers.FindOrLoad(packet.ComputerId); if (computer != null) return computer; computer = db.RComputers.NewRow(); packet.CopyInto(computer); db.RComputers.Add(computer); return computer; }
private static RUser ParseRUser(CsspIdentity packet, AtSackChristianService db) { var rUser = db.RUsers.FirstOrDefault(user => user.Sid.Equals(packet.UserSid, StringComparison.OrdinalIgnoreCase) && user.ComputerId == packet.ComputerId); if (rUser != null) return rUser; var rows = db.RUsers.DownloadRows($"SELECT {db.RUsers.DefaultSqlSelector} FROM {RUsersTable.NativeName} WHERE UPPER({RUsersTable.SidCol}) LIKE UPPER('{CsDbTableBase.SqlParam(packet.UserSid)}') AND {RUsersTable.ComputerIdCol} = '{packet.ComputerId}'"); if (rows.Length != 0) return rows[0]; rUser = db.RUsers.NewRow(); packet.CopyInto(rUser); rUser.RComputer = ParseRComputer(packet, db); db.RUsers.Add(rUser); return rUser; }