同步操作将从 腾硕软件/vc-client 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
//rtcim.cpp#include "stdafx.h"#include "chatwin.h"#include "options.h"#include <atlstr.h>#define IDT_CHECKMSGTIMEOUT 1#define CHECKMSGTIMEOUT_PERIOD 1000#define MSG_SEND_TIMEOUT_INSECONDS 30ChatWin::ChatWin(HWND hwnd,MainWin* pmw){m_hWnd=hwnd;m_mainWin=pmw;m_hWndStatic=NULL;ZeroMemory(m_targetIP,sizeof(TCHAR)*STRLEN_SMALL);ZeroMemory(m_targetCN,sizeof(TCHAR)*MAX_PATH);ZeroMemory(m_style,sizeof(TCHAR)*MAX_PATH);m_webBrowserReady=FALSE;m_pendingDisplayInfo=NULL;m_sendMsgColor=(DWORD)RGB(0,0,0);m_msgRecorder=NULL;m_showHistoryFlag=FALSE;m_netOKFlag=TRUE;m_webBrowser.m_hParentWnd=m_hWnd;m_webBrowserEvent.m_pChatWin=this;m_webBrowserEvent.host=&m_webBrowser;}ChatWin::~ChatWin(){}HRESULT ChatWin::RegisterClass(){// 注册窗口类WNDCLASS wc;ATOM atom;ZeroMemory(&wc, sizeof(WNDCLASS));wc.style = CS_HREDRAW | CS_VREDRAW;wc.lpfnWndProc = (WNDPROC)ChatWin::WindowProc;wc.hInstance = GetModuleHandle(NULL);wc.hCursor = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);wc.lpszMenuName = NULL;wc.lpszClassName = IM_CLASS;wc.hIcon = LoadIcon(wc.hInstance,MAKEINTRESOURCE(IDI_SMALL));atom = ::RegisterClass(&wc);if ( !atom ) return E_FAIL;return S_OK;}LRESULT CALLBACK ChatWin::WindowProc(HWND hWnd, UINT uMsg,WPARAM wParam,LPARAM lParam){ChatWin * me = NULL;LRESULT lr = 0;if ( uMsg == WM_CREATE ){CREATESTRUCT *pcs=(CREATESTRUCT*)lParam;MainWin* pmw=(MainWin*)pcs->lpCreateParams;me = new ChatWin(hWnd,pmw);lr=me->OnCreate(uMsg,wParam,lParam);SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)me);}else{me = (ChatWin *)GetWindowLongPtr(hWnd, GWLP_USERDATA);switch( uMsg ){case WM_DESTROY:if(me){me->OnDestroy(uMsg,wParam,lParam);delete me; // 删除MainWin对象实例}break;case WM_CLOSE:if(me) lr=me->OnClose(uMsg,wParam,lParam);break;case WM_SIZE:if(me) lr=me->OnSize(uMsg,wParam,lParam);break;case WM_COMMAND:if(me) lr=me->OnCommand(uMsg,wParam,lParam);break;case WM_NOTIFY:if(me) lr=me->OnNotify(uMsg,wParam,lParam);break;case WM_TIMER:if(me) me->OnTimer(uMsg,wParam,lParam);break;case WM_GETMINMAXINFO:if(me) lr=me->OnGetMinMaxInfo(uMsg,wParam,lParam);break;case WM_ACTIVATEAPP:if(me) lr=me->OnActiveApp(uMsg,wParam,lParam);break;case WM_NMRECEIVED:if(me) lr=me->OnIMReceived(uMsg,wParam,lParam);return 0;case WM_SENDSTATUSCHANGED:if(me) lr=me->OnSendStatusChanged(uMsg,wParam,lParam);return 0;case WM_NETERROR:if(me) lr=me->OnNetError(uMsg,wParam,lParam);return 0;case WM_GET_SEND_MSGID:if(me) lr=me->OnGetMsgId(uMsg,wParam,lParam);return 0;case WM_FT_ASK:if(me) lr=me->OnAskFile(uMsg,wParam,lParam);return 0;case WM_FT_ACCEPT:if(me) lr=me->OnAcceptFile(uMsg,wParam,lParam);return 0;case WM_FT_REFUSE:if(me) lr=me->OnRefuseFile(uMsg,wParam,lParam);return 0;case WM_FT_COMPLETE:if(me) lr=me->OnFTComplete(uMsg,wParam,lParam);return 0;case WM_FT_ERROR:if(me) lr=me->OnFTError(uMsg,wParam,lParam);return 0;case WM_FT_PROGRESS:if(me) lr=me->OnFTProgress(uMsg,wParam,lParam);return 0;case WM_FT_SENDFDATA:if(me) lr=me->OnFTSendFData(uMsg,wParam,lParam);return 0;case WM_FT_CANCEL:if(me) lr=me->OnFTCanceled(uMsg,wParam,lParam);return 0;default:lr = DefWindowProc( hWnd, uMsg, wParam, lParam );}}return lr;}LRESULT ChatWin::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam){RECT rc;GetClientRect(m_hWnd,&rc);//创建WebBrowser控件容器窗口if (m_hWndStatic!=NULL) DeleteWindow(m_hWndStatic);m_hWndStatic= CreateWindowEx(0,L"STATIC",L"", WS_CHILD | WS_VISIBLE,0, 0,(rc.right-rc.left),(rc.bottom-rc.top) ,m_hWnd, (HMENU)IDC_HEADERSTATIC, GetModuleHandle(NULL), NULL);if (!m_hWndStatic) return -1;m_webBrowser.hwnd=m_hWndStatic;return 0;}LRESULT ChatWin::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam){RECT rc;GetClientRect(m_hWnd, &rc);int winh=(int)(short)HIWORD(lParam);//设置容器控件大小int staticw=(int)(short)LOWORD(lParam);int statich=(rc.bottom-rc.top);SetWindowPos(m_hWndStatic,HWND_TOP,0,0,staticw,statich,SWP_SHOWWINDOW);//嵌入浏览器对象(WebBrowser)if (!m_webBrowser.mpWebObject){TCHAR szUrl[STRLEN_1K]={0};TCHAR fn[MAX_PATH]={0};int len=GetModuleFileName(NULL,fn,MAX_PATH);if (len>0){_stprintf_s(szUrl,L"res://%s/IDH_MSG_DISPLAY",fn);}else{_stprintf_s(szUrl,L"about:blank");}this->m_webBrowser.CreateEmbeddedWebControl(szUrl);m_webBrowser.EventAdivse(&m_webBrowserEvent);SetTimer(m_hWnd,IDT_CHECKMSGTIMEOUT,CHECKMSGTIMEOUT_PERIOD,NULL);}else {m_webBrowser.Resize();}return 0;}LRESULT ChatWin::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam){return 0;}LRESULT ChatWin::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam){return 0;}LRESULT ChatWin::OnActiveApp(UINT uMsg, WPARAM wParam, LPARAM lParam){return 0;}void ChatWin::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam){switch((UINT)wParam){case IDT_CHECKMSGTIMEOUT:{ITROUTINFO itr=m_sendinfo.begin();while(itr!=m_sendinfo.end()){SendInfo *si=(*itr);SYSTEMTIME curdt;GetLocalTime(&curdt);if(si && MainWin::TimeDiff(curdt,si->msgSentDt)>MSG_SEND_TIMEOUT_INSECONDS) {if(si->msg==NULL){SAFE_DEL_PTR(si);itr=m_sendinfo.erase(itr);continue;}size_t l=_tcslen(si->msg);BOOL isStyle=(_tcsstr(si->msg,STYLE_PREFIX)==si->msg);BOOL isFileTransfer=(_tcsstr(si->msg,FILE_TRANSFER_PREFIX)==si->msg);if(l==0 || isStyle || isFileTransfer) {SAFE_DEL_ARR(si->msg);SAFE_DEL_PTR(si);itr=m_sendinfo.erase(itr);continue;}l+=MAX_PATH;TCHAR *js=new TCHAR[l];ZeroMemory(js,l*sizeof(TCHAR));TCHAR lid[STRLEN_SMALL]={0};MainWin::GetLocalMsgId(lid,STRLEN_SMALL);_stprintf_s(js,l,L"chatwin.error('%s','消息发送失败,请检查网络或联系系统管理员:<br/>%s');",lid,si->msg);BSTR bstrJS=SysAllocString(js);this->m_webBrowser.CallJavaScript(bstrJS);SAFE_DEL_ARR(js);FREE_SYS_STR(bstrJS);//允许继续发送TCHAR enableSendJS[STRLEN_SMALL]={0};_stprintf_s(enableSendJS,L"chatwin.enablesend(%s);",(si->echo?L"true":L"false"));BSTR bstrEnableSendJS=SysAllocString(enableSendJS);this->m_webBrowser.CallJavaScript(bstrEnableSendJS);FREE_SYS_STR(bstrEnableSendJS);SAFE_DEL_ARR(si->msg);SAFE_DEL_PTR(si);itr=m_sendinfo.erase(itr);}else{++itr;}}}break;}}LRESULT ChatWin::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam){if(!this->m_sendinfo.empty()){if (MessageBox(this->m_hWnd,L"此操作将导致部分消息无法发送,是否确定要关闭?",L"关闭确认",MB_OKCANCEL|MB_ICONQUESTION|MB_DEFBUTTON2)==IDCANCEL) return 0;}if(!this->m_ftc.empty()){if (MessageBox(this->m_hWnd,L"此操作将导致文件传输出现错误,是否确定要关闭?",L"关闭确认",MB_OKCANCEL|MB_ICONQUESTION|MB_DEFBUTTON2)==IDCANCEL) return 0;}DestroyWindow(m_hWnd);return 0;}LRESULT ChatWin::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam){KillTimer(m_hWnd,IDT_CHECKMSGTIMEOUT);//解除ie嵌入this->m_webBrowser.UnCreateEmbeddedWebControl();ITROUTINFO itr=m_sendinfo.begin();while(itr!=m_sendinfo.end()){SendInfo *si=(*itr);if(si) {SAFE_DEL_ARR(si->msg);SAFE_DEL_PTR(si);}itr++;}m_sendinfo.clear();ITRFTCONTEXT itrft=m_ftc.begin();while(itrft!=m_ftc.end()){PFTContext x=(*itrft);if(x) {TCHAR* szMsgOut=new TCHAR[STRLEN_SMALL];ZeroMemory(szMsgOut,sizeof(TCHAR)*STRLEN_SMALL);_stprintf_s(szMsgOut,STRLEN_SMALL,L"%s:%u:%u",FILE_TRANSFER_PREFIX,CANCEL,x->m_id);UINT ip=(UINT)MainWin::GetIPValue(m_targetIP);SendMessage(this->m_mainWin->m_hWnd,WM_SENDIM,(WPARAM)ip,(LPARAM)szMsgOut);SAFE_DEL_ARR(szMsgOut);x->m_canceled=TRUE;//等待发送文件内容线程关闭if(x->m_thread!=NULL){DWORD dwWaitRet=WaitForSingleObject(x->m_thread,1000);switch(dwWaitRet){case WAIT_OBJECT_0:break;case WAIT_TIMEOUT:default:TerminateThread(x->m_thread,0);break;}}SAFE_DEL_PTR(x);break;}itrft++;}m_ftc.clear();if(m_mainWin){CWItr itr=m_mainWin->m_chatwininfo.find(MainWin::GetIPValue(m_targetIP));if(itr!=m_mainWin->m_chatwininfo.end()){itr->second->hWnd=NULL;//SAFE_DEL_PTR(itr->second);}}SAFE_DEL_PTR(m_msgRecorder);this->m_mainWin=NULL;return 0;}LRESULT ChatWin::OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam){LPMINMAXINFO p=(LPMINMAXINFO)lParam;p->ptMinTrackSize.x = IM_WIDTH;p->ptMinTrackSize.y = IM_HEIGHT;return 0;}LRESULT ChatWin::OnIMReceived(UINT uMsg, WPARAM wParam, LPARAM lParam){TCHAR* js=(TCHAR*)lParam;if(!js || _tcslen(js)==0) return 0;if(!m_webBrowserReady){m_pendingDisplayInfo=SysAllocString(js);}else{BSTR bstrJS=SysAllocString(js);this->m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);}SAFE_DEL_ARR(js);NotifiyUser();return 0;}LRESULT ChatWin::OnSendStatusChanged(UINT uMsg, WPARAM wParam, LPARAM lParam){DWORD msgid=(DWORD)wParam;DWORD code=(DWORD)lParam;//ITROUTINFO itr;vector<SendInfo*>::reverse_iterator itr;for(itr=m_sendinfo.rbegin();itr!=m_sendinfo.rend();itr++){SendInfo *si=(*itr);if(msgid==si->msgId && code==2/*消息被目标成功接收标记*/) {TCHAR lid[STRLEN_SMALL]={0};if(si->msgId!=0){_stprintf_s(lid,L"%u",si->msgId);}else{MainWin::GetLocalMsgId(lid,STRLEN_SMALL);}SYSTEMTIME st;GetLocalTime(&st);TCHAR szDt[STRLEN_SMALL]={0};_stprintf_s(szDt,L"%04d-%02d-%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);if(si->echo){//显示发送的内容并清空发送内容区size_t l=_tcslen(si->msg)+MAX_PATH;TCHAR *js=new TCHAR[l];ZeroMemory(js,l*sizeof(TCHAR));_stprintf_s(js,l,L"chatwin.senddone('%s','%s','%s','%s');",lid,szDt,this->m_mainWin->m_userInfo.cn,si->msg);BSTR bstrJS=SysAllocString(js);this->m_webBrowser.CallJavaScript(bstrJS);SAFE_DEL_ARR(js);FREE_SYS_STR(bstrJS);}//记录消息历史记录if(si->recordable && this->m_msgRecorder) this->m_msgRecorder->RecordMsg(lid,si->msg,m_mainWin->m_userInfo.cn,szDt,m_style);//允许继续发送TCHAR enableSendJS[STRLEN_SMALL]={0};_stprintf_s(enableSendJS,L"chatwin.enablesend();");BSTR bstrEnableSendJS=SysAllocString(enableSendJS);this->m_webBrowser.CallJavaScript(bstrEnableSendJS);FREE_SYS_STR(bstrEnableSendJS);SAFE_DEL_ARR(si->msg);SAFE_DEL_PTR(si);m_sendinfo.erase((++itr).base());break;}}return 0;}LRESULT ChatWin::OnNetError(UINT uMsg, WPARAM wParam, LPARAM lParam){m_netOKFlag=FALSE;//阻止继续发送TCHAR* errMsg=(TCHAR*)lParam;TCHAR disableSendJS[STRLEN_DEFAULT]={0};_stprintf_s(disableSendJS,L"chatwin.disablesend('%s');",errMsg);BSTR bstrDisableSendJS=SysAllocString(disableSendJS);this->m_webBrowser.CallJavaScript(bstrDisableSendJS);FREE_SYS_STR(bstrDisableSendJS);return 0;}LRESULT ChatWin::OnGetMsgId(UINT uMsg, WPARAM wParam, LPARAM lParam){DWORD msgid=(DWORD)wParam;if(msgid==0) return 0;//ITROUTINFO itr;vector<SendInfo*>::reverse_iterator itr;for(itr=m_sendinfo.rbegin();itr!=m_sendinfo.rend();itr++){SendInfo *si=(*itr);if(si && si->msg==(TCHAR*)lParam) {si->msgId=msgid;break;}}return 0;}LRESULT ChatWin::OnAcceptFile(UINT uMsg, WPARAM wParam, LPARAM lParam){DWORD fid=(DWORD)lParam;if(fid==0){ErrMsg(0,L"无法获取目标文件的唯一标记!");return 0;}FTContext *pftc=NULL;if (!FindFTContext(fid,&pftc) || !pftc){ErrMsg(0,L"无法获取目标文件相关信息!");return 0;}TCHAR szMsgIn[STRLEN_1K]={0};TCHAR lid[STRLEN_SMALL]={0};_stprintf_s(lid,L"ftp_%u",pftc->m_id);if(!ReceiveFile(pftc)){ErrMsg(0,L"无法接收文件内容,请联系管理员!");}else{_stprintf_s(szMsgIn,L"chatwin.info('%s','正在接收文件"%s"...');",lid,pftc->m_fn);}BSTR bstrJS=SysAllocString(szMsgIn);m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);RemoveFTAskLink(fid);return 0;}LRESULT ChatWin::OnRefuseFile(UINT uMsg, WPARAM wParam, LPARAM lParam){DWORD fid=(DWORD)lParam;if(fid==0){ErrMsg(0,L"无法获取被拒绝文件的唯一标记!");return 0;}BOOL found=FALSE;TCHAR szFN[MAX_PATH]={0};if(m_ftc.empty()) return 0;ITRFTCONTEXT itr;for(itr=m_ftc.begin();itr!=m_ftc.end();itr++){PFTContext x=(*itr);if(x && x->m_id==fid) {found=TRUE;_tcscpy_s(szFN,x->m_fn);SAFE_DEL_PTR(x);m_ftc.erase(itr);break;}}if(found){TCHAR szMsgIn[STRLEN_1K]={0};TCHAR lid[STRLEN_SMALL]={0};MainWin::GetLocalMsgId(lid,STRLEN_SMALL);_stprintf_s(szMsgIn,L"chatwin.info('%s','%s拒绝了对文件:"%s"的接收。');",lid,this->m_targetCN,szFN);BSTR bstrJS=SysAllocString(szMsgIn);this->m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);}return 0;}LRESULT ChatWin::OnAskFile(UINT uMsg, WPARAM wParam, LPARAM lParam){PFTContext pftc=(PFTContext)lParam;if(!pftc||pftc->m_id==0 || pftc->m_fileSize==0||_tcslen(pftc->m_fn)==0) return 0;TCHAR lid[STRLEN_SMALL]={0};_stprintf_s(lid,L"%u",pftc->m_id);TCHAR szFTMsg[STRLEN_1K]={0};_stprintf_s(szFTMsg,L"chatwin.info('%s','%s给您发送文件:"%s"。<br/><span id=\"ftask_%u\">您可以<a href=\"#acceptfile:%u|%u|%s\">接收</a>或<a href=\"#refusefile:%u|%s\">拒绝</a>此文件。</span>');",/*lid*/lid,/*msg*/this->m_targetCN,pftc->m_fn,/*ask div*/pftc->m_id,/*accept*/pftc->m_id,pftc->m_fileSize,pftc->m_fn,/*refuse*/pftc->m_id,pftc->m_fn);if(!m_webBrowserReady){m_pendingDisplayInfo=SysAllocString(szFTMsg);}else{BSTR bstrJS=SysAllocString(szFTMsg);this->m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);}SAFE_DEL_PTR(pftc);return 0;}LRESULT ChatWin::OnFTComplete(UINT uMsg, WPARAM wParam, LPARAM lParam){FTContext *pftc=(PFTContext)lParam;if(!pftc) return 0;TCHAR lid[STRLEN_SMALL]={0};MainWin::GetLocalMsgId(lid,STRLEN_SMALL);TCHAR receivedLink[STRLEN_1K]={0};if(!pftc->m_isSender){_stprintf_s(receivedLink,L"您可以<a href=\"#openfile:%s\">打开</a>或<a href=\"#explorefile:%s\" title=\"在目标文件夹中查看\">浏览</a>此文件。",pftc->m_fp,pftc->m_fp);}CAtlString atlStr(receivedLink);atlStr.Replace(L"\\",L"\\\\");TCHAR log[STRLEN_2K]={0};_stprintf_s(log,L"chatwin.info('%s','文件"%s"%s完毕。%s');",lid,pftc->m_fn,(pftc->m_isSender?L"发送":L"接收"),atlStr.GetString());BSTR bstrJS=SysAllocString(log);m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);RemoveFTProgress(pftc->m_id);if(m_ftc.empty()) return 0;ITRFTCONTEXT itr;for(itr=m_ftc.begin();itr!=m_ftc.end();itr++){PFTContext x=(*itr);if(x && (x==pftc||x->m_id==pftc->m_id)) {SAFE_DEL_PTR(x);m_ftc.erase(itr);break;}}return 0;}LRESULT ChatWin::OnFTError(UINT uMsg, WPARAM wParam, LPARAM lParam){FTContext *pftc=(PFTContext)lParam;DWORD dwErrCode=(DWORD)wParam;TCHAR lid[STRLEN_SMALL]={0};MainWin::GetLocalMsgId(lid,STRLEN_SMALL);TCHAR errlog[STRLEN_DEFAULT]={0};switch(dwErrCode){case ERROR_CANCELLED:_stprintf_s(errlog,L"chatwin.info('%s','文件"%s"的传输过程被取消。');",lid,(pftc?pftc->m_fn:L""));break;case WSAENETDOWN:case WSAENETUNREACH:_stprintf_s(errlog,L"chatwin.info('%s','文件"%s"的传输过程因网络异常而中断。');",lid,(pftc?pftc->m_fn:L""));break;case WSAENETRESET:case WSAECONNABORTED:case WSAECONNRESET:_stprintf_s(errlog,L"chatwin.info('%s','文件"%s"的传输过程因网络被重置而中断。');",lid,(pftc?pftc->m_fn:L""));break;case WSAENOBUFS:_stprintf_s(errlog,L"chatwin.info('%s','文件"%s"的传输过程因网络缓冲区不足而中断。');",lid,(pftc?pftc->m_fn:L""));break;case WSAEISCONN:case WSAENOTCONN:case WSAEHOSTDOWN:case WSAEHOSTUNREACH:case WSAHOST_NOT_FOUND:_stprintf_s(errlog,L"chatwin.info('%s','文件"%s"的传输过程因网络连接异常而中断。');",lid,(pftc?pftc->m_fn:L""));break;case WSAESHUTDOWN:_stprintf_s(errlog,L"chatwin.info('%s','文件"%s"的传输过程因网络连接被关闭而中断。');",lid,(pftc?pftc->m_fn:L""));break;case WSAETIMEDOUT:_stprintf_s(errlog,L"chatwin.info('%s','文件"%s"的传输过程因网络超时而中断。');",lid,(pftc?pftc->m_fn:L""));break;case WSAECONNREFUSED:case WSAEREFUSED:_stprintf_s(errlog,L"chatwin.info('%s','文件"%s"的传输过程因连接被拒绝而中断。');",lid,(pftc?pftc->m_fn:L""));break;case WSASYSCALLFAILURE:_stprintf_s(errlog,L"chatwin.info('%s','文件"%s"的传输过程因不可恢复的网络错误而中断。');",lid,(pftc?pftc->m_fn:L""));break;default:_stprintf_s(errlog,L"chatwin.info('%s','%s文件"%s"时出现错误,错误代码为:0x%X,请联系管理员。');",lid,(pftc?(pftc->m_isSender?L"发送":L"接收"):L"传输"),(pftc?pftc->m_fn:L""),dwErrCode);break;}BSTR bstrJS=SysAllocString(errlog);m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);RemoveFTProgress(pftc->m_id);if(m_ftc.empty()) return 0;ITRFTCONTEXT itr;for(itr=m_ftc.begin();itr!=m_ftc.end();itr++){PFTContext x=(*itr);if(x && (x==pftc||x->m_id==pftc->m_id)) {SAFE_DEL_PTR(x);m_ftc.erase(itr);break;}}return 0;}LRESULT ChatWin::OnFTProgress(UINT uMsg, WPARAM wParam, LPARAM lParam){FTContext *pftc=(PFTContext)lParam;if(!pftc) return 0;DWORD p=(DWORD)(((double)(pftc->m_isSender?pftc->m_sentBytes:pftc->m_receivedBytes)/(double)pftc->m_fileSize)*100.0);TCHAR js[MAX_PATH]={0};_stprintf_s(js,L"chatwin.ftprogress('%u',%u);",pftc->m_id,p);BSTR bstrJS=SysAllocString(js);this->m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);return 0;}LRESULT ChatWin::OnFTSendFData(UINT uMsg, WPARAM wParam, LPARAM lParam){PFTContext pftc=(PFTContext)lParam;if(!pftc) return 0;if(!SendFile(pftc)){ErrMsg(0,L"无法发送文件内容,请联系管理员!");}return 0;}LRESULT ChatWin::OnFTCanceled(UINT uMsg, WPARAM wParam, LPARAM lParam){DWORD fid=(DWORD)lParam;PFTContext pftc=NULL;if(!FindFTContext(fid,&pftc) ||!pftc) return 0;OnFTError(WM_FT_ERROR,(WPARAM)ERROR_CANCELLED,(LPARAM)pftc);return 0;}BOOL ChatWin::FindFTContext(DWORD fid,PFTContext* ppftc){*ppftc=NULL;if(m_ftc.empty()) return FALSE;ITRFTCONTEXT itr;for(itr=m_ftc.begin();itr!=m_ftc.end();itr++){PFTContext x=(*itr);if(x && x->m_id==fid) {*ppftc=x;return TRUE;}}return FALSE;}BOOL ChatWin::SendFile(PFTContext pftc){BOOL ret=FALSE;if (!pftc) return ret;TCHAR szMsgIn[STRLEN_1K]={0};TCHAR lid[STRLEN_SMALL]={0};_stprintf_s(lid,L"ftp_%u",pftc->m_id);_stprintf_s(szMsgIn,L"chatwin.info('%s','正在发送文件"%s"...');",lid,pftc->m_fn);BSTR bstrJS=SysAllocString(szMsgIn);m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);pftc->m_thread=CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)SendFileContent,(LPVOID)pftc,0,&(pftc->m_tid));ret=(pftc->m_tid!=0);return ret;}BOOL ChatWin::ReceiveFile(PFTContext pftc){BOOL ret=FALSE;if (!pftc) return ret;pftc->m_thread=CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)RecvFileContent,(LPVOID)pftc,0,&(pftc->m_tid));ret=(pftc->m_tid!=0);return ret;}void ChatWin::InitFTContext(PFTContext pftc){if(!pftc) return;pftc->m_id=GetTickCount();pftc->m_hwnd=m_hWnd;pftc->m_port=DEFAULT_PORT;pftc->m_receivedBytes=0;pftc->m_sentBytes=0;pftc->m_isSender=FALSE;pftc->m_fileSize=0;pftc->m_tid=0;pftc->m_thread=NULL;pftc->m_socket=INVALID_SOCKET;pftc->m_canceled=FALSE;ZeroMemory(&pftc->m_fn,sizeof(TCHAR)*MAX_PATH);ZeroMemory(&pftc->m_fp,sizeof(TCHAR)*MAX_PATH);ZeroMemory(&pftc->m_src,sizeof(TCHAR)*MAX_PATH);ZeroMemory(&pftc->m_dest,sizeof(TCHAR)*MAX_PATH);}void ChatWin::RemoveFTAskLink(DWORD fid){TCHAR js[MAX_PATH]={0};_stprintf_s(js,L"chatwin.removeftlink('%u');",fid);BSTR bstrJS=SysAllocString(js);this->m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);}void ChatWin::RemoveFTProgress(DWORD fid){TCHAR js[MAX_PATH]={0};_stprintf_s(js,L"chatwin.removeftprogress('%u');",fid);BSTR bstrJS=SysAllocString(js);this->m_webBrowser.CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);}void ChatWin::NotifiyUser(){if (GetForegroundWindow()!=m_hWnd || IsIconic(m_hWnd)){FLASHWINFO fwi;ZeroMemory(&fwi,sizeof(fwi));fwi.cbSize=sizeof(fwi);fwi.hwnd=m_hWnd;fwi.dwFlags=FLASHW_TRAY|FLASHW_TIMERNOFG;if (!IsIconic(m_hWnd)) fwi.dwFlags|=FLASHW_CAPTION;fwi.uCount=5000;fwi.dwTimeout=0;FlashWindowEx(&fwi);}}/*********** ChatWinIEEventImpl 成员 ************/void ChatWinIEEventImpl::DocumentComplete(IDispatch *pDisp,VARIANT *URL){CComPtr<IWebBrowser2> pWebBrowser2=NULL;HRESULT hr=pDisp->QueryInterface(IID_IWebBrowser2,(void**)&pWebBrowser2);if (FAILED(hr) || !pWebBrowser2) return ;if(m_pChatWin->m_pendingDisplayInfo!=NULL){this->host->CallJavaScript(m_pChatWin->m_pendingDisplayInfo);FREE_SYS_STR(m_pChatWin->m_pendingDisplayInfo);m_pChatWin->NotifiyUser();}BSTR bstrUrl=NULL;TCHAR szUrlParams[MAX_PATH]={0};if(pWebBrowser2->get_LocationURL(&bstrUrl)==S_OK){TCHAR* szParamStart=_tcsstr(bstrUrl,L"#");if(szParamStart)_tcscpy_s(szUrlParams,szParamStart+1);FREE_SYS_STR(bstrUrl);}if(!m_pChatWin->m_webBrowserReady && _tcslen(szUrlParams)==0){TCHAR fn[MAX_PATH]={0};int len=GetModuleFileName(NULL,fn,MAX_PATH);if(_tcslen(fn)==0 || ERROR_INSUFFICIENT_BUFFER==GetLastError()){ErrMsg(0,L"初始化即时消息窗口时出现异常,请联系管理员!");}else{TCHAR* sz=fn;while(*sz!=L'0円'){if(*sz==L'\\') *sz=L'/';sz++;}AppOptions* appOpts=AppOptions::GetInstance();TCHAR szInitJs[STRLEN_2K]={0};_stprintf_s(szInitJs,L"chatwin.init('%s','http://%s/tsim/theme/emotions/','%s','%s');",fn,AppOptions::szCurrentSiteUrl,AppOptions::szCurrentSiteUrlExt,appOpts->SendMsgKey);BSTR initjs=SysAllocString(szInitJs);this->host->CallJavaScript(initjs);FREE_SYS_STR(initjs);}}m_pChatWin->m_webBrowserReady=TRUE;if(_tcsstr(szUrlParams,L"send")==szUrlParams){OnSendIMMessage(pWebBrowser2,szUrlParams);}if(_tcsstr(szUrlParams,L"close")==szUrlParams){OnClose(pWebBrowser2,szUrlParams);}if(_tcsstr(szUrlParams,L"file")==szUrlParams){OnSendFile(pWebBrowser2,szUrlParams);}if(_tcsstr(szUrlParams,L"acceptfile")==szUrlParams){OnAcceptFile(pWebBrowser2,szUrlParams);}if(_tcsstr(szUrlParams,L"refusefile")==szUrlParams){OnRefuseFile(pWebBrowser2,szUrlParams);}if(_tcsstr(szUrlParams,L"pickcolor")==szUrlParams){OnPickColor(pWebBrowser2,szUrlParams);}if(_tcsstr(szUrlParams,L"setstyle")==szUrlParams){OnSetStyle(pWebBrowser2,szUrlParams);}if(_tcsstr(szUrlParams,L"history")==szUrlParams){OnHistory(pWebBrowser2,szUrlParams);}if(_tcsstr(szUrlParams,L"openfile")==szUrlParams){OnOpenFile(pWebBrowser2,szUrlParams);}if(_tcsstr(szUrlParams,L"explorefile")==szUrlParams){OnExploreFile(pWebBrowser2,szUrlParams);}}void ChatWinIEEventImpl::OnSendIMMessage(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){BSTR bstrElId=SysAllocString(L"sendarea");CComPtr<IHTMLDocument2> doc2=NULL;CComPtr<IHTMLDocument3> doc3=NULL;CComPtr<IHTMLElement> el=NULL;HRESULT hr=pWebBrowser2->get_Document((IDispatch**)&doc2);if (FAILED(hr)) goto end;hr=doc2->QueryInterface(IID_IHTMLDocument3,(void**)&doc3);if (FAILED(hr)) goto end;hr=doc3->getElementById(bstrElId,&el);if (FAILED(hr) || !el) goto end;BSTR sendContent=NULL;hr=el->get_innerHTML(&sendContent);if(FAILED(hr) || !sendContent) goto end;size_t l=_tcslen(sendContent);if(l==0){FREE_SYS_STR(sendContent);ErrMsg(0,L"您必须输入有效内容!");goto end;}l+=l;SendInfo *si=new SendInfo;memset(si,0,sizeof(SendInfo));si->echo=TRUE;si->recordable=TRUE;GetLocalTime(&(si->msgSentDt));this->m_pChatWin->m_sendinfo.push_back(si);si->msg=new TCHAR[l];ZeroMemory(si->msg,sizeof(TCHAR)*l);TCHAR *d = si->msg;TCHAR *s=sendContent;while (*s!=L'0円'){if(*s!=L'\r' && *s!=L'\n') {if(*s!=L'\''){*d++=*s;}else{*d++=L'\\';*d++=*s;}}s++;}UINT ip=(UINT)MainWin::GetIPValue(this->m_pChatWin->m_targetIP);PostMessage(this->m_pChatWin->m_mainWin->m_hWnd,WM_SENDIM,(WPARAM)ip,(LPARAM)si->msg);//阻止继续发送以等待消息被成功接收或超时TCHAR disableSendJS[STRLEN_SMALL]={0};_stprintf_s(disableSendJS,L"chatwin.disablesend('正在发送消息...');");BSTR bstrDisableSendJS=SysAllocString(disableSendJS);this->host->CallJavaScript(bstrDisableSendJS);FREE_SYS_STR(bstrDisableSendJS);////显示发送的内容并清空发送内容区,//SYSTEMTIME st;//GetLocalTime(&st);//TCHAR szDt[STRLEN_SMALL]={0};//_stprintf_s(szDt,L"%04d-%02d-%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);//l+=MAX_PATH;//TCHAR *js=new TCHAR[l];//ZeroMemory(js,l*sizeof(TCHAR));//TCHAR lid[STRLEN_SMALL]={0};//MainWin::GetLocalMsgId(lid,STRLEN_SMALL);//_stprintf_s(js,l,L"chatwin.senddone('%s','%s','%s','%s');",lid,szDt,this->m_pChatWin->m_mainWin->m_userInfo.cn,si->msg);//BSTR bstrJS=SysAllocString(js);//this->host->CallJavaScript(bstrJS);//SAFE_DEL_ARR(js);//FREE_SYS_STR(bstrJS);////记录消息历史记录//if(m_pChatWin->m_msgRecorder) m_pChatWin->m_msgRecorder->RecordMsg(lid,si->msg,m_pChatWin->m_mainWin->m_userInfo.cn,szDt,m_pChatWin->m_style);FREE_SYS_STR(sendContent);end:FREE_SYS_STR(bstrElId);}void ChatWinIEEventImpl::OnClose(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){PostMessage(this->m_pChatWin->m_hWnd,WM_SYSCOMMAND,SC_CLOSE,(LPARAM)0);}void ChatWinIEEventImpl::OnSendFile(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){if(!this->m_pChatWin->m_netOKFlag) return;TCHAR szResult[MAX_PATH]={0};TCHAR szFileTitle[MAX_PATH]={0};OPENFILENAME ofn;ZeroMemory(&ofn, sizeof(OPENFILENAME));ofn.lStructSize = sizeof(OPENFILENAME);ofn.hwndOwner = this->m_pChatWin->m_hWnd;ofn.lpstrFilter = L"所有文件0円*.*0円0円";ofn.nFilterIndex = 0;ofn.lpstrDefExt=NULL;ofn.lpstrFile=szResult;ofn.nMaxFile = MAX_PATH;ofn.lpstrFileTitle = szFileTitle;ofn.nMaxFileTitle=MAX_PATH;ofn.lpstrInitialDir = NULL;ofn.lpstrTitle=L"选择要发送的文件";ofn.Flags =OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_LONGNAMES; //|=OFN_ALLOWMULTISELECTif (GetOpenFileName(&ofn)==TRUE){PFTContext pftc=new FTContext;m_pChatWin->InitFTContext(pftc);pftc->m_isSender=TRUE;_tcscpy_s(pftc->m_dest,m_pChatWin->m_targetIP);_tcscpy_s(pftc->m_src,m_pChatWin->m_mainWin->m_userInfo.ip);_tcscpy_s(pftc->m_fn,szFileTitle);_tcscpy_s(pftc->m_fp,szResult);HANDLE hFile=CreateFile(pftc->m_fp,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hFile == INVALID_HANDLE_VALUE) {ErrMsg(GetLastError(),L"无法打开文件:%s");return;}LARGE_INTEGER li={0};if(!GetFileSizeEx(hFile,&li)){CloseHandle(hFile);ErrMsg(GetLastError(),L"无法获取文件大小:%s");return;}if(li.QuadPart==0){CloseHandle(hFile);ErrMsg(0,L"您不能发送大小为0的文件!");return;}if(li.QuadPart>MAX_FILE_SEND_LENGTH){CloseHandle(hFile);ErrMsg(0,L"您不能发送大小超过2GB的文件!");return;}pftc->m_fileSize=(DWORD)li.QuadPart;CloseHandle(hFile);m_pChatWin->m_ftc.push_back(pftc);TCHAR szMsgOut[STRLEN_1K]={0};//_stprintf_s(szMsgOut,L"%s给您发送文件:"%s"。<br/>您可以<a href=\"#acceptfile:%u,%u,%s\">接收</a>或<a href=\"#refusefile:%u,%s\">拒绝</a>此文件。",/*msg*/this->m_pChatWin->m_mainWin->m_userInfo.cn,szFileTitle,/*accept*/pftc->m_id,pftc->m_fileSize,szFileTitle,/*refuse*/pftc->m_id,szFileTitle);_stprintf_s(szMsgOut,L"%s:%u:%u:%u:%s",FILE_TRANSFER_PREFIX,ASK,pftc->m_id,pftc->m_fileSize,szFileTitle);TCHAR szMsgIn[STRLEN_1K]={0};TCHAR lid[STRLEN_SMALL]={0};MainWin::GetLocalMsgId(lid,STRLEN_SMALL);_stprintf_s(szMsgIn,L"chatwin.info('%s','等待%s接收文件:"%s"...');",lid,this->m_pChatWin->m_targetCN,szFileTitle);SendInfo *si=new SendInfo;memset(si,0,sizeof(SendInfo));GetLocalTime(&(si->msgSentDt));m_pChatWin->m_sendinfo.push_back(si);size_t l=_tcslen(szMsgOut)+1;si->msg=new TCHAR[l];ZeroMemory(si->msg,sizeof(TCHAR)*l);_tcscpy_s(si->msg,l,szMsgOut);UINT ip=(UINT)MainWin::GetIPValue(m_pChatWin->m_targetIP);PostMessage(this->m_pChatWin->m_mainWin->m_hWnd,WM_SENDIM,(WPARAM)ip,(LPARAM)si->msg);BSTR bstrJS=SysAllocString(szMsgIn);this->host->CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);}}void ChatWinIEEventImpl::OnAcceptFile(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){OPENFILENAME ofn;ZeroMemory(&ofn, sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = GetForegroundWindow();TCHAR szFileTitle[MAX_PATH]={0};TCHAR szExtName[MAX_PATH]={0};TCHAR szResult[MAX_PATH]={0};TCHAR szInitDir[MAX_PATH]={0};AppOptions* appOpts=AppOptions::GetInstance();_tcscpy_s(szInitDir,appOpts->LocalFilePath);TCHAR *sz=_tcschr(szUrlParams,L':');if(sz==NULL) return;sz++;int idx=0;while(*(sz+idx)!=L'0円'){if(*(sz+idx)==L'|') *(sz+idx)=L'0円';idx++;}DWORD fid=0;DWORD fsize=0;idx=0;for (LPTSTR pszz = sz; *pszz; pszz += _tcslen(pszz) + 1) {switch(idx){case 0: //file idfid=_tcstoul(pszz,NULL,10);if(fid==0) {ErrMsg(0,L"无法获取接收文件的唯一标记!");return;}break;case 1: //file sizefsize=_tcstoul(pszz,NULL,10);if(fsize==0) {ErrMsg(0,L"无法获取接收文件的大小!");return;}break;case 2: //file name{_tcscpy_s(szFileTitle,pszz);if(_tcslen(szFileTitle)==0) {ErrMsg(0,L"无法获取接收文件的文件名!");return;}TCHAR* sz=_tcsrchr(szFileTitle,L'.');if(sz!=NULL)_tcscpy_s(szExtName,++sz);_tcscpy_s(szResult,szFileTitle);ZeroMemory(szFileTitle,sizeof(TCHAR)*MAX_PATH);}break;default:break;}idx++;if(idx>2) break;}TCHAR filter[STRLEN_SMALL]={0};_stprintf_s(filter,L"%s文件|*.%s",szExtName,szExtName);filter[_tcslen(filter)+1]=L'0円';TCHAR *filterStart=filter;while(*(filterStart++)!=L'0円'){if(*filterStart==L'|') *filterStart=L'0円';}ofn.lpstrFilter = filter;ofn.nFilterIndex = 1;ofn.lpstrDefExt=szExtName;ofn.lpstrFile=szResult;ofn.nMaxFile=MAX_PATH;ofn.lpstrFileTitle=szFileTitle;ofn.nMaxFileTitle=MAX_PATH;ofn.lpstrInitialDir = szInitDir;ofn.lpstrTitle=L"保存文件";ofn.Flags = OFN_OVERWRITEPROMPT| OFN_EXPLORER | OFN_LONGNAMES;if (GetSaveFileName(&ofn)==TRUE){PFTContext pftc=new FTContext;m_pChatWin->InitFTContext(pftc);pftc->m_id=fid;pftc->m_fileSize=fsize;_tcscpy_s(pftc->m_dest,m_pChatWin->m_mainWin->m_userInfo.ip);_tcscpy_s(pftc->m_src,m_pChatWin->m_targetIP);pftc->m_isSender=FALSE;_tcscpy_s(pftc->m_fn,szFileTitle);_tcscpy_s(pftc->m_fp,szResult);m_pChatWin->m_ftc.push_back(pftc);PostMessage(this->m_pChatWin->m_hWnd,WM_FT_ACCEPT,(WPARAM)0,(LPARAM)fid);}}void ChatWinIEEventImpl::OnRefuseFile(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){TCHAR *sz=_tcschr(szUrlParams,L':');TCHAR *sz1=_tcschr(szUrlParams,L'|');if(sz==NULL || sz1==NULL) return;TCHAR* fid=sz+1;if(_tcslen(fid)==0) return ;*sz1=L'0円';TCHAR* fn=sz1+1;if(_tcslen(fn)==0) return ;TCHAR szMsgOut[STRLEN_1K]={0};_stprintf_s(szMsgOut,L"%s:%u:%s",FILE_TRANSFER_PREFIX,REFUSE,fid);SendInfo *si=new SendInfo;memset(si,0,sizeof(SendInfo));GetLocalTime(&(si->msgSentDt));m_pChatWin->m_sendinfo.push_back(si);size_t l=_tcslen(szMsgOut)+1;si->msg=new TCHAR[l];ZeroMemory(si->msg,sizeof(TCHAR)*l);_tcscpy_s(si->msg,l,szMsgOut);UINT ip=(UINT)MainWin::GetIPValue(m_pChatWin->m_targetIP);PostMessage(this->m_pChatWin->m_mainWin->m_hWnd,WM_SENDIM,(WPARAM)ip,(LPARAM)si->msg);TCHAR szMsgIn[STRLEN_1K]={0};TCHAR lid[STRLEN_SMALL]={0};MainWin::GetLocalMsgId(lid,STRLEN_SMALL);_stprintf_s(szMsgIn,L"chatwin.info('%s','您拒绝了对文件"%s"的接收。');",lid,fn);BSTR bstrJS=SysAllocString(szMsgIn);this->host->CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);DWORD dwFid=_tcstoul(fid,NULL,10);this->m_pChatWin->RemoveFTAskLink(dwFid);}void ChatWinIEEventImpl::OnPickColor(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){CHOOSECOLOR cc;static COLORREF acrCustClr[16];ZeroMemory(&cc, sizeof(cc));cc.lStructSize = sizeof(cc);cc.hwndOwner = m_pChatWin->m_hWnd;cc.lpCustColors = (LPDWORD) acrCustClr;cc.rgbResult = m_pChatWin->m_sendMsgColor;cc.Flags = CC_FULLOPEN | CC_RGBINIT;if (ChooseColor(&cc)==TRUE) {m_pChatWin->m_sendMsgColor = cc.rgbResult;TCHAR szResult[STRLEN_SMALL]={0};_stprintf_s(szResult,L"chatwin.setColor('#%02X%02X%02X');",GetRValue(cc.rgbResult),GetGValue(cc.rgbResult),GetBValue(cc.rgbResult));BSTR bstrJS=SysAllocString(szResult);this->host->CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);}}void ChatWinIEEventImpl::OnSetStyle(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){ULONG ipv=(UINT)MainWin::GetIPValue(m_pChatWin->m_targetIP);CWItr itr=m_pChatWin->m_mainWin->m_chatwininfo.find(ipv);if(itr==m_pChatWin->m_mainWin->m_chatwininfo.end()) return;ChatWinInfo* pcw=itr->second;if(!pcw) return;static OLECHAR FAR* sMethod = L"getStyle";IHTMLDocument2 *htmlDoc2=NULL;IDispatch* pScript = NULL;DISPID idMethod = 0;VARIANT ret={0};HRESULT hr=pWebBrowser2->get_Document((IDispatch**)&htmlDoc2);if (FAILED(hr)) goto end;hr=htmlDoc2->get_Script(&pScript);if (FAILED(hr)) goto end;hr = pScript->GetIDsOfNames(IID_NULL, &sMethod, 1, LOCALE_SYSTEM_DEFAULT,&idMethod);if (SUCCEEDED(hr)) {DISPPARAMS dpNoArgs = {NULL,NULL, 0, 0};hr = pScript->Invoke(idMethod, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,&dpNoArgs, &ret, NULL, NULL);if(ret.vt==VT_BSTR && ret.bstrVal!=NULL && _tcslen(ret.bstrVal)>0){_tcscpy_s(pcw->style,ret.bstrVal);_tcscpy_s(m_pChatWin->m_style,ret.bstrVal);TCHAR szSend[STRLEN_DEFAULT]={0};_stprintf_s(szSend,L"%s:%s",STYLE_PREFIX,ret.bstrVal);SendInfo *si=new SendInfo;memset(si,0,sizeof(SendInfo));GetLocalTime(&(si->msgSentDt));this->m_pChatWin->m_sendinfo.push_back(si);size_t l=_tcslen(szSend)+1;si->msg=new TCHAR[l];ZeroMemory(si->msg,sizeof(TCHAR)*l);_tcscpy_s(si->msg,l,szSend);UINT ip=(UINT)MainWin::GetIPValue(this->m_pChatWin->m_targetIP);PostMessage(this->m_pChatWin->m_mainWin->m_hWnd,WM_SENDIM,(WPARAM)ip,(LPARAM)si->msg);}}end:SAFE_RELEASE(pScript);SAFE_RELEASE(htmlDoc2);FREE_SYS_STR(ret.bstrVal);return ;}void ChatWinIEEventImpl::OnHistory(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){if(_tcsrchr(szUrlParams,L':')!=NULL){OnHistoryIndex(pWebBrowser2,szUrlParams);return ;}if(m_pChatWin->m_showHistoryFlag){BSTR bstrJS=SysAllocString(L"chatwin.scrolltotop();");host->CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);return ;}WIN32_FIND_DATA ffd;LARGE_INTEGER filesize;TCHAR szDir[MAX_PATH]={0};HANDLE hFind = INVALID_HANDLE_VALUE;DWORD dwError=0;AppOptions* appOpts=AppOptions::GetInstance();size_t fll=_tcslen(appOpts->LocalMessagePath);if(appOpts->LocalMessagePath[fll-1]==L'\\') _stprintf_s(szDir,L"%s%s\\*.dat",appOpts->LocalMessagePath,m_pChatWin->m_msgRecorder->m_pdir);else _stprintf_s(szDir,L"%s\\%s\\*.dat",appOpts->LocalMessagePath,m_pChatWin->m_msgRecorder->m_pdir);CAtlString atlStr(L"");hFind = FindFirstFile(szDir, &ffd);if(INVALID_HANDLE_VALUE == hFind) goto end;do{if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;filesize.LowPart = ffd.nFileSizeLow;filesize.HighPart = ffd.nFileSizeHigh;if(filesize.QuadPart==0) continue;if(atlStr.GetLength()>0) atlStr+=L",\r\n";atlStr+=L"'";atlStr+=ffd.cFileName;atlStr+=L"'";} while (FindNextFile(hFind, &ffd) != 0);if(atlStr.GetLength()>0){atlStr.Insert(0,L"chatwin.sethistoryfiles([");atlStr+=L"]);";BSTR bstrJS=atlStr.AllocSysString();this->host->CallJavaScript(bstrJS);FREE_SYS_STR(bstrJS);}//dwError = GetLastError();//if (dwError != ERROR_NO_MORE_FILES){}end:m_pChatWin->m_showHistoryFlag=TRUE;FindClose(hFind);return ;}void ChatWinIEEventImpl::OnHistoryIndex(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){TCHAR* szStart=_tcschr(szUrlParams,L':');TCHAR* szEnd=_tcsrchr(szUrlParams,L':');int idx=0;if(szStart!=NULL && szEnd>szStart){size_t len=szEnd-szStart;TCHAR szIdx[STRLEN_SMALL]={0};_tcsncpy_s(szIdx,szStart+1,szEnd-szStart-1);idx=_tstoi(szIdx);}TCHAR* sz=_tcsrchr(szUrlParams,L':');if(sz==NULL) return;TCHAR szDir[MAX_PATH]={0};HANDLE hFile = INVALID_HANDLE_VALUE;DWORD dwError=0;AppOptions* appOpts=AppOptions::GetInstance();size_t fll=_tcslen(appOpts->LocalMessagePath);if(appOpts->LocalMessagePath[fll-1]==L'\\') _stprintf_s(szDir,L"%s%s\\%s.dat",appOpts->LocalMessagePath,m_pChatWin->m_msgRecorder->m_pdir,sz+1);else _stprintf_s(szDir,L"%s\\%s\\%s.dat",appOpts->LocalMessagePath,m_pChatWin->m_msgRecorder->m_pdir,sz+1);TCHAR* szContent=NULL;TCHAR* szJS=NULL;BSTR bstrJS=NULL;char *bs = NULL;if(_tcsicmp(szDir,m_pChatWin->m_msgRecorder->m_fn)==0){szContent=m_pChatWin->m_msgRecorder->m_oldContent;}else{hFile=CreateFile(szDir,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hFile == INVALID_HANDLE_VALUE){ErrMsg(GetLastError(),L"无法打开保存历史记录的文件:%s");return;}DWORD dwfilesize=GetFileSize(hFile,NULL);DWORD dwBytesRead = 0;bs= new char[dwfilesize+1];ZeroMemory(bs,dwfilesize+1);if(FALSE==ReadFile(hFile, bs, dwfilesize, &dwBytesRead, NULL)){goto end;}USES_CONVERSION;szContent=A2T(bs);}if(szContent!=NULL){size_t l= _tcslen(szContent);if(l==0){goto end;}size_t jslen=l+MAX_PATH;szJS=new TCHAR[jslen];ZeroMemory(szJS,sizeof(TCHAR)*jslen);_stprintf_s(szJS,jslen,L"chatwin.showhistory([%s],%d);",szContent,idx);bstrJS=SysAllocString(szJS);host->CallJavaScript(bstrJS);}end:SAFE_DEL_ARR(bs);SAFE_DEL_ARR(szJS);FREE_SYS_STR(bstrJS);CloseHandle(hFile);}void ChatWinIEEventImpl::OnOpenFile(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){TCHAR* sz=_tcschr(szUrlParams,L':');if(sz==NULL) return;sz++;if(_tcslen(sz)==0) return;CAtlString atlStr(sz);atlStr.Replace(L"%20",L" ");SHELLEXECUTEINFO ShExecInfo;ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT;ShExecInfo.lpVerb = L"open";ShExecInfo.lpFile =atlStr.GetString();ShExecInfo.lpParameters = NULL;ShExecInfo.lpDirectory = NULL;ShExecInfo.nShow = SW_SHOWNORMAL;ShExecInfo.hInstApp = NULL;ShExecInfo.hwnd = NULL;if (!ShellExecuteEx(&ShExecInfo)){ErrMsg(GetLastError(),L"启动文件时出现错误:%s");}}void ChatWinIEEventImpl::OnExploreFile(IWebBrowser2* pWebBrowser2,TCHAR* szUrlParams){TCHAR* sz=_tcschr(szUrlParams,L':');if(sz==NULL) return;sz++;if(_tcslen(sz)==0) return;CAtlString atlStr(sz);atlStr.Replace(L"%20",L" ");SHELLEXECUTEINFO ShExecInfo;ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT;ShExecInfo.lpVerb = L"open";ShExecInfo.lpFile =L"explorer.exe";TCHAR szParam[MAX_PATH+100]={0};_stprintf_s(szParam,L"/select,\"%s\"",atlStr.GetString());ShExecInfo.lpParameters = szParam;ShExecInfo.lpDirectory = NULL;ShExecInfo.nShow = SW_SHOWNORMAL;ShExecInfo.hInstApp = NULL;ShExecInfo.hwnd = NULL;if (!ShellExecuteEx(&ShExecInfo)){ErrMsg(GetLastError(),L"查看文件时出现错误:%s");}}void ChatWinIEEventImpl::BeforeNavigate2(IDispatch *pDisp, VARIANT *&url, VARIANT *&Flags, VARIANT *&TargetFrameName, VARIANT *&PostData, VARIANT *&Headers, VARIANT_BOOL *&Cancel){//NOOP}int ChatWinIEEventImpl::GetElementValue(IWebBrowser2 *pWB,BSTR szElID,BSTR* pbstrValue){int ret=-1;*pbstrValue=NULL;if (!pWB || !szElID) return ret;CComPtr<IHTMLDocument2> doc2=NULL;CComPtr<IHTMLDocument3> doc3=NULL;CComPtr<IHTMLElement> el=NULL;CComPtr<IHTMLInputElement> elx=NULL;HRESULT hr=pWB->get_Document((IDispatch**)&doc2);if (FAILED(hr)) goto end;hr=doc2->QueryInterface(IID_IHTMLDocument3,(void**)&doc3);if (FAILED(hr)) goto end;hr=doc3->getElementById(szElID,&el);if (FAILED(hr) || !el) goto end;hr=el->QueryInterface(IID_IHTMLInputElement,(void**)&elx);if (FAILED(hr) || !elx) goto end;hr=elx->get_value(pbstrValue);if (FAILED(hr)) goto end;ret=SysStringLen(*pbstrValue);end:return ret;}void ChatWinIEEventImpl::SetElementValue(IWebBrowser2 *pWB,BSTR szElID,BSTR bstrValue){int ret=-1;if (!pWB || !szElID) return ;CComPtr<IHTMLDocument2> doc2=NULL;CComPtr<IHTMLDocument3> doc3=NULL;CComPtr<IHTMLElement> el=NULL;CComPtr<IHTMLInputElement> elx=NULL;HRESULT hr=pWB->get_Document((IDispatch**)&doc2);if (FAILED(hr)) goto end;hr=doc2->QueryInterface(IID_IHTMLDocument3,(void**)&doc3);if (FAILED(hr)) goto end;hr=doc3->getElementById(szElID,&el);if (FAILED(hr) || !el) goto end;hr=el->QueryInterface(IID_IHTMLInputElement,(void**)&elx);if (FAILED(hr) || !elx) goto end;hr=elx->put_value(bstrValue);if (FAILED(hr)) goto end;end:return ;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。