本文整理汇总了C++中wrapper函数的典型用法代码示例。如果您正苦于以下问题:C++ wrapper函数的具体用法?C++ wrapper怎么用?C++ wrapper使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了wrapper函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: wrapper
bool UserStreamWrapper::touch(const String& path,
int64_t mtime, int64_t atime) {
auto file = newres<UserFile>(m_cls);
Resource wrapper(file);
return file->touch(path, mtime, atime);
}
示例2: assert
void Worker::operator()(const boost::shared_ptr<Worker> &self)
{
assert(this == self.get());
{
// Before entering the execution, check to see if we are canceled or
// blocked.
boost::mutex::scoped_lock lock(m_mutex);
assert(m_state == STATE_QUEUED);
if (m_cancel)
{
m_state = STATE_CANCELED;
m_cancel = false;
m_block = false;
goto CANCELED;
}
if (m_block)
{
m_state = STATE_BLOCKED;
m_block = false;
return;
}
unsigned int hpp = m_scheduler.highestPendingWorkerPriority();
if (hpp > m_priority)
{
m_state = STATE_QUEUED;
m_scheduler.schedule(WorkerAdapter(self));
#ifdef SMYD_WORKER_UNIT_TEST
printf("%s: Priority %u preempted by priority %u\n",
description(), m_priority, hpp);
#endif
return;
}
m_state = STATE_RUNNING;
}
{
ExecutionWrapper wrapper(self);
m_bypassWrapper = false;
{
// After preparing for the execution but before entering the
// execution, check to see if we are updated.
boost::mutex::scoped_lock lock(m_mutex);
assert(m_state == STATE_RUNNING);
if (m_update)
{
m_update = false;
updateInternally();
}
}
// Enter the execution loop. Check the external requests periodically.
for (;;)
{
bool done = step();
{
boost::mutex::scoped_lock lock(m_mutex);
assert(m_state == STATE_RUNNING);
// Note that we should check to see if we are updated, done,
// canceled, blocked or preempted, strictly in that order.
if (m_update)
{
m_update = false;
updateInternally();
}
else if (done)
{
m_state = STATE_FINISHED;
m_cancel = false;
m_block = false;
goto FINISHED;
}
if (m_cancel)
{
m_state = STATE_CANCELED;
m_cancel = false;
m_block = false;
cancelInternally();
goto CANCELED;
}
if (m_block)
{
m_state = STATE_BLOCKED;
m_block = false;
m_bypassWrapper = true;
return;
}
unsigned int hpp = m_scheduler.highestPendingWorkerPriority();
if (hpp > m_priority)
{
// FIXME It is possible that multiple low priority workers
// are preempted by a higher priority. But actually only
// one worker is needed.
m_state = STATE_QUEUED;
m_bypassWrapper = true;
m_scheduler.schedule(WorkerAdapter(self));
#ifdef SMYD_WORKER_UNIT_TEST
printf("%s: Priority %u preempted by priority %u\n",
description(), m_priority, hpp);
#endif
//.........这里部分代码省略.........
示例3: wrapper
BMP_Status OLED::displayBMP(const uint8_t *pgm_addr, const int x, const int y) {
_Progmem_wrapper wrapper(pgm_addr);
return _displayBMP(wrapper, 0, 0, x, y);
}
示例4: wrapper
wxSizer *wxDialogBase::CreateTextSizer(const wxString& message)
{
wxTextSizerWrapper wrapper(this);
return CreateTextSizer(message, wrapper);
}
示例5: countNestedRects
bool SkMaskFilter::filterPath(const SkPath& devPath, const SkMatrix& matrix,
const SkRasterClip& clip, SkBounder* bounder,
SkBlitter* blitter, SkPaint::Style style) const {
SkRect rects[2];
int rectCount = 0;
if (SkPaint::kFill_Style == style) {
rectCount = countNestedRects(devPath, rects);
}
if (rectCount > 0) {
NinePatch patch;
patch.fMask.fImage = NULL;
switch (this->filterRectsToNine(rects, rectCount, matrix,
clip.getBounds(), &patch)) {
case kFalse_FilterReturn:
SkASSERT(NULL == patch.fMask.fImage);
return false;
case kTrue_FilterReturn:
draw_nine(patch.fMask, patch.fOuterRect, patch.fCenter,
1 == rectCount, clip, bounder, blitter);
SkMask::FreeImage(patch.fMask.fImage);
return true;
case kUnimplemented_FilterReturn:
SkASSERT(NULL == patch.fMask.fImage);
// fall through
break;
}
}
SkMask srcM, dstM;
if (!SkDraw::DrawToMask(devPath, &clip.getBounds(), this, &matrix, &srcM,
SkMask::kComputeBoundsAndRenderImage_CreateMode,
style)) {
return false;
}
SkAutoMaskFreeImage autoSrc(srcM.fImage);
if (!this->filterMask(&dstM, srcM, matrix, NULL)) {
return false;
}
SkAutoMaskFreeImage autoDst(dstM.fImage);
// if we get here, we need to (possibly) resolve the clip and blitter
SkAAClipBlitterWrapper wrapper(clip, blitter);
blitter = wrapper.getBlitter();
SkRegion::Cliperator clipper(wrapper.getRgn(), dstM.fBounds);
if (!clipper.done() && (bounder == NULL || bounder->doIRect(dstM.fBounds))) {
const SkIRect& cr = clipper.rect();
do {
blitter->blitMask(dstM, cr);
clipper.next();
} while (!clipper.done());
}
return true;
}
示例6: LOG_ERROR
void CHttpThread::sendHttp(const CProtocol& protocol)
{
//LOG_PROTOCOL(protocol);
QByteArray postData;
// konwertuj protokol do postaci binarnej tablicy QByteArray
if (!convertToBinary(postData, protocol)){
// nieprawidlowy format protokolu
LOG_ERROR("Sending protocol error. idPackage:", protocol.getIdPackage());
DConnectionResult res(new CConnectionResult(protocol, EConnectionStatus::OUTPUT_PROTOCOL_FORMAT_ERROR));
resultsQueue.push(res);
}
else
{
//convertToProtocolDebug(postData);
uint16_t crc = NUtil::CCryptography::crc16(postData.constData(), postData.size());
postData.replace(postData.size() - sizeof(crc), sizeof(crc), reinterpret_cast<char*>(&crc), sizeof(crc));
// tworzy tymczasowa petle komunikatow
QEventLoop eventLoop;
// dla sygnalu QNetworkAccessManager::finished wywolaj QEventLoop::quit
QNetworkAccessManager mgr;
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
// HTTP
const std::string url = NEngine::CConfigurationFactory::getInstance()->getServerUrl();
QUrl qUrl(url.c_str());
QNetworkRequest req(qUrl);
// typ MIME
req.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
// wyslij post'a
std::shared_ptr<QNetworkReply> reply(mgr.post(req, postData));
eventLoop.exec(); // czekaj QEventLoop::quit (czyli QNetworkAccessManager::finished)
if (reply->error() == QNetworkReply::NoError) {
//success
LOG_DEBUG("Protocol has been sent successfully. idPackage:", protocol.getIdPackage());
CByteWrapper wrapper(reply->readAll());
// wyslanie potwierdzenia zmiany konfiguracji - jesli zmiana odbyla sie bez problemow nie zwraca danych
if (wrapper.getSize() > 0)
{
if (!wrapper.isCRCValid())
{
LOG_ERROR("Received protocol error - CRC. idPackage:", protocol.getIdPackage());
DConnectionResult res(new CConnectionResult(protocol, EConnectionStatus::CRC_ERROR));
resultsQueue.push(res);
}
else
{
std::shared_ptr<CProtocol> responseProtocol =
convertToProtocol(wrapper);
// przekonwertuj do struktury
if (!responseProtocol)
{
// blad struktury protokolu
LOG_ERROR("Received protocol error. idPackage:", protocol.getIdPackage());
DConnectionResult res(new CConnectionResult(protocol, EConnectionStatus::INPUT_PROTOCOL_FORMAT_ERROR));
resultsQueue.push(res);
}
else
{
LOG_DEBUG("Protocol has been received successfully. idPackage:", responseProtocol->getIdPackage());
DConnectionResult res(new CConnectionResult(protocol, responseProtocol, EConnectionStatus::NONE));
resultsQueue.push(res);
}
}
}
}
else {
LOG_ERROR("Protocol sending error. idPackage:",
protocol.getIdPackage(), ". Error: ", reply->errorString().toStdString());
DConnectionResult res(new CConnectionResult(protocol, EConnectionStatus::CONNECTION_ERROR));
resultsQueue.push(res);
}
}
}
示例7: wrapper
void TextDrawer::WrapString(std::string &out, const char *str, float maxW) {
TextDrawerWordWrapper wrapper(this, str, maxW);
out = wrapper.Wrapped();
}
示例8: wrapper
void OLED::drawString_P(int x, int y, const char *str, OLED_Colour foreground, OLED_Colour background)
{
_FlashStringWrapper wrapper(str);
_drawString(this, (void*)this->font, x, y, wrapper, foreground, background);
}
示例9: dummyPtr
void
testServiceRegistry::externalServiceTest()
{
art::AssertHandler ah;
{
std::unique_ptr<DummyService> dummyPtr(new DummyService);
dummyPtr->value_ = 2;
art::ServiceToken token(art::ServiceRegistry::createContaining(dummyPtr));
{
art::ServiceRegistry::Operate operate(token);
art::ServiceHandle<DummyService> dummy;
CPPUNIT_ASSERT(dummy);
CPPUNIT_ASSERT(dummy.isAvailable());
CPPUNIT_ASSERT(dummy->value_ == 2);
}
{
std::vector<fhicl::ParameterSet> pss;
fhicl::ParameterSet ps;
std::string typeName("DummyService");
ps.addParameter("service_type", typeName);
int value = 2;
ps.addParameter("value", value);
pss.push_back(ps);
art::ServiceToken token(art::ServiceRegistry::createSet(pss));
art::ServiceToken token2(art::ServiceRegistry::createContaining(dummyPtr,
token,
art::serviceregistry::kOverlapIsError));
art::ServiceRegistry::Operate operate(token2);
art::ServiceHandle<testserviceregistry::DummyService> dummy;
CPPUNIT_ASSERT(dummy);
CPPUNIT_ASSERT(dummy.isAvailable());
CPPUNIT_ASSERT(dummy->value() == 2);
}
}
{
std::unique_ptr<DummyService> dummyPtr(new DummyService);
std::shared_ptr<art::serviceregistry::ServiceWrapper<DummyService> >
wrapper(new art::serviceregistry::ServiceWrapper<DummyService>(dummyPtr));
art::ServiceToken token(art::ServiceRegistry::createContaining(wrapper));
wrapper->get().value_ = 2;
{
art::ServiceRegistry::Operate operate(token);
art::ServiceHandle<DummyService> dummy;
CPPUNIT_ASSERT(dummy);
CPPUNIT_ASSERT(dummy.isAvailable());
CPPUNIT_ASSERT(dummy->value_ == 2);
}
{
std::vector<fhicl::ParameterSet> pss;
fhicl::ParameterSet ps;
std::string typeName("DummyService");
ps.addParameter("service_type", typeName);
int value = 2;
ps.addParameter("value", value);
pss.push_back(ps);
art::ServiceToken token(art::ServiceRegistry::createSet(pss));
art::ServiceToken token2(art::ServiceRegistry::createContaining(dummyPtr,
token,
art::serviceregistry::kOverlapIsError));
art::ServiceRegistry::Operate operate(token2);
art::ServiceHandle<testserviceregistry::DummyService> dummy;
CPPUNIT_ASSERT(dummy);
CPPUNIT_ASSERT(dummy.isAvailable());
CPPUNIT_ASSERT(dummy->value() == 2);
}
}
}
示例10: wxRichToolTipPopup
wxRichToolTipPopup(wxWindow* parent,
const wxString& title,
const wxString& message,
const wxIcon& icon,
wxTipKind tipKind,
const wxFont& titleFont_) :
m_timer(this)
{
Create(parent, wxFRAME_SHAPED);
wxBoxSizer* const sizerTitle = new wxBoxSizer(wxHORIZONTAL);
if ( icon.IsOk() )
{
sizerTitle->Add(new wxStaticBitmap(this, wxID_ANY, icon),
wxSizerFlags().Centre().Border(wxRIGHT));
}
//else: Simply don't show any icon.
wxStaticText* const labelTitle = new wxStaticText(this, wxID_ANY, "");
labelTitle->SetLabelText(title);
wxFont titleFont(titleFont_);
if ( !titleFont.IsOk() )
{
// Determine the appropriate title font for the current platform.
titleFont = labelTitle->GetFont();
#ifdef __WXMSW__
// When using themes MSW tooltips use larger bluish version of the
// normal font.
wxUxThemeEngine* const theme = GetTooltipTheme();
if ( theme )
{
titleFont.MakeLarger();
COLORREF c;
if ( FAILED(theme->GetThemeColor
(
wxUxThemeHandle(parent, L"TOOLTIP"),
TTP_BALLOONTITLE,
0,
TMT_TEXTCOLOR,
&c
)) )
{
// Use the standard value of this colour as fallback.
c = 0x993300;
}
labelTitle->SetForegroundColour(wxRGBToColour(c));
}
else
#endif // __WXMSW__
{
// Everything else, including "classic" MSW look uses just the
// bold version of the base font.
titleFont.MakeBold();
}
}
labelTitle->SetFont(titleFont);
sizerTitle->Add(labelTitle, wxSizerFlags().Centre());
wxBoxSizer* const sizerTop = new wxBoxSizer(wxVERTICAL);
sizerTop->Add(sizerTitle,
wxSizerFlags().DoubleBorder(wxLEFT|wxRIGHT|wxTOP));
// Use a spacer as we don't want to have a double border between the
// elements, just a simple one will do.
sizerTop->AddSpacer(wxSizerFlags::GetDefaultBorder());
wxTextSizerWrapper wrapper(this);
wxSizer* sizerText = wrapper.CreateSizer(message, -1 /* No wrapping */);
#ifdef __WXMSW__
if ( icon.IsOk() && GetTooltipTheme() )
{
// Themed tooltips under MSW align the text with the title, not
// with the icon, so use a helper horizontal sizer in this case.
wxBoxSizer* const sizerTextIndent = new wxBoxSizer(wxHORIZONTAL);
sizerTextIndent->AddSpacer(icon.GetWidth());
sizerTextIndent->Add(sizerText,
wxSizerFlags().Border(wxLEFT).Centre());
sizerText = sizerTextIndent;
}
#endif // !__WXMSW__
sizerTop->Add(sizerText,
wxSizerFlags().DoubleBorder(wxLEFT|wxRIGHT|wxBOTTOM)
.Centre());
SetSizer(sizerTop);
const int offsetY = SetTipShapeAndSize(tipKind, GetBestSize());
if ( offsetY > 0 )
{
// Offset our contents by the tip height to make it appear in the
// main rectangle.
sizerTop->PrependSpacer(offsetY);
//.........这里部分代码省略.........
示例11: wrapper
bool Cexif::DecodeExif(const char *filename, int Thumb)
{
FileWrapper wrapper(filename, "r");
FILE * hFile = wrapper.handle;
if(!hFile) return false;
m_exifinfo = new EXIFINFO;
memset(m_exifinfo,0,sizeof(EXIFINFO));
freeinfo = true;
m_exifinfo->Thumnailstate = Thumb;
m_szLastError[0]='\0';
ExifImageWidth = MotorolaOrder = SectionsRead=0;
memset(&Sections, 0, MAX_SECTIONS * sizeof(Section_t));
int HaveCom = 0;
int a = fgetc(hFile);
strcpy(m_szLastError,"EXIF-Data not found");
if (a != 0xff || fgetc(hFile) != M_SOI) return false;
for(;;)
{
int marker = 0;
int ll,lh, got, itemlen;
unsigned char * Data;
if (SectionsRead >= MAX_SECTIONS)
{
strcpy(m_szLastError,"Too many sections in jpg file"); return false;
}
for (a=0;a<7;a++)
{
marker = fgetc(hFile);
if (marker != 0xff) break;
if (a >= 6)
{
strcpy(m_szLastError,"too many padding unsigned chars\n"); return false;
}
}
if (marker == 0xff)
{
strcpy(m_szLastError,"too many padding unsigned chars!"); return false;
}
Sections[SectionsRead].Type = marker;
lh = fgetc(hFile);
ll = fgetc(hFile);
itemlen = (lh << 8) | ll;
if (itemlen < 2)
{
strcpy(m_szLastError,"invalid marker"); return false;
}
Sections[SectionsRead].Size = itemlen;
Data = (unsigned char *)malloc(itemlen);
if (Data == NULL)
{
strcpy(m_szLastError,"Could not allocate memory"); return false;
}
Sections[SectionsRead].Data = Data;
Data[0] = (unsigned char)lh;
Data[1] = (unsigned char)ll;
got = fread(Data+2, 1, itemlen-2,hFile);
if (got != itemlen-2)
{
strcpy(m_szLastError,"Premature end of file?"); return false;
}
SectionsRead += 1;
switch(marker)
{
case M_SOS:
return true;
case M_EOI:
printf("No image in jpeg!\n");
return false;
case M_COM:
if (HaveCom)
{
free(Sections[--SectionsRead].Data);
Sections[SectionsRead].Data=0;
}
else
{
process_COM(Data, itemlen);
HaveCom = 1;
}
break;
case M_JFIF:
free(Sections[--SectionsRead].Data);
//.........这里部分代码省略.........
示例12: LoadActions
//.........这里部分代码省略.........
++ok_blocks;
}
int pc=(int)((float)((float)currpos/(float)size)*100.f+0.5f);
if(pc!=last_pc)
{
last_pc=pc;
Server->Log("Checking hashfile: "+convert(pc)+"%");
}
}
if(diff==0)
{
Server->Log("Hashfile does match");
}
Server->Log("Blocks with correct hash: "+convert(ok_blocks));
Server->Log("Different blocks: "+convert(diff));
Server->Log("Wrong differences: "+convert(diff_w));
exit(diff==0?0:7);
}
std::string device_verify=Server->getServerParameter("device_verify");
if(!device_verify.empty())
{
std::auto_ptr<IVHDFile> in(open_device_file(device_verify));
if(in.get()==NULL || in->isOpen()==false)
{
Server->Log("Error opening Image-File \""+device_verify+"\"", LL_ERROR);
exit(4);
}
int skip=1024*512;
FileWrapper wrapper(in.get(), skip);
FSNTFS fs(&wrapper, IFSImageFactory::EReadaheadMode_None, false, NULL);
if(fs.hasError())
{
Server->Log("Error opening device file", LL_ERROR);
exit(3);
}
PrintInfo(&fs);
std::string s_hashfile=Server->getServerParameter("hash_file");
if(s_hashfile.empty())
{
s_hashfile = device_verify+".hash";
}
IFile *hashfile=Server->openFile(s_hashfile, MODE_READ);
if(hashfile==NULL)
{
Server->Log("Error opening hashfile "+s_hashfile);
exit(7);
}
unsigned int ntfs_blocksize=(unsigned int)fs.getBlocksize();
unsigned int vhd_sectorsize=(1024*1024)/2;
uint64 currpos=0;
uint64 size=fs.getSize();
sha256_ctx ctx;
sha256_init(&ctx);
int diff=0;
int last_pc=0;
int mixed=0;
示例13: ZlibDecompress
bool ZlibDecompress(const butil::IOBuf& data, google::protobuf::Message* req) {
butil::IOBufAsZeroCopyInputStream wrapper(data);
google::protobuf::io::GzipInputStream zlib(
&wrapper, google::protobuf::io::GzipInputStream::ZLIB);
return ParsePbFromZeroCopyStream(req, &zlib);
}
示例14: NS_ENSURE_ARG
NS_IMETHODIMP
nsXFormsControlStub::ResetBoundNode(const nsString &aBindAttribute,
PRUint16 aResultType,
PRBool *aContextChanged)
{
NS_ENSURE_ARG(aContextChanged);
// Clear existing bound node, etc.
*aContextChanged = mBoundNode ? PR_TRUE : PR_FALSE;
nsCOMPtr<nsIDOMNode> oldBoundNode;
oldBoundNode.swap(mBoundNode);
mUsesModelBinding = PR_FALSE;
mAppearDisabled = PR_FALSE;
mDependencies.Clear();
RemoveIndexListeners();
if (!mHasParent || !mHasDoc || !HasBindingAttribute())
return NS_OK_XFORMS_NOTREADY;
nsCOMPtr<nsIDOMXPathResult> result;
nsresult rv = ProcessNodeBinding(aBindAttribute, aResultType,
getter_AddRefs(result));
if (NS_FAILED(rv)) {
nsXFormsUtils::ReportError(NS_LITERAL_STRING("controlBindError"), mElement);
return rv;
}
if (rv == NS_OK_XFORMS_DEFERRED || rv == NS_OK_XFORMS_NOTREADY || !result) {
// Binding was deferred, or not bound
return rv;
}
// Get context node, if any
if (mUsesModelBinding) {
// When bound via @bind, we'll get a snapshot back
result->SnapshotItem(0, getter_AddRefs(mBoundNode));
} else {
result->GetSingleNodeValue(getter_AddRefs(mBoundNode));
}
*aContextChanged = (oldBoundNode != mBoundNode);
// Some controls may not be bound to certain types of content. If the content
// is a disallowed type, report the error and dispatch a binding exception
// event.
PRBool isAllowed = IsContentAllowed();
if (!mBoundNode || !isAllowed) {
// If there's no result (ie, no instance node) returned by the above, it
// means that the binding is not pointing to an instance data node, so we
// should disable the control.
mAppearDisabled = PR_TRUE;
if (!isAllowed) {
// build the error string that we want output to the ErrorConsole
nsAutoString localName;
mElement->GetLocalName(localName);
const PRUnichar *strings[] = { localName.get() };
nsXFormsUtils::ReportError(
NS_LITERAL_STRING("boundTypeErrorComplexContent"),
strings, 1, mElement, mElement);
nsXFormsUtils::DispatchEvent(mElement, eEvent_BindingException);
}
nsCOMPtr<nsIXTFElementWrapper> wrapper(do_QueryInterface(mElement));
NS_ENSURE_STATE(wrapper);
PRInt32 iState;
GetDisabledIntrinsicState(&iState);
return wrapper->SetIntrinsicState(iState);
}
// Check for presence of @xsi:type on bound node and add as a dependency
nsCOMPtr<nsIDOMElement> boundEl(do_QueryInterface(mBoundNode));
if (boundEl) {
nsCOMPtr<nsIDOMAttr> attrNode;
rv = boundEl->GetAttributeNodeNS(NS_LITERAL_STRING(NS_NAMESPACE_XML_SCHEMA_INSTANCE),
NS_LITERAL_STRING("type"),
getter_AddRefs(attrNode));
if (NS_SUCCEEDED(rv) && attrNode) {
mDependencies.AppendObject(attrNode);
}
}
return NS_OK;
}
示例15: Demo_StartFrame
//.........这里部分代码省略.........
}
break;
case M_MIGRATE_ACTIVATE: // TO: Changing server, full state
{
P->r_u16 (ID);
CObject* O = Objects.net_Find (ID);
if (0 == O) break;
O->net_MigrateActive (*P);
if (bDebug) Log("! MIGRATE_ACTIVATE",*O->cName());
}
break;
case M_CHAT:
{
char buffer[256];
P->r_stringZ(buffer);
Msg ("- %s",buffer);
}
break;
case M_GAMEMESSAGE:
{
if (!game) break;
Game().OnGameMessage(*P);
}break;
case M_RELOAD_GAME:
case M_LOAD_GAME:
case M_CHANGE_LEVEL:
{
if(m_type==M_LOAD_GAME)
{
string256 saved_name;
P->r_stringZ (saved_name);
if(xr_strlen(saved_name) && ai().get_alife())
{
CSavedGameWrapper wrapper(saved_name);
if (wrapper.level_id() == ai().level_graph().level_id())
{
Engine.Event.Defer ("Game:QuickLoad", size_t(xr_strdup(saved_name)), 0);
break;
}
}
}
Engine.Event.Defer ("KERNEL:disconnect");
Engine.Event.Defer ("KERNEL:start",size_t(xr_strdup(*m_caServerOptions)),size_t(xr_strdup(*m_caClientOptions)));
}break;
case M_SAVE_GAME:
{
ClientSave ();
}break;
case M_GAMESPY_CDKEY_VALIDATION_CHALLENGE:
{
OnGameSpyChallenge(P);
}break;
case M_AUTH_CHALLENGE:
{
OnBuildVersionChallenge();
}break;
case M_CLIENT_CONNECT_RESULT:
{
OnConnectResult(P);
}break;
case M_CHAT_MESSAGE:
{
if (!game) break;
Game().OnChatMessage(P);
}break;