Messenger/MSGer.tk/Networking/Networking.UpdateListAndChat.cs
2015-07-06 13:04:54 +02:00

167 lines
9.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MSGer.tk
{
partial class Networking
{
public class UpdateListAndChat
{
public void Run()
{
while (MainForm.PartnerListUpdateThread != null && Program.MainThread.IsAlive)
{
do
{
PacketFormat pf;
IPEndPoint remoteEP;
if (!Networking.ReceiveUpdates(out pf, out remoteEP))
break;
IPEndPoint SendBackEP = new IPEndPoint(remoteEP.Address, pf.Port); //2015.05.10.
bool Break = false;
switch (pf.PacketType)
{
case UpdateType.ListUpdate:
{
Networking.ParseUpdateInfo(new string[1][] { ((PDListUpdate)pf.EData).Strings });
new PacketSender(new PDListUpdate(true), pf.ID).Send(SendBackEP);
break;
}
case UpdateType.LoginUser:
{
PDLoginUser data = (PDLoginUser)pf.EData;
string tmpresp = Networking.SendRequest(Networking.RequestType.CheckUser, pf.EUserID.ToString(), 0, true); //2014.09.19.
if (tmpresp == "Fail")
{
Break = true;
break; //Nem küld el neki semmit, hanem újra várja a packet-eket
}
else if (tmpresp != "Success")
{
MessageBox.Show("LoginUser:\n" + tmpresp);
Break = true;
break;
}
if (!UserInfo.IPs.Any(entry => entry == SendBackEP))
UserInfo.IPs.Add(SendBackEP);
List<string> strs = new List<string>();
foreach (var uinfo in data.UserInfos)
{
int uid = uinfo.Key;
int updatetime = uinfo.Value;
UserInfo user = UserInfo.Select(uid);
if (user == null)
continue;
strs.Add(user.ToString()); //Egybe rakja felhasználónként, de amikor megkapja, ugyanúgy szétválogatja majd
}
new PacketSender(new PDLoginUser(strs.ToArray()), pf.ID).Send(SendBackEP);
break;
}
case UpdateType.LogoutUser:
{ //2015.05.10. - Felesleges elküldenie az IP-címeket, mint a bejelentkezésnél
UserInfo.Select(pf.EUserID).State = 0;
new PacketSender(new PDLogoutUser(), pf.ID).Send(SendBackEP);
break;
}
case UpdateType.GetImage:
{
PDGetImage data = (PDGetImage)pf.EData;
UserInfo user = UserInfo.Select(data.UserID);
bool success;
byte[] imagedata;
if (user.PicUpdateTime > data.PicUpdateTime)
{
success = true;
var ms = new MemoryStream();
if (user.Image != null)
{
user.Image.Save(ms, ImageFormat.Tiff); //2015.05.30.
imagedata = ms.ToArray(); //2015.05.30.
}
else
{
success = false;
imagedata = new byte[0];
}
}
else
{
success = false;
imagedata = new byte[0];
}
new PacketSender(new PDGetImage(success, user.PicUpdateTime, imagedata), pf.ID).Send(SendBackEP);
}
break;
case UpdateType.UpdateMessages:
{
PDUpdateMessages data = (PDUpdateMessages)pf.EData;
bool success = true;
var userinfos = data.Users.Select(entry => UserInfo.Select(entry)); //2015.06.16.
if (userinfos.Except(UserInfo.KnownUsers.Where(entry => entry.IsPartner && entry.UserID != CurrentUser.UserID)).Count() == 0)
{ //2015.06.16. - Leellenőrzi, hogy van-e ismerőse a listában
success = false; //2015.06.25.
}
else
{
ChatPanel cp = ChatPanel.GetChatPanelByUsers(userinfos);
if (cp == null) //2015.05.16.
cp = ChatPanel.Create(data.Users.Select(entry => UserInfo.Select(entry))); //2015.05.16.
cp.ShowReceivedMessageT(UserInfo.Select(pf.EUserID), data.Message, data.Time);
}
new PacketSender(new PDUpdateMessages(success), pf.ID).Send(SendBackEP);
}
break;
case UpdateType.SetKey:
break; //TODO
case UpdateType.SendImage: //2015.06.25.
{
PDSendImage data = (PDSendImage)pf.EData;
bool success = true;
var userinfos = data.Users.Select(entry => UserInfo.Select(entry));
if (userinfos.Except(UserInfo.KnownUsers.Where(entry => entry.IsPartner && entry.UserID != CurrentUser.UserID)).Count() == 0)
{
success = false;
}
ChatPanel cp = ChatPanel.GetChatPanelByUsers(userinfos);
if (cp == null)
cp = ChatPanel.Create(data.Users.Select(entry => UserInfo.Select(entry)));
cp.ShowReceivedImageT(UserInfo.Select(pf.EUserID), data.Image, data.Time);
new PacketSender(new PDSendImage(success), pf.ID).Send(SendBackEP);
}
break;
case UpdateType.SendFile: //2015.06.30.
{
PDSendFile data = (PDSendFile)pf.EData;
bool success = true;
var userinfos = data.Users.Select(entry => UserInfo.Select(entry));
if (userinfos.Except(UserInfo.KnownUsers.Where(entry => entry.IsPartner && entry.UserID != CurrentUser.UserID)).Count() == 0)
{
success = false;
}
ChatPanel cp = ChatPanel.GetChatPanelByUsers(userinfos);
if (cp == null)
cp = ChatPanel.Create(data.Users.Select(entry => UserInfo.Select(entry)));
long rprogress = cp.ShowReceivedFileT(UserInfo.Select(pf.EUserID), data.File, data.Time, data.Progress);
new PacketSender(new PDSendFile(success, rprogress, CurrentUser.IPs, CurrentUser.Port), pf.ID).Send(SendBackEP);
}
break;
default: //2015.06.25.
throw new NotImplementedException("This type (" + pf.PacketType + ") is not handled in code."); //2015.06.25.
}
if (Break)
break;
} while (false);
}
}
}
}
}