| 217 | } |
| 218 | |
| 219 | error_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 | } |
nothing calls this directly
no test coverage detected