Files
ultrasm64-2/lib/libpl2/libpl2-rhdc.c
a f183158d03 git subrepo clone https://gitlab.com/parallel-launcher/libpl2 lib/libpl2
subrepo:
  subdir:   "lib/libpl2"
  merged:   "58e4fa38"
upstream:
  origin:   "https://gitlab.com/parallel-launcher/libpl2"
  branch:   "master"
  commit:   "58e4fa38"
git-subrepo:
  version:  "0.4.9"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "4f60dd7"
2025-06-27 11:57:17 -04:00

71 lines
2.5 KiB
C

#include "libpl2-rhdc.h"
#include "libpl2-internal.h"
unsigned short lpl2_get_my_rhdc_username( char *username, lpl2_err *err ) {
LPL2_VERIFY_INITIALIZED( err, 0 )
LPL2_VERIFY_ABI( 3, err, 0 )
LPL2_VERIFY_NOTNULL( username, err, 0 )
volatile const __lpl2_response *response = __lpl2_query_basic( 0x0200 );
if( response->status == 0 && response->payloadSize <= 30 ) {
if( err ) *err = LPL2_ERR_OKAY;
const unsigned short len = __lpl2_strcpy( username, response->payload, 30 );
username[len] = '\0';
return len;
} else if( err ) {
switch( response->status ) {
case 1: *err = LPL2_ERR_RHDC_INTEGRATION_NOT_ENABLED; break;
case 0x300: case 0x400: *err = LPL2_ERR_BROKEN_PIPE; break;
default: *err = LPL2_UNEXPECTED_ERROR( response->status ); break;
}
}
return 0;
}
lpl2_bool lpl2_get_rhdc_avatar_async( const char *username, lpl2_avatar_options options, void *avatar, lpl2_err *err ) {
LPL2_VERIFY_INITIALIZED( err, FALSE )
LPL2_VERIFY_ABI( 7, err, FALSE )
LPL2_VERIFY_NOTNULL( username, err, FALSE )
LPL2_VERIFY_NOTNULL( avatar, err, FALSE )
if( ((unsigned int)avatar & 7) != 0 ) {
if( err ) *err = LPL2_ERR_MISALIGNED_POINTER_ARG;
return FALSE;
}
avatar = __builtin_assume_aligned( avatar, 8 );
volatile char *requestPayload = __lpl2_payload_start();
*((volatile unsigned int*)requestPayload) = (unsigned int)options;
const unsigned short usernameLen = __lpl2_strcpy( &requestPayload[4], username, 31 );
if( usernameLen == 0 || usernameLen > 30 ) {
if( err ) *err = LPL2_ERR_INVALID_ARGUMENTS;
return FALSE;
}
volatile const __lpl2_response *response = __lpl2_payload_send( 0x0203, usernameLen + 4 );
volatile const int *tempAvatar = (volatile const int*)__builtin_assume_aligned( (const void*)response->payload, 4 );
if( response->status == 0 ) {
if( err ) *err = LPL2_ERR_OKAY;
for( unsigned short i = 0; i < (response->payloadSize >> 2); i++ ) {
((unsigned int*)avatar)[i] = tempAvatar[i];
}
return TRUE;
} else if( err ) {
switch( response->status ) {
case 0x500: *err = LPL2_ERR_WAIT; break;
case 1: *err = LPL2_ERR_RHDC_AVATAR_NOT_FOUND; break;
case 2: *err = LPL2_ERR_RHDC_NETWORK_ERROR; break;
case 3: *err = LPL2_ERR_RHDC_AVATAR_INVALID; break;
case 4: *err = LPL2_ERR_RHDC_RATE_LIMIT; break;
case 0x200: case 0x201: case 0x600: *err = LPL2_ERR_INVALID_ARGUMENTS; break;
case 0x300: case 0x400: *err = LPL2_ERR_BROKEN_PIPE; break;
default: *err = LPL2_UNEXPECTED_ERROR( response->status ); break;
}
}
return FALSE;
}