2020-12-05 13:08:24 +01:00
# include "stdafx.h"
2017-03-25 15:25:24 +01:00
# include "Emu/Cell/PPUModule.h"
2018-02-02 16:47:46 +01:00
# include "cellSysutil.h"
2019-11-17 00:22:56 +01:00
# include "cellCrossController.h"
2018-02-09 15:49:37 +01:00
2017-07-21 17:41:11 +02:00
2018-08-25 14:39:00 +02:00
LOG_CHANNEL ( cellCrossController ) ;
2017-03-25 15:25:24 +01:00
2019-11-17 00:22:56 +01:00
template < >
void fmt_class_string < CellCrossControllerError > : : format ( std : : string & out , u64 arg )
2018-02-02 16:47:46 +01:00
{
2019-11-17 00:22:56 +01:00
format_enum ( out , arg , [ ] ( CellCrossControllerError value )
{
switch ( value )
{
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_CANCEL ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_NETWORK ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_OUT_OF_MEMORY ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_FATAL ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILENAME ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_INVALID_SIG_FILENAME ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_INVALID_ICON_FILENAME ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_PKG_FILE_OPEN ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_SIG_FILE_OPEN ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_ICON_FILE_OPEN ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_INVALID_STATE ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILE ) ;
STR_CASE ( CELL_CROSS_CONTROLLER_ERROR_INTERNAL ) ;
}
2018-02-02 16:47:46 +01:00
2019-11-17 00:22:56 +01:00
return unknown ;
} ) ;
}
2017-07-21 17:41:11 +02:00
2019-11-17 00:22:56 +01:00
error_code cellCrossControllerInitialize ( vm : : cptr < CellCrossControllerParam > pParam , vm : : cptr < CellCrossControllerPackageInfo > pPkgInfo , vm : : ptr < CellCrossControllerCallback > cb , vm : : ptr < void > userdata ) // LittleBigPlanet 2 and 3
2017-07-21 17:41:11 +02:00
{
2019-11-17 00:22:56 +01:00
cellCrossController . todo ( " cellCrossControllerInitialize(pParam=*0x%x, pPkgInfo=*0x%x, cb=*0x%x, userdata=*0x%x) " , pParam , pPkgInfo , cb , userdata ) ;
2017-07-21 17:41:11 +02:00
2019-11-17 00:22:56 +01:00
// TODO
//if (something)
//{
// return CELL_CROSS_CONTROLLER_ERROR_INVALID_STATE;
//}
2017-07-21 17:41:11 +02:00
2019-11-17 00:22:56 +01:00
if ( ! pParam | | ! pPkgInfo )
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE ;
}
// Check if the strings exceed the allowed size (not counting null terminators)
if ( ! pParam - > pPackageFileName | | ! memchr ( pParam - > pPackageFileName . get_ptr ( ) , ' \0 ' , CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN + 1 ) )
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_PKG_FILENAME ;
}
if ( ! pParam - > pSignatureFileName | | ! memchr ( pParam - > pSignatureFileName . get_ptr ( ) , ' \0 ' , CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN + 1 ) )
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_SIG_FILENAME ;
}
if ( ! pParam - > pIconFileName | | ! memchr ( pParam - > pIconFileName . get_ptr ( ) , ' \0 ' , CELL_CROSS_CONTROLLER_PARAM_FILE_NAME_LEN + 1 ) )
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_ICON_FILENAME ;
}
if ( ! pPkgInfo - > pAppVer | | ! memchr ( pPkgInfo - > pAppVer . get_ptr ( ) , ' \0 ' , CELL_CROSS_CONTROLLER_PKG_APP_VER_LEN + 1 ) | |
! pPkgInfo - > pTitleId | | ! memchr ( pPkgInfo - > pTitleId . get_ptr ( ) , ' \0 ' , CELL_CROSS_CONTROLLER_PKG_TITLE_ID_LEN + 1 ) | |
! pPkgInfo - > pTitle | | ! memchr ( pPkgInfo - > pTitle . get_ptr ( ) , ' \0 ' , CELL_CROSS_CONTROLLER_PKG_TITLE_LEN + 1 ) | |
! cb )
{
return CELL_CROSS_CONTROLLER_ERROR_INVALID_VALUE ;
}
2018-02-02 16:47:46 +01:00
sysutil_register_cb ( [ = ] ( ppu_thread & ppu ) - > s32
{
cb ( ppu , CELL_CROSS_CONTROLLER_STATUS_INITIALIZED , CELL_OK , vm : : null , userdata ) ;
cb ( ppu , CELL_CROSS_CONTROLLER_STATUS_FINALIZED , CELL_OK , vm : : null , userdata ) ;
return CELL_OK ;
} ) ;
2017-03-25 15:25:24 +01:00
return CELL_OK ;
}
DECLARE ( ppu_module_manager : : cellCrossController ) ( " cellCrossController " , [ ] ( )
{
2017-07-21 17:41:11 +02:00
REG_FUNC ( cellCrossController , cellCrossControllerInitialize ) ;
2017-03-25 15:25:24 +01:00
} ) ;