//============================================================================ static void DownloadCallback ( ENetError result, void * param, const wchar_t filename[], hsStream * writer ) { if(IS_NET_ERROR(result)) { switch (result) { case kNetErrTimeout: writer->Rewind(); NetCliFileDownloadRequest(filename, writer, DownloadCallback, param); break; default: plString msg = plString::Format("Error getting patcher file: %S", NetErrorToString(result)); plStatusLog::AddLineS("patcher.log", msg.c_str()); if (IS_NET_SUCCESS(s_patchResult)) s_patchResult = result; break; } return; } writer->Close(); delete writer; AtomicAdd(&s_numFiles, -1); if(!s_numFiles) { s_downloadComplete = true; s_updated = true; } }
//============================================================================ static void FileSrvIpAddressCallback ( ENetError result, void * param, const wchar_t addr[] ) { NetCliGateKeeperDisconnect(); if (IS_NET_ERROR(result)) { plString msg = plString::Format("FileSrvIpAddressRequest failed: %S", NetErrorToString(result)); plStatusLog::AddLineS("patcher.log", msg.c_str()); s_patchResult = result; s_downloadComplete = true; } // Start connecting to the server const char* caddr = hsWStringToString(addr); NetCliFileStartConnect(&caddr, 1, true); delete[] caddr; PathGetProgramDirectory(s_newPatcherFile, arrsize(s_newPatcherFile)); GetTempFileNameW(s_newPatcherFile, kPatcherExeFilename, 0, s_newPatcherFile); plFileUtils::RemoveFile(s_newPatcherFile); NetCliFileManifestRequest(ManifestCallback, nil, s_manifest); }
static void AuthFailedStrings (ENetError authError, const char **ppStr1, const char **ppStr2, const wchar_t **ppWStr) { *ppStr1 = NULL; *ppStr2 = NULL; *ppWStr = NULL; switch (plLocalization::GetLanguage()) { case plLocalization::kFrench: case plLocalization::kGerman: case plLocalization::kJapanese: *ppStr1 = "Authentication Failed. Please try again."; break; default: *ppStr1 = "Authentication Failed. Please try again."; switch (authError) { case kNetErrAccountNotFound: *ppStr2 = "Account Not Found."; break; case kNetErrAccountNotActivated: *ppStr2 = "Account Not Activated."; break; case kNetErrConnectFailed: *ppStr2 = "Unable to connect to Myst Online."; break; case kNetErrDisconnected: *ppStr2 = "Disconnected from Myst Online."; break; case kNetErrAuthenticationFailed: *ppStr2 = "Incorrect password.\n\nMake sure CAPS LOCK is not on."; break; case kNetErrGTServerError: case kNetErrGameTapConnectionFailed: *ppStr2 = "Unable to connect to GameTap, please try again in a few minutes."; break; case kNetErrAccountBanned: *ppStr2 = "Your account has been banned from accessing Myst Online. If you are unsure as to why this happened please contact customer support."; break; default: *ppWStr = NetErrorToString (authError); break; } break; } }
//============================================================================ static void NetErrorHandler (ENetProtocol protocol, ENetError error) { plString msg = plString::Format("NetErr: %S", NetErrorToString(error)); plStatusLog::AddLineS("patcher.log", msg.c_str()); if (IS_NET_SUCCESS(s_patchResult)) s_patchResult = error; s_downloadComplete = true; switch(error) { case kNetErrServerBusy: MessageBox(0, "Due to the high demand, the server is currently busy. Please try again later, or for alternative download options visit: http://www.mystonline.com/play/", "UruLauncher", MB_OK); s_patchResult = kNetErrServerBusy; s_downloadComplete = true; break; } }
static void FileDownloaded( ENetError result, void* param, const plFileName & filename, hsStream* writer) { plResPatcher* patcher = (plResPatcher*)param; plFileName file = filename; if (((plResDownloadStream*)writer)->IsZipped()) file = file.StripFileExt(); // Kill off .gz writer->Close(); switch (result) { case kNetSuccess: { PatcherLog(kStatus, " Download Complete: %s", file.AsString().c_str()); // If this is a PRP, then we need to add it to the ResManager plFileName clientPath = static_cast<plResDownloadStream*>(writer)->GetFileName(); if (clientPath.GetFileExt().CompareI("prp") == 0) { plResManager* clientResMgr = static_cast<plResManager*>(hsgResMgr::ResMgr()); clientResMgr->AddSinglePage(clientPath); } // Continue down the warpath patcher->IssueRequest(); delete writer; return; } case kNetErrFileNotFound: PatcherLog(kError, " Download Failed: %s not found", file.AsString().c_str()); break; default: char* error = hsWStringToString(NetErrorToString(result)); PatcherLog(kError, " Download Failed: %s", error); delete[] error; break; } // Failure case static_cast<plResDownloadStream*>(writer)->Unlink(); patcher->Finish(false); delete writer; }
static void AuthFailedStrings (ENetError authError, const char **ppStr1, const char **ppStr2, const wchar_t **ppWStr) { *ppStr1 = NULL; *ppStr2 = NULL; *ppWStr = NULL; switch (plLocalization::GetLanguage()) { case plLocalization::kEnglish: default: *ppStr1 = "Authentication Failed. Please try again."; switch (authError) { case kNetErrAccountNotFound: *ppStr2 = "Invalid account name or password."; break; case kNetErrAccountNotActivated: *ppStr2 = "Account Not Activated."; break; case kNetErrConnectFailed: *ppStr2 = "Unable to connect to Myst Online."; break; case kNetErrDisconnected: *ppStr2 = "Disconnected from Myst Online."; break; case kNetErrAuthenticationFailed: *ppStr2 = "Invalid account name or password."; break; case kNetErrGTServerError: case kNetErrGameTapConnectionFailed: *ppStr2 = "Unable to connect to GameTap, please try again in a few minutes."; break; case kNetErrAccountBanned: *ppStr2 = "Your account is either inactive or has been banned.\nIf you are unsure as to why this happened please check your e-mails or contact the support."; break; default: *ppWStr = NetErrorToString (authError); break; } break; } }
static void FileDownloaded( ENetError result, void* param, const wchar_t filename[], hsStream* writer) { plResPatcher* patcher = (plResPatcher*)param; char* name = hsWStringToString(filename); if (((plResDownloadStream*)writer)->IsZipped()) plFileUtils::StripExt(name); // Kill off .gz writer->Close(); switch (result) { case kNetSuccess: PatcherLog(kStatus, " Download Complete: %s", name); // If this is a PRP, then we need to add it to the ResManager if (stricmp(plFileUtils::GetFileExt(name), "prp") == 0) ((plResManager*)hsgResMgr::ResMgr())->AddSinglePage(name); // Continue down the warpath patcher->IssueRequest(); delete[] name; delete writer; return; case kNetErrFileNotFound: PatcherLog(kError, " Download Failed: %s not found", name); break; default: char* error = hsWStringToString(NetErrorToString(result)); PatcherLog(kError, " Download Failed: %s", error); delete[] error; break; } // Failure case ((plResDownloadStream*)writer)->Unlink(); patcher->Finish(false); delete[] name; delete writer; }
void pfPatcherWorker::EndPatch(ENetError result, const plString& msg) { // Guard against multiple calls if (fStarted) { // Send end status if (fOnComplete) fOnComplete(result, msg); // yay log hax if (IS_NET_SUCCESS(result)) PatcherLogWhite("--- Patch Complete ---"); else { PatcherLogRed("\tNetwork Error: %S", NetErrorToString(result)); PatcherLogWhite("--- Patch Killed by Error ---"); } } fStarted = false; fFileSignal.Signal(); }
void Util::Error(DWORD error, LPWSTR string) { SetConsoleColor(LIGHT_RED); wprintf(L"[!] %s: %s\n", string, NetErrorToString(error)); SetConsoleColor(DEFAULT); }
// // MsgReceive handler for plasma messages // bool plNetClientMgr::MsgReceive( plMessage* msg ) { if (plNetLinkingMgr::GetInstance()->MsgReceive( msg )) return true; plEvalMsg* evalMsg = plEvalMsg::ConvertNoRef(msg); if (evalMsg) { IPlaybackMsgs(); if ( GetFlagsBit( kNeedToSendAgeLoadedMsg ) ) { SetFlagsBit( kNeedToSendAgeLoadedMsg, false ); plAgeLoader::GetInstance()->NotifyAgeLoaded( true ); } if ( GetFlagsBit( kNeedToSendInitialAgeStateLoadedMsg ) ) { SetFlagsBit(kNeedToSendInitialAgeStateLoadedMsg, false); plInitialAgeStateLoadedMsg* m = new plInitialAgeStateLoadedMsg; m->Send(); } return true; } plGenRefMsg* ref = plGenRefMsg::ConvertNoRef(msg); if (ref) { if( ref->fType == kVaultImage ) { // Ignore, we just use it for reffing, don't care about the actual pointer return true; } hsAssert(ref->fType==kAgeSDLHook, "unknown ref msg context"); if (ref->GetContext()==plRefMsg::kOnCreate) { hsAssert(fAgeSDLObjectKey==nil, "already have a ref to age sdl hook"); fAgeSDLObjectKey = ref->GetRef()->GetKey(); DebugMsg("Age SDL hook object created, uoid=%s", fAgeSDLObjectKey->GetUoid().StringIze().c_str()); } else { fAgeSDLObjectKey=nil; DebugMsg("Age SDL hook object destroyed"); } return true; } if (plNetClientMgrMsg * ncmMsg = plNetClientMgrMsg::ConvertNoRef(msg)) { if (ncmMsg->type == plNetClientMgrMsg::kCmdDisableNet) { SetFlagsBit(kDisableOnNextUpdate); hsRefCnt_SafeUnRef(fDisableMsg); fDisableMsg = ncmMsg; fDisableMsg->Ref(); } return true; } if (plNetCommAuthMsg * authMsg = plNetCommAuthMsg::ConvertNoRef(msg)) { if (IS_NET_ERROR(authMsg->result)) { char str[256]; StrPrintf(str, arrsize(str), "Authentication failed: %S", NetErrorToString(authMsg->result)); QueueDisableNet(true, str); return false; // @@@ TODO: Handle this failure better } return true; } if (plNetCommActivePlayerMsg * activePlrMsg = plNetCommActivePlayerMsg::ConvertNoRef(msg)) { if (IS_NET_ERROR(activePlrMsg->result)) { char str[256]; StrPrintf(str, arrsize(str), "SetActivePlayer failed: %S", NetErrorToString(activePlrMsg->result)); QueueDisableNet(true, str); return false; // @@@ TODO: Handle this failure better. } return true; } plPlayerPageMsg *playerPageMsg = plPlayerPageMsg::ConvertNoRef(msg); if(playerPageMsg) { IHandlePlayerPageMsg(playerPageMsg); return true; // handled } plLoadCloneMsg* pCloneMsg = plLoadCloneMsg::ConvertNoRef(msg); if(pCloneMsg) { ILoadClone(pCloneMsg); return true; // handled } // player is petitioning a CCR plCCRPetitionMsg* petMsg=plCCRPetitionMsg::ConvertNoRef(msg); if (petMsg) { ISendCCRPetition(petMsg); return true; } // a remote CCR is turning invisible plCCRInvisibleMsg* invisMsg=plCCRInvisibleMsg::ConvertNoRef(msg); if (invisMsg) { LogMsg(kLogDebug, "plNetClientMgr::MsgReceive - Got plCCRInvisibleMsg"); MakeCCRInvisible(invisMsg->fAvKey, invisMsg->fInvisLevel); return true; } plCCRBanLinkingMsg* banLinking = plCCRBanLinkingMsg::ConvertNoRef(msg); if (banLinking) { DebugMsg("Setting BanLinking to %d", banLinking->fBan); SetFlagsBit(kBanLinking, banLinking->fBan); return true; } plCCRSilencePlayerMsg* silence = plCCRSilencePlayerMsg::ConvertNoRef(msg); if (silence) { DebugMsg("Setting Silence to %d", silence->fSilence); SetFlagsBit(kSilencePlayer, silence->fSilence); return true; } plNetVoiceListMsg* voxList = plNetVoiceListMsg::ConvertNoRef(msg); if (voxList) { IHandleNetVoiceListMsg(voxList); return true; } plSynchEnableMsg* synchEnable = plSynchEnableMsg::ConvertNoRef(msg); if (synchEnable) { if (synchEnable->fPush) { plSynchedObject::PushSynchDisabled(!synchEnable->fEnable); } else { plSynchedObject::PopSynchDisabled(); } return true; } plClientMsg* clientMsg = plClientMsg::ConvertNoRef(msg); if (clientMsg && clientMsg->GetClientMsgFlag()==plClientMsg::kInitComplete) { // add 1 debug object for age sdl if (plNetObjectDebugger::GetInstance()) { plNetObjectDebugger::GetInstance()->RemoveDebugObject("AgeSDLHook"); plNetObjectDebugger::GetInstance()->AddDebugObject("AgeSDLHook"); } // if we're linking to startup we don't need (or want) a player set plString ageName = NetCommGetStartupAge()->ageDatasetName; if (ageName.IsEmpty()) ageName = "StartUp"; if (ageName.CompareI("StartUp") == 0) NetCommSetActivePlayer(0, nullptr); plAgeLinkStruct link; link.GetAgeInfo()->SetAgeFilename(NetCommGetStartupAge()->ageDatasetName); link.SetLinkingRules(plNetCommon::LinkingRules::kOriginalBook); plNetLinkingMgr::GetInstance()->LinkToAge(&link); return true; } return plNetClientApp::MsgReceive(msg); }
//============================================================================ static void ManifestCallback ( ENetError result, void * param, const wchar_t group[], const NetCliFileManifestEntry manifest[], unsigned entryCount ) { if(IS_NET_ERROR(result)) { switch (result) { case kNetErrTimeout: NetCliFileManifestRequest(ManifestCallback, nil, s_manifest); break; default: plString msg = plString::Format("Error getting patcher manifest: %S", NetErrorToString(result)); plStatusLog::AddLineS("patcher.log", msg.c_str()); if (IS_NET_SUCCESS(s_patchResult)) s_patchResult = result; break; } return; } #ifndef PLASMA_EXTERNAL_RELEASE if (entryCount == 0) { // dataserver does not contain a patcher s_downloadComplete = true; return; } #endif char ansi[MAX_PATH]; // MD5 check current patcher against value in manifest ASSERT(entryCount == 1); wchar_t curPatcherFile[MAX_PATH]; PathGetProgramName(curPatcherFile, arrsize(curPatcherFile)); StrToAnsi(ansi, curPatcherFile, arrsize(ansi)); if (!MD5Check(ansi, manifest[0].md5)) { // MessageBox(GetTopWindow(nil), "MD5 failed", "Msg", MB_OK); SelfPatcherStream::totalBytes += manifest[0].zipSize; AtomicAdd(&s_numFiles, 1); SetText("Downloading new patcher..."); StrToAnsi(ansi, s_newPatcherFile, arrsize(ansi)); SelfPatcherStream * stream = new SelfPatcherStream; if (!stream->Open(ansi, "wb")) ErrorAssert(__LINE__, __FILE__, "Failed to create file: %s, errno: %u", ansi, errno); NetCliFileDownloadRequest(manifest[0].downloadName, stream, DownloadCallback, nil); } else { s_downloadComplete = true; } }