Example #1
0
CGI::CGI(bool process_body) : _GET(_request_queries)
                            , _POST(_request_posts)
                            , _COOKIE(_request_cookies)
                            , _SERVER(_server_variables)
                            , _REQUEST(_request_all)
                            , _FILES(_uploaded_files)
                            , BODY(this)
                            , _request_handled(false)
                            , _header_sent(false)
                            , _body_sent(false)
                            , _buffered(true)
                            , _status(200)
                            , _cgi_handle(NULL)
{
    void **cgiptr = &_cgi_handle;
    ::CGI * &cgi = *reinterpret_cast< ::CGI **>(cgiptr);
    NEOERR *err;

    TranslateEnvvars(&_server_variables);

    err = cgi_init(&cgi, NULL);
    ThrowIfNeoError(err);

    TranslateHDF(cgi, "Cookie", &_request_cookies);
    TranslateHDF(cgi, "Query",  &_request_queries);

    if (!process_body) {
        return;
    }

    err = cgi_register_parse_cb(cgi, "POST", "*", this, Parser::Parse);
    ThrowIfNeoError(err);

    // Purge Query subtree so GET values are gone.
    err = hdf_remove_tree(cgi->hdf, "Query");
    ThrowIfNeoError(err);

    err = cgi_parse(cgi);
    ThrowIfNeoError(err);

    if (_SERVER["REQUEST_METHOD"].compare("POST") == 0) {
        TranslatePost(cgi, &_request_posts, &_uploaded_files);

    } else if (_SERVER["REQUEST_METHOD"].compare("PUT") == 0) {
        TranslatePut(cgi, &_uploaded_files);
    }

    // Now we have both GET and POST data, POST overwrites GET.
    _request_all = _request_queries;
    _request_all.Merge(_request_posts, true);
}
Example #2
0
byte CRCrack3::Crack(byte byWinBitmap, byte byChair1, byte byType, byte byRspType, byte byGrade, byte byCount, byte byScore)
{
	//破解初始化
	byte byChair = 0;
	m_nDepth = 0;
	m_bGvpTag = false;

	//保存初始状态
	SaveAction(byWinBitmap, byChair, byChair1, byType, byRspType, byGrade, byCount);

	//复原手牌位图
	for (int i = 0; i < 4; i++)
		m_pRPlayer[i]->RestoreBitmap();

	dword dwInterrupt = 0;
	while (m_nDepth < MAX_CRACK_DEPTH)
	{
		if (dwInterrupt++ >= g_dwCrackDepth) //检测中断
			return INTERRUPT;

		byRspType = m_pRPlayer[byChair]->RspCards(byType, byRspType, byGrade, byCount); //行为应答
		if (byRspType == TYPE_GVP)
		{
			//放弃操作转义
			if (TranslateGvp(byChair, byChair1, byType, byRspType, byGrade, byCount))
				continue;

			if (byType == TYPE_GVP) //无牌可出
			{
				if (m_nDepth == 1)
					return (byChair & 1) ? CONTRACT_YES : CONTRACT_FAIL;
				BackAction(byWinBitmap, byChair, byChair1, byType, byRspType, byGrade, byCount);
				continue;
			}

			//获得下一个出牌的玩家
			GetNextRspser(byChair, byChair1);

			//更新出牌类型
			if (byChair == byChair1)
				byType = TYPE_GVP;
			else
			{
				byType = m_pRAction[m_nDepth - 1]->byRspType;
				if (byType == TYPE_GVP)
					byType = m_pRAction[m_nDepth - 1]->byType;
				byGrade = m_pRAction[m_nDepth - 1]->byGrade;
				byCount = m_pRAction[m_nDepth - 1]->byCount;
			}

			if (m_nDepth == 1)
				m_bGvpTag = true;
			continue;
		}
		SaveAction(byWinBitmap, byChair, byChair1, byType, byRspType, byGrade, byCount); //保存出牌行为

		//获胜处理
		if (!m_pRPlayer[byChair]->IsAlive())
		{
			byte byContract = TranslateWin(byScore, byWinBitmap, byChair, byChair1, byType, byRspType, byGrade, byCount);
			if (byContract == CONTRACT_BKT)
				continue;
			if (byContract == CONTRACT_FAIL || byContract == CONTRACT_YES)
				return byContract;
		}

		//更新最后出牌者
		byChair1 = byChair;

		//出牌操作转义
		if (TranslatePut(byChair, byChair1, byType, byRspType, byGrade, byCount))
			continue;

		//下一个出牌者
		byChair = GetNextPlayer(byChair);
		byType = byRspType;
	}
	return CONTRACT_UNK; //无效语句
}