cleanup argument parsing when used as a library + ensure os_lib_end gets called
This commit is contained in:
137
src/main.c
137
src/main.c
@@ -680,8 +680,21 @@ void app_exit() {
|
|||||||
END_TRY_L(exit);
|
END_TRY_L(exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void coin_main_with_config(chain_config_t *config) {
|
void init_coin_config(chain_config_t *coin_config) {
|
||||||
chainConfig = config;
|
memset(coin_config, 0, sizeof(chain_config_t));
|
||||||
|
strcpy(coin_config->coinName, CHAINID_COINNAME " ");
|
||||||
|
coin_config->chainId = CHAIN_ID;
|
||||||
|
coin_config->kind = CHAIN_KIND;
|
||||||
|
}
|
||||||
|
|
||||||
|
void coin_main(chain_config_t *coin_config) {
|
||||||
|
chain_config_t config;
|
||||||
|
if (coin_config == NULL) {
|
||||||
|
init_coin_config(&config);
|
||||||
|
chainConfig = &config;
|
||||||
|
} else {
|
||||||
|
chainConfig = coin_config;
|
||||||
|
}
|
||||||
reset_app_context();
|
reset_app_context();
|
||||||
tmpCtx.transactionContext.currentTokenIndex = 0;
|
tmpCtx.transactionContext.currentTokenIndex = 0;
|
||||||
|
|
||||||
@@ -734,53 +747,67 @@ void coin_main_with_config(chain_config_t *config) {
|
|||||||
app_exit();
|
app_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_coin_config(chain_config_t *coin_config) {
|
struct libargs_s {
|
||||||
memset(coin_config, 0, sizeof(chain_config_t));
|
unsigned int id;
|
||||||
strcpy(coin_config->coinName, CHAINID_COINNAME " ");
|
unsigned int command;
|
||||||
coin_config->chainId = CHAIN_ID;
|
chain_config_t *chain_config;
|
||||||
coin_config->kind = CHAIN_KIND;
|
union {
|
||||||
}
|
check_address_parameters_t *check_address;
|
||||||
|
create_transaction_parameters_t *create_transaction;
|
||||||
|
get_printable_amount_parameters_t *get_printable_amount;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
void coin_main() {
|
static void library_main_helper(struct libargs_s *args) {
|
||||||
chain_config_t coin_config;
|
check_api_level(CX_COMPAT_APILEVEL);
|
||||||
init_coin_config(&coin_config);
|
PRINTF("Inside a library \n");
|
||||||
coin_main_with_config(&coin_config);
|
switch (args->command) {
|
||||||
}
|
case CHECK_ADDRESS:
|
||||||
|
// ensure result is zero if an exception is thrown
|
||||||
void library_main_with_config(chain_config_t *config,
|
args->check_address->result = 0;
|
||||||
unsigned int command,
|
args->check_address->result =
|
||||||
unsigned int *call_parameters) {
|
handle_check_address(args->check_address, args->chain_config);
|
||||||
BEGIN_TRY {
|
break;
|
||||||
TRY {
|
case SIGN_TRANSACTION:
|
||||||
check_api_level(CX_COMPAT_APILEVEL);
|
if (copy_transaction_parameters(args->create_transaction, args->chain_config)) {
|
||||||
PRINTF("Inside a library \n");
|
// never returns
|
||||||
switch (command) {
|
handle_swap_sign_transaction(args->chain_config);
|
||||||
case CHECK_ADDRESS:
|
|
||||||
handle_check_address((check_address_parameters_t *) call_parameters, config);
|
|
||||||
break;
|
|
||||||
case SIGN_TRANSACTION:
|
|
||||||
handle_swap_sign_transaction(
|
|
||||||
(create_transaction_parameters_t *) call_parameters,
|
|
||||||
config);
|
|
||||||
break;
|
|
||||||
case GET_PRINTABLE_AMOUNT:
|
|
||||||
handle_get_printable_amount(
|
|
||||||
(get_printable_amount_parameters_t *) call_parameters,
|
|
||||||
config);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
os_lib_end();
|
break;
|
||||||
}
|
case GET_PRINTABLE_AMOUNT:
|
||||||
FINALLY {
|
// ensure result is zero if an exception is thrown
|
||||||
}
|
args->get_printable_amount->result = 0;
|
||||||
|
args->get_printable_amount->result =
|
||||||
|
handle_get_printable_amount(args->get_printable_amount, args->chain_config);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
END_TRY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void library_main(unsigned int call_id, unsigned int *call_parameters) {
|
void library_main(struct libargs_s *args) {
|
||||||
chain_config_t coin_config;
|
chain_config_t coin_config;
|
||||||
init_coin_config(&coin_config);
|
if (args->chain_config == NULL) {
|
||||||
library_main_with_config(&coin_config, call_id, call_parameters);
|
init_coin_config(&coin_config);
|
||||||
|
args->chain_config = &coin_config;
|
||||||
|
}
|
||||||
|
bool end = false;
|
||||||
|
/* This loop ensures that library_main_helper and os_lib_end are called
|
||||||
|
* within a try context, even if an exception is thrown */
|
||||||
|
while (1) {
|
||||||
|
BEGIN_TRY {
|
||||||
|
TRY {
|
||||||
|
if (!end) {
|
||||||
|
library_main_helper(args);
|
||||||
|
}
|
||||||
|
os_lib_end();
|
||||||
|
}
|
||||||
|
FINALLY {
|
||||||
|
end = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
END_TRY;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((section(".boot"))) int main(int arg0) {
|
__attribute__((section(".boot"))) int main(int arg0) {
|
||||||
@@ -825,34 +852,26 @@ __attribute__((section(".boot"))) int main(int arg0) {
|
|||||||
|
|
||||||
if (!arg0) {
|
if (!arg0) {
|
||||||
// called from dashboard as standalone eth app
|
// called from dashboard as standalone eth app
|
||||||
coin_main();
|
coin_main(NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((unsigned int *) arg0)[0] != 0x100) {
|
struct libargs_s *args = (struct libargs_s *) arg0;
|
||||||
|
if (args->id != 0x100) {
|
||||||
app_exit();
|
app_exit();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
unsigned int command = ((unsigned int *) arg0)[1];
|
switch (args->command) {
|
||||||
chain_config_t *chain_config = ((unsigned int *) arg0)[2];
|
|
||||||
switch (command) {
|
|
||||||
case RUN_APPLICATION:
|
case RUN_APPLICATION:
|
||||||
// coin application launched from dashboard
|
// coin application launched from dashboard
|
||||||
if (chain_config == NULL)
|
if (args->chain_config == NULL)
|
||||||
app_exit();
|
app_exit();
|
||||||
else
|
else
|
||||||
coin_main_with_config(chain_config);
|
coin_main(args->chain_config);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (chain_config == NULL)
|
// called as bitcoin or altcoin library
|
||||||
// Called as standalone eth library
|
library_main(args);
|
||||||
library_main(command, ((unsigned int *) arg0)[3]); // called as bitcoin library
|
|
||||||
else
|
|
||||||
// Called as a library from an altcoin
|
|
||||||
library_main_with_config(chain_config,
|
|
||||||
command,
|
|
||||||
((unsigned int *) arg0)[3]); // called as coin library
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ typedef struct get_printable_amount_parameters_s {
|
|||||||
bool is_fee;
|
bool is_fee;
|
||||||
// OUT
|
// OUT
|
||||||
char printable_amount[30];
|
char printable_amount[30];
|
||||||
|
int result;
|
||||||
} get_printable_amount_parameters_t;
|
} get_printable_amount_parameters_t;
|
||||||
|
|
||||||
typedef struct create_transaction_parameters_s {
|
typedef struct create_transaction_parameters_s {
|
||||||
|
|||||||
Reference in New Issue
Block a user