GLADE_CB void on_mkdir_clicked (GtkToolButton *toolbutton, gpointer user_data) { gchar *ret; GNode *node; VarEntry *ve; if(GFMFile.trees.vars == NULL) return; if(tifiles_calc_is_ti8x(GFMFile.model)) return; ret = msgbox_input(_("New Folder"), _("folder"), _("Name of folder to create:")); if(ret == NULL) return; ret[8] = '\0'; ve = tifiles_ve_create(); strcpy(ve->name, ret); ve->type = tifiles_folder_type(GFMFile.model); node = g_node_new(ve); g_node_append(GFMFile.trees.vars, node); ctree_refresh(); labels_refresh(); }
static int recv_var (CalcHandle* handle, CalcMode mode, FileContent* content, VarRequest* vr) { char *path; uint8_t *data = NULL; VarEntry *ve; char *utf8; int err; const char * dot_if_any = "."; TRYF(nsp_session_open(handle, SID_FILE_MGMT)); // Don't add a dot if this file type is unknown. if (vr->type >= NSP_MAXTYPES) dot_if_any = ""; path = g_strconcat("/", vr->folder, "/", vr->name, dot_if_any, tifiles_vartype2fext(handle->model, vr->type), NULL); utf8 = ticonv_varname_to_utf8(handle->model, path, vr->type); g_snprintf(update_->text, sizeof(update_->text), "%s", utf8); g_free(utf8); update_label(); err = nsp_cmd_s_get_file(handle, path); g_free(path); if (err) { return err; } TRYF(nsp_cmd_r_get_file(handle, &(vr->size))); TRYF(nsp_cmd_s_file_ok(handle)); if (vr->size) TRYF(nsp_cmd_r_file_contents(handle, &(vr->size), &data)); TRYF(nsp_cmd_s_status(handle, ERR_OK)); content->model = handle->model; strcpy(content->comment, tifiles_comment_set_single()); content->num_entries = 1; content->entries = tifiles_ve_create_array(1); ve = content->entries[0] = tifiles_ve_create(); memcpy(ve, vr, sizeof(VarEntry)); ve->data = tifiles_ve_alloc_data(ve->size); if (data && ve->data) { memcpy(ve->data, data, ve->size); } g_free(data); // XXX don't check the result of this call, to enable reception of variables from Nspires running OS >= 1.7. // Those versions send a martian packet: // * a src port never seen before in the conversation; // * an improper dest port; // * a 1-byte payload containing 02 (i.e. an invalid address for the next packet). // * .ack = 0x00 (instead of 0x0A). nsp_session_close(handle); return 0; }
static int recv_var (CalcHandle* handle, CalcMode mode, FileContent* content, VarRequest* vr) { uint16_t aids[] = { AID_ARCHIVED, AID_VAR_VERSION, AID_VAR_SIZE }; const int naids = sizeof(aids) / sizeof(uint16_t); CalcAttr **attrs; const int nattrs = 1; char fldname[40], varname[40]; uint8_t *data; VarEntry *ve; char *utf8; utf8 = ticonv_varname_to_utf8(handle->model, vr->name, vr->type); g_snprintf(update_->text, sizeof(update_->text), "%s", utf8); g_free(utf8); update_label(); attrs = ca_new_array(nattrs); attrs[0] = ca_new(AID_VAR_TYPE2, 4); attrs[0]->data[0] = 0xF0; attrs[0]->data[1] = 0x07; attrs[0]->data[2] = 0x00; attrs[0]->data[3] = vr->type; TRYF(cmd_s_var_request(handle,"",vr->name,naids,aids,nattrs,CA(attrs))); ca_del_array(nattrs, attrs); attrs = ca_new_array(naids); TRYF(cmd_r_var_header(handle, fldname, varname, attrs)); TRYF(cmd_r_var_content(handle, NULL, &data)); content->model = handle->model; strcpy(content->comment, tifiles_comment_set_single()); content->num_entries = 1; content->entries = tifiles_ve_create_array(1); ve = content->entries[0] = tifiles_ve_create(); memcpy(ve, vr, sizeof(VarEntry)); ve->size = GINT32_FROM_BE(*((uint32_t *)(attrs[2]->data))); ve->data = tifiles_ve_alloc_data(ve->size); memcpy(ve->data, data, ve->size); g_free(data); ca_del_array(naids, attrs); return 0; }
static int recv_var (CalcHandle* handle, CalcMode mode, FileContent* content, VarRequest* vr) { uint16_t status; VarEntry *ve; uint32_t unused; char varname[18]; char *utf8; content->model = CALC_TI92; strcpy(content->comment, tifiles_comment_set_single()); content->num_entries = 1; content->entries = tifiles_ve_create_array(1); ve = content->entries[0] = tifiles_ve_create(); memcpy(ve, vr, sizeof(VarEntry)); tifiles_build_fullname(handle->model, varname, vr->folder, vr->name); utf8 = ticonv_varname_to_utf8(handle->model, varname, vr->type); g_snprintf(update_->text, sizeof(update_->text), "%s", utf8); g_free(utf8); update_label(); TRYF(ti92_send_REQ(0, vr->type, varname)); TRYF(ti92_recv_ACK(&status)); if (status != 0) return ERR_MISSING_VAR; TRYF(ti92_recv_VAR(&ve->size, &ve->type, ve->name)); TRYF(ti92_send_ACK()); TRYF(ti92_send_CTS()); TRYF(ti92_recv_ACK(NULL)); ve->data = tifiles_ve_alloc_data(ve->size + 4); TRYF(ti92_recv_XDP(&unused, ve->data)); memmove(ve->data, ve->data + 4, ve->size); TRYF(ti92_send_ACK()); TRYF(ti92_recv_EOT()); TRYF(ti92_send_ACK()); return 0; }
static int recv_var (CalcHandle* handle, CalcMode mode, FileContent* content, VarRequest* vr) { uint16_t unused; VarEntry *ve; char *utf8; uint16_t ve_size; content->model = CALC_TI83; strcpy(content->comment, tifiles_comment_set_single()); content->num_entries = 1; content->entries = tifiles_ve_create_array(1); ve = content->entries[0] = tifiles_ve_create(); memcpy(ve, vr, sizeof(VarEntry)); 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(); // silent request TRYF(ti82_send_REQ(handle, (uint16_t)vr->size, vr->type, vr->name)); TRYF(ti82_recv_ACK(handle, &unused)); TRYF(ti82_recv_VAR(handle, &ve_size, &ve->type, ve->name)); ve->size = ve_size; TRYF(ti82_send_ACK(handle)); TRYF(ti82_send_CTS(handle)); TRYF(ti82_recv_ACK(handle, NULL)); ve->data = tifiles_ve_alloc_data(ve->size); TRYF(ti82_recv_XDP(handle, &ve_size, ve->data)); ve->size = ve_size; TRYF(ti82_send_ACK(handle)); return 0; }
static int get_dirlist (CalcHandle* handle, GNode** vars, GNode** apps) { TreeInfo *ti; GNode *folder; uint16_t unused; uint32_t memory; char *utf8; // get list of folders & FLASH apps (*apps) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = APP_NODE_NAME; (*apps)->data = ti; (*vars) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = VAR_NODE_NAME; (*vars)->data = ti; TRYF(ti82_send_REQ(handle, 0x0000, TI83_DIR, "")); TRYF(ti82_recv_ACK(handle, &unused)); TRYF(ti82_recv_XDP(handle, &unused, (uint8_t *)&memory)); fixup(memory); TRYF(ti82_send_ACK(handle)); ti->mem_free = memory; folder = g_node_new(NULL); g_node_append(*vars, folder); // Add permanent variables (Window, RclWindow, TblSet aka WINDW, ZSTO, TABLE) { GNode *node; VarEntry *ve; ve = tifiles_ve_create(); ve->type = TI83_WINDW; node = g_node_new(ve); g_node_append(folder, node); ve = tifiles_ve_create(); ve->type = TI83_ZSTO; node = g_node_new(ve); g_node_append(folder, node); ve = tifiles_ve_create(); ve->type = TI83_TABLE; node = g_node_new(ve); g_node_append(folder, node); } for (;;) { VarEntry *ve = tifiles_ve_create(); GNode *node; int err; uint16_t ve_size; err = ti82_recv_VAR(handle, &ve_size, &ve->type, ve->name); ve->size = ve_size; TRYF(ti82_send_ACK(handle)); if (err == ERR_EOT) break; else if (err != 0) return err; node = g_node_new(ve); g_node_append(folder, node); utf8 = ticonv_varname_to_utf8(handle->model, ve->name, ve->type); g_snprintf(update_->text, sizeof(update_->text), _("Parsing %s"), utf8); g_free(utf8); update_label(); } return 0; }
static int get_dirlist (CalcHandle* handle, GNode** vars, GNode** apps) { TreeInfo *ti; VarEntry info; uint32_t unused; uint8_t buffer[65536]; int err; char folder_name[9] = ""; GNode *folder = NULL; char *utf8; // get list of folders & FLASH apps (*vars) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = VAR_NODE_NAME; (*vars)->data = ti; (*apps) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = APP_NODE_NAME; (*apps)->data = ti; TRYF(ti92_send_REQ(0, TI92_RDIR, "")); TRYF(ti92_recv_ACK(NULL)); TRYF(ti92_recv_VAR(&info.size, &info.type, info.name)); for (;;) { VarEntry *ve = tifiles_ve_create(); GNode *node; TRYF(ti92_send_ACK()); TRYF(ti92_send_CTS()); TRYF(ti92_recv_ACK(NULL)); TRYF(ti92_recv_XDP(&unused, buffer)); memcpy(ve->name, buffer + 4, 8); // skip 4 extra 00s ve->name[8] = '\0'; ve->type = buffer[12]; ve->attr = buffer[13]; ve->size = buffer[14] | (buffer[15] << 8) | (buffer[16] << 16) | (buffer[17] << 24); strcpy(ve->folder, ""); if (ve->type == TI92_DIR) { strcpy(folder_name, ve->name); node = g_node_new(ve); folder = g_node_append(*vars, node); } else { strcpy(ve->folder, folder_name); if(!strcmp(ve->folder, "main") && (!strcmp(ve->name, "regcoef") || !strcmp(ve->name, "regeq"))) { tifiles_ve_delete(ve); } else { node = g_node_new(ve); g_node_append(folder, node); } } ticalcs_info(_("Name: %8s | Type: %8s | Attr: %i | Size: %08X"), ve->name, tifiles_vartype2string(handle->model, ve->type), ve->attr, ve->size); TRYF(ti92_send_ACK()); err = ti92_recv_CNT(); if (err == ERR_EOT) break; TRYF(err); utf8 = ticonv_varname_to_utf8(handle->model, ve->name, ve->type); g_snprintf(update_->text, sizeof(update_->text), _("Parsing %s/%s"), ((VarEntry *) (folder->data))->name, utf8); g_free(utf8); update_->label(); } TRYF(ti92_send_ACK()); return 0; }
static int get_dirlist (CalcHandle* handle, GNode** vars, GNode** apps) { TreeInfo *ti; GNode *folder; uint16_t unused; uint8_t hl, ll, lh; uint8_t mem[8]; char *utf8; // get list of folders & FLASH apps (*vars) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = VAR_NODE_NAME; (*vars)->data = ti; (*apps) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = APP_NODE_NAME; (*apps)->data = ti; TRYF(ti85_send_REQ(0x0000, TI86_DIR, "")); TRYF(ti85_recv_ACK(&unused)); TRYF(ti85_recv_XDP(&unused, mem)); TRYF(ti85_send_ACK()); hl = mem[0]; ll = mem[1]; lh = mem[2]; ti->mem_free = (hl << 16) | (lh << 8) | ll; folder = g_node_new(NULL); g_node_append(*vars, folder); // Add permanent variables (Func, Pol, Param, DifEq, ZRCL as WIND, WIND, WIND, WIND, WIND) { GNode *node; VarEntry *ve; ve = tifiles_ve_create(); ve->type = TI86_FUNC; node = g_node_new(ve); g_node_append(folder, node); ve = tifiles_ve_create(); ve->type = TI86_POL; node = g_node_new(ve); g_node_append(folder, node); ve = tifiles_ve_create(); ve->type = TI86_PARAM; node = g_node_new(ve); g_node_append(folder, node); ve = tifiles_ve_create(); ve->type = TI86_DIFEQ; node = g_node_new(ve); g_node_append(folder, node); ve = tifiles_ve_create(); ve->type = TI86_ZRCL; node = g_node_new(ve); g_node_append(folder, node); } for (;;) { VarEntry *ve = tifiles_ve_create(); GNode *node; int err; uint16_t ve_size; err = ti85_recv_VAR(&ve_size, &ve->type, ve->name); ve->size = ve_size; TRYF(ti85_send_ACK()); if (err == ERR_EOT) break; else if (err != 0) return err; node = g_node_new(ve); g_node_append(folder, node); utf8 = ticonv_varname_to_utf8(handle->model, ve->name, ve->type); g_snprintf(update_->text, sizeof(update_->text), _("Parsing %s"), utf8); g_free(utf8); update_label(); } return 0; }
/** * ticalcs_dirlist_ve_add: * @tree: source tree. * @entry: entry to add. * * Add an entry into the main tree (if it doesn't exist yet). * * Return value: none. **/ TIEXPORT3 void TICALL ticalcs_dirlist_ve_add(GNode* tree, VarEntry *entry) { TreeInfo *info; int i, j; int found = 0; GNode *parent = NULL; VarEntry *fe = NULL; GNode *child; VarEntry *ve; const char *folder; if (tree == NULL || entry == NULL) { ticalcs_critical("ticalcs_dirlist_ve_add: an argument is NULL"); return; } info = (TreeInfo *)(tree->data); if (info == NULL) { return; } if (strcmp(info->type, VAR_NODE_NAME) && strcmp(info->type, APP_NODE_NAME)) { return; } if (!strcmp(entry->folder, "") && tifiles_has_folder(info->model)) { folder = "main"; } else { folder = entry->folder; } // If TI8x tree is empty, create pseudo-folder (NULL) if (!g_node_n_children(tree) && !tifiles_has_folder(info->model)) { parent = g_node_new(NULL); g_node_append(tree, parent); } // Check for one folder at least... if (g_node_n_children(tree) > 0) { // Parse folders for (found = 0, i = 0; i < (int)g_node_n_children(tree); i++) { parent = g_node_nth_child(tree, i); fe = (VarEntry *) (parent->data); if (fe == NULL) { break; } if (!strcmp(fe->name, folder)) { found = !0; break; } } } // folder doesn't exist? => create! if ((!found && fe) || (!g_node_n_children(tree) && tifiles_has_folder(info->model))) { fe = tifiles_ve_create(); if (fe != NULL) { ticalcs_strlcpy(fe->name, entry->folder, sizeof(fe->name)); fe->type = TI89_DIR; parent = g_node_new(fe); g_node_append(tree, parent); } } if (!strcmp(entry->name, "")) { return; } // next, add variables beneath this folder for (found = 0, j = 0; j < (int)g_node_n_children(parent); j++) { child = g_node_nth_child(parent, j); ve = (VarEntry *) (child->data); if (!strcmp(ve->name, entry->name)) { found = !0; break; } } if (!found) { ve = tifiles_ve_dup(entry); if (ve != NULL) { child = g_node_new(ve); g_node_append(parent, child); } } if (fe && found) { fe->size++; } }
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; }
int main(int argc, char **argv) { void * ptr; tifiles_library_init(); PRINTF(tifiles_error_get, INT, -1, NULL); PRINTF(tifiles_error_free, INT, NULL); PRINTF(tifiles_model_to_string, STR, -1); PRINTF(tifiles_string_to_model, INT, NULL); PRINTF(tifiles_attribute_to_string, STR, -1); PRINTF(tifiles_string_to_attribute, INT, NULL); PRINTF(tifiles_class_to_string, STR, -1); PRINTF(tifiles_string_to_class, INT, NULL); PRINTF(tifiles_fext_of_group, STR, -1); PRINTF(tifiles_fext_of_backup, STR, -1); PRINTF(tifiles_fext_of_flash_app, STR, -1); PRINTF(tifiles_fext_of_flash_os, STR, -1); PRINTF(tifiles_fext_of_certif, STR, -1); PRINTF(tifiles_fext_get, STR, NULL); ptr = tifiles_fext_dup(NULL); PRINTF(, PTR, ptr); tifiles_fext_free(ptr); PRINTFVOID(tifiles_fext_free, NULL); PRINTF(tifiles_file_is_ti, INT, NULL); PRINTF(tifiles_file_is_single, INT, NULL); PRINTF(tifiles_file_is_group, INT, NULL); PRINTF(tifiles_file_is_regular, INT, NULL); PRINTF(tifiles_file_is_backup, INT, NULL); PRINTF(tifiles_file_is_os, INT, NULL); PRINTF(tifiles_file_is_app, INT, NULL); PRINTF(tifiles_file_is_tib, INT, NULL); PRINTF(tifiles_file_is_flash, INT, NULL); PRINTF(tifiles_file_is_tigroup, INT, NULL); PRINTF(tifiles_file_is_tno, INT, NULL); PRINTF(tifiles_file_has_ti_header, INT, NULL); PRINTF(tifiles_file_has_tib_header, INT, NULL); PRINTF(tifiles_file_has_tig_header, INT, NULL); PRINTF(tifiles_file_has_tifl_header, INT, NULL, (void *)0x12345678, (void *)0x12345678); PRINTF(tifiles_file_has_tno_header, INT, NULL); PRINTF(tifiles_model_to_dev_type, INT, -1); PRINTF(tifiles_file_test, INT, NULL, -1, -1); PRINTF(tifiles_file_get_model, INT, NULL); PRINTF(tifiles_file_get_class, INT, NULL); PRINTF(tifiles_file_get_type, STR, NULL); PRINTF(tifiles_file_get_icon, STR, NULL); PRINTF(tifiles_vartype2string, STR, -1, -1); PRINTF(tifiles_string2vartype, INT, -1, NULL); PRINTF(tifiles_vartype2fext, STR, -1, -1); PRINTF(tifiles_fext2vartype, INT, -1, NULL); PRINTF(tifiles_vartype2type, STR, -1, -1); PRINTF(tifiles_vartype2icon, STR, -1, -1); PRINTF(tifiles_calctype2signature, STR, -1); PRINTF(tifiles_signature2calctype, INT, NULL); PRINTF(tifiles_folder_type, INT, -1); PRINTF(tifiles_flash_type, INT, -1); PRINTF(tifiles_idlist_type, INT, -1); PRINTF(tifiles_calc_is_ti8x, INT, -1); PRINTF(tifiles_calc_is_ti9x, INT, -1); PRINTF(tifiles_calc_are_compat, INT, -1, -1); PRINTF(tifiles_has_folder, INT, -1); PRINTF(tifiles_is_flash, INT, -1); PRINTF(tifiles_has_backup, INT, -1); PRINTF(tifiles_checksum, INT, NULL, 1234567891); PRINTF(tifiles_hexdump, INT, NULL, 1); PRINTF(tifiles_get_varname, STR, NULL); PRINTF(tifiles_get_fldname, STR, NULL); PRINTF(tifiles_build_fullname, STR, -1, NULL, NULL, (void *)0x12345678); PRINTF(tifiles_build_fullname, STR, -1, (void *)0x12345678, NULL, NULL); PRINTF(tifiles_build_fullname, STR, -1, NULL, (void *)0x12345678, NULL); PRINTF(tifiles_build_filename, STR, -1, NULL); PRINTFVOID(tifiles_filename_free, NULL); ptr = tifiles_content_create_regular(-1); PRINTF(, PTR, ptr); tifiles_content_delete_regular(ptr); PRINTF(tifiles_content_delete_regular, INT, NULL); PRINTF(tifiles_file_read_regular, INT, NULL, (void *)0x12345678); PRINTF(tifiles_file_read_regular, INT, (void *)0x12345678, NULL); PRINTF(tifiles_file_write_regular, INT, NULL, NULL, (void *)0x12345678); PRINTF(tifiles_file_write_regular, INT, NULL, (void *)0x12345678, NULL); PRINTF(tifiles_file_write_regular, INT, (void *)0x12345678, NULL, NULL); PRINTF(tifiles_file_display_regular, INT, NULL); ptr = tifiles_content_create_backup(-1); PRINTF(, PTR, ptr); tifiles_content_delete_backup(ptr); PRINTF(tifiles_content_delete_backup, INT, NULL); PRINTF(tifiles_file_read_backup, INT, NULL, (void *)0x12345678); PRINTF(tifiles_file_read_backup, INT, (void *)0x12345678, NULL); PRINTF(tifiles_file_write_backup, INT, NULL, (void *)0x12345678); PRINTF(tifiles_file_write_backup, INT, (void *)0x12345678, NULL); PRINTF(tifiles_file_display_backup, INT, NULL); ptr = tifiles_content_create_flash(-1); PRINTF(, PTR, ptr); tifiles_content_delete_flash(ptr); PRINTF(tifiles_file_read_flash, INT, NULL, (void *)0x12345678); PRINTF(tifiles_content_delete_flash, INT, NULL); PRINTF(tifiles_file_read_flash, INT, (void *)0x12345678, NULL); PRINTF(tifiles_file_write_flash, INT, NULL, (void *)0x12345678); PRINTF(tifiles_file_write_flash, INT, (void *)0x12345678, NULL); PRINTF(tifiles_file_write_flash2, INT, NULL, (void *)0x12345678, NULL); PRINTF(tifiles_file_write_flash2, INT, (void *)0x12345678, NULL, NULL); PRINTF(tifiles_file_display_flash, INT, NULL); PRINTF(tifiles_content_dup_regular, PTR, NULL); PRINTF(tifiles_content_dup_flash, PTR, NULL); PRINTF(tifiles_file_display, INT, NULL); ptr = tifiles_content_create_group(0); PRINTF(, PTR, ptr); tifiles_content_delete_group(ptr); PRINTF(tifiles_content_delete_group, INT, NULL); PRINTF(tifiles_group_contents, INT, NULL, (void *)0x12345678); PRINTF(tifiles_group_contents, INT, (void *)0x12345678, NULL); PRINTF(tifiles_ungroup_content, INT, NULL, (void *)0x12345678); PRINTF(tifiles_ungroup_content, INT, (void *)0x12345678, NULL); PRINTF(tifiles_group_files, INT, NULL, (void *)0x12345678); PRINTF(tifiles_group_files, INT, (void *)0x12345678, NULL); PRINTF(tifiles_ungroup_file, INT, NULL, (void *)0x12345678); PRINTF(tifiles_content_add_entry, INT, NULL, (void *)0x12345678); PRINTF(tifiles_content_del_entry, INT, NULL, (void *)0x12345678); PRINTF(tifiles_group_add_file, INT, NULL, (void *)0x12345678); PRINTF(tifiles_group_add_file, INT, (void *)0x12345678, NULL); PRINTF(tifiles_group_del_file, INT, NULL, (void *)0x12345678); PRINTF(tifiles_group_del_file, INT, (void *)0x12345678, NULL); ptr = tifiles_content_create_tigroup(-1, -1); PRINTF(, PTR, ptr); tifiles_content_delete_tigroup(ptr); PRINTF(tifiles_content_delete_tigroup, INT, NULL); PRINTF(tifiles_file_read_tigroup, INT, NULL, (void *)0x12345678); PRINTF(tifiles_file_read_tigroup, INT, (void *)0x12345678, NULL); PRINTF(tifiles_file_write_tigroup, INT, NULL, (void *)0x12345678); PRINTF(tifiles_file_write_tigroup, INT, (void *)0x12345678, NULL); PRINTF(tifiles_file_display_tigroup, INT, NULL); PRINTF(tifiles_tigroup_contents, INT, NULL, (void *)0x12345678, NULL); PRINTF(tifiles_tigroup_contents, INT, (void *)0x12345678, NULL, NULL); PRINTF(tifiles_tigroup_contents, INT, NULL, NULL, NULL); PRINTF(tifiles_untigroup_content, INT, NULL, NULL, NULL); PRINTF(tifiles_untigroup_content, INT, NULL, NULL, NULL); PRINTF(tifiles_untigroup_content, INT, NULL, NULL, NULL); PRINTF(tifiles_tigroup_files, INT, NULL, NULL); PRINTF(tifiles_tigroup_files, INT, NULL, NULL); PRINTF(tifiles_untigroup_file, INT, NULL, NULL); PRINTF(tifiles_untigroup_file, INT, NULL, NULL); PRINTF(tifiles_content_add_te, INT, NULL, NULL); PRINTF(tifiles_content_add_te, INT, NULL, NULL); PRINTF(tifiles_content_del_te, INT, NULL, NULL); PRINTF(tifiles_content_del_te, INT, NULL, NULL); PRINTF(tifiles_tigroup_add_file, INT, NULL, NULL); PRINTF(tifiles_tigroup_add_file, INT, NULL, NULL); PRINTF(tifiles_tigroup_del_file, INT, NULL, NULL); PRINTF(tifiles_tigroup_del_file, INT, NULL, NULL); PRINTF(tifiles_te_create, PTR, NULL, -1, -1); PRINTF(tifiles_te_delete, INT, NULL); ptr = tifiles_te_create_array(0); PRINTF(, PTR, ptr); tifiles_te_delete_array(ptr); ptr = tifiles_te_resize_array(NULL, 0); PRINTF(, PTR, ptr); tifiles_te_delete_array(ptr); PRINTFVOID(tifiles_te_delete_array, NULL); PRINTF(tifiles_te_sizeof_array, INT, NULL); PRINTF(tifiles_comment_set_single, STR); PRINTF(tifiles_comment_set_group, STR); PRINTF(tifiles_comment_set_backup, STR); PRINTF(tifiles_comment_set_tigroup, STR); ptr = tifiles_ve_create(); PRINTF(, PTR, ptr); tifiles_ve_delete(ptr); ptr = tifiles_ve_create_alloc_data(0); PRINTF(, PTR, ptr); tifiles_ve_delete(ptr); ptr = tifiles_ve_create_with_data(0); PRINTF(, PTR, ptr); tifiles_ve_delete(ptr); ptr = tifiles_ve_create_with_data2(0, NULL); PRINTF(, PTR, ptr); tifiles_ve_delete(ptr); PRINTFVOID(tifiles_ve_delete, NULL); ptr = tifiles_ve_alloc_data(0); PRINTF(, PTR, ptr); tifiles_ve_free_data(ptr); ptr = tifiles_ve_realloc_data(NULL, 1); PRINTF(, PTR, ptr); tifiles_ve_free_data(ptr); PRINTFVOID(tifiles_ve_free_data, NULL); PRINTF(tifiles_ve_copy, PTR, NULL, NULL); PRINTF(tifiles_ve_dup, PTR, NULL); ptr = tifiles_ve_create_array(0); PRINTF(, PTR, ptr); tifiles_ve_delete_array(ptr); ptr = tifiles_ve_resize_array(NULL, 0); PRINTF(, PTR, ptr); tifiles_ve_delete_array(ptr); PRINTFVOID(tifiles_ve_delete_array, NULL); ptr = tifiles_fp_create(); PRINTF(, PTR, ptr); tifiles_fp_delete(ptr); ptr = tifiles_fp_create_alloc_data(0); PRINTF(, PTR, ptr); tifiles_fp_delete(ptr); ptr = tifiles_fp_create_with_data(0); PRINTF(, PTR, ptr); tifiles_fp_delete(ptr); ptr = tifiles_fp_create_with_data2(0, NULL); PRINTF(, PTR, ptr); tifiles_fp_delete(ptr); PRINTFVOID(tifiles_fp_delete, NULL); ptr = tifiles_fp_alloc_data(0); PRINTF(, PTR, ptr); tifiles_fp_free_data(ptr); ptr = tifiles_fp_realloc_data(NULL, 1); PRINTF(, PTR, ptr); tifiles_fp_free_data(ptr); PRINTFVOID(tifiles_fp_free_data, NULL); ptr = tifiles_fp_create_array(0); PRINTF(, PTR, ptr); tifiles_fp_delete_array(ptr); ptr = tifiles_fp_resize_array(NULL, 0); PRINTF(, PTR, ptr); tifiles_fp_delete_array(ptr); PRINTFVOID(tifiles_fp_delete_array, NULL); ptr = tifiles_create_table_of_entries(NULL, NULL); PRINTF(, PTR, ptr); tifiles_free_table_of_entries(ptr); PRINTFVOID(tifiles_free_table_of_entries, NULL); cert_functions_unit_test(); tifiles_library_exit(); return 0; }
static int get_dirlist (CalcHandle* handle, GNode** vars, GNode** apps) { TreeInfo *ti; int err; GNode *root, *folder = NULL; char varname[VARNAME_MAX]; uint32_t varsize; uint8_t vartype; int i; (*apps) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = APP_NODE_NAME; (*apps)->data = ti; (*vars) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = VAR_NODE_NAME; (*vars)->data = ti; root = g_node_new(NULL); g_node_append(*apps, root); TRYF(nsp_session_open(handle, SID_FILE_MGMT)); TRYF(nsp_cmd_s_dir_attributes(handle, "/")); TRYF(nsp_cmd_r_dir_attributes(handle, NULL, NULL, NULL)); TRYF(nsp_session_close(handle)); TRYF(nsp_session_open(handle, SID_FILE_MGMT)); TRYF(nsp_cmd_s_dir_enum_init(handle, "/")); TRYF(nsp_cmd_r_dir_enum_init(handle)); for(;;) { VarEntry *fe; GNode *node; TRYF(nsp_cmd_s_dir_enum_next(handle)); err = nsp_cmd_r_dir_enum_next(handle, varname, &varsize, &vartype); if (err == ERR_EOT) break; else if (err != 0) return err; fe = tifiles_ve_create(); strcpy(fe->folder, varname); strcpy(fe->name, varname); fe->size = varsize; fe->type = vartype; fe->attr = ATTRB_NONE; node = g_node_new(fe); folder = g_node_append(*vars, node); ticalcs_info(_("Name: %s | Type: %8s | Attr: %i | Size: %08X"), fe->name, tifiles_vartype2string(handle->model, fe->type), fe->attr, fe->size); } TRYF(nsp_cmd_s_dir_enum_done(handle)); TRYF(nsp_cmd_r_dir_enum_done(handle)); for(i = 0; i < (int)g_node_n_children(*vars); i++) { char *folder_name; char *u1, *u2; folder = g_node_nth_child(*vars, i); folder_name = ((VarEntry *) (folder->data))->name; vartype = ((VarEntry *) (folder->data))->type; // Skip entries whose type is 0 (TNS), for example themes.csv on OS 3.0+. if (vartype == 0) { ticalcs_info(_("Not enumerating documents in %s because it's not a folder"), folder_name); continue; } ticalcs_info(_("Directory listing in <%s>..."), folder_name); TRYF(nsp_cmd_s_dir_enum_init(handle, folder_name)); TRYF(nsp_cmd_r_dir_enum_init(handle)); for(;;) { VarEntry *ve = tifiles_ve_create(); GNode *node; char *ext; TRYF(nsp_cmd_s_dir_enum_next(handle)); err = nsp_cmd_r_dir_enum_next(handle, varname, &varsize, &vartype); if (err == ERR_EOT) break; else if (err != 0) return err; ext = tifiles_fext_get(varname); strcpy(ve->folder, folder_name); ve->size = varsize; ve->type = tifiles_fext2vartype(handle->model, ext); ve->attr = ATTRB_NONE; // Just a sanity check if (ext) { // Did the file name have any non-empty extension ? if (*ext) { // Do we know about this file type ? if (ve->type < NSP_MAXTYPES) { // Then we can remove the exension. *(ext-1) = '\0'; } // else don't remove the extension. } // else there is no extension to remove. } strcpy(ve->name, varname); node = g_node_new(ve); g_node_append(folder, node); ticalcs_info(_("Name: %8s | Type: %8s | Attr: %i | Size: %08X"), ve->name, tifiles_vartype2string(handle->model, ve->type), ve->attr, ve->size); u1 = ticonv_varname_to_utf8(handle->model, ((VarEntry *) (folder->data))->name, -1); u2 = ticonv_varname_to_utf8(handle->model, ve->name, ve->type); g_snprintf(update_->text, sizeof(update_->text), _("Parsing %s/%s"), u1, u2); g_free(u1); g_free(u2); update_label(); } TRYF(nsp_cmd_s_dir_enum_done(handle)); TRYF(nsp_cmd_r_dir_enum_done(handle)); } TRYF(nsp_session_close(handle)); return 0; }
static int recv_var_ns (CalcHandle* handle, CalcMode mode, FileContent* content, VarEntry** vr) { uint32_t unused; int nvar, err; char tipath[18]; char *tiname; char *utf8; content->model = handle->model; // receive packets for(nvar = 1;; nvar++) { VarEntry *ve; content->entries = tifiles_ve_resize_array(content->entries, nvar+1); ve = content->entries[nvar-1] = tifiles_ve_create();; strcpy(ve->folder, "main"); err = ti92_recv_VAR(&ve->size, &ve->type, tipath); TRYF(ti92_send_ACK()); if(err == ERR_EOT) // end of transmission goto exit; else content->num_entries = nvar; // from Christian (TI can send varname or fldname/varname) if ((tiname = strchr(tipath, '\\')) != NULL) { *tiname = '\0'; strcpy(ve->folder, tipath); strcpy(ve->name, tiname + 1); } else { strcpy(ve->folder, "main"); strcpy(ve->name, tipath); } 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(); TRYF(ti92_send_CTS()); TRYF(ti92_recv_ACK(NULL)); ve->data = tifiles_ve_alloc_data(ve->size + 4); TRYF(ti92_recv_XDP(&unused, ve->data)); memmove(ve->data, ve->data + 4, ve->size); TRYF(ti92_send_ACK()); } exit: nvar--; if(nvar > 1) *vr = NULL; else *vr = tifiles_ve_dup(content->entries[0]); return 0; }
// Helper function for get_dirlist, it does the bulk of the work. static int enumerate_folder(CalcHandle* handle, GNode** vars, const char * folder_name) { int ret; ticalcs_info("enumerate_folder<%s>\n", folder_name); do { char varname[VARNAME_MAX]; ret = nsp_cmd_s_dir_enum_init(handle, folder_name); if (ret) { break; } ret = nsp_cmd_r_dir_enum_init(handle); if (ret) { break; } for (;;) { VarEntry *fe; GNode *node; char *ext; uint32_t varsize; uint8_t vartype; ret = nsp_cmd_s_dir_enum_next(handle); if (ret) { break; } ret = nsp_cmd_r_dir_enum_next(handle, varname, &varsize, &vartype); if (ret == ERR_EOT) { ret = 0; break; } else if (ret != 0) { break; } fe = tifiles_ve_create(); ticalcs_strlcpy(fe->folder, folder_name + 1, sizeof(fe->folder)); // Skip leading / fe->size = varsize; fe->type = vartype; fe->attr = ATTRB_NONE; ext = tifiles_fext_get(varname); // Just a sanity check if (ext) { // Did the file name have any non-empty extension ? if (*ext) { // Do we know about this file type ? if (fe->type < NSP_MAXTYPES) { // Then we can remove the exension. *(ext-1) = '\0'; } // else don't remove the extension. } // else there is no extension to remove. } ticalcs_strlcpy(fe->name, varname, sizeof(fe->name)); node = dirlist_create_append_node(fe, vars); if (!node) { ret = ERR_MALLOC; break; } ticalcs_info(_("Name: %s | Type: %8s | Attr: %i | Size: %08X"), fe->name, tifiles_vartype2string(handle->model, fe->type), fe->attr, fe->size); } while (!ret) { int i; ret = nsp_cmd_s_dir_enum_done(handle); if (ret) { break; } ret = nsp_cmd_r_dir_enum_done(handle); if (ret) { break; } // Enumerate elements of root folder. for (i = 0; i < (int)g_node_n_children(*vars); i++) { char new_folder_name[FLDNAME_MAX]; const char * separator_if_any; GNode * folder = g_node_nth_child(*vars, i); uint8_t vartype = ((VarEntry *)(folder->data))->type; // Don't recurse into regular files (type 0, TNS or e.g. themes.csv on OS 3.0+). if (vartype == 0) { ticalcs_info(_("Not enumerating documents in %s because it's not a folder\n"), ((VarEntry *)(folder->data))->name); continue; } // Prevent names from starting with "//". if (strcmp(folder_name, "/")) { separator_if_any = "/"; } else { separator_if_any = ""; } ticalcs_slprintf(new_folder_name, sizeof(new_folder_name), "%s%s%s", folder_name, separator_if_any, ((VarEntry *)(folder->data))->name); ticalcs_info(_("Directory listing in <%s>...\n"), new_folder_name); ret = enumerate_folder(handle, &folder, new_folder_name); if (ret) { break; } } break; } } while (0); return ret; }
static int get_dirlist (CalcHandle* handle, GNode** vars, GNode** apps) { uint16_t aids[] = { AID_VAR_SIZE, AID_VAR_TYPE, AID_ARCHIVED, }; const int size = sizeof(aids) / sizeof(uint16_t); TreeInfo *ti; int err; CalcAttr **attr; GNode *folder, *root; char fldname[40], varname[40]; char *utf8; (*apps) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = APP_NODE_NAME; (*apps)->data = ti; (*vars) = g_node_new(NULL); ti = (TreeInfo *)g_malloc(sizeof(TreeInfo)); ti->model = handle->model; ti->type = VAR_NODE_NAME; (*vars)->data = ti; folder = g_node_new(NULL); g_node_append(*vars, folder); root = g_node_new(NULL); g_node_append(*apps, root); // Add permanent variables (Window, RclWindow, TblSet aka WINDW, ZSTO, TABLE) { GNode *node; VarEntry *ve; ve = tifiles_ve_create(); strcpy(ve->name, "Window"); ve->type = TI84p_WINDW; node = g_node_new(ve); g_node_append(folder, node); ve = tifiles_ve_create(); strcpy(ve->name, "RclWin"); ve->type = TI84p_ZSTO; node = g_node_new(ve); g_node_append(folder, node); ve = tifiles_ve_create(); strcpy(ve->name, "TblSet"); ve->type = TI84p_TABLE; node = g_node_new(ve); g_node_append(folder, node); } TRYF(cmd_s_dirlist_request(handle, size, aids)); do { VarEntry *ve = tifiles_ve_create(); GNode *node; attr = ca_new_array(size); err = cmd_r_var_header(handle, fldname, varname, attr); if (err == ERR_EOT) break; else if (err != 0) return err; strcpy(ve->name, varname); ve->size = GINT32_FROM_BE(*((uint32_t *)(attr[0]->data))); ve->type = GINT32_FROM_BE(*((uint32_t *)(attr[1]->data))) & 0xff; ve->attr = attr[2]->data[0] ? ATTRB_ARCHIVED : ATTRB_NONE; ca_del_array(size, attr); node = g_node_new(ve); if (ve->type != TI73_APPL) g_node_append(folder, node); else g_node_append(root, node); utf8 = ticonv_varname_to_utf8(handle->model, ve->name, ve->type); g_snprintf(update_->text, sizeof(update_->text), _("Parsing %s"), utf8); g_free(utf8); update_label(); } while(1); return 0; }
static int get_dirlist (CalcHandle* handle, GNode** vars, GNode** apps) { int ret; uint16_t unused; TreeInfo *ti; GNode *folder, *node; char *utf8; ret = dirlist_init_trees(handle, vars, apps); if (ret) { return ret; } ti = (*vars)->data; ret = SEND_REQ(handle, 0x0000, (handle->model == CALC_TI83) ? TI83_DIR : TI86_DIR, "\0\0\0\0\0\0\0"); if (!ret) { ret = RECV_ACK(handle, &unused); if (!ret) { ret = RECV_XDP(handle, &unused, handle->buffer2); if (!ret) { ret = SEND_ACK(handle); } } } if (!ret) { VarEntry *ve; uint8_t * mem = (uint8_t *)handle->buffer2; folder = dirlist_create_append_node(NULL, vars); if (handle->model == CALC_TI83) { ti->mem_free = (((uint32_t)(mem[1])) << 8) | mem[0]; // Clamp mem_free to a 16-bit value. // Add permanent variables (Window, RclWindow, TblSet aka WINDW, ZSTO, TABLE) ve = tifiles_ve_create(); ve->type = TI83_WINDW; node = dirlist_create_append_node(ve, &folder); if (node != NULL) { ve = tifiles_ve_create(); ve->type = TI83_ZSTO; node = dirlist_create_append_node(ve, &folder); if (node != NULL) { ve = tifiles_ve_create(); ve->type = TI83_TABLE; node = dirlist_create_append_node(ve, &folder); } } } else { ti->mem_free = (((uint32_t)(mem[0])) << 16) | (((uint32_t)(mem[1])) << 8) | mem[2]; // Add permanent variables (Func, Pol, Param, DifEq, ZRCL as WIND, WIND, WIND, WIND, WIND) ve = tifiles_ve_create(); ve->type = TI86_FUNC; node = dirlist_create_append_node(ve, &folder); if (node != NULL) { ve = tifiles_ve_create(); ve->type = TI86_POL; node = dirlist_create_append_node(ve, &folder); if (node != NULL) { ve = tifiles_ve_create(); ve->type = TI86_PARAM; node = dirlist_create_append_node(ve, &folder); if (node != NULL) { ve = tifiles_ve_create(); ve->type = TI86_DIFEQ; node = dirlist_create_append_node(ve, &folder); if (node != NULL) { ve = tifiles_ve_create(); ve->type = TI86_ZRCL; node = dirlist_create_append_node(ve, &folder); } } } } } if (!node) { ret = ERR_MALLOC; } else { for (;;) { uint16_t ve_size; int ret2; ve = tifiles_ve_create(); ret = RECV_VAR(handle, &ve_size, &ve->type, ve->name); ve->size = ve_size; ret2 = SEND_ACK(handle); if (ret) { if (ret == ERR_EOT) // end of transmission { ret = 0; } error: tifiles_ve_delete(ve); break; } if (ret2) { ret = ret2; goto error; } node = dirlist_create_append_node(ve, &folder); if (!node) { return ERR_MALLOC; } utf8 = ticonv_varname_to_utf8(handle->model, ve->name, ve->type); ticalcs_slprintf(update_->text, sizeof(update_->text), _("Parsing %s"), utf8); ticonv_utf8_free(utf8); update_label(); } } } 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; }
static int recv_var (CalcHandle* handle, CalcMode mode, FileContent* content, VarRequest* vr) { int ret; uint16_t unused; VarEntry *ve; uint16_t ve_size; content->model = handle->model; ticalcs_strlcpy(content->comment, tifiles_comment_set_single(), sizeof(content->comment)); content->num_entries = 1; content->entries = tifiles_ve_create_array(1); ve = content->entries[0] = tifiles_ve_create(); memcpy(ve, vr, sizeof(VarEntry)); ticonv_varname_to_utf8_sn(handle->model, vr->name, update_->text, sizeof(update_->text), vr->type); update_label(); do { // silent request ret = SEND_REQ(handle, (uint16_t)vr->size, vr->type, vr->name); if (!ret) { ret = RECV_ACK(handle, &unused); if (!ret) { ret = RECV_VAR(handle, &ve_size, &ve->type, ve->name); } } if (ret) { break; } ve->size = ve_size; ret = SEND_ACK(handle); if (!ret) { ret = SEND_CTS(handle); if (!ret) { ret = RECV_ACK(handle, NULL); } } if (ret) { break; } 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); } } while(0); return ret; }
static int recv_var (CalcHandle* handle, CalcMode mode, FileContent* content, VarRequest* vr) { char *path; int ret; ret = nsp_session_open(handle, NSP_SID_FILE_MGMT); if (ret) { return ret; } path = build_path(handle->model, vr); ticonv_varname_to_utf8_sn(handle->model, path, update_->text, sizeof(update_->text), vr->type); update_label(); ret = nsp_cmd_s_get_file(handle, path); g_free(path); if (!ret) { ret = nsp_cmd_r_get_file(handle, &(vr->size)); if (!ret) { ret = nsp_cmd_s_file_ok(handle); if (!ret) { uint8_t *data = NULL; if (vr->size) { ret = nsp_cmd_r_file_contents(handle, &(vr->size), &data); } if (!ret) { ret = nsp_cmd_s_status(handle, NSP_ERR_OK); if (!ret) { VarEntry *ve; content->model = handle->model; ticalcs_strlcpy(content->comment, tifiles_comment_set_single(), sizeof(content->comment)); content->num_entries = 1; content->entries = tifiles_ve_create_array(1); ve = content->entries[0] = tifiles_ve_create(); memcpy(ve, vr, sizeof(VarEntry)); ve->data = tifiles_ve_alloc_data(ve->size); if (data && ve->data) { memcpy(ve->data, data, ve->size); } } g_free(data); } } } } // Close session at the end. // XXX don't check the result of this call, to enable reception of variables from Nspires running OS >= 1.7. // Those versions send a martian packet: // * a src port never seen before in the conversation; // * an improper dest port; // * a 1-byte payload containing 02 (i.e. an invalid address for the next packet). // * .ack = 0x00 (instead of 0x0A). nsp_session_close(handle); return ret; }
static int get_dirlist (CalcHandle* handle, GNode** vars, GNode** apps) { int ret; TreeInfo *ti; GNode *folder, *root, *node; uint16_t unused; uint32_t memory; char *utf8; ret = dirlist_init_trees(handle, vars, apps); if (ret) { return ret; } ti = (*vars)->data; ret = SEND_REQ(handle, 0x0000, TI73_DIR, "\0\0\0\0\0\0\0", 0x00, 0x00); if (!ret) { ret = RECV_ACK(handle, &unused); if (!ret) { ret = RECV_XDP(handle, &unused, handle->buffer2); if (!ret) { ret = SEND_ACK(handle); if (!ret) { uint8_t * mem = (uint8_t *)handle->buffer2; memory = (((uint32_t)(mem[1])) << 8) | mem[0]; // Clamp mem_free to a 16-bit value. } } } } if (ret) { return ret; } ti->mem_free = memory; folder = dirlist_create_append_node(NULL, vars); if (!folder) { return ERR_MALLOC; } root = dirlist_create_append_node(NULL, apps); if (!root) { return ERR_MALLOC; } // Add permanent variables (Window, RclWindow, TblSet aka WINDW, ZSTO, TABLE) { VarEntry *ve; ve = tifiles_ve_create(); ve->type = TI84p_WINDW; node = dirlist_create_append_node(ve, &folder); if (node != NULL) { if (handle->model != CALC_TI73) { ve = tifiles_ve_create(); ve->type = TI84p_ZSTO; node = dirlist_create_append_node(ve, &folder); } if (node != NULL) { ve = tifiles_ve_create(); ve->type = TI84p_TABLE; node = dirlist_create_append_node(ve, &folder); } } } if (!node) { return ERR_MALLOC; } for (;;) { VarEntry *ve = tifiles_ve_create(); uint16_t ve_size; int ret2; ret = RECV_VAR(handle, &ve_size, &ve->type, ve->name, &ve->attr, &ve->version); ve->size = ve_size; ret2 = SEND_ACK(handle); if (ret) { if (ret == ERR_EOT) { ret = 0; } error: tifiles_ve_delete(ve); break; } if (ret2) { ret = ret2; goto error; } if (ve->type == TI73_APPL) { /* Size is reported as a number of pages -- compute amount of space consumed (the actual application may be somewhat smaller.) Note: the MSB of the "size" word is the application's starting page number. */ ve->size = (ve->size & 0xff) * 0x4000; } node = dirlist_create_append_node(ve, (ve->type != TI73_APPL) ? &folder : &root); if (!node) { return ERR_MALLOC; } utf8 = ticonv_varname_to_utf8(handle->model, ve->name, ve->type); ticalcs_slprintf(handle->updat->text, sizeof(handle->updat->text), _("Parsing %s"), utf8); ticonv_utf8_free(utf8); ticalcs_update_label(handle); } return ret; }