aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Durango/Durango_App.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/Durango/Durango_App.cpp')
-rw-r--r--Minecraft.Client/Durango/Durango_App.cpp799
1 files changed, 799 insertions, 0 deletions
diff --git a/Minecraft.Client/Durango/Durango_App.cpp b/Minecraft.Client/Durango/Durango_App.cpp
new file mode 100644
index 00000000..2ec81a29
--- /dev/null
+++ b/Minecraft.Client/Durango/Durango_App.cpp
@@ -0,0 +1,799 @@
+#include "stdafx.h"
+#include "..\Common\Consoles_App.h"
+#include "..\User.h"
+#include "..\..\Minecraft.Client\Minecraft.h"
+#include "..\..\Minecraft.Client\MinecraftServer.h"
+#include "..\..\Minecraft.Client\PlayerList.h"
+#include "..\..\Minecraft.Client\ServerPlayer.h"
+#include "..\..\Minecraft.World\Level.h"
+#include "..\..\Minecraft.World\LevelSettings.h"
+#include "..\..\Minecraft.World\BiomeSource.h"
+#include "..\..\Minecraft.World\LevelType.h"
+#include "ServiceConfig\Events-XBLA.8-149E11AEEvents.h"
+#include "..\..\Minecraft.World\DurangoStats.h"
+#include "..\..\Minecraft.Client\Durango\XML\xmlFilesCallback.h"
+
+CConsoleMinecraftApp app;
+
+CConsoleMinecraftApp::CConsoleMinecraftApp() : CMinecraftApp()
+{
+ memset(&m_ThumbnailBuffer,0,sizeof(ImageFileBuffer));
+ m_bShutdown=false;
+
+ m_bRead_TMS_DLCINFO_XML=false;
+ m_bTMSPP_GlobalFileListRead=false;
+ m_bTMSPP_UserFileListRead=false;
+
+ for (int i=0; i<MAX_LOCAL_PLAYERS; i++)
+ {
+ m_iLastPresenceContext[i] = -1;
+ m_xuidLastPresencePlayer[i] = INVALID_XUID;
+ }
+}
+
+
+void CConsoleMinecraftApp::HandleDLCLicenseChange()
+{
+ // run through the DLC packs and update if required
+ int iOfferC=app.GetDLCOffersCount();
+ for(int i = 0; i < iOfferC; i++)
+ {
+ MARKETPLACE_CONTENTOFFER_INFO xOffer = StorageManager.GetOffer(i);
+
+ XCONTENT_DATA *pContentData=StorageManager.GetInstalledDLC(xOffer.wszProductID);
+
+ if((pContentData!=NULL) &&(pContentData->bTrialLicense==false))
+ {
+ DLCPack *pack = app.m_dlcManager.getPackFromProductID(xOffer.wszProductID);
+ if(pack)
+ {
+ // Clear the DLC installed flag so the scenes will pick up the new dlc (could be a full pack install)
+ app.ClearDLCInstalled();
+ app.DebugPrintf(">>> HandleDLCLicenseChange - Updating license for DLC [%ls]\n",xOffer.wszOfferName);
+ pack->updateLicenseMask(1);
+ }
+ else
+ {
+ app.DebugPrintf(">>> HandleDLCLicenseChange - Couldn't find licensed DLC [%ls] in app.m_dlcManager\n",xOffer.wszOfferName);
+ }
+ }
+ }
+
+ ui.HandleDLCLicenseChange();
+}
+
+
+void CConsoleMinecraftApp::SetRichPresenceContext(int iPad, int contextId)
+{
+ if(iPad < XUSER_MAX_COUNT && Minecraft::GetInstance()->localplayers[iPad])
+ {
+ PlayerUID uid;
+ ProfileManager.GetXUID(iPad, &uid, true);
+
+ if (uid != INVALID_XUID)
+ {
+ // 4J-JEV: Player has changed, update cached player and ensure this next presence is sent.
+ if (uid != m_xuidLastPresencePlayer[iPad])
+ {
+ m_xuidLastPresencePlayer[iPad] = uid;
+ m_iLastPresenceContext[iPad] = -1;
+ }
+
+ if (m_iLastPresenceContext[iPad] != contextId)
+ {
+ app.DebugPrintf(">>> EventWriteRichPresenceState(%ls,_,%d)\n", uid.toString().c_str(), contextId);
+ EventWriteRichPresenceState(uid.toString().c_str(), DurangoStats::getPlayerSession(), contextId);
+
+ m_iLastPresenceContext[iPad] = contextId;
+ }
+ }
+ }
+}
+
+void CConsoleMinecraftApp::StoreLaunchData()
+{
+}
+void CConsoleMinecraftApp::ExitGame()
+{
+ //Windows::ApplicationModel::Core::CoreApplication::Exit();
+ m_bShutdown=true;
+}
+void CConsoleMinecraftApp::FatalLoadError()
+{
+ // 4J-PB -
+ //for(int i=0;i<10;i++)
+ {
+#ifndef _CONTENT_PACKAGE
+ OutputDebugStringA("FatalLoadError\n");
+#endif
+ //Sleep(5000);
+ }
+}
+
+void CConsoleMinecraftApp::CaptureSaveThumbnail()
+{
+ RenderManager.CaptureThumbnail(&m_ThumbnailBuffer);
+}
+void CConsoleMinecraftApp::GetSaveThumbnail(PBYTE *pbData,DWORD *pdwSize)
+{
+ // on a save caused by a create world, the thumbnail capture won't have happened
+ if(m_ThumbnailBuffer.Allocated())
+ {
+ if( pbData )
+ {
+ *pbData= new BYTE [m_ThumbnailBuffer.GetBufferSize()];
+ *pdwSize=m_ThumbnailBuffer.GetBufferSize();
+ memcpy(*pbData,m_ThumbnailBuffer.GetBufferPointer(),*pdwSize);
+ }
+ m_ThumbnailBuffer.Release();
+ }
+ else
+ {
+ if( pbData )
+ {
+ // use the default image
+ StorageManager.GetDefaultSaveThumbnail(pbData,pdwSize);
+ }
+ }
+}
+void CConsoleMinecraftApp::ReleaseSaveThumbnail()
+{
+
+}
+
+void CConsoleMinecraftApp::GetScreenshot(int iPad,PBYTE *pbData,DWORD *pdwSize)
+{
+
+}
+
+int CConsoleMinecraftApp::GetLocalTMSFileIndex(WCHAR *wchTMSFile,bool bFilenameIncludesExtension,eFileExtensionType eEXT)
+{
+ return -1;
+}
+
+
+int CConsoleMinecraftApp::LoadLocalTMSFile(WCHAR *wchTMSFile)
+{
+ return -1;
+}
+
+int CConsoleMinecraftApp::LoadLocalTMSFile(WCHAR *wchTMSFile, eFileExtensionType eExt)
+{
+ return -1;
+}
+
+void CConsoleMinecraftApp::FreeLocalTMSFiles(eTMSFileType eType)
+{
+
+}
+
+int CConsoleMinecraftApp::LoadLocalDLCImages()
+{
+ unordered_map<wstring,DLC_INFO * > *pDLCInfoA=app.GetDLCInfo();
+ // 4J-PB - Any local graphic files for the Minecraft Store?
+ for( AUTO_VAR(it, pDLCInfoA->begin()); it != pDLCInfoA->end(); it++ )
+ {
+ DLC_INFO * pDLCInfo=(*it).second;
+
+ LoadLocalDLCImage(pDLCInfo->wchBanner,&pDLCInfo->pbImageData,&pDLCInfo->dwImageBytes);
+ }
+ return 0;
+}
+
+void CConsoleMinecraftApp::FreeLocalDLCImages()
+{
+ // 4J-PB - Any local graphic files for the Minecraft Store?
+ unordered_map<wstring,DLC_INFO * > *pDLCInfoA=app.GetDLCInfo();
+
+ for( AUTO_VAR(it, pDLCInfoA->begin()); it != pDLCInfoA->end(); it++ )
+ {
+ DLC_INFO * pDLCInfo=(*it).second;
+
+ if(pDLCInfo->dwImageBytes!=0)
+ {
+ free(pDLCInfo->pbImageData);
+ pDLCInfo->dwImageBytes=0;
+ pDLCInfo->pbImageData=NULL;
+ }
+ }
+}
+
+
+int CConsoleMinecraftApp::LoadLocalDLCImage(WCHAR *wchName,PBYTE *ppbImageData,DWORD *pdwBytes)
+{
+ // load the local file
+ WCHAR wchFilename[64];
+
+
+ // 4J-PB - Read the file containing the product codes. This will be different for the SCEE/SCEA/SCEJ builds
+ swprintf(wchFilename,L"DLCImages/%s",wchName);
+ HANDLE hFile = CreateFile(wchFilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+
+ if( hFile == INVALID_HANDLE_VALUE )
+ {
+ app.DebugPrintf("Failed to open %ls\n", wchFilename);
+ return FALSE;
+ }
+
+ DWORD dwHigh=0;
+ *pdwBytes = GetFileSize(hFile,&dwHigh);
+
+ if(*pdwBytes!=0)
+ {
+ DWORD dwBytesRead;
+ PBYTE pbImageData=(PBYTE)malloc(*pdwBytes);
+
+ if(ReadFile(hFile,pbImageData,*pdwBytes,&dwBytesRead,NULL)==FALSE)
+ {
+ // failed
+ free(pbImageData);
+ *pdwBytes=0;
+ }
+ else
+ {
+ *ppbImageData=pbImageData;
+ }
+ }
+
+ CloseHandle(hFile);
+
+ return 0;
+}
+
+void CConsoleMinecraftApp::TemporaryCreateGameStart()
+{
+ ////////////////////////////////////////////////////////////////////////////////////////////// From CScene_Main::OnInit
+
+ app.setLevelGenerationOptions(NULL);
+
+ // From CScene_Main::RunPlayGame
+ Minecraft *pMinecraft=Minecraft::GetInstance();
+ app.ReleaseSaveThumbnail();
+ ProfileManager.SetLockedProfile(0);
+ pMinecraft->user->name = L"Durango";
+ app.ApplyGameSettingsChanged(0);
+
+ ////////////////////////////////////////////////////////////////////////////////////////////// From CScene_MultiGameJoinLoad::OnInit
+ MinecraftServer::resetFlags();
+
+ // From CScene_MultiGameJoinLoad::OnNotifyPressEx
+ app.SetTutorialMode( false );
+ app.SetCorruptSaveDeleted(false);
+
+ ////////////////////////////////////////////////////////////////////////////////////////////// From CScene_MultiGameCreate::CreateGame
+
+ app.ClearTerrainFeaturePosition();
+ wstring wWorldName = L"TestWorld";
+
+ StorageManager.ResetSaveData();
+ StorageManager.SetSaveTitle(wWorldName.c_str());
+
+ bool isFlat = false;
+ __int64 seedValue = BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements
+
+ NetworkGameInitData *param = new NetworkGameInitData();
+ param->seed = seedValue;
+ param->saveData = NULL;
+
+ app.SetGameHostOption(eGameHostOption_Difficulty,0);
+ app.SetGameHostOption(eGameHostOption_FriendsOfFriends,0);
+ app.SetGameHostOption(eGameHostOption_Gamertags,1);
+ app.SetGameHostOption(eGameHostOption_BedrockFog,1);
+
+ app.SetGameHostOption(eGameHostOption_GameType,GameType::SURVIVAL->getId() );
+ app.SetGameHostOption(eGameHostOption_LevelType, 0 );
+ app.SetGameHostOption(eGameHostOption_Structures, 1 );
+ app.SetGameHostOption(eGameHostOption_BonusChest, 0 );
+
+ app.SetGameHostOption(eGameHostOption_PvP, 1);
+ app.SetGameHostOption(eGameHostOption_TrustPlayers, 1 );
+ app.SetGameHostOption(eGameHostOption_FireSpreads, 1 );
+ app.SetGameHostOption(eGameHostOption_TNT, 1 );
+ app.SetGameHostOption(eGameHostOption_HostCanFly, 1);
+ app.SetGameHostOption(eGameHostOption_HostCanChangeHunger, 1);
+ app.SetGameHostOption(eGameHostOption_HostCanBeInvisible, 1 );
+
+ param->settings = app.GetGameHostOption( eGameHostOption_All );
+
+ g_NetworkManager.FakeLocalPlayerJoined();
+
+ LoadingInputParams *loadingParams = new LoadingInputParams();
+ loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc;
+ loadingParams->lpParam = (LPVOID)param;
+
+ // Reset the autosave time
+ app.SetAutosaveTimerTime();
+
+ C4JThread* thread = new C4JThread(loadingParams->func, loadingParams->lpParam, "RunNetworkGame");
+ thread->Run();
+}
+
+typedef struct
+{
+ eDLCContentType e_DLC_Type;
+ //WCHAR *wchDisplayName;
+ WCHAR *wchProductId;
+ WCHAR *wchBannerName;
+ WCHAR *wchFirstSkin;
+ int iConfig;
+ unsigned int uiSortIndex;
+}
+DLC_DETAILS;
+
+#define MAX_DLC_DETAILS 18
+/*DLC_DETAILS DLCDetailsA[MAX_DLC_DETAILS] =
+{
+ // skin packs
+
+ // Skin Pack Festive
+ { e_DLC_SkinPack,L"Festive Skin Pack",L"6dffc4d6-a2d2-4c8c-9284-c607f77e431a",L"SPF.png",L"dlcskin00000600.png",0,1},
+ // Skin Pack 1
+ { e_DLC_SkinPack,L"Skin Pack 1",L"8ecf0f25-a119-4987-a32b-ee0a5925ad8d",L"SP1.png",L"dlcskin00000000.png",0,2},
+ // Skin Pack 2
+ { e_DLC_SkinPack,L"Skin Pack 2",L"cc59b688-7cfb-4fa0-a76e-84aa55b92cae",L"SP2.png",L"dlcskin00000900.png",0,3},
+ // Skin Pack 6
+ //{ e_DLC_SkinPack,L"0037a29f-876e-4709-8bb8-a388738e6f51","SP6.png","dlcskin00000900.png",0,3},
+ // Skin Pack Battle And Beasts
+ { e_DLC_SkinPack,L"Battle And Beasts",L"eeeb6489-02a3-4c6e-a8c9-2ace2aa1094d",L"SPC.png",L"dlcskin00000800.png",0,4},
+ // Skin Pack Battle And Beasts 2
+ { e_DLC_SkinPack,L"Battle And Beasts 2",L"b858200a-59a8-4e1f-a049-f3e73db2d786",L"SPZ.png",L"dlcskin00001000.png",0,5},
+ // Skin Pack Marvel Avengers
+ { e_DLC_SkinPack,L"Marvel Avengers",L"d59757dd-7757-4c5e-8499-dbe4743baa10",L"SPM.png",L"dlcskin00001700.png",0,6},
+ // Skin Pack Marvel Spider-Man
+ { e_DLC_SkinPack,L"Marvel Spider-Man",L"cdca1bff-13d1-435a-8aee-e7a35002473f",L"SPI.png",L"dlcskin00001800.png",0,7},
+ // Skin Pack Birthday 1
+ { e_DLC_SkinPack,L"Birthday Skin Pack",L"951e8062-3d4e-470c-8177-5eca91bc08b3",L"SPB.png",L"dlcskin00000700.png",0,8},
+ // Skin Pack Birthday 2
+ { e_DLC_SkinPack,L"2nd Birthday Skin Pack",L"c7157788-468d-4ca8-9ecf-5d77a09850fc",L"SPB2.png",L"dlcskin00002200.png",0,9},
+
+ // Texture Packs
+
+ // Plastic Texture Pack
+ { e_DLC_TexturePacks,L"Plastic Texture Pack",L"52ecdcf1-d362-47a1-973b-1eeca0db0ea8",L"TP01.png",L"",2049,1},
+ // Natural Texture Pack
+ { e_DLC_TexturePacks,L"Natural Texture Pack",L"1c56db0c-ff49-4bb1-b372-2122b0e813c1",L"TP02.png",L"",2053,2},
+ // Halloween Texture Pack
+ { e_DLC_TexturePacks,L"Halloween Texture Pack",L"8cb331d1-8fa1-4367-a41a-d4830a80ce67",L"TP03.png",L"",2052,3},
+ // Fantasy Texture Pack
+ { e_DLC_TexturePacks,L"Fantasy Texture Pack",L"375a1df4-5550-415b-b278-20f65b31a7a3",L"TP04.png",L"",2051,4},
+ // City Texture Pack
+ { e_DLC_TexturePacks,L"City Texture Pack",L"ea5c7b40-e04d-4469-9382-8806467ca2c4",L"TP05.png",L"",2054,5},
+ // Candy Texture Pack
+ { e_DLC_TexturePacks,L"Candy Texture Pack",L"94c75e45-0757-4886-916c-ab026ae27ca9",L"TP06.png",L"",2050,6},
+ // Comic Texture Pack
+ //{ e_DLC_TexturePacks,L"Comic Texture Pack",L"3e14cf0f-26eb-40df-897d-7af905456e58",L"TP07.png",L"",2055,7},
+
+ // Mash-up Packs
+
+ // Mass Effect
+ { e_DLC_MashupPacks,L"Mass Effect",L"ead4f3bb-b388-42da-8fa9-f1f91570b5c7",L"MPMA.png",L"dlcskin00001100.png",1024,1},
+ // Skyrim
+ { e_DLC_MashupPacks,L"Skyrim",L"81cc4261-7b63-4e48-af1c-60b9ae099644",L"MPSR.png",L"dlcskin00001400.png",1025,2},
+ // Halo
+ { e_DLC_MashupPacks,L"Halo",L"1e06dafc-ea27-475e-945c-fcee0c455f87",L"MPHA.png",L"dlcskin00001600.png",1026,3},
+};*/
+
+void CConsoleMinecraftApp::InitialiseDLCDetails()
+{
+ for(int i=0;i<18;i++)
+ {
+ //RegisterDLCData(DLCDetailsA[i].e_DLC_Type, DLCDetailsA[i].wchBannerName, DLCDetailsA[i].wchDisplayName, DLCDetailsA[i].wchProductId, DLCDetailsA[i].wchFirstSkin, DLCDetailsA[i].iConfig, DLCDetailsA[i].uiSortIndex);
+ }
+}
+
+bool CConsoleMinecraftApp::UpdateProductId(XCONTENT_DATA &Data)
+{
+ // Do we have a product id for this?
+ DLC_INFO *pDLCInfo=app.GetDLCInfoForProductName(Data.wszDisplayName);
+
+ if(pDLCInfo!=NULL)
+ {
+ app.DebugPrintf("Updating product id for %ls\n",Data.wszDisplayName);
+ swprintf_s(Data.wszProductID, 64,L"%ls",pDLCInfo->wsProductId.c_str());
+ return true;
+ }
+ else
+ {
+ app.DebugPrintf("Couldn't find %ls\n",Data.wszDisplayName);
+ }
+
+ return false;
+}
+
+void CConsoleMinecraftApp::Shutdown()
+{
+ m_bShutdown=true;
+}
+
+bool CConsoleMinecraftApp::getShutdownFlag()
+{
+ return m_bShutdown;
+}
+
+
+// TMS
+bool CConsoleMinecraftApp::TMSPP_ReadBannedList(int iPad,eTMSAction NextAction)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::TMSPP_ReadBannedList\n");
+ eTitleStorageState eResult;
+ bool bSendBanFileRetrievedMsg=false;
+
+ if(GetBanListRead(iPad)==false)
+ {
+ // Attempt to read the ban list
+ // do we have one in our user filelist?
+ //if(StorageManager.TMSPP_InFileList(C4JStorage::eGlobalStorage_TitleUser,iPad,L"BannedList"))
+ {
+ SetBanListRead(iPad,true);
+ ClearBanList(iPad);
+
+ eResult=StorageManager.TMSPP_ReadFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"BannedList",&CConsoleMinecraftApp::Callback_TMSPPReadBannedList,this,NextAction);
+ if(eResult!=eTitleStorage_pending)
+ {
+ // something went wrong
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ bSendBanFileRetrievedMsg=true;
+ }
+ }
+ }
+ else
+ {
+ bSendBanFileRetrievedMsg=true;
+ }
+
+ if(bSendBanFileRetrievedMsg)
+ {
+ ui.HandleTMSBanFileRetrieved(iPad);
+ }
+
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+
+ return true;
+}
+
+int CConsoleMinecraftApp::Callback_TMSPPReadBannedList(void *pParam,int iPad, int iUserData, LPVOID lpvData,WCHAR *wchFilename)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadBannedList\n");
+ C4JStorage::PTMSPP_FILEDATA pFileData=(C4JStorage::PTMSPP_FILEDATA)lpvData;
+
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam;
+
+ if(pFileData)
+ {
+ // put the entries into the vector
+ int iEntries=pFileData->dwSize/sizeof(BANNEDLISTDATA);
+ PBANNEDLISTDATA pData=(PBANNEDLISTDATA)pFileData->pbData;
+
+ for(int i=0;i<iEntries;i++)
+ {
+ pClass->AddLevelToBannedLevelList(iPad,&pData[i], false);
+ }
+ // mark the level as not checked against banned levels - it'll be checked once the level starts
+ app.SetBanListCheck(iPad,false);
+
+ // Xbox One will clear things within the DownloadBlob
+#ifndef _XBOX_ONE
+ delete [] pFileData->pbData;
+ delete [] pFileData;
+#endif
+
+ ui.HandleTMSBanFileRetrieved(iPad);
+ }
+ else
+ {
+ // read problem - set state to idel again
+ StorageManager.TMSPP_ClearTitleStorageState(iPad);
+ }
+
+ // change the state to the next action
+ pClass->SetTMSAction(iPad,(eTMSAction)iUserData);
+
+ return 0;
+}
+
+void CConsoleMinecraftApp::TMSPP_ReadDLCFile(int iPad,eTMSAction NextAction)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::TMSPP_ReadDLCFile\n");
+ bool bRetrievedDLCFile=false;
+ // try reading the DLC.xml file (from TMS global) - only allowed to do this once an hour at the most, but we'll just read once each time the game launches
+ eTitleStorageState eResult;
+ if(m_bRead_TMS_DLCINFO_XML==false)
+ {
+// 4J-PB - we're reading this info from a local file now
+
+ eResult=StorageManager.TMSPP_ReadFile(iPad,C4JStorage::eGlobalStorage_Title,C4JStorage::TMS_FILETYPE_BINARY,L"DLCXbox1.cmp",&CConsoleMinecraftApp::Callback_TMSPPReadDLCFile,this,NextAction);
+ if(eResult!=eTitleStorage_pending)
+ {
+ // something went wrong
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ bRetrievedDLCFile=true;
+ m_bRead_TMS_DLCINFO_XML=true;
+ }
+ }
+ else
+ {
+ bRetrievedDLCFile=true;
+ }
+
+ if(bRetrievedDLCFile)
+ {
+ ui.HandleTMSDLCFileRetrieved(iPad);
+
+ app.SetTMSAction(iPad,(eTMSAction)NextAction);
+ }
+}
+
+void CConsoleMinecraftApp::TMSPP_RetrieveFileList(int iPad,C4JStorage::eGlobalStorage eStorageFacility,eTMSAction NextAction)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::TMSPP_RetrieveFileList\n");
+
+ if(eStorageFacility==C4JStorage::eGlobalStorage_Title)
+ {
+ if(m_bTMSPP_GlobalFileListRead==false)
+ {
+ m_bTMSPP_GlobalFileListRead=true;
+ StorageManager.TMSPP_ReadFileList(iPad,eStorageFacility,&CConsoleMinecraftApp::Callback_TMSPPRetrieveFileList,this,NextAction);
+ }
+ else
+ {
+ SetTMSAction(iPad,NextAction);
+ }
+ }
+ else
+ {
+ if(m_bTMSPP_UserFileListRead==false)
+ {
+ m_bTMSPP_UserFileListRead=true;
+ StorageManager.TMSPP_ReadFileList(iPad,eStorageFacility,&CConsoleMinecraftApp::Callback_TMSPPRetrieveFileList,this,NextAction);
+ }
+ else
+ {
+ SetTMSAction(iPad,NextAction);
+ }
+ }
+}
+
+int CConsoleMinecraftApp::Callback_TMSPPRetrieveFileList(void *pParam,int iPad, int iUserData, LPVOID lpvData, WCHAR *wchFilename)
+{
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam;
+ app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPRetrieveFileList\n");
+ if(lpvData!=NULL)
+ {
+ vector<C4JStorage::PTMSPP_FILE_DETAILS> *pvTmsFileDetails=(vector<C4JStorage::PTMSPP_FILE_DETAILS> *)lpvData;
+
+ if(pvTmsFileDetails->size()>0)
+ {
+ #ifdef _DEBUG
+ // dump out the file list
+ app.DebugPrintf("TMSPP filecount - %d\nFiles - \n",pvTmsFileDetails->size());
+ int iCount=0;
+ AUTO_VAR(itEnd, pvTmsFileDetails->end());
+ for( AUTO_VAR(it, pvTmsFileDetails->begin()); it != itEnd; it++ )
+ {
+ C4JStorage::PTMSPP_FILE_DETAILS fd = *it;
+ app.DebugPrintf("%2d. %ls (size - %d)\n",iCount++,fd->wchFilename,fd->ulFileSize);
+ }
+
+ #endif
+ }
+ }
+ // change the state to the next action
+ pClass->SetTMSAction(iPad,(eTMSAction)iUserData);
+ return 0;
+}
+
+//#define WRITE_DLCINFO 1
+int CConsoleMinecraftApp::Callback_TMSPPReadDLCFile(void *pParam,int iPad, int iUserData, LPVOID lpvData ,WCHAR *pwchFilename)
+{
+ app.DebugPrintf("CConsoleMinecraftApp::Callback_TMSPPReadDLCFile\n");
+ C4JStorage::PTMSPP_FILEDATA pFileData= (C4JStorage::PTMSPP_FILEDATA)lpvData;
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam;
+
+#ifdef WRITE_DLCINFO
+ if(0)
+#else
+ if(pFileData && pFileData->dwSize>0)
+#endif
+ {
+ // the DLC.xml file is now compressed
+
+ unsigned int uiDecompSize=*(unsigned int *)pFileData->pbData;
+ unsigned int uiCompSize=((unsigned int *)pFileData->pbData)[1];
+
+ BYTE *pDecompressedData = new BYTE [uiDecompSize];
+
+ Compression::ECompressionTypes eOriginalCompressionType=Compression::getCompression()->GetDecompressionType();
+ Compression::getCompression()->SetDecompressionType(Compression::eCompressionType_LZXRLE);
+ Compression::getCompression()->Decompress(pDecompressedData,&uiDecompSize,&((unsigned int *)pFileData->pbData)[2],uiCompSize);
+ Compression::getCompression()->SetDecompressionType(eOriginalCompressionType);
+
+ ATG::XMLParser xmlParser;
+ xmlDLCInfoCallback xmlCallback;
+
+ xmlParser.RegisterSAXCallbackInterface( &xmlCallback );
+ xmlParser.ParseXMLBuffer((CHAR *)pDecompressedData,uiDecompSize);
+
+ pClass->m_bRead_TMS_DLCINFO_XML=true;
+
+ delete pDecompressedData;
+
+ // apply the dlc info to the locally installed DLC
+ StorageManager.UpdateDLCProductIDs();
+
+ ui.HandleTMSDLCFileRetrieved(iPad);
+ }
+ else
+ {
+
+ // if there was a read error, reset to idle
+ StorageManager.TMSPP_ClearTitleStorageState(iPad);
+
+#ifdef WRITE_DLCINFO
+ HANDLE file;
+ DWORD dwHigh=0;
+ DWORD dwFileSize;
+
+ // hack for now to upload the file
+ // open the local file
+ file = CreateFile(L"DLCXbox1.cmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if( file == INVALID_HANDLE_VALUE )
+ {
+ DWORD error = GetLastError();
+ app.DebugPrintf("Failed to open DLCXbox1.cmp with error code %d (%x)\n", error, error);
+ __debugbreak();
+ return 0;
+ }
+
+ dwHigh=0;
+ dwFileSize = GetFileSize(file,&dwHigh);
+
+ if(dwFileSize!=0)
+ {
+ DWORD bytesRead;
+
+ PBYTE pbData= new BYTE [dwFileSize];
+
+ ReadFile(file,pbData,dwFileSize,&bytesRead,NULL);
+
+ if(bytesRead==dwFileSize)
+ {
+ //StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"DLCXbox1.cmp",(PBYTE) pbData, dwFileSize,NULL,NULL, 0);
+ StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"TP06.cmp",(PBYTE) pbData, dwFileSize,NULL,NULL, 0);
+ }
+ Sleep(5000);
+ }
+
+ CloseHandle(file);
+
+ /*
+ // now the icon
+ file = CreateFile(L"TP06.png", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if( file == INVALID_HANDLE_VALUE )
+ {
+ DWORD error = GetLastError();
+ app.DebugPrintf("Failed to open DLCXbox1.cmp with error code %d (%x)\n", error, error);
+ return 0;
+ }
+
+ dwHigh=0;
+ dwFileSize = GetFileSize(file,&dwHigh);
+
+ if(dwFileSize!=0)
+ {
+ DWORD bytesRead;
+
+ PBYTE pbData= new BYTE [dwFileSize];
+
+ ReadFile(file,pbData,dwFileSize,&bytesRead,NULL);
+
+ if(bytesRead==dwFileSize)
+ {
+ StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"TP06.png",(PBYTE) pbData, dwFileSize,NULL,NULL, 0);
+ }
+ Sleep(5000);
+ }
+
+ CloseHandle(file);*/
+#endif
+ }
+
+ // change the state to the next action
+ pClass->SetTMSAction(iPad,(eTMSAction)iUserData);
+
+ return 0;
+}
+
+void CConsoleMinecraftApp::Callback_SaveGameIncomplete(void *pParam, C4JStorage::ESaveIncompleteType saveIncompleteType)
+{
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam;
+
+ if ( saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota
+ || saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfLocalStorage )
+ {
+ StorageManager.SetSaveDisabled(true);
+ pClass->EnterSaveNotificationSection();
+
+ int message;
+ if (saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota) message = IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA;
+ else message = IDS_SAVE_INCOMPLETE_EXPLANATION_LOCAL_STORAGE;
+
+ UINT uiIDA[3] =
+ {
+ IDS_SAVE_INCOMPLETE_RETRY_SAVING,
+ IDS_SAVE_INCOMPLETE_DISABLE_SAVING,
+ IDS_SAVE_INCOMPLETE_DELETE_SAVES
+ };
+
+ if ( ui.RequestMessageBox( IDS_SAVE_INCOMPLETE_TITLE, message, uiIDA,3,0,Callback_SaveGameIncompleteMessageBoxReturned,pClass, app.GetStringTable()) == C4JStorage::EMessage_Busy)
+ {
+ // If this failed to display, continue as if we cancelled. This isn't ideal, but the user should already have had some system notification of being out of memory,
+ // and if we instantly retry then they may not be able to navigate whatever other error is blocking this from appearing
+ Callback_SaveGameIncompleteMessageBoxReturned(pParam, 0, C4JStorage::EMessage_Cancelled);
+ }
+ }
+ else
+ {
+ // 4J-JEV: Unknown error, just cancel the operation.
+ Callback_SaveGameIncompleteMessageBoxReturned(pParam, 0, C4JStorage::EMessage_Cancelled);
+ }
+}
+
+int CConsoleMinecraftApp::Callback_SaveGameIncompleteMessageBoxReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
+{
+ CConsoleMinecraftApp* pClass = (CConsoleMinecraftApp*)pParam;
+
+ switch(result)
+ {
+ case C4JStorage::EMessage_ResultAccept:
+ pClass->LeaveSaveNotificationSection();
+ StorageManager.SetSaveDisabled(false);
+ StorageManager.ContinueIncompleteOperation();
+ break;
+ case C4JStorage::EMessage_ResultDecline:
+ case C4JStorage::EMessage_Cancelled:
+ pClass->LeaveSaveNotificationSection();
+ // Set the global flag, so that we don't disable saving again once the message box is complete
+ app.SetGameHostOption(eGameHostOption_DisableSaving, 1);
+ StorageManager.CancelIncompleteOperation();
+ break;
+ case C4JStorage::EMessage_ResultThirdOption:
+ ui.NavigateToScene(iPad, eUIScene_InGameSaveManagementMenu, NULL, eUILayer_Error, eUIGroup_Fullscreen);
+ break;
+ }
+ return 0;
+}
+
+void CConsoleMinecraftApp::ReadLocalDLCList(void)
+{
+ char szFile[255];
+ DWORD dwLength;
+ // read the local dlc list
+ File fDLCList(L"CU/DLCXbox1.cmp") ;
+ if(fDLCList.exists())
+ {
+ dwLength = fDLCList.length();
+ byteArray data(dwLength);
+
+ FileInputStream fis(fDLCList);
+ fis.read(data,0,dwLength);
+ fis.close();
+
+ unsigned int uiDecompSize=*(unsigned int *)data.data;
+ unsigned int uiCompSize=((unsigned int *)data.data)[1];
+
+ BYTE *pDecompressedData = new BYTE [uiDecompSize];
+
+ Compression::ECompressionTypes eOriginalCompressionType=Compression::getCompression()->GetDecompressionType();
+ Compression::getCompression()->SetDecompressionType(Compression::eCompressionType_LZXRLE);
+ Compression::getCompression()->Decompress(pDecompressedData,&uiDecompSize,&((unsigned int *)data.data)[2],uiCompSize);
+ Compression::getCompression()->SetDecompressionType(eOriginalCompressionType);
+
+ ATG::XMLParser xmlParser;
+ xmlDLCInfoCallback xmlCallback;
+
+ xmlParser.RegisterSAXCallbackInterface( &xmlCallback );
+ xmlParser.ParseXMLBuffer((CHAR *)pDecompressedData,uiDecompSize);
+
+ delete pDecompressedData;
+ }
+} \ No newline at end of file