void CAuctionServerDoc::ProcessPendingRead(CClientSocket* pSocket) { CBuffer buffer; int nLen = buffer.Receive(pSocket); CString str; switch (buffer.GetCmd()) { case CMD_REGISTER_CLIENT: { CInRegisterClient* inBuf = (CInRegisterClient*)&buffer; CString strUserID = inBuf->GetUserID(); CString strPassword = inBuf->GetUserPassword(); CString strUserName; bool bValidUser = ValidateUser(strUserID, strPassword, strUserName); pSocket->SetUserID(strUserID); UpdateClientUserID(pSocket, strUserID); COutRegisterClient outBuf; outBuf.SetValid(bValidUser); if (bValidUser) { outBuf.SetUserName(strUserName); pSocket->SetUserName(strUserName); UpdateClientName(pSocket, strUserName); outBuf.SetLogin(CheckLogin(strUserID)); UpdateClientLogin(pSocket, true); } outBuf.Send(pSocket); str.Format(TEXT("CMD_REGISTER_CLIENT") ); m_listMessage.Push(str); str.Format(TEXT("\tUserID = %s, UserName = %s"), strUserID, strUserName); m_listMessage.Push(str); m_stateAuction = E_NONE; } break; case CMD_RETRIEVE_STOCK_OF_CLIENT: { CInRetrieveStock* inBuf = (CInRetrieveStock*)&buffer; CString strUserID = inBuf->GetUserID(); std::vector<CProduct> & listProduct = GetListProduct(strUserID); COutRetrieveStock outBuf; outBuf.SetListProduct(listProduct); str.Format(TEXT("CMD_RETRIEVE_STOCK_OF_CLIENT") ); m_listMessage.Push(str); for (CProduct product : listProduct) { str.Format(TEXT(">>>ProductID = %d, ProductCount = %d,Price = %f, Product Name = %s"), product.GetProductID(), product.GetCount(), product.GetPrice(), product.GetName()); m_listMessage.Push(str); } outBuf.Send(pSocket); m_stateAuction = E_NONE; } break; case CMD_ADVERTISING: { str.Format(TEXT("CMD_ADVERTISING")); m_listMessage.Push(str); m_stateAuction = E_ADVERTISING; CInAdvertising* inBuf = (CInAdvertising*)&buffer; DWORD dwProductID = inBuf->GetProductID(); CString strName = inBuf->GetProductName(); DWORD dwCount = inBuf->GetProductCount(); double dblPrice = inBuf->GetProductPrice(); CBroadcastPrice buf; buf.SetProductID(dwProductID); buf.SetProductCount(dwCount); buf.SetProductPrice(dblPrice); buf.SetProductName(strName); str.Format(TEXT("Broadcast Advertising Event. (%s, %d, %f)"), strName, dwCount, dblPrice); m_listMessage.Push(str); // Broadcast this packet to the other clients BroadcastBuffer( buf); COutAdvertising outBuf; outBuf.SetState(m_stateAuction); outBuf.Send(pSocket); // ***************************************************************************** // After 5 minutes, the Auction should be started and the bids will be allowed. int * p = NULL; timer.registerHandler(&TimerAdvertisingProc, p); timer.registerHandlerAfter(&TimerAfterAdvertisingProc, p); timer.setInterval(1); timer.SetPeriod(WAITINGTIME); timer.Start(); //****************************************************************************** } break; case CMD_BID: { str.Format(TEXT("CMD_BID")); m_listMessage.Push(str); CInAuction* inBuf = (CInAuction*)&buffer; double m_dblPrice = inBuf->GetProductPrice(); CString strUserID = inBuf->GetUserID(); // Check the max bid price double dblMaxBidPrice = GetMaxBidPrice(m_dwAuctionID); //double dblMaxBidPrice = GetDBConn().GetMaxBidPrice(m_lAuctionID); CProduct product( inBuf->GetProductID(), inBuf->GetProductName(), inBuf->GetProductCount(), inBuf->GetProductPrice()); COutAuction outBuf; m_stateAuction = E_AUCTION; if (m_dblPrice > dblMaxBidPrice) { str.Format(TEXT("The new biggest price(%f) come in"), m_dblPrice); m_listMessage.Push(str); m_mutex.lock(); SetBidTransaction( m_dwAuctionID, strUserID, product); m_mutex.unlock(); CBroadcastPrice buf; buf.SetProductID(inBuf->GetProductID()); buf.SetProductName(inBuf->GetProductName()); buf.SetProductCount(inBuf->GetProductCount()); buf.SetProductPrice(inBuf->GetProductPrice()); BroadcastBuffer(buf); //CBroadcastState state; //state.SetState(E_AUCTION); //BroadcastBuffer(state); //********************************************************* //如果这个最高价格保持5分钟,这个拍卖就可以结束了。 //实现起来,我们还需要一个线程去检查在这5分钟里,有没有新价格高于它。 //********************************************************* int * p = NULL; timerBid.registerHandler(&TimerBidProc, p); timerBid.registerHandlerAfter(&TimerAfterBidProc, p); timerBid.setInterval(1); timerBid.SetPeriod(WAITINGTIME); timerBid.Start(); outBuf.SetState(m_stateAuction); outBuf.Send(pSocket); } } break; } UpdateAllViews(NULL); //CAuctionServerView::GetView()->UpdateWindow(); }