最近有人发现,将 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 文件夹,然后运行一下这个程序,效果相当不错!
重启一下,字典就可以用了。