Browse Source

changes to the send/recv using CClipList. Changed to a post message so a posible lock couldn't happen happen.

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@92 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden 21 years ago
parent
commit
5bb9578718
4 changed files with 124 additions and 39 deletions
  1. 40 17
      MainFrm.cpp
  2. 3 1
      ProcessCopy.cpp
  3. 77 19
      Server.cpp
  4. 4 2
      Server.h

+ 40 - 17
MainFrm.cpp

@@ -456,38 +456,61 @@ void CMainFrame::OnClose()
 
 LRESULT CMainFrame::OnAddToDatabaseFromSocket(WPARAM wParam, LPARAM lParam)
 {
-	CClip *pClip = (CClip*)wParam;
-	BOOL bSetToClipBoard = (BOOL)lParam;
-
 	LogSendRecieveInfo("---------Start of OnAddToDatabaseFromSocket");
+	CClipList *pClipList = (CClipList*)wParam;
+	if(pClipList == NULL)
+	{
+		LogSendRecieveInfo("---------ERROR pClipList == NULL");
+		return FALSE;
+	}
+	
+	BOOL bSetToClipBoard = (BOOL)lParam;
 
 	if(bSetToClipBoard)
 	{
 		LogSendRecieveInfo("---------Start of Set to ClipBoard");
-		CClip NewClip;
-		NewClip = *pClip;
 
-		LogSendRecieveInfo("---------After =");
+		CClip *pClip = pClipList->GetTail();
+		if(pClip)
+		{
+			CClip NewClip;
+			NewClip = *pClip;
 
-		CProcessPaste paste;
-		//Don't send the paste just load it into memory
-		paste.m_bSendPaste = false;
-		paste.m_pOle->LoadFormats(&NewClip.m_Formats);
-		paste.m_pOle->CacheGlobalData(theApp.m_cfIgnoreClipboard, NewGlobalP("Ignore", sizeof("Ignore")));
+			LogSendRecieveInfo("---------After =");
 
-		LogSendRecieveInfo("---------After LoadFormats");
-	
-		paste.DoPaste();
+			CProcessPaste paste;
+			//Don't send the paste just load it into memory
+			paste.m_bSendPaste = false;
+			paste.m_pOle->LoadFormats(&NewClip.m_Formats);
+			paste.m_pOle->CacheGlobalData(theApp.m_cfIgnoreClipboard, NewGlobalP("Ignore", sizeof("Ignore")));
+
+			LogSendRecieveInfo("---------After LoadFormats");
+		
+			paste.DoPaste();
+		}
+		else
+		{
+			LogSendRecieveInfo("---------GetTail returned NULL");
+
+		}
 
 		LogSendRecieveInfo("---------Start of Set to ClipBoard");
 	}
 
-	pClip->MakeLatestTime();
-	pClip->AddToDB(true);
+	pClipList->AddToDB(true);
+
 	LogSendRecieveInfo("---------After AddToDB");
 
+	CClip *pClip = pClipList->GetTail();
+	if(pClip)
+	{
+		theApp.m_FocusID = pClip->m_ID;
+	}
+
 	theApp.RefreshView();
-	theApp.m_FocusID = pClip->m_ID;
+
+	delete pClipList;
+	pClipList = NULL;
 
 	LogSendRecieveInfo("---------End of OnAddToDatabaseFromSocket");
 	

+ 3 - 1
ProcessCopy.cpp

@@ -139,7 +139,6 @@ const CClip& CClip::operator=(const CClip &clip)
 	m_ID = clip.m_ID;
 	m_DataID = clip.m_DataID;
 	m_Time = clip.m_Time;
-	m_Desc = clip.m_Desc;
 	m_lTotalCopySize = clip.m_lTotalCopySize;
 
 	int nCount = clip.m_Formats.GetSize();
@@ -156,6 +155,9 @@ const CClip& CClip::operator=(const CClip &clip)
 		GlobalUnlock(pCF->m_hgData);
 	}
 
+	//Set this after since in could get the wrong description in AddFormat
+	m_Desc = clip.m_Desc;
+
 	return *this;
 }
 

+ 77 - 19
Server.cpp

@@ -93,6 +93,12 @@ BOOL Recv(SOCKET sock, SendInfo *pInfo)
 		lLastRecievedCount += lReceiveCount;
 	}
 
+	if(pInfo->m_nSize != lExpectedCount)
+	{
+		LogSendRecieveInfo(StrF("------ERROR Incoming struct size %d Expected Size %d", pInfo->m_nSize, lExpectedCount));
+		return FALSE;
+	}
+
 	return TRUE;
 }
 
@@ -102,13 +108,13 @@ UINT  ClientThread(LPVOID pParam)
 	
 	SOCKET socket = (SOCKET)pParam;
 
+	CClipList *pClipList = NULL;
+	CClip *pClip = NULL;
+	CClipFormat cf;
 	SendInfo info;
 	int nRecvReturn = 0;
-	CClip NewClip;
-	CClipFormat cf;
 	long lBytesCopied;
 	bool bBreak = false;
-	bool bAddToDatabase = false;
 	BYTE *pByte = NULL;
 	long lByteSize = 0;
 	BOOL bSetToClipBoard = FALSE;
@@ -122,21 +128,30 @@ UINT  ClientThread(LPVOID pParam)
 		{
 		case MyEnums::START:
 			{				
-				NewClip.Clear();
-
+				if(pClip != NULL)
+				{
+					delete pClip;
+					pClip = NULL;
+				}
+				
+				pClip = new CClip;
+				
 				CString cs;
 				cs.Format("%s\n(%s)(%s)", info.m_cText, info.m_cComputerName, info.m_cIP);
 				
-				NewClip.m_Desc = cs;
-
-				bAddToDatabase = false;
+				if(pClip)
+				{
+					pClip->m_Desc = cs;
+				}
+				
+				bSetToClipBoard = FALSE;
 
 				if(g_Opt.m_csIPListToPutOnClipboard.Find(info.m_cIP) >= 0)
 					bSetToClipBoard = TRUE;
 
 				if(g_Opt.m_csIPListToPutOnClipboard.Find(info.m_cComputerName) >= 0)
 					bSetToClipBoard = TRUE;
-
+				
 				info.m_cText[20] = 0;
 				LogSendRecieveInfo(StrF("::START %s %s %s", info.m_cText, info.m_cComputerName, info.m_cIP));
 			}
@@ -148,12 +163,14 @@ UINT  ClientThread(LPVOID pParam)
 					delete pByte;
 					pByte = NULL;
 				}
+				
 				lByteSize = info.m_lParameter1;
 				pByte = new BYTE[info.m_lParameter1];
 
 				cf.m_cfType = GetFormatID(info.m_cText);
 				lBytesCopied = 0;
-				NewClip.m_lTotalCopySize += info.m_lParameter1;
+				if(pClip)
+					pClip->m_lTotalCopySize += info.m_lParameter1;
 
 				LogSendRecieveInfo(StrF("::DATA_START Total Size = %d type = %s", lByteSize, info.m_cText));
 			}
@@ -168,29 +185,54 @@ UINT  ClientThread(LPVOID pParam)
 			break;
 		case MyEnums::DATA_END:
 			{
-				cf.m_hgData = NewGlobalP(pByte, lByteSize);
+				if(pByte)
+				{
+					cf.m_hgData = NewGlobalP(pByte, lByteSize);
 
-				NewClip.m_Formats.Add(cf);
+					if(pClip)
+					{
+						pClip->m_Formats.Add(cf);
+						cf.m_hgData = 0; // now owned by pClip
+					}
 
-				delete pByte;
-				pByte = NULL;
+					delete pByte;
+					pByte = NULL;
+				}
+				else
+					LogSendRecieveInfo("::ERROR pByte was null");
 
-				bAddToDatabase = true;
 
 				LogSendRecieveInfo("::DATA_END");
 			}
 			break;
 		case MyEnums::END:
-			{
-				if(bAddToDatabase)
+			{				
+				if(pClipList == NULL)
+					pClipList = new CClipList;
+
+				if(pClipList)
 				{
-					LogSendRecieveInfo("::END");
-					//::SendMessage(theApp.m_MainhWnd, WM_ADD_TO_DATABASE_FROM_SOCKET, (WPARAM)&NewClip, bSetToClipBoard);
+					pClipList->AddTail(pClip);
+					pClip = NULL;
 				}
+				else
+					LogSendRecieveInfo("::ERROR pClipList was NULL");
+
+				LogSendRecieveInfo("::END");
+
 			}
 			break;
 		case MyEnums::EXIT:
 			{				
+				if(pClipList && pClipList->GetCount() > 0)
+				{
+					//Post a message pClipList will be freed by the reciever
+					::PostMessage(theApp.m_MainhWnd, WM_ADD_TO_DATABASE_FROM_SOCKET, (WPARAM)pClipList, bSetToClipBoard);
+					pClipList = NULL;
+				}
+				else
+					LogSendRecieveInfo("::ERROR pClipList was NULL or Count was 0");
+
 				LogSendRecieveInfo("::EXIT");
 				bBreak = true;
 			}
@@ -201,6 +243,22 @@ UINT  ClientThread(LPVOID pParam)
 			break;
 	}		
 
+	if(pClipList)
+	{
+		delete pClipList;
+		pClipList = NULL;
+
+		LogSendRecieveInfo("::ERROR pClipList was not NULL something is wrong");
+	}
+
+	if(pClip)
+	{
+		delete pClip;
+		pClip = NULL;
+
+		LogSendRecieveInfo("::ERROR pClip was not NULL something is wrong");
+	}
+
 	closesocket(socket);
 
 	LogSendRecieveInfo("*********************End of ClientThread*********************");

+ 4 - 2
Server.h

@@ -17,14 +17,15 @@ public:
 	enum eSendType{START, DATA, DATA_START, DATA_END, END, EXIT};
 };
 
-#define MAX_DATA_SIZE	1000
+#define MAX_DATA_SIZE	4000
 class SendInfo
 {
 public:
 	SendInfo()
 	{
-		m_nSize = sizeof(this);
+		m_nSize = sizeof(SendInfo);
 		m_nVersion = 1;
+		memset(&m_cExtra, -1, sizeof(m_cExtra));
 	}
 	int					m_nSize;
 	MyEnums::eSendType	m_Type;
@@ -36,6 +37,7 @@ public:
 	long		m_lParameter1;
 	long		m_lParameter2;
 	char		m_cText[MAX_DATA_SIZE];
+	char		m_cExtra[1000];
 };
 
 UINT  MTServerThread(LPVOID pParam);