#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;
}
}
}
// if(m_bBitmapOfferIconDisplayed==false)
// {
// // do we have it yet?
// if
// }
// retrieve the icons for the DLC
// if(m_vIconRetrieval.size()>0)
// {
// // for each icon, request it, and remove it from the list
// // the callback for the retrieval will update the display if needed
//
// AUTO_VAR(itEnd, m_vIconRetrieval.end());
// for (AUTO_VAR(it, m_vIconRetrieval.begin()); it != itEnd; it++)
// {
//
// }
//
// }
#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