在 TI-Nspire CX-C CAS 上直接安装字典方法的研究

Nspire

最近有人发现,将 TI-Nspire CX CAS 升级到 OS 4.0.3.29 之后出现了无法安装字典的问题,我在 firebird 上使用字典安装程序,然后发现这实际上是防降级机制的问题。
因为 OS 4.0 实际上有两个版本,官网上直接下载到的是 OS 4.0.3.29 ,而教师软件里自带的是 OS 4.0.0.235 。而教师软件自带了一个版本号是 4.0.0.500 的 ZiDian.tcc ,因此在 4.0.3.29 上直接安装这个 ZiDian.tcc 会触发防降级机制,并不会被安装。
我在 firebird 里安装了一个 OS 4.0.0.235 ,然后在里面安装了字典,然后我发现安装过程中会有这样的输出。

TI_OS_INSTALL_VERIFYING_IMAGE incremental update (91)
TI_OS_INSTALL_VERIFYING_IMAGE incremental update (93)
TI_OS_INSTALL_VERIFYING_RESOURCE (95)
TI_OS_INSTALL_VERIFICATION_COMPLETE (99)
OS_EXT: Start Install (4.0.0.500)...
TI_OS_deleteTree(): path /extension/dict_zh_CN 
TI_OS_deleteTree(): Failed to chdir : 2
Unpacking data...
Creating directory extension 
Creating directory extension/dict_zh_CN 
Inflating file extension/dict_zh_CN/cidian.db 
TI_OS_INSTALL_INSTALLING_RESOURCES incremental update (64)
Inflating file extension/dict_zh_CN/cidian.tre 
TI_OS_INSTALL_INSTALLING_RESOURCES incremental update (71)
Extracting file extension/dict_zh_CN/manifest.cer 
Extracting file extension/dict_zh_CN/manifest.sig 
Inflating file extension/dict_zh_CN/manifest.txt 
Inflating file extension/dict_zh_CN/yinghan.db 
TI_OS_INSTALL_INSTALLING_RESOURCES incremental update (89)
Inflating file extension/dict_zh_CN/yinghan.tre 
TI_OS_INSTALL_INSTALLING_IMAGE incremental update (93)
Finished unpacking.
OS_EXT: Install Complete(0x0000).

原来字典安装字典的主要过程就是解压+复制+验证的过程,如果把 ZiDian.tcc 以 zip 解压,我们会得到一个 os_ext.img 再解压它,得到的恰好就是这些文件,那就简单了。把这些文件直接复制到对应文件夹里试试。
于是我写了个简单的 Ndless 程序(好吧其实是拿以前写的复制文件代码随便改改出来的),来完成这个复制操作

#include <libndls.h>

extern "C" {
    #include <nspireio/nspireio.h>
}

int copy(const char *path, void *context); 
void getFilename(char *filename, const char *path);
void getFilenameWithPath(char *filename_with_path, char *filename);

int main(void) {
    assert_ndless_rev(801);
    nio_console csl;
    nio_init(&csl, NIO_MAX_COLS, NIO_MAX_ROWS, 0, 0, BLACK, WHITE, TRUE);
    nio_set_default(&csl);
    //新建文件夹
    mkdir("/extension", 0777);
    mkdir("/extension/dict_zh_CN", 0777);
    //复制 dict 目录下所有文件到 /extension/dict_zh_CN/
    int (*callback)(const char *path, void *context); 
    callback=copy;
    file_each("/documents/dict", callback, NULL);

    nio_printf("Done, press any key to exit.");
    wait_key_pressed();
    nio_free(&csl);
    return 0;
}

int copy(const char *path, void *context) {
    nio_printf("%s -> ", path);
    //取得完整路径
    char *filename = new char[30];
    char *filename_with_path = new char[70];
    getFilename(filename, path);
    getFilenameWithPath(filename_with_path, filename);
    delete filename;
    //打开对应文件
    FILE *src, *dst;
    if((src = fopen(path, "rt")) == NULL || (dst = fopen(filename_with_path, "wt")) == NULL) {
        nio_printf("Failed to open file\n");
        wait_key_pressed();
        return 0;
    }
    //复制文件
    int ch;
    while ((ch = fgetc(src)) != EOF) {
        fputc(ch, dst);
    }

    nio_printf("%s\n", filename_with_path);
    delete filename_with_path;
    fclose(src);
    fclose(dst);
    return 0;
}
//取得文件名,顺便去掉文件名后面的 .tns
void getFilename(char *filename, const char *path) {
    while (*path) path++;
    while (*path != '/') path--;
    path++;
    while ((*filename++ = *path++));
    filename -= 5;
    *filename = '\0';
}
//取得目标路径完整路径名
void getFilenameWithPath(char *filename_with_path, char *filename) {
    strcpy(filename_with_path, "/extension/dict_zh_CN/");
    strcat(filename_with_path, filename);
}

考虑到 Nspire 只能传输 .tns 文件。所以必须在传入之前加上这个后缀,复制的时候再把它处理掉。
把从 ZiDian.tcc 中得到的所有文件加个 .tns 后缀,放到 我的文档 下面的 dict 文件夹,然后运行一下这个程序,效果相当不错!

重启一下,字典就可以用了。

Post Directory

文章目录