#include "stdafx.h"
#include "UI.h"
#include "UIScene_DLCOffersMenu.h"
#include "..\..\..\Minecraft.World\StringHelpers.h"
#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
#include "Common\Network\Sony\SonyHttp.h"
#endif
#ifdef __PSVITA__
#include "PSVita\Network\SonyCommerce_Vita.h"
#endif
#define PLAYER_ONLINE_TIMER_ID 0
#define PLAYER_ONLINE_TIMER_TIME 100
UIScene_DLCOffersMenu::UIScene_DLCOffersMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
{
m_bProductInfoShown=false;
DLCOffersParam *param=(DLCOffersParam *)initData;
m_iProductInfoIndex=param->iType;
m_iCurrentDLC=0;
m_iTotalDLC=0;
#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
m_pvProductInfo=NULL;
#endif
m_bAddAllDLCButtons=true;
// Setup all the Iggy references we need for this scene
initialiseMovie();
// Alert the app the we want to be informed of ethernet connections
app.SetLiveLinkRequired( true );
m_bIsSD=!RenderManager.IsHiDef() && !RenderManager.IsWidescreen();
m_labelOffers.init(app.GetString(IDS_DOWNLOADABLE_CONTENT_OFFERS));
m_buttonListOffers.init(eControl_OffersList);
m_labelHTMLSellText.init(L" ");
m_labelPriceTag.init(L" ");
TelemetryManager->RecordMenuShown(m_iPad, eUIScene_DLCOffersMenu, 0);
m_bHasPurchased = false;
m_bIsSelected = false;
if(m_loadedResolution == eSceneResolution_1080)
{
#ifdef _DURANGO
m_labelXboxStore.init( app.GetString(IDS_XBOX_STORE) );
#else
m_labelXboxStore.init( L"" );
#endif
}
#ifdef _DURANGO
m_pNoImageFor_DLC = NULL;
// If we don't yet have this DLC, we need to display a timer
m_bDLCRequiredIsRetrieved=false;
m_bIgnorePress=true;
m_bSelectionChanged=true;
// display a timer
m_Timer.setVisible(true);
#endif
#ifdef __ORBIS__
//sceNpCommerceShowPsStoreIcon(SCE_NP_COMMERCE_PS_STORE_ICON_CENTER);
#endif
#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ )
addTimer( PLAYER_ONLINE_TIMER_ID, PLAYER_ONLINE_TIMER_TIME );
#endif
#ifdef __PSVITA__
ui.TouchBoxRebuild(this);
#endif
}
UIScene_DLCOffersMenu::~UIScene_DLCOffersMenu()
{
// Alert the app the we no longer want to be informed of ethernet connections
app.SetLiveLinkRequired( false );
}
void UIScene_DLCOffersMenu::handleTimerComplete(int id)
{
#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__)
switch(id)
{
case PLAYER_ONLINE_TIMER_ID:
#ifndef _WINDOWS64
if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())==false)
{
// check the player hasn't gone offline
// If they have, bring up the PSN warning and exit from the DLC menu
unsigned int uiIDA[1];
uiIDA[0]=IDS_OK;
C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_DLCOffersMenu::ExitDLCOffersMenu,this);
}
#endif
break;
}
#endif
}
int UIScene_DLCOffersMenu::ExitDLCOffersMenu(void *pParam,int iPad,C4JStorage::EMessageResult result)
{
UIScene_DLCOffersMenu* pClass = (UIScene_DLCOffersMenu*)pParam;
#if defined __ORBIS__ || defined __PSVITA__
app.GetCommerce()->HidePsStoreIcon();
#endif
ui.NavigateToHomeMenu();//iPad,eUIScene_MainMenu);
return 0;
}
wstring UIScene_DLCOffersMenu::getMoviePath()
{
return L"DLCOffersMenu";
}
void UIScene_DLCOffersMenu::updateTooltips()
{
int iA = -1;
if(m_bIsSelected)
{
if( !m_bHasPurchased )
{
iA = IDS_TOOLTIPS_INSTALL;
}
else
{
iA = IDS_TOOLTIPS_REINSTALL;
}
}
ui.SetTooltips( m_iPad, iA,IDS_TOOLTIPS_BACK);
}
void UIScene_DLCOffersMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled)
{
//app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE");
ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released);
switch(key)
{
case ACTION_MENU_CANCEL:
if(pressed)
{
navigateBack();
}
break;
case ACTION_MENU_OK:
#ifdef __ORBIS__
case ACTION_MENU_TOUCHPAD_PRESS:
#endif
sendInputToMovie(key, repeat, pressed, released);
break;
case ACTION_MENU_UP:
if(pressed)
{
// 4J - TomK don't proceed if there is no DLC to navigate through
if(m_iTotalDLC > 0)
{
if(m_iCurrentDLC > 0)
m_iCurrentDLC--;
m_bProductInfoShown = false;
}
}
sendInputToMovie(key, repeat, pressed, released);
break;
case ACTION_MENU_DOWN:
if(pressed)
{
// 4J - TomK don't proceed if there is no DLC to navigate through
if(m_iTotalDLC > 0)
{
if(m_iCurrentDLC < (m_iTotalDLC - 1))
m_iCurrentDLC++;
m_bProductInfoShown = false;
}
}
sendInputToMovie(key, repeat, pressed, released);
break;
case ACTION_MENU_LEFT:
/*
#ifdef _DEBUG
static int iTextC=0;
switch(iTextC)
{
case 0:
m_labelHTMLSellText.init("Voici un fantastique mini-pack de 24 apparences pour personnaliser votre personnage Minecraft et vous mettre dans l'ambiance des f�tes de fin d'ann�e.
1-4 joueurs
2-8 joueurs en r�seau
Cet article fait l�objet d�une licence ou d�une sous-licence de Sony Computer Entertainment America, et est soumis aux conditions g�n�rales du service du r�seau, au contrat d�utilisateur, aux restrictions d�utilisation de cet article et aux autres conditions applicables, disponibles sur le site www.us.playstation.com/support/useragreements. Si vous ne souhaitez pas accepter ces conditions, ne t�l�chargez pas ce produit. Cet article peut �tre utilis� avec un maximum de deux syst�mes PlayStation�3 activ�s associ�s � ce compte Sony Entertainment Network.�
'Minecraft' est une marque commerciale de Notch Development AB.");
break;
case 1:
m_labelHTMLSellText.init("Un fabuloso minipack de 24 aspectos para personalizar tu personaje de Minecraft y ponerte a tono con las fiestas.
1-4 jugadores
2-8 jugadores en red
Sony Computer Entertainment America le concede la licencia o sublicencia de este art�culo, que est� sujeto a los t�rminos de servicio y al acuerdo de usuario de la red. Las restricciones de uso de este art�culo, as� como otros t�rminos aplicables, se encuentran en www.us.playstation.com/support/useragreements. Si no desea aceptar todos estos t�rminos, no descargue este art�culo. Este art�culo puede usarse en hasta dos sistemas PlayStation�3 activados asociados con esta cuenta de Sony Entertainment Network.�
'Minecraft' es una marca comercial de Notch Development AB.");
break;
case 2:
m_labelHTMLSellText.init("Este � um incr�vel pacote com 24 capas para personalizar seu personagem no Minecraft e entrar no clima de final de ano.
1-4 Jogadores
Jogadores em rede 2-8
Este item est� sendo licenciado ou sublicenciado para voc� pela Sony Computer Entertainment America e est� sujeito aos Termos de Servi�o da Rede e Acordo do Usu�rio, as restri��es de uso deste item e outros termos aplic�veis est�o localizados em www.us.playstation.com/support/useragreements. Caso n�o queira aceitar todos esses termos, n�o baixe este item. Este item pode ser usado com at� 2 sistemas PlayStation�3 ativados associados a esta Conta de Rede Sony Entertainment.�
'Minecraft' � uma marca registrada da Notch Development AB");
break;
}
iTextC++;
if(iTextC>2) iTextC=0;
#endif
*/
case ACTION_MENU_RIGHT:
case ACTION_MENU_OTHER_STICK_DOWN:
case ACTION_MENU_OTHER_STICK_UP:
// don't pass down PageUp or PageDown because this will cause conflicts between the buttonlist and scrollable html text component
//case ACTION_MENU_PAGEUP:
//case ACTION_MENU_PAGEDOWN:
sendInputToMovie(key, repeat, pressed, released);
break;
}
}
void UIScene_DLCOffersMenu::handlePress(F64 controlId, F64 childId)
{
switch((int)controlId)
{
case eControl_OffersList:
{
#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
// buy the DLC
vector::iterator it = m_pvProductInfo->begin();
string teststring;
for(int i=0;i-1))
{
int iIndex = (int)childId;
MARKETPLACE_CONTENTOFFER_INFO xOffer = StorageManager.GetOffer(iIndex);
UpdateDisplay(xOffer);
}*/
#endif
#if defined __PSVITA__ || defined __ORBIS__
if(m_pvProductInfo)
{
m_bIsSelected = true;
vector::iterator it = m_pvProductInfo->begin();
string teststring;
for(int i=0;isize();
}
vector::iterator it = m_pvProductInfo->begin();
string teststring;
bool bFirstItemSet=false;
for(int i=0;idwImageBytes!=0)
{
pbImageData=pSONYDLCInfo->pbImageData;
iImageDataBytes=pSONYDLCInfo->dwImageBytes;
bDeleteData=false; // we'll clean up the local LDC images
}
else
#endif
if(info.imageUrl[0]!=0)
{
SonyHttp::getDataFromURL(info.imageUrl,(void **)&pbImageData,&iImageDataBytes);
bDeleteData=true;
}
if(iImageDataBytes!=0)
{
// set the image
registerSubstitutionTexture(textureName,pbImageData,iImageDataBytes,bDeleteData);
m_bitmapIconOfferImage.setTextureName(textureName);
// 4J Stu - Don't delete this
//delete [] pbImageData;
}
else
{
m_bitmapIconOfferImage.setTextureName(L"");
}
}
else
{
m_bitmapIconOfferImage.setTextureName(textureName);
}
}
it++;
}
if(bFirstItemSet==false)
{
// we were not able to add any items to the list
m_labelOffers.setLabel(app.GetString(IDS_NO_DLCCATEGORIES));
}
else
{
// set the focus to the first thing in the categories if there are any
if(m_pvProductInfo->size()>0)
{
m_buttonListOffers.setFocus(true);
}
else
{
// need to display text to say no downloadable content available yet
m_labelOffers.setLabel(app.GetString(IDS_NO_DLCCATEGORIES));
}
}
m_Timer.setVisible(false);
m_bProductInfoShown=true;
}
}
else
{
#ifdef __PSVITA__
// MGH - fixes bug 5768 on Vita - should be extended properly to work for other platforms
if((SonyCommerce_Vita::getPurchasabilityUpdated()) && app.GetCommerceProductListRetrieved()&& app.GetCommerceProductListInfoRetrieved() && m_iTotalDLC > 0)
{
{
vector::iterator it = m_pvProductInfo->begin();
for(int i=0;i 0)
{
vector::iterator it = m_pvProductInfo->begin();
string teststring;
for(int i=0;idwImageBytes!=0)
{
pbImageData=pSONYDLCInfo->pbImageData;
iImageDataBytes=pSONYDLCInfo->dwImageBytes;
bDeleteData=false; // we'll clean up the local LDC images
}
else
#endif
{
SonyHttp::getDataFromURL(info.imageUrl,(void **)&pbImageData,&iImageDataBytes);
bDeleteData=true;
}
if(iImageDataBytes!=0)
{
// set the image
registerSubstitutionTexture(textureName,pbImageData,iImageDataBytes, bDeleteData);
m_bitmapIconOfferImage.setTextureName(textureName);
// 4J Stu - Don't delete this
//delete [] pbImageData;
}
else
{
m_bitmapIconOfferImage.setTextureName(L"");
}
}
else
{
m_bitmapIconOfferImage.setTextureName(textureName);
}
m_bProductInfoShown=true;
m_Timer.setVisible(false);
}
}
#elif defined _XBOX_ONE
if(m_bAddAllDLCButtons)
{
// Is the DLC we're looking for available?
if(!m_bDLCRequiredIsRetrieved)
{
// DLCContentRetrieved is to see if the type of content has been retrieved - and on Durango there is only type 0 - XMARKETPLACE_OFFERING_TYPE_CONTENT
if(app.DLCContentRetrieved(e_Marketplace_Content))
{
m_bDLCRequiredIsRetrieved=true;
// Retrieve the info
GetDLCInfo(app.GetDLCOffersCount(), false);
m_bIgnorePress=false;
m_bAddAllDLCButtons=false;
// hide the timer
m_Timer.setVisible(false);
}
}
}
// have to wait until we have the offers
if(m_bSelectionChanged && m_bDLCRequiredIsRetrieved)
{
// need to update text and icon
if(m_buttonListOffers.hasFocus() && (getControlChildFocus()>-1))
{
int iIndex = getControlChildFocus();
MARKETPLACE_CONTENTOFFER_INFO xOffer = StorageManager.GetOffer(iIndex);
if (!ui.UsingBitmapFont()) // 4J-JEV: Replace characters we don't have.
{
for (int i=0; xOffer.wszCurrencyPrice[i]!=0; i++)
{
WCHAR *c = &xOffer.wszCurrencyPrice[i];
if (*c == L'\u20A9') *c = L'\uFFE6'; // Korean Won.
else if (*c == L'\u00A5') *c = L'\uFFE5'; // Japanese Yen.
}
}
if(UpdateDisplay(xOffer))
{
// image was available
m_bSelectionChanged=false;
}
}
}
#endif
}
#if defined _XBOX_ONE
void UIScene_DLCOffersMenu::GetDLCInfo( int iOfferC, bool bUpdateOnly )
{
MARKETPLACE_CONTENTOFFER_INFO xOffer;
int iCount=0;
bool bNoDLCToDisplay = true;
unsigned int uiDLCCount=0;
if(bUpdateOnly) // Just update the info on the current list
{
}
else
{
// clear out the list
m_buttonListOffers.clearList();
// need to reorder the DLC display according to dlc uiSortIndex
SORTINDEXSTRUCT *OrderA = new SORTINDEXSTRUCT [iOfferC];
for(int i = 0; i < iOfferC; i++)
{
xOffer = StorageManager.GetOffer(i);
// Check that this is in the list of known DLC
DLC_INFO *pDLC=app.GetDLCInfoForFullOfferID(xOffer.wszProductID);
if(pDLC!=NULL)
{
OrderA[uiDLCCount].uiContentIndex=i;
OrderA[uiDLCCount++].uiSortIndex=pDLC->uiSortIndex;
}
else
{
app.DebugPrintf("Unknown offer - %ls\n",xOffer.wszOfferName);
}
}
qsort( OrderA, uiDLCCount, sizeof(SORTINDEXSTRUCT), OrderSortFunction );
for(int i = 0; i < uiDLCCount; i++)
{
xOffer = StorageManager.GetOffer(OrderA[i].uiContentIndex);
// Check that this is in the list of known DLC
DLC_INFO *pDLC=app.GetDLCInfoForFullOfferID(xOffer.wszProductID);
if(pDLC==NULL)
{
// skip this one
app.DebugPrintf("Unknown offer - %ls\n",xOffer.wszOfferName);
continue;
}
if(pDLC->eDLCType==(eDLCContentType)m_iProductInfoIndex)
{
wstring wstrTemp=xOffer.wszOfferName;
// 4J-PB - Rog requested we remove the Minecraft at the start of the name. It's required for the Bing search, but gets in the way here
app.DebugPrintf("Adding %ls at %d\n",wstrTemp.c_str(), i);
if(wcsncmp(L"Minecraft ",wstrTemp.c_str(),10)==0)
{
app.DebugPrintf("Removing Minecraft from name\n");
WCHAR *pwchNewName=(WCHAR *)wstrTemp.c_str();
wstrTemp=&pwchNewName[10];
}
#ifdef _XBOX_ONE
// 4J-PB - the hasPurchased comes from the local installed package info
// find the DLC in the installed packages
XCONTENT_DATA *pContentData=StorageManager.GetInstalledDLC(xOffer.wszProductID);
if(pContentData!=NULL)
{
m_buttonListOffers.addItem(wstrTemp,!pContentData->bTrialLicense,OrderA[i].uiContentIndex);
}
else
{
m_buttonListOffers.addItem(wstrTemp,false,OrderA[i].uiContentIndex);
}
#else
m_buttonListOffers.addItem(wstrTemp,xOffer.fUserHasPurchased,OrderA[i].uiContentIndex);
#endif
// add the required image to the retrieval queue
m_vIconRetrieval.push_back(pDLC->wchBanner);
/** 4J JEV:
* We've filtered results out from the list, need to keep track
* of the 'actual' list index.
*/
iCount++;
}
}
// Check if there is nothing to display, and display the default "nothing available at this time"
if(iCount>0)
{
bNoDLCToDisplay=false;
xOffer = StorageManager.GetOffer(OrderA[0].uiContentIndex);
//m_buttonListOffers.setCurrentSelection(0);
UpdateDisplay(xOffer);
}
delete OrderA;
}
// turn off the timer display
//m_Timer.SetShow(FALSE);
if(bNoDLCToDisplay)
{
// set the default text
wchar_t formatting[40];
wstring wstrTemp = app.GetString(IDS_NO_DLCOFFERS);
// swprintf(formatting, 40, L"", m_bIsSD?12:14);
// wstrTemp = formatting + wstrTemp;
m_labelHTMLSellText.setLabel(wstrTemp);
m_labelPriceTag.setVisible(false);
}
}
int UIScene_DLCOffersMenu::OrderSortFunction(const void* a, const void* b)
{
return ((SORTINDEXSTRUCT*)b)->uiSortIndex - ((SORTINDEXSTRUCT*)a)->uiSortIndex;
}
void UIScene_DLCOffersMenu::UpdateTooltips(MARKETPLACE_CONTENTOFFER_INFO& xOffer)
{
m_bHasPurchased = xOffer.fUserHasPurchased;
m_bIsSelected = true;
updateTooltips();
}
bool UIScene_DLCOffersMenu::UpdateDisplay(MARKETPLACE_CONTENTOFFER_INFO& xOffer)
{
bool bImageAvailable=false;
#ifdef _XBOX_ONE
DLC_INFO *dlc = app.GetDLCInfoForFullOfferID(xOffer.wszProductID);
#else
DLC_INFO *dlc = app.GetDLCInfoForFullOfferID(xOffer.wszOfferName);
#endif
if (dlc != NULL)
{
WCHAR *cString = dlc->wchBanner;
// is the file in the local DLC images?
// is the file in the TMS XZP?
//int iIndex = app.GetLocalTMSFileIndex(cString, true);
if(dlc->dwImageBytes!=0)
{
//app.LoadLocalTMSFile(cString);
// set the image - no delete
registerSubstitutionTexture(cString,dlc->pbImageData,dlc->dwImageBytes,false);
m_bitmapIconOfferImage.setTextureName(cString);
bImageAvailable=true;
}
else
{
bool bPresent = app.IsFileInMemoryTextures(cString);
if (!bPresent)
{
// Image has not come in yet
// Set the item monitored in the timer, so we can set the image when it comes in
m_pNoImageFor_DLC=dlc;
app.AddTMSPPFileTypeRequest(dlc->eDLCType,true);
bImageAvailable=false;
//m_bitmapIconOfferImage.setTextureName(L"");
}
else
{
if(hasRegisteredSubstitutionTexture(cString)==false)
{
BYTE *pData=NULL;
DWORD dwSize=0;
app.GetMemFileDetails(cString,&pData,&dwSize);
// set the image
#ifdef _XBOX_ONE
registerSubstitutionTexture(cString,pData,dwSize);
#else
registerSubstitutionTexture(cString,pData,dwSize,true);
#endif
m_bitmapIconOfferImage.setTextureName(cString);
}
else
{
m_bitmapIconOfferImage.setTextureName(cString);
}
bImageAvailable=true;
}
}
m_labelHTMLSellText.setLabel(xOffer.wszSellText);
// set the price info
m_labelPriceTag.setVisible(true);
m_labelPriceTag.setLabel(xOffer.wszCurrencyPrice);
UpdateTooltips(xOffer);
}
else
{
wchar_t formatting[40];
wstring wstrTemp = app.GetString(IDS_NO_DLCOFFERS);
m_labelHTMLSellText.setLabel(wstrTemp.c_str());
m_labelPriceTag.setVisible(false);
}
return bImageAvailable;
}
#endif
#ifdef _XBOX_ONE
void UIScene_DLCOffersMenu::HandleDLCLicenseChange()
{
// flag an update of the display
int iOfferC=app.GetDLCOffersCount();
GetDLCInfo(iOfferC,false);
}
#endif // _XBOX_ONE
#ifdef __PS3__
void UIScene_DLCOffersMenu::HandleDLCInstalled()
{
app.DebugPrintf(4,"UIScene_DLCOffersMenu::HandleDLCInstalled\n");
// m_buttonListOffers.clearList();
// m_bAddAllDLCButtons=true;
// m_bProductInfoShown=false;
}
// void UIScene_DLCOffersMenu::HandleDLCMountingComplete()
// {
// app.DebugPrintf(4,"UIScene_SkinSelectMenu::HandleDLCMountingComplete\n");
//}
#endif