public void ShowDialog(DownloadInfo info) { try { mDownloadInfo = info; //logWrite("DownloadForm:sender name=" + mDownloadInfo.SenderName); //logWrite("DownloadForm:sender id=" + mDownloadInfo.SenderId); //logWrite("DownloadForm:filename=" + mDownloadInfo.FileName); //logWrite("DownloadForm:filesize=" + mDownloadInfo.FileSize); //logWrite("DownloadForm:myid=" + mDownloadInfo.MyId); //logWrite("DownloadForm:formKey=" + mDownloadInfo.MsgFileKey); //logWrite("DownloadForm:DownloadPath=" + mDownloadInfo.DownloadPath); //logWrite("DownloadForm:SenderFileName=" + mDownloadInfo.SenderFileName); } catch (Exception exception) { //logWrite(exception.ToString()); } string[] filenameArray = mDownloadInfo.FileName.Split('\\'); string shortFileName = filenameArray[filenameArray.Length - 1];; labelMainMessage.Text = string.Format("{0}[{1}]님이 파일을 보내려고 합니다.\n파일을 저장하시겠습니까?", mDownloadInfo.SenderName, mDownloadInfo.SenderId); TextBoxSaveDir.Text = string.Format(@"C:\MiniCTI\{0}\Files", mDownloadInfo.MyId); labelFileName.Text = string.Format(labelFileName.Text, shortFileName); PanelFinishFileSave.Visible = false; setProgressVisible(false); this.Show(); }
public void FTP_ShowDialg(DownloadInfo info) { //call DownloadForm DownloadForm frm = new DownloadForm(); frm.DownloadYNChecked += FTP_DiaglogResultReceived; frm.DownloadStatusChanged += FTP_DialogStatusChanged; frm.ShowDialog(info); //frm.Show(); FileRcvFormList[info.MsgFileKey] = frm; mFormKeyRcv = info.MsgFileKey; //CHOI_DEBUG showFileRcvStatDelegate = new ShowFileRcvStatDelegate(ShowFileReceiveStatus); }
/// <summary> /// 수신된 메시지를 분석하여 각 요청에 맞게 처리 /// </summary> /// <param name="obj">ArrayList로 형변환할 Object</param> protected void MsgFilter(object obj, IPEndPoint iep) { try { string msg = ((string)obj).Trim(); //수신 메시지 string tempFormKey; string[] tempMsg = msg.Split('|'); string code = tempMsg[0]; switch (code) { #region //일반메신저기능 case "f"://로그인 실패시(f|n or p) try { FormTextCtrlDelegate informationMsg = new FormTextCtrlDelegate(ShowMessageBox); if (tempMsg[1].Equals("n")) { Invoke(informationMsg, "등록되지 않은 사용자 입니다."); } else Invoke(informationMsg, "비밀번호가 틀렸습니다."); Loginfail fail = new Loginfail(logInFail); Invoke(fail, null); } catch (Exception e) { }; break; case "g": //로그인 성공시 (g|name|team|company|com_cd) connected = true; stringDele changeProgressStyle = new stringDele(chageProgressbar); Invoke(changeProgressStyle, "로딩중"); //MiniCTI config 파일 설정 FileInfo tempfileinfo = new FileInfo(XmlConfigFullPath);//"C:\\MiniCTI\\config\\MiniCTI_config_demo.xml"); if (!tempfileinfo.Exists) { logWrite("MiniCTI config 파일 없음"); FileInfo temp = new FileInfo(XmlConfigOrgFullPath);//Application.StartupPath + "\\MiniCTI_config_demo.xml"); temp.CopyTo(tempfileinfo.FullName); } setCRM_DB_HOST(XmlConfigFullPath, serverIP);//"c:\\MiniCTI\\config\\MiniCTI_config_demo.xml", serverIP); //서버측에서 전달된 이름 저장 myname = tempMsg[1]; myid = this.id.Text; com_cd = tempMsg[4]; logWrite("로그인 성공! (" + DateTime.Now.ToString() + ")"); //개인 정보를 Client_Form 에 표시 FormTextCtrlDelegate FlushName = new FormTextCtrlDelegate(FlushInfo); FormTextCtrlDelegate FlushTeam = new FormTextCtrlDelegate(Flushteam); Invoke(FlushName, tempMsg[1]); if (tempMsg[2].Length > 0) { Invoke(FlushTeam, tempMsg[2]); } else { Invoke(FlushTeam, tempMsg[3]); } //화면의 모든 콘트롤에 keydown이벤트설정 this.KeyDown += new KeyEventHandler(Client_Form_KeyDown); int count = this.Controls.Count; for (int i = 0; i < count; i++) { this.Controls[i].KeyDown += new KeyEventHandler(Client_Form_KeyDown); } //쪽지 및 대화 저장 폴더, 파일 생성 MemoUtils.MemoFileCheck(this.myid); DialogFileCheck(); FileDirCheck(); if (checkThread == null) { checkThread = new Thread(new ThreadStart(SendCheck)); checkThread.Start(); logWrite("SendCheck 스레드 시작"); } break; case "M": //다른 클라이언트 목록 및 접속상태 정보(M|팀이름|id!멤버이름|id!멤버이름) if (tempMsg[1].Equals("e")) { //모든 팀트리 정보 전송완료 메시지일 경우 -> Client_Form을 로그인 상태로 하위 구성요소를 활성화 한다. PanelCtrlDelegate loginPanel = new PanelCtrlDelegate(LogInPanelVisible); //로그인 패널 컨트롤 호출용 PanelCtrlDelegate TreeViewPanel = new PanelCtrlDelegate(TreeViewVisible); //memTreeView 컨트롤호출용 PanelCtrlDelegate btnCtrl = new PanelCtrlDelegate(ButtonCtrl);//각종 버튼 컨트롤호출용 Invoke(TreeViewPanel, true); // 버튼 활성화 Invoke(btnCtrl, true); //tooltip 설정 tooltip.AutoPopDelay = 0; tooltip.AutomaticDelay = 2000; tooltip.InitialDelay = 100; Invoke(loginPanel, false); //crm 프로그램 실행 Thread thread = new Thread(new ThreadStart(SetUserInfo)); thread.Start(); //NoParamDele dele = new NoParamDele(SetUserInfo); //Invoke(dele); } else { // 팀트리 정보를 수신한 경우 ArrayList list = new ArrayList(); if (tempMsg.Length > 2) { string teamName = tempMsg[1]; for (int i = 2; i < tempMsg.Length; i++) {//배열 순서 2번째 부터인 id!name을 추출 if (tempMsg[i].Length != 0) { list.Add(tempMsg[i]); string[] memInfo = tempMsg[i].Split('!'); //<id>와 <name>을 분리하여 memInfo에 저장 MemberInfoList[memInfo[0]] = memInfo[1]; //key=id, value=name logWrite("MemberInfoList[" + memInfo[0] + "] = " + memInfo[1]); //다른 상담원의 <소속>과 <id>를 hashtable에 저장(key=id, value=소속) if (teamName.Trim() == "") { //소속이 미지정인 경우 teamName = MsgrMsg.UNDEFINED_TEAM; } TeamInfoList[memInfo[0]] = teamName; logWrite("TeamInfoList[" + memInfo[0] + "] = " + teamName); //logWrite("사용자 정보 등록 : 이름(" + memInfo[1] + ") 아이디(" + memInfo[0] + ")"); } } ChildNodeDelegate AddMemNode = new ChildNodeDelegate(MakeMemTree); object[] ar = { teamName, list }; Invoke(AddMemNode, ar); treesource[teamName] = list; memTree.Tag = treesource; logWrite(teamName + " 팀 리스트 생성!"); //델리게이트 생성 } } break; case "y": //로그인 Client 리스트 y|id|상태값 string team = (string)TeamInfoList[tempMsg[1]]; int Port = 8883; logWrite("팀 : "+team+" 사용자 id : " + tempMsg[1] + " port : " + Port.ToString()); //InList[tempMsg[1]] = server; //로그인 리스트 테이블에 저장(key=id, value=IPEndPoint) ChangeStat changelogin = new ChangeStat(ChangeMemStat); Invoke(changelogin, new object[] { tempMsg[1], tempMsg[2] }); break; case "IP": //로그인 Client 리스트 IP|id|ip주소 Port = 8883; logWrite(" 사용자 id : " + tempMsg[1] + "IP 주소 : " + tempMsg[2] + " port : " + Port.ToString()); InList[tempMsg[1]] = new IPEndPoint(IPAddress.Parse(tempMsg[2]), Port); //로그인 리스트 테이블에 저장(key=id, value=IPEndPoint) break; case "a": //중복로그인 시도를 알려줌 Loginfail relogin = new Loginfail(ReLogin); Invoke(relogin, null); break; case "u": //서버측에서 강제 로그아웃 메시지 수신한 경우 LogOutDelegate logoutDel = new LogOutDelegate(LogOut); Invoke(logoutDel, null); break; case "d": //상대방 대화메시지일 경우 (d|Formkey|id/id/...|name|메시지) tempFormKey = ChatUtils.GetFormKey(tempMsg[1], myid); string[] ids = tempMsg[2].Split('/'); if (!ids[0].Equals(myid)) { if (ChatFormList.Contains((string)tempFormKey) && ChatFormList[(string)tempFormKey] != null) { //이미 발신자와 채팅중일 경우 ChatForm form = (ChatForm)ChatFormList[(string)tempFormKey]; AddChatMsgDelegate addMsg = new AddChatMsgDelegate(form.PostUserMessage); Invoke(addMsg, new object[] { ids[0], tempMsg[3], tempMsg[4] });//id/id... 첫번째가 문자올린 대화자 //if() 사용자 상태에 따라 //form.Activate(); } else { //새로운 대화요청일 경우, 대화창 생성 ArrangeCtrlDelegate OpenChatForm = new ArrangeCtrlDelegate(NewChatForm); Invoke(OpenChatForm, new object[] { tempMsg }); } } break; case "c": //c|formkey|id/id/..|name //대화중 초대가 일어난 경우 { tempFormKey = ChatUtils.GetFormKey(tempMsg[1], myid); ChatForm form = (ChatForm)ChatFormList[(string)tempFormKey]; if (form != null) { string[] addedIdArray = tempMsg[2].Split('/'); AddChatterDelegate addChatter = new AddChatterDelegate(form.AddChatterToNode); foreach (string addedId in addedIdArray) { UserObject userObj = ChatUtils.FindUserObjectTagFromTreeNodes(memTree.Nodes, addedId); Invoke(addChatter, new object[] { userObj }); } string newFormKey = ChatUtils.GetFormKeyWithMultiUsersAdded(tempFormKey, myid, tempMsg[2]); SetChatFormKeyUpdate(form, newFormKey, tempFormKey); } else { logWrite(string.Format("'c' key[{0}]를 갖는 채팅창이 존재하지 않음.", tempFormKey)); } } break; case "C": //보낸공지 읽음확인 수신(C|확인자id|noticeid) ArrangeCtrlDelegate NoticeDetailResultFormAdd = new ArrangeCtrlDelegate(NoticeReaderAdd); Invoke(NoticeDetailResultFormAdd, new object[] { tempMsg }); break; case "q": //다자 대화중 상대방이 대화창 나감 (q|Formkey|id) { tempFormKey = ChatUtils.GetFormKey(tempMsg[1], myid); ChatForm form = (ChatForm)ChatFormList[(string)tempFormKey]; if (form != null) { //노드삭제 DelChatterDelegate delchatter = new DelChatterDelegate(form.DeleteChatter); Invoke(delchatter, new object[] { tempMsg[2], GetUserName(tempMsg[2]) }); //formkey 변경 string newFormKey = ChatUtils.GetFormKeyWithUserQuit(tempFormKey, myid, tempMsg[2]); SetChatFormKeyUpdate(form, newFormKey, tempFormKey); } else { logWrite(string.Format("'q' key[{0}]를 갖는 채팅창이 존재하지 않음.", tempFormKey)); } } break; case "dc": //다자 대화중 상대방이 연결 끊김 (dc|Formkey|id) { tempFormKey = ChatUtils.GetFormKey(tempMsg[1], myid); ChatForm form = (ChatForm)ChatFormList[(string)tempFormKey]; if (form != null) { //노드삭제 DelChatterDelegate delchatter = new DelChatterDelegate(form.DeleteChatter); Invoke(delchatter, new object[] { tempMsg[2], GetUserName(tempMsg[2]) }); //formkey 변경 string newFormKey = ChatUtils.GetFormKeyWithUserQuit(tempFormKey, myid, tempMsg[2]); SetChatFormKeyUpdate(form, newFormKey, tempFormKey); } else { logWrite(string.Format("'dc' key[{0}]를 갖는 채팅창이 존재하지 않음.", tempFormKey)); } } break; case "m"://메모를 수신한 경우 m|name|id|message|수신자id ArrangeCtrlDelegate memo = new ArrangeCtrlDelegate(MakeMemo); Invoke(memo, new object[] { tempMsg }); MemoUtils.MemoFileWrite(this.myid, msg + "|" + DateTime.Now.ToString()); break; #endregion //일반메신저기능 case "F": //파일받기전 파일 정보 수신 F|파일명|파일크기|파일key|전송자id string name = GetUserName(tempMsg[4]); string[] filenameArray = tempMsg[1].Split('\\'); //파일명 추출 int filesize = int.Parse(tempMsg[2]); //파일크기 캐스팅 IPEndPoint siep = (IPEndPoint)InList[tempMsg[4]]; siep.Port = 8883; string savefilename = "C:\\MiniCTI\\" + this.myid + "\\Files\\" + filenameArray[filenameArray.Length - 1]; //수락여부 확인 플로우로 넘김 //1.수락 // FTP_ShowDialog(Hashtable info); // form.ShowDialog(Hashtable info); // event FTP_DialogResultReceived(CustomEvent); //2-1.거부 //2-2.종료 // event FTP_OnStatusChanged // //2.수락메시지전송 // //3.수신대기 // FileReceiver //4.수신 // FTP_ShowStatus(Receive|Cancel|Done|Error) // form.ShowStatus(Hashtable info); //5.완료 // FTP_StopReceiving() //6.취소 // FTP_CancelReceiving() //7.실패 // if (InList.ContainsKey(tempMsg[4]) && InList[tempMsg[4]] != null) //전송대상자가 로그인 상태인 경우 { //Hashtable info = new Hashtable(); //info["filename"] = savefilename; //info["filesize"] = filesize; //info["name"] = name; //info["senderid"] = tempMsg[4]; //info["myid"] = myid; DownloadInfo info = new DownloadInfo(); info.FileName = savefilename; info.FileSize = filesize; info.SenderName = name; info.SenderId = tempMsg[4]; info.MyId = myid; info.MsgFileKey = tempMsg[3]; info.SenderFileName = tempMsg[1]; if (mDownloadPath != null && mDownloadPath.Trim() != "") info.DownloadPath = mDownloadPath; else info.DownloadPath = string.Format(@"C:\MiniCTI\{0}\Files", myid); //FTP_ShowDialg(info); FTP_ShowDialogDelegate delShow = new FTP_ShowDialogDelegate(FTP_ShowDialg); Invoke(delShow, new object[] { info }); } break; #region 파일로직변경으로 막음 //if (InList.ContainsKey(tempMsg[4]) && InList[tempMsg[4]] != null) //전송대상자가 로그인 상태인 경우 //{ // Hashtable info = new Hashtable(); // info[savefilename] = filesize; // info["name"] = name; // info["senderid"] = tempMsg[4]; // //파일받기 수락 메시지전송 // SendMsg("Y|" + tempMsg[1] + "|" + tempMsg[3] + "|" + this.myid, siep); //구성(Y|파일명|파일Key|수신자id) // //파일수신대기/수신 // FileReceiver((object)info); //} //downloadform.Show(); //break; #endregion case "Y"://파일 받기 수락 메시지(Y|파일명|파일key|수신자id) ShowFileSendDetailDelegate show = new ShowFileSendDetailDelegate(ShowFileSendDetail); Hashtable table = new Hashtable(); table[tempMsg] = (IPEndPoint)InList[tempMsg[3]]; //파일 전송 스레드 시작 Thread sendfile = new Thread(new ParameterizedThreadStart(SendFile)); sendfile.Start((object)table); FileSendThreadList[tempMsg[2] + "|" + tempMsg[3]] = sendfile; FileSendDetailListView view = (FileSendDetailListView)FileSendDetailList[tempMsg[2]]; Invoke(show, new object[] { tempMsg[3], "전송대기중", view }); break; case "FS"://파일 받기 수락 메시지(FS|파일명|파일key|수신자id) ShowFileSendDetailDelegate show_ = new ShowFileSendDetailDelegate(ShowFileSendDetail); Hashtable table_ = new Hashtable(); table_[tempMsg] = server; //파일 전송 스레드 시작 Thread sendfile_ = new Thread(new ParameterizedThreadStart(SendFile)); sendfile_.Start((object)table_); FileSendThreadList[tempMsg[2] + "|" + tempMsg[3]] = sendfile_; FileSendDetailListView view_ = (FileSendDetailListView)FileSendDetailList[tempMsg[2]]; Invoke(show_, new object[] { tempMsg[3], "전송대기중", view_ }); break; case "N": //파일 받기 거부("N|파일명|파일키|id) ShowFileSendDetailDelegate detail = new ShowFileSendDetailDelegate(ShowFileSendDetail); FileSendDetailListView View = (FileSendDetailListView)FileSendDetailList[tempMsg[2]]; Invoke(detail, new object[] { tempMsg[3], "받기 거부", View }); string Name = GetUserName(tempMsg[3]); string[] FilenameArray = tempMsg[1].Split('\\'); MessageBox.Show(Name + " 님이 파일 받기를 거부하셨습니다.\r\n\r\n파일명 : " + FilenameArray[(FilenameArray.Length - 1)], "알림", MessageBoxButtons.OK, MessageBoxIcon.Information); break; #region //일반 메신저기능 case "i": //추가 로그인 상담원일 경우 형태 : i|id|소속팀명|ip|이름 try { //1. 로그인 리스트 테이블에 추가 IPEndPoint addiep = new IPEndPoint(IPAddress.Parse(tempMsg[3]), 8883); InList[tempMsg[1]] = addiep; //2. memTree 뷰에 로그인 사용자 상태 변경 ChangeStat change = new ChangeStat(ChangeMemStat); Invoke(change, new object[] { tempMsg[1], "online" }); TeamInfoList[tempMsg[1]] = tempMsg[2]; //3. 각 채팅창 key변경 및 채팅창 노드/상태변경 ChangeStat logInChatter = new ChangeStat(SetUserStatusInChatForm); Invoke(logInChatter, new object[] { tempMsg[1], MsgrUserStatus.ONLINE }); //4. 로그인 했음 메시지 창 띄움 // 추후 구현 } catch (Exception e) { logWrite(e.ToString()); } break; case "o": //로그아웃 상담원이 발생할 경우 o|id|소속 try { //1. 로그인 리스트 테이블에서 삭제 lock (this) { InList[tempMsg[1]] = null; } //2. memTree 뷰에 로그아웃 사용자 상태 변경 ChangeStat logout = new ChangeStat(ChangeMemStat); Invoke(logout, new object[] { tempMsg[1], tempMsg[2] }); //3. 각 채팅창 key변경 및 채팅창 노드/상태변경 ChangeStat logOutChatter = new ChangeStat(SetUserStatusInChatForm); Invoke(logOutChatter, new object[] {tempMsg[1], MsgrUserStatus.LOGOUT}); } catch (Exception e) { logWrite(e.ToString()); } break; case "n": //공지사항 메시지 (n|메시지|발신자id|mode|noticetime|제목) logWrite("공지사항 수신!"); if (!tempMsg[2].Equals(this.myid)) //자기가 보낸 공지일 경우 보이지 않음 { ArrangeCtrlDelegate notice = new ArrangeCtrlDelegate(ShowNoticeDirect); Invoke(notice, new object[] { tempMsg }); } break; case "A": //부재중 정보 전달(A|mnum|fnum|nnum|tnum) ArrangeCtrlDelegate ShowAbsentInfo = new ArrangeCtrlDelegate(ShowAbsentInfoNumber); Invoke(ShowAbsentInfo, new object[] { tempMsg }); break; case "Q"://안읽은 메모 리스트 (Q|sender;content;time;seqnum|sender;content;time;seqnum|... ArrangeCtrlDelegate ShowNRmemoList = new ArrangeCtrlDelegate(ShowMemoList); Invoke(ShowNRmemoList, new object[] { tempMsg }); break; case "T"://안읽은 공지 리스트 (T|sender;content;time;mode;seqnum|sender;content;time;mode;seqnum|... ArrangeCtrlDelegate ShowNRnoticeList = new ArrangeCtrlDelegate(ShowNotReadNoticeList); Invoke(ShowNRnoticeList, new object[] { tempMsg }); break; case "R"://안읽은 파일 리스트 (R|보낸사람;filenum;filename;time;size;seqnum|보낸사람;filenum;filename;time;size;seqnum|... ArrangeCtrlDelegate ShowNRFileList = new ArrangeCtrlDelegate(ShowFileList); Invoke(ShowNRFileList, new object[] { tempMsg }); break; case "t": //"t|ntime†content†nmode†title†안읽은사람1:안읽은사람2:...|... ArrangeCtrlDelegate ShowNoticeResultFromDB = new ArrangeCtrlDelegate(showNoticeResultFromDB); Invoke(ShowNoticeResultFromDB, new object[] { tempMsg }); break; case "L"://공지사항 리스트 수신한 경우 L|time!content!mode!sender!seqnum if (!(tempMsg.Length < 2)) { ArrangeCtrlDelegate makeNoticeList = new ArrangeCtrlDelegate(MakeNoticeListForm); Invoke(makeNoticeList, new object[] { tempMsg }); } else { MessageBox.Show("등록된 공지가 없습니다.", "공지없음", MessageBoxButtons.OK); } break; #endregion //일반 메신저 기능 case "s"://각 클라이언트 상태값 변경 메시지 s|id|상태|IPAddress { if (!tempMsg[1].Equals(this.myid)) { //1. 트리상태변경 ChangeStat presenceupdate = new ChangeStat(PresenceUpdate); Invoke(presenceupdate, new object[] { tempMsg[1], tempMsg[2] }); //2. 로그인리스트 테이블에 추가 IPEndPoint tempiep = new IPEndPoint(IPAddress.Parse(tempMsg[3]), listenport); lock (InList) { InList[tempMsg[1]] = tempiep; } //3. 채팅창 상태변경 // 각 채팅창 key변경 및 채팅창 노드/상태변경 ChangeStat changeStat = new ChangeStat(SetUserStatusInChatForm); Invoke(changeStat, new object[] { tempMsg[1], tempMsg[2] }); } } break; #region //전화기능 case "Ring": //발신자 표시(Ring|ani|name|server_type) RingingDele ringdele = new RingingDele(Ringing); Invoke(ringdele, new object[] { tempMsg[1], tempMsg[2], tempMsg[3] }); break; case "Dial": //다이얼시 고객정보 팝업(Dial|ani) if (this.nopop_outbound == false) { doublestringDele dialdele = new doublestringDele(Answer); Invoke(dialdele, new object[] { tempMsg[1], "2" }); } break; case "Answer": //offhook시 고객정보 팝업(Answer|ani|type) doublestringDele answerdele = new doublestringDele(Answer); Invoke(answerdele, new object[] { tempMsg[1], tempMsg[2] }); break; case "Abandon": //Abandon 발생시 AbandonDele abandon = new AbandonDele(Abandoned); Invoke(abandon); break; case "Other": //다른사람이 응답시 AbandonDele other = new AbandonDele(OtherAnswer); Invoke(other); break; #endregion //전화기능 case "pass"://고객정보 전달 수신(pass|ani|senderID|receiverID if (tempMsg[2].Equals(this.myid)) { //MessageBox.Show("이관되었습니다."); } else { //notifyTransfer(tempMsg); ArrangeCtrlDelegate passdele = new ArrangeCtrlDelegate(notifyTransfer); Invoke(passdele, new object[]{tempMsg}); } break; case "trans"://부재중 이관 메시시 수신(trans|sender†content†time†seqnum|...) ArrangeCtrlDelegate ShowNRTransList = new ArrangeCtrlDelegate(showNoreadTransfer); Invoke(ShowNRTransList, new object[] { tempMsg }); break; } } catch (Exception exception) { logWrite(exception.StackTrace); } }