public Messages() { NameValueCollection dirSettings = (NameValueCollection)ConfigurationManager.GetSection("HudsonBase/Dir"); string baseDir = dirSettings["msgdir"]; Areas = new Dictionary <int, string>(); NameValueCollection areasList = (NameValueCollection)ConfigurationManager.GetSection("HudsonBase/Areas"); foreach (string key in areasList) { Areas.Add(Convert.ToInt16(key), areasList[key]); } Index = new MsgIdx(Path.Combine(baseDir, "MSGIDX.BBS")); Headers = new MsgHdr(Path.Combine(baseDir, "MSGHDR.BBS")); MsgBodies = new Dictionary <int, string>(); byte[] text = File.ReadAllBytes(Path.Combine(baseDir, "MSGTXT.BBS")); foreach (MsgHdr.MsgHdrRecord h in Headers.Data) { StringBuilder sb = new StringBuilder(); for (int j = 0; j < h.NumBlocks; j++) { sb.Append(FidonetHelpers.GetPascalString(text, (h.StartBlock + j) * 256)); } MsgBodies.Add(h.MsgNum, sb.ToString()); } }
public MsgHdrRecord(byte[] raw, int idx) : this() { MsgNum = FidonetHelpers.GetUShort(raw, idx); PrevReply = FidonetHelpers.GetUShort(raw, idx + 2); NextReply = FidonetHelpers.GetUShort(raw, idx + 4); TimesRead = FidonetHelpers.GetUShort(raw, idx + 6); StartBlock = FidonetHelpers.GetUShort(raw, idx + 8); NumBlocks = FidonetHelpers.GetUShort(raw, idx + 10); DestNet = FidonetHelpers.GetUShort(raw, idx + 12); DestNode = FidonetHelpers.GetUShort(raw, idx + 14); OrigNet = FidonetHelpers.GetUShort(raw, idx + 16); OrigNode = FidonetHelpers.GetUShort(raw, idx + 18); DestZone = raw[idx + 20]; OrigZone = raw[idx + 21]; Cost = FidonetHelpers.GetUShort(raw, idx + 22); MsgAttr = raw[idx + 24]; NetAttr = raw[idx + 25]; Board = raw[idx + 26]; string time = FidonetHelpers.GetPascalString(raw, idx + 0x1b); string date = FidonetHelpers.GetPascalString(raw, idx + 0x21); if (!DateTime.TryParseExact($"{date} {time}", "MM-dd-yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out Timestamp)) { Timestamp = DateTime.MinValue; } WhoTo = FidonetHelpers.GetPascalString(raw, idx + 0x2a); WhoFrom = FidonetHelpers.GetPascalString(raw, idx + 0x4e); Subject = FidonetHelpers.GetPascalString(raw, idx + 0x72); }
/// <summary> /// Build a packed message from Hudsonbase header and body /// </summary> /// <param name="header"></param> /// <param name="body"></param> public HudsonPackedMessage(Messages msgbase, int msgnum) : this() { MsgHdr.MsgHdrRecord header = msgbase.Headers.Data[msgnum - 1]; Text = new MsgText(msgbase.MsgBodies[msgnum]); Text.Area = msgbase.Areas[header.Board]; orig = new FidoAddress(header.OrigZone, header.OrigNet, header.OrigNode, 0); dest = new FidoAddress(header.DestZone, header.DestNet, header.DestNode, 0); FromUser = header.WhoFrom; DestUser = header.WhoTo; Subject = header.Subject; Timestamp = FidonetHelpers.FidoFormatDatetime(header.Timestamp); }
/// <summary> /// Toss the message in the message base /// </summary> /// <param name="network">Network to use</param> public override void Toss(string network) { Message m = new Message(); m.Area = Text.Area.ToUpper(); m.DateTime = FidonetHelpers.ParseDatetime(Timestamp); m.MessageFrom = FromUser; m.MessageTo = DestUser; m.Subject = Subject; m.FidoId = Text.MsgId; m.FidoReplyTo = Text.ReplyId; m.TearLine = Text.Tear; m.OriginLine = Text.Origin; m.OrigZone = orig.zone; m.OrigNet = orig.net; m.OrigNode = orig.node; m.OrigPoint = orig.point; m.DestZone = dest.zone; m.DestNet = dest.net; m.DestNode = dest.node; m.DestPoint = dest.point; m.Attributes = attr.Binary; m.Body = string.Join('\n', Text.Lines); Console.WriteLine($"Processing message for area: {m.Area}"); using (bbsContext db = new bbsContext()) { db.Messages.Add(m); db.SaveChanges(); foreach (string s in Text.SeenBy) { db.MessagesSeenBy.Add(new MessageSeenBy() { MessageId = m.Id, SeenBy = s }); } foreach (string s in Text.Path) { db.MessagePaths.Add(new MessagePath() { MessageId = m.Id, Path = s }); } db.SaveChanges(); } }
/// <summary> /// builds message from database entity /// </summary> /// <param name="m"></param> public BBSPackedMessage(Message m) : base() { orig = new FidoAddress(m.OrigZone, m.OrigNet, m.OrigNode, m.OrigPoint); dest = new FidoAddress(m.DestZone, m.DestNet, m.DestNode, m.DestPoint); FromUser = m.MessageFrom; DestUser = m.MessageTo; Timestamp = FidonetHelpers.FidoFormatDatetime(m.DateTime); Subject = m.Subject; attr = new MsgAttributes((ushort)m.Attributes); Text.Area = m.Area; Text.MsgId = m.FidoId; Text.ReplyId = m.FidoReplyTo; Text.Tear = m.TearLine; Text.Origin = m.OriginLine; Text.Lines = TextHelper.SplitString(m.Body); Text.Path = m.PathLines; Text.SeenBy = m.SeenByLines; }
/// <summary> /// Builds record from raw data /// </summary> /// <param name="raw"></param> /// <param name="idx"></param> public MsgIdxRecord(byte[] raw, int idx) { msgnum = FidonetHelpers.GetUShort(raw, idx); board = raw[idx + 2]; }