MCPcopy Create free account
hub / github.com/RPCSX/rpcsx / cellOskDialogLoadAsync

Function cellOskDialogLoadAsync

ps3fw/cellOskDialog.cpp:219–643  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

217}
218
219error_code cellOskDialogLoadAsync(u32 container, vm::ptr<CellOskDialogParam> dialogParam, vm::ptr<CellOskDialogInputFieldInfo> inputFieldInfo)
220{
221 cellOskDialog.warning("cellOskDialogLoadAsync(container=0x%x, dialogParam=*0x%x, inputFieldInfo=*0x%x)", container, dialogParam, inputFieldInfo);
222
223 if (!dialogParam || !inputFieldInfo || !inputFieldInfo->message || !inputFieldInfo->init_text || inputFieldInfo->limit_length > CELL_OSKDIALOG_STRING_SIZE)
224 {
225 return CELL_OSKDIALOG_ERROR_PARAM;
226 }
227
228 cellOskDialog.notice("cellOskDialogLoadAsync: dialogParam={ allowOskPanelFlg=0x%x, prohibitFlgs=0x%x, firstViewPanel=%d, controlPoint=(%.2f,%.2f) }",
229 dialogParam->allowOskPanelFlg, dialogParam->prohibitFlgs, dialogParam->firstViewPanel, dialogParam->controlPoint.x, dialogParam->controlPoint.y);
230
231 auto osk = _get_osk_dialog(true);
232
233 // Can't open another dialog if this one is already open.
234 if (!osk || osk->state.load() != OskDialogState::Unloaded)
235 {
236 return CELL_SYSUTIL_ERROR_BUSY;
237 }
238
239 // Get the OSK options
240 auto& info = g_fxo->get<osk_info>();
241 u32 maxLength = (inputFieldInfo->limit_length >= CELL_OSKDIALOG_STRING_SIZE) ? 511 : u32{inputFieldInfo->limit_length};
242 const u32 prohibitFlgs = dialogParam->prohibitFlgs;
243 const u32 allowOskPanelFlg = dialogParam->allowOskPanelFlg;
244 const u32 firstViewPanel = dialogParam->firstViewPanel;
245 info.layout.x_offset = dialogParam->controlPoint.x;
246 info.layout.y_offset = dialogParam->controlPoint.y;
247
248 // Get init text and prepare return value
249 osk->osk_input_result = CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK;
250 osk->osk_text = {};
251
252 // Also clear the info text just to be sure (it should be zeroed at this point anyway)
253 {
254 std::lock_guard lock(info.text_mtx);
255 info.valid_text = {};
256 }
257
258 if (inputFieldInfo->init_text)
259 {
260 for (u32 i = 0; (i < maxLength) && (inputFieldInfo->init_text[i] != 0); i++)
261 {
262 osk->osk_text[i] = inputFieldInfo->init_text[i];
263 }
264 }
265
266 // Get message to display above the input field
267 // Guarantees 0 terminated (+1). In praxis only 128 but for now lets display all of it
268 char16_t message[CELL_OSKDIALOG_STRING_SIZE + 1]{};
269
270 if (inputFieldInfo->message)
271 {
272 for (u32 i = 0; (i < CELL_OSKDIALOG_STRING_SIZE) && (inputFieldInfo->message[i] != 0); i++)
273 {
274 message[i] = inputFieldInfo->message[i];
275 }
276 }

Callers

nothing calls this directly

Calls 15

_get_osk_dialogFunction · 0.85
sysutil_register_cbFunction · 0.85
yieldFunction · 0.85
sysutil_send_system_cmdFunction · 0.85
utf16_to_ascii8Function · 0.85
get_localized_stringFunction · 0.85
IsStoppedMethod · 0.80
push_backMethod · 0.80
errorMethod · 0.80
InsertMethod · 0.80
SetTextMethod · 0.80

Tested by

no test coverage detected