public static async Task <EnrollResult> Enroll(string studentId, List <ClassSchedule> schedules) { if (schedules == null || schedules.Count == 0) { return(null); } if (Server == null) { await FindServer(); } if (Server == null) { return(new EnrollResult(ResultCodes.Offline)); } var request = new EnrollRequest() { StudentId = studentId, ClassSchedules = schedules }; EnrollResult result = null; NetworkComms.AppendGlobalIncomingPacketHandler <EnrollResult>(EnrollResult.GetHeader(), (h, c, i) => { NetworkComms.RemoveGlobalIncomingPacketHandler(EnrollResult.GetHeader()); result = i; }); await request.Send(new IPEndPoint(IPAddress.Parse(Server.IP), Server.Port)); // foreach (var sched in schedules) // { // sched.Sent = true; // await Db.Save(sched); // } var start = DateTime.Now; while ((DateTime.Now - start).TotalSeconds < 17) { if (result != null) { return(result); } await Task.Delay(TimeSpan.FromSeconds(1)); } Server = null; NetworkComms.RemoveGlobalIncomingPacketHandler(EnrollResult.GetHeader()); return(new EnrollResult(ResultCodes.Timeout)); }
public static void Start() { if (_started) { return; } _started = true; NetworkComms.DisableLogging(); var serializer = DPSManager.GetDataSerializer <ProtobufSerializer>(); NetworkComms.DefaultSendReceiveOptions = new SendReceiveOptions(serializer, NetworkComms.DefaultSendReceiveOptions.DataProcessors, NetworkComms.DefaultSendReceiveOptions.Options); PeerDiscovery.EnableDiscoverable(PeerDiscovery.DiscoveryMethod.UDPBroadcast); NetworkComms.AppendGlobalIncomingPacketHandler <AndroidInfo>(AndroidInfo.GetHeader(), AndroidHandler.HandShakeHandler); NetworkComms.AppendGlobalIncomingPacketHandler <StudentInfoRequest>(StudentInfoRequest.GetHeader(), AndroidHandler.StudentInfoRequested); NetworkComms.AppendGlobalIncomingPacketHandler <EndPointInfo>(EndPointInfo.GetHeader(), HandShakeHandler); NetworkComms.AppendGlobalIncomingPacketHandler <GetWork>(GetWork.GetHeader(), GetWorkHandler); NetworkComms.AppendGlobalIncomingPacketHandler <Login>(Login.GetHeader(), LoginHandler); NetworkComms.AppendGlobalIncomingPacketHandler <Logout>(Logout.GetHeader(), LogoutHandler); NetworkComms.AppendGlobalIncomingPacketHandler <SchedulesRequest>(SchedulesRequest.GetHeader(), AndroidHandler.ScheduleRequestHandler); NetworkComms.AppendGlobalIncomingPacketHandler <EnrollRequest>(EnrollRequest.GetHeader(), AndroidHandler.EnrollRequestHandler); NetworkComms.AppendGlobalIncomingPacketHandler <RegisterStudent>(RegisterStudent.GetHeader(), AndroidHandler.RegisterStudentHandler); NetworkComms.AppendGlobalIncomingPacketHandler <SaveWork>(SaveWork.GetHeader(), SaveWorkHandler); NetworkComms.AppendGlobalIncomingPacketHandler <GetCourses>(GetCourses.GetHeader(), AndroidHandler.GetCoursesHandler); NetworkComms.AppendGlobalIncomingPacketHandler <GetCoursesDesktop>(GetCoursesDesktop.GetHeader(), GetCoursesHandler); NetworkComms.AppendGlobalIncomingPacketHandler <Pong>(Pong.GetHeader(), PongHandler); NetworkComms.AppendGlobalIncomingPacketHandler <EnrollStudent>(EnrollStudent.GetHeader(), EnrollStudentHandler); NetworkComms.AppendGlobalIncomingPacketHandler <StartEnrollment>(StartEnrollment.GetHeader(), AndroidHandler.StartEnrollmentHandler); NetworkComms.AppendGlobalIncomingPacketHandler <AddSchedule>(AddSchedule.GetHeader(), AndroidHandler.AddScheduleHandler); NetworkComms.AppendGlobalIncomingPacketHandler <CommitEnrollment>(CommitEnrollment.GetHeader(), AndroidHandler.CommitEnrollmentHandler); NetworkComms.AppendGlobalIncomingPacketHandler <StatusRequest>(StatusRequest.GetHeader(), AndroidHandler.StatusRequestHandler); NetworkComms.AppendGlobalIncomingPacketHandler <CancelEnrollment>(CancelEnrollment.GetHeader(), AndroidHandler.CancelEnrollmentHandler); // try // { Connection.StartListening(ConnectionType.UDP, new IPEndPoint(IPAddress.Any, 0), true); // } // catch (Exception e) // { // // } }
public static void EnrollRequestHandler(PacketHeader packetheader, Connection connection, EnrollRequest incomingobject) { var dev = AndroidDevice.Cache.FirstOrDefault( d => d.IP == ((IPEndPoint)connection.ConnectionInfo.RemoteEndPoint).Address.ToString()); //Maybe do not ignore this on production if (dev == null) { return; } var ep = new IPEndPoint(IPAddress.Parse(dev.IP), dev.Port); var req = Request.Cache.FirstOrDefault(x => x.StudentId == incomingobject.StudentId); if (req == null) { req = new Request() { StudentId = incomingobject.StudentId, } } ; if (req.Status == Request.Statuses.Proccessing) { new EnrollResult(ResultCodes.Processing).Send(ep); return; } if (req.Status == Request.Statuses.Accepted) { new EnrollResult(ResultCodes.Enrolled).Send(ep); return; } req.DateSubmitted = DateTime.Now; req.Status = Request.Statuses.Pending; req.ReceiptNumber = incomingobject.ReceiptNumber; req.Save(); //RequestDetail.DeleteWhere(nameof(RequestDetail.RequestId),req.Id); foreach (var sched in incomingobject.ClassSchedules) { var detail = RequestDetail.Cache.FirstOrDefault(x => x.Schedule.Subject.Code == sched.SubjectCode) ?? new RequestDetail() { RequestId = req.Id, ScheduleId = sched.ClassId, Status = Request.Statuses.Pending, }; detail.Save(); } var result = new EnrollResult(ResultCodes.Success) { QueueNumber = Request.Cache.Count(x => x.Status == Request.Statuses.Pending), }; if (req.Status == Request.Statuses.Proccessing) { result.QueueNumber = 0; } result.Send(ep); }