Beispiel #1
0
		/// <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;
		}
Beispiel #2
0
		private Task<CssPacket> TransmitAndProcess(CsspIdentity packet)
		{
			return CsGlobal.Transmission.Http.CsServer.Receive.Process(SendContext.Transmit(packet));
		}
Beispiel #3
0
		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}));
		}
Beispiel #4
0
		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;
		}