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); }
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; //无效语句 }