// DataSyncSendDlg.cpp : implementation file // #include "stdafx.h" #include "DataSyncSend.h" #include "DataSyncSendDlg2.h" #include // #include "ConnectDlg.h" #include "SendDataDlg.h" #include "AddContact.h" #include "Lzari.h" #include "SendReg.h" #include "zlib.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #pragma comment(lib, "ZLib.lib") // #define CONNTEST 1 //测试 CString g_sendip; extern void WriteLogin(CString str); extern DWORD g_nSendCode; extern BOOL g_bReturned2; ///////////////////////////////////////////////////////////////////////////// extern HWND g_hSendWnd; extern HWND g_hConnectWnd; #define DISCONNECT_TIMER (WM_USER + 101) #define LOGINFAILED_TIMER (WM_USER + 102) ///////////////////////////////////////////////////////////////////////////// static void HandleClientNetEvent2(IN SOCKET hSocket, IN ETransportEvent eEvent, IN void *pDataBuf, IN unsigned long nDataLen, IN int nError, IN void *pContext) { if( nError != TRANSPORT_OK ) return; CDataSyncSendDlg2 *pDlg = (CDataSyncSendDlg2 *)pContext; if( NULL == pDlg ) return; pDlg->ProcessNetEvent(eEvent, pDataBuf, nDataLen); } CDataSyncSendDlg2::CDataSyncSendDlg2(CWnd* pParent /*=NULL*/) : CDialog(CDataSyncSendDlg2::IDD, pParent) { //{{AFX_DATA_INIT(CDataSyncSendDlg2) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 } void CDataSyncSendDlg2::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDataSyncSendDlg2) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDataSyncSendDlg2, CDialog) //{{AFX_MSG_MAP(CDataSyncSendDlg2) ON_WM_DESTROY() ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// BOOL CDataSyncSendDlg2::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog // SetTimer(1, 30000, NULL); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } DWORD CDataSyncSendDlg2::GetConnectionID() { return m_dwConnectionID; } void CDataSyncSendDlg2::SetConnectionID(DWORD dwConnection) { m_dwConnectionID = dwConnection; } void CDataSyncSendDlg2::ProcessChatMessageRequest2(CString sql) { const char *szDataBuf = sql.GetBuffer(0); sql.ReleaseBuffer(); ProcessChatMessageRequest((void*)szDataBuf, strlen(szDataBuf) + 1); } void CDataSyncSendDlg2::ProcessChatMessageRequest2(BYTE code) { ProcessChatMessageRequest(&code, sizeof(BYTE)); } void CDataSyncSendDlg2::ProcessChatMessageRequest2(BYTE *pData, int length) { ProcessChatMessageRequest((void*)pData, length); } DWORD g_nReturnCode=0; BOOL CDataSyncSendDlg2::ProcessChatMessageRequest(void *szDataBuf, int nDataLen) { g_bReturned2=0; DWORD dwFromUserID = GetConnectionID(); WORD wMessageId = MSG_CHATMESSAGE_REQ; DWORD dwDataLen = sizeof(TCHAT_MESSAGE_STRU) + nDataLen; BYTE *pSendData = new BYTE[dwDataLen]; TCHAT_MESSAGE_STRU *pChatMessage=(TCHAT_MESSAGE_STRU*)pSendData; memset(pChatMessage, 0x00, dwDataLen); g_sendhead.length[98]=987123768; memcpy(pSendData, &g_sendhead, sizeof(g_sendhead)); pChatMessage->tCommonMsg.dwConnectionID = GetConnectionID(); pChatMessage->tCommonMsg.wMessageId = wMessageId; pChatMessage->dwFromUserID = dwFromUserID; pChatMessage->dwToUserID = 15; pChatMessage->wMessageLen = nDataLen; memcpy(pChatMessage->byFileContent, szDataBuf, nDataLen); TMessageHeader tHeader = {0}; tHeader.wMessageId = wMessageId; tHeader.dwDataLen = dwDataLen; BOOL bRet=0; unsigned long ulSendLen = m_tClientTunnel.net_Send(&tHeader, (void *)pChatMessage, dwDataLen); if( ulSendLen != SOCKET_ERROR ) { bRet=1; } delete [] pSendData; return bRet; } int g_conpos=0; BOOL CDataSyncSendDlg2::OnConnect() { CString strServerAddress = g_sendip; char *szServerAddress = strServerAddress.GetBuffer(0); strServerAddress.ReleaseBuffer(); /*for Client, IP and Port can be 0, and for Server, IP is LocalIP, and Port is Listening Port*/ int nResult = m_tClientTunnel.net_OpenSocket(Transport_Client, 0, HandleClientNetEvent2, this); if( TRANSPORT_OK != nResult ) { return 0; } DWORD dwRemoteIPValue = inet_addr(szServerAddress); WORD wPort = 5679; nResult = m_tClientTunnel.net_Connect(dwRemoteIPValue, wPort); if( TRANSPORT_OK != nResult ) { m_tClientTunnel.net_CloseSocket(); return 0; } return ProcessLoginRequest(); } void CDataSyncSendDlg2::ProcessNetEvent(int nEventType, void *pRecvMsg, DWORD dwDataLen) { if( Transport_ReadEv == nEventType ) { if( NULL == pRecvMsg ) return; TMessageHeader* pHeader = (TMessageHeader *)pRecvMsg; char *pDataBuf = (char *)pRecvMsg + MESSAGE_HEADER_LEN; WORD dwMessageID = pHeader->wMessageId; switch(dwMessageID) { case MSG_LOGIN_RESP: { LOGIN_RESULT_STRU tLoginResult = {0}; memcpy(&tLoginResult, pDataBuf, sizeof(LOGIN_RESULT_STRU)); ProcessLoginResponse(&tLoginResult); break; } case MSG_USERINFO_RESP: { TUSERLIST_INFO_STRU tUserListInfo = {0}; memcpy(&tUserListInfo, pDataBuf, sizeof(TUSERLIST_INFO_STRU)); // ProcessUserListInfoResponse(&tUserListInfo); break; } case MSG_LOGOUT_RESP: { TUSERLIST_INFO_STRU tUserListInfo = {0}; memcpy(&tUserListInfo, pDataBuf, sizeof(TUSERLIST_INFO_STRU)); // ProcessLogoutResponse(&tUserListInfo); break; } case MSG_CHATMESSAGE_RESP: { TCHAT_MESSAGE_STRU *pChatMessage = (TCHAT_MESSAGE_STRU *)pDataBuf; ProcessChatMessageResponse((void *)pChatMessage); break; } default: { break; } } } else if( Transport_CloseEv == nEventType ) { SetTimer(DISCONNECT_TIMER, 0, NULL); } } void CDataSyncSendDlg2::OnDisconnect() { m_tClientTunnel.net_CloseSocket(); SetConnectionID(INVALID_SOCKET); } void CDataSyncSendDlg2::ProcessLoginResponse(void *pLoginResult) { if( NULL == pLoginResult ) return; LOGIN_RESULT_STRU *ptLoginResult = (LOGIN_RESULT_STRU *)pLoginResult; DWORD dwConnectionID = ptLoginResult->tCommonMsg.dwConnectionID; SetConnectionID(dwConnectionID); BYTE byResult = ptLoginResult->byResult; if(LOGIN_RESULT_SUC == byResult) { } else { SetTimer(LOGINFAILED_TIMER, 0, NULL); } CString strCommentInfo(""); strCommentInfo.Format("%s. 用户代号: %ld", ((LOGIN_RESULT_SUC == byResult) ? "登录成功" : (LOGIN_RESULT_MULTI == byResult) ? "重复登录" : (LOGIN_RESULT_NAMERROR == byResult) ? "名字不存在" : (LOGIN_RESULT_PWERROR == byResult) ? "密码错误" : "登录失败"), dwConnectionID); } extern CString newGUID(); BOOL CDataSyncSendDlg2::ProcessLoginRequest() { WORD wMessageId = MSG_LOGIN_REQ; TLOGIN_STRU tLogonInfo = {0}; tLogonInfo.tCommonMsg.dwConnectionID = GetConnectionID(); tLogonInfo.tCommonMsg.wMessageId = wMessageId; CString strUserName = newGUID(); strUserName.TrimLeft(); strUserName.TrimRight(); strcpy(tLogonInfo.tUserInfo.szUserName, strUserName); strUserName.TrimLeft(); strUserName.TrimRight(); strcpy(tLogonInfo.tUserInfo.szUserName, strUserName); DWORD dwDataLen = sizeof(TLOGIN_STRU); TMessageHeader tHeader = {0}; tHeader.wMessageId = wMessageId; tHeader.dwDataLen = dwDataLen; unsigned long ulSendLen = m_tClientTunnel.net_Send(&tHeader, (void *)&tLogonInfo, dwDataLen); if( ulSendLen == SOCKET_ERROR ) { return 0; } return 1; } //--------------------------------------------------------------------------- void CDataSyncSendDlg2::OnDestroy() { OnDisconnect(); CDialog::OnDestroy(); } extern BOOL g_bShowDlg; BOOL g_bSendData=0; void CDataSyncSendDlg2::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if( DISCONNECT_TIMER == nIDEvent ) { KillTimer(nIDEvent); OnDisconnect(); } else if( LOGINFAILED_TIMER == nIDEvent ) { KillTimer(nIDEvent); OnDisconnect(); } else if( 1 == nIDEvent ) { if(g_bShowDlg)return; KillTimer(1);g_pMainWnd->DelTrayIcon(); g_bSendData=1; if(GenOwnData()) { WriteLogin("生成数据包!"); SendOwnData(); WriteLogin("开始发送数据!"); } else { WriteLogin("GenLocalData失败!"); SetTimer(1, 30000, NULL);g_bSendData=0; } } else if( 2 == nIDEvent ) { if(g_bShowDlg)return; KillTimer(2);g_pMainWnd->DelTrayIcon();g_bSendData=1; SendOwnData(); } } void CDataSyncSendDlg2::ProcessChatMessageResponse(void *pResponse) { if( NULL == pResponse ) return; TCHAT_MESSAGE_STRU *pChatMessage = (TCHAT_MESSAGE_STRU *)pResponse; memcpy(&g_nReturnCode, pChatMessage->byFileContent, sizeof(g_nReturnCode)); /* int nMessageLen = pChatMessage->wMessageLen; if(g_pData)delete []g_pData;g_pData=NULL; g_pData=new BYTE[nMessageLen]; memcpy(g_pData, pChatMessage->byFileContent, nMessageLen); memcpy( &g_sendhead, pChatMessage, sizeof(g_sendhead)); g_nLeng=nMessageLen;*/ g_bReturned2=1; } void DeleteDirectory(CString strDir) { try { strDir.TrimRight("\\"); // 首先删除文件及子文件夹 CFileFind ff; BOOL bFound = ff.FindFile(strDir+"\\*", 0); while(bFound) { bFound = ff.FindNextFile(); if(ff.GetFileName()=="."||ff.GetFileName()=="..") continue; // 去掉文件(夹)只读等属性 SetFileAttributes(ff.GetFilePath(), FILE_ATTRIBUTE_NORMAL); if(ff.IsDirectory()) { // 递归删除子文件夹 DeleteDirectory(ff.GetFilePath()); RemoveDirectory(ff.GetFilePath()); } else { DeleteFile(ff.GetFilePath()); // 删除文件 } } ff.Close(); // 然后删除该文件夹 RemoveDirectory(strDir); } catch(...) { } } CString GetModifyTime(CString path) { CFileFind finder; BOOL bWorking = finder.FindFile(path); if(bWorking) { finder.FindNextFile( ); CTime tm; finder.GetLastWriteTime(tm); CString stime; stime.Format ("%d%02d%02d", tm.GetYear (),tm.GetMonth (),tm.GetDay ()); return stime; } return ""; } BOOL CDataSyncSendDlg2::GenOwnData() { CArrayg_List1array; { MyLock lock("savebranchinfo"); CFile fp; CString path=g_mainpath+"\\branchinfo.dat"; if(::PathFileExists (path)==0) { WriteLogin("未找到信息文件!"); return 0; } fp.Open (path, CFile::modeRead); DWORD leng=fp.GetLength (); if(lengCompactDatabase((_bstr_t)filename ,(_bstr_t)filename2); filename= filesarray2.ElementAt (i); filename2= filesarray2.ElementAt (i)+"xx"; if(::PathFileExists (filename2)) { ::DeleteFile (filename); ::rename (filename2, filename); } else WriteLogin("数据压缩失败!"); filename=filename.Right (filename.GetLength ()-filename.ReverseFind ('\\')-1); savefilenamearray.Add (filename); } savefilenamearray.Add(g_sbranchname); CFile fp; if(fp.Open (GetSavePath(dir), CFile::modeWrite|CFile::modeCreate)) { DWORD fileleng=0; fp.Write (&fileleng, sizeof(DWORD)); CMemFile memfile; CArchive ar(&memfile, CArchive::store); savefilenamearray.Serialize (ar); ar.Close(); int leng=memfile.GetLength (); BYTE *pData = memfile.Detach(); fp.Write (&leng, sizeof(int)); fp.Write (pData, leng);delete []pData; int size=savefilenamearray.GetSize (); for( i=0; iGetSize (); i++) { if(pArray->ElementAt (i)==Str) return i; } return -1; } CStringArray g_failedbrancharray; CString g_curbranchname; int g_nFailcount=0; void CDataSyncSendDlg2::SendOwnData() { CArrayg_List1array; { MyLock lock("savebranchinfo"); CFile fp; CString path=g_mainpath+"\\branchinfo.dat"; if(::PathFileExists (path)==0) { SetTimer(2, 1*60*1000, NULL);g_bSendData=0;return; } fp.Open (path, CFile::modeRead); DWORD leng=fp.GetLength (); if(leng=3) { g_nFailcount=0; g_failedbrancharray.RemoveAll ();oldfailedsize=0; } } for(int i=0; i5) { CString rights=g_List1array.ElementAt (i).ElementAt (5); if(rights.Find (branchname)==-1) { continue;//该分店无权访问本店 } } if(oldfailedsize) { if(::FindArray(&g_failedbrancharray, g_List1array.ElementAt (i).ElementAt (1))==-1) continue; } g_sendip=g_List1array.ElementAt (i).ElementAt (2); #ifdef CONNTEST if("服务器"==g_List1array.ElementAt (i).ElementAt (1)) g_sendip="218.14.125.130"; #endif WriteLogin("开始向"+g_List1array.ElementAt (i).ElementAt (1)+g_sendip+"发送数据!"); int failcount=0; while(OnConnect()==0) { failcount++; if(failcount==3)break; } if(failcount==3) { WriteLogin("连接"+g_List1array.ElementAt (i).ElementAt (1)+"失败!"); if(::FindArray(&g_failedbrancharray, g_List1array.ElementAt (i).ElementAt (1))==-1) g_failedbrancharray.Add (g_List1array.ElementAt (i).ElementAt (1)); continue; } int nOldSend=0; g_curbranchname=g_List1array.ElementAt (i).ElementAt (1); CString sendpath=GetSendpath(g_List1array.ElementAt (i).ElementAt (1), nOldSend);//g_mainpath+"\\数据\\DataSyncSend\\data"; if(::PathFileExists (sendpath)==0) { SetTimer(1, 1000, NULL); g_bSendData=0;return; } CFile fp; BYTE *pSendData=NULL; DWORD nSendLeng=0; if(fp.Open (sendpath, CFile::modeRead)) { nSendLeng=fp.GetLength (); pSendData=new BYTE[nSendLeng]; fp.Read (pSendData,nSendLeng); fp.Close (); } if(nSendLeng==0) { SetTimer(1, 10000, NULL);g_bSendData=0;return; } if(SendDataFunction(pSendData, nSendLeng, nOldSend)) { WriteLogin("发送数据向"+g_List1array.ElementAt (i).ElementAt (1)+"成功!"); SaveSuccessStatus(); int pos=::FindArray(&g_failedbrancharray, g_List1array.ElementAt (i).ElementAt (1)); if(pos!=-1)g_failedbrancharray.RemoveAt(pos); } else { WriteLogin("发送数据向"+g_List1array.ElementAt (i).ElementAt (1)+"失败!"); if(::FindArray(&g_failedbrancharray, g_List1array.ElementAt (i).ElementAt (1))==-1) g_failedbrancharray.Add (g_List1array.ElementAt (i).ElementAt (1)); if(sendpath.Right (1)!="2" && ::PathFileExists(g_mainpath+"\\数据\\DataSyncSend\\data2") )//如果以前不是未发成功者,且重发文件已存在,则重发 { SaveSuccessStatus(); } SaveFailStatus(); } delete []pSendData; } CheckAllStatus(); if(g_failedbrancharray.GetSize ()) SetTimer(2, 10000, NULL); else { #ifdef CONNTEST SetTimer(1, 10000, NULL); #else SetTimer(1, 10*60*1000, NULL); #endif } g_bSendData=0;return; } BOOL CDataSyncSendDlg2::SendDataFunction(BYTE *pSendData, DWORD nSendLeng, int nOldSend) { BYTE pBuf[102400*5+128]; DWORD nSended=0; DWORD nBufleng=102400; DWORD nMaxBufleng=102400*5; BOOL bRet=0; DWORD ticks=::GetTickCount (); nSended=nOldSend; if(nOldSend==nSendLeng) { return 1; } while(nSended