static int recv_var_ns (CalcHandle* handle, CalcMode mode, FileContent* content, VarEntry** vr) { int nvar = 0; int err = 0; char *utf8; uint16_t ve_size; g_snprintf(update_->text, sizeof(update_->text), _("Waiting for var(s)...")); update_label(); content->model = CALC_TI82; for (nvar = 0;; nvar++) { VarEntry *ve; content->entries = tifiles_ve_resize_array(content->entries, nvar+1); ve = content->entries[nvar] = tifiles_ve_create(); do { update_refresh(); if (update_->cancel) return ERR_ABORT; err = ti82_recv_VAR(&ve_size, &(ve->type), ve->name); ve->size = ve_size; } while (err == ERROR_READ_TIMEOUT); TRYF(ti82_send_ACK()); if (err == ERR_EOT) goto exit; TRYF(err); TRYF(ti82_send_CTS()); TRYF(ti82_recv_ACK(NULL)); utf8 = ticonv_varname_to_utf8(handle->model, ve->name, ve->type); g_snprintf(update_->text, sizeof(update_->text), "%s", utf8); g_free(utf8); update_label(); ve->data = tifiles_ve_alloc_data(ve->size); TRYF(ti82_recv_XDP(&ve_size, ve->data)); ve->size = ve_size; TRYF(ti82_send_ACK()); } exit: content->num_entries = nvar; if(nvar == 1) { strcpy(content->comment, tifiles_comment_set_single()); *vr = tifiles_ve_dup(content->entries[0]); } else { strcpy(content->comment, tifiles_comment_set_group()); *vr = NULL; } return 0; }
static int send_var_ns (CalcHandle* handle, CalcMode mode, FileContent* content) { int i; int err; uint8_t rej_code; uint16_t status; char *utf8; update_->cnt2 = 0; update_->max2 = content->num_entries; for (i = 0; i < content->num_entries; i++) { VarEntry *entry = content->entries[i]; TRYF(ti82_send_VAR((uint16_t)entry->size, entry->type, entry->name)); TRYF(ti82_recv_ACK(&status)); g_snprintf(update_->text, sizeof(update_->text), _("Waiting for user's action...")); update_label(); do { // wait user's action update_refresh(); if (update_->cancel) return ERR_ABORT; err = ti82_recv_SKP(&rej_code); } while (err == ERROR_READ_TIMEOUT); TRYF(ti82_send_ACK()); switch (rej_code) { case REJ_EXIT: return ERR_ABORT; case REJ_SKIP: continue; case REJ_MEMORY: return ERR_OUT_OF_MEMORY; default: // RTS break; } utf8 = ticonv_varname_to_utf8(handle->model, entry->name, entry->type); g_snprintf(update_->text, sizeof(update_->text), "%s", utf8); g_free(utf8); update_label(); TRYF(ti82_send_XDP(entry->size, entry->data)); TRYF(ti82_recv_ACK(&status)); update_->cnt2 = i+1; update_->max2 = content->num_entries; update_->pbar(); } if ((mode & MODE_SEND_ONE_VAR) || (mode & MODE_SEND_LAST_VAR)) { TRYF(ti82_send_EOT()); TRYF(ti82_recv_ACK(NULL)); } return 0; }
static int send_backup (CalcHandle* handle, BackupContent* content) { int err = 0; uint16_t length; char varname[9]; uint8_t rej_code; uint16_t status; g_snprintf(update_->text, sizeof(update_->text), _("Waiting for user's action...")); update_label(); length = content->data_length1; varname[0] = LSB(content->data_length2); varname[1] = MSB(content->data_length2); varname[2] = LSB(content->data_length3); varname[3] = MSB(content->data_length3); varname[4] = LSB(content->mem_address); varname[5] = MSB(content->mem_address); TRYF(ti82_send_VAR(content->data_length1, TI82_BKUP, varname)); TRYF(ti82_recv_ACK(&status)); do { // wait user's action update_refresh(); if (update_->cancel) return ERR_ABORT; err = ti82_recv_SKP(&rej_code); } while (err == ERROR_READ_TIMEOUT); TRYF(ti82_send_ACK()); switch (rej_code) { case REJ_EXIT: case REJ_SKIP: return ERR_ABORT; case REJ_MEMORY: return ERR_OUT_OF_MEMORY; default: // RTS break; } strcpy(update_->text, ""); update_label(); update_->cnt2 = 0; update_->max2 = 3; update_->pbar(); TRYF(ti82_send_XDP(content->data_length1, content->data_part1)); TRYF(ti82_recv_ACK(&status)); update_->cnt2++; update_->pbar(); TRYF(ti82_send_XDP(content->data_length2, content->data_part2)); TRYF(ti82_recv_ACK(&status)); update_->cnt2++; update_->pbar(); TRYF(ti82_send_XDP(content->data_length3, content->data_part3)); TRYF(ti82_recv_ACK(&status)); update_->cnt2++; update_->pbar(); //TRYF(ti82_send_EOT()); return 0; }
static int send_var_ns (CalcHandle* handle, CalcMode mode, FileContent* content) { unsigned int i; int ret = 0; uint8_t rej_code; uint16_t status; if ((mode & MODE_SEND_EXEC_ASM) && content->num_entries != 1) { ticalcs_critical("no variable to execute"); return -1; } update_->cnt2 = 0; update_->max2 = content->num_entries; for (i = 0; i < content->num_entries; i++) { VarEntry *entry = content->entries[i]; uint16_t size; if (!ticalcs_validate_varentry(entry)) { ticalcs_critical("%s: skipping invalid content entry #%u", __FUNCTION__, i); continue; } if (entry->action == ACT_SKIP) { ticalcs_info("%s: skipping variable #%u because requested", __FUNCTION__, i); continue; } if (entry->size >= 65536U) { ticalcs_critical("%s: oversized variable has size %u, clamping to 65535", __FUNCTION__, entry->size); size = 65535; } else { size = (uint16_t)entry->size; } ret = SEND_VAR(handle, size, entry->type, entry->name); if (!ret) { ret = RECV_ACK(handle, &status); } if (ret) { break; } ticalcs_strlcpy(update_->text, _("Waiting for user's action..."), sizeof(update_->text)); update_label(); do { // wait for user's action update_refresh(); if (update_->cancel) { ret = ERR_ABORT; break; } ret = RECV_SKP(handle, &rej_code); } while (ret == ERROR_READ_TIMEOUT); if (!ret) { ret = SEND_ACK(handle); } if (ret) { break; } switch (rej_code) { case DBUS_REJ_EXIT: ret = ERR_ABORT; break; case DBUS_REJ_SKIP: if (mode & MODE_SEND_EXEC_ASM) { ret = ERR_ABORT; break; } continue; case DBUS_REJ_MEMORY: ret = ERR_OUT_OF_MEMORY; // Fall through. case 0: // CTS break; default: ret = ERR_VAR_REJECTED; break; } if (ret) { break; } ticonv_varname_to_utf8_sn(handle->model, entry->name, update_->text, sizeof(update_->text), entry->type); update_label(); ret = SEND_XDP(handle, size, entry->data); if (!ret) { ret = RECV_ACK(handle, &status); } if (ret) { break; } ticalcs_info("Sent variable #%u", i); update_->cnt2 = i+1; update_->max2 = content->num_entries; update_->pbar(); } if (mode & MODE_SEND_EXEC_ASM) { ret = ti82_send_asm_exec(handle, content->entries[0]); if (!ret) { ret = RECV_ERR(handle, &status); if (!ret) { ret = SEND_ACK(handle); } } } else if ((mode & MODE_SEND_ONE_VAR) || (mode & MODE_SEND_LAST_VAR)) { ret = SEND_EOT(handle); if (!ret) { ret = RECV_ACK(handle, NULL); } } return ret; }
static int send_backup (CalcHandle* handle, BackupContent* content) { int ret; uint16_t length; char varname[9]; uint8_t rej_code; uint16_t status; length = content->data_length1; varname[0] = LSB(content->data_length2); varname[1] = MSB(content->data_length2); varname[2] = LSB(content->data_length3); varname[3] = MSB(content->data_length3); varname[4] = LSB((handle->model != CALC_TI86) ? content->mem_address : content->data_length4); varname[5] = MSB((handle->model != CALC_TI86) ? content->mem_address : content->data_length4); varname[6] = 0; varname[7] = 0; varname[8] = 0; do { if (handle->model == CALC_TI83) { ret = SEND_RTS(handle, content->data_length1, TI83_BKUP, varname); } else { ret = SEND_VAR(handle, content->data_length1, (handle->model == CALC_TI82) ? TI82_BKUP : ((handle->model == CALC_TI85) ? TI85_BKUP : TI86_BKUP), varname); } if (!ret) { ret = RECV_ACK(handle, &status); } if (ret) { break; } if (handle->model == CALC_TI83) { ret = RECV_SKP(handle, &rej_code); } else { ticalcs_strlcpy(update_->text, _("Waiting for user's action..."), sizeof(update_->text)); update_label(); do { // wait for user's action update_refresh(); if (update_->cancel) { ret = ERR_ABORT; break; } ret = RECV_SKP(handle, &rej_code); } while (ret == ERROR_READ_TIMEOUT); } if (!ret) { ret = SEND_ACK(handle); } if (ret) { break; } switch (rej_code) { case DBUS_REJ_EXIT: case DBUS_REJ_SKIP: ret = ERR_ABORT; break; case DBUS_REJ_MEMORY: ret = ERR_OUT_OF_MEMORY; // Fall through. case 0: // CTS break; default: ret = ERR_VAR_REJECTED; break; } if (ret) { break; } update_->text[0] = 0; update_label(); update_->cnt2 = 0; update_->max2 = (handle->model != CALC_TI86) ? 3 : 4; update_->pbar(); ret = SEND_XDP(handle, content->data_length1, content->data_part1); if (!ret) { ret = RECV_ACK(handle, &status); } if (ret) { break; } update_->cnt2++; update_->pbar(); ret = SEND_XDP(handle, content->data_length2, content->data_part2); if (!ret) { ret = RECV_ACK(handle, &status); } if (ret) { break; } update_->cnt2++; update_->pbar(); if (content->data_length3) { ret = SEND_XDP(handle, content->data_length3, content->data_part3); if (!ret) { ret = RECV_ACK(handle, &status); } if (ret) { break; } } update_->cnt2++; update_->pbar(); if (handle->model == CALC_TI86) { ret = SEND_XDP(handle, content->data_length4, content->data_part4); if (!ret) { ret = RECV_ACK(handle, &status); } if (ret) { break; } update_->cnt2++; update_->pbar(); } if (handle->model == CALC_TI83) { ret = SEND_ACK(handle); } else if (handle->model == CALC_TI85) { ret = SEND_EOT(handle); } } while(0); return ret; }
static int recv_var_ns (CalcHandle* handle, CalcMode mode, FileContent* content, VarEntry** vr) { int nvar = 0; int ret = 0; uint16_t ve_size; ticalcs_strlcpy(update_->text, _("Waiting for var(s)..."), sizeof(update_->text)); update_label(); content->model = handle->model; content->num_entries = 0; for (nvar = 0;; nvar++) { VarEntry *ve = tifiles_ve_create(); int ret2; do { update_refresh(); if (update_->cancel) { ret = ERR_ABORT; goto error; } ret = RECV_VAR(handle, &ve_size, &(ve->type), ve->name); ve->size = ve_size; } while (ret == ERROR_READ_TIMEOUT); ret2 = SEND_ACK(handle); if (ret) { if (ret == ERR_EOT) // end of transmission { ret = 0; } goto error; } if (ret2) { ret = ret2; goto error; } ret = SEND_CTS(handle); if (!ret) { ret = RECV_ACK(handle, NULL); if (!ret) { ticonv_varname_to_utf8_sn(handle->model, ve->name, update_->text, sizeof(update_->text), ve->type); update_label(); ve->data = tifiles_ve_alloc_data(ve->size); ret = RECV_XDP(handle, &ve_size, ve->data); if (!ret) { ve->size = ve_size; ret = SEND_ACK(handle); } } } if (!ret) { tifiles_content_add_entry(content, ve); } else { error: tifiles_ve_delete(ve); break; } } if (nvar == 1) { ticalcs_strlcpy(content->comment, tifiles_comment_set_single(), sizeof(content->comment)); *vr = tifiles_ve_dup(content->entries[0]); } else { ticalcs_strlcpy(content->comment, tifiles_comment_set_group(), sizeof(content->comment)); *vr = NULL; } return ret; }