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();
}