让minimo支持下载功能

让minimo支持下载功能

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>

minimo本身并不支持下载功能,前几天有位朋友问到了这个问题,当时我没有测试过,只是想既然firebox支持下载,让minimo支持也不会困难。最近自己试了一下,结果花了大半天时间才加上这个功能。这里做个笔记供有需要的朋友参考。

对于minimo本身支持的文件类型,像HTML/WML和图像文件等,它会直接打开到浏览器中,可以通过”另存为”保存到文件系统里,minimo已经封装这样的函数,mozilla_save用于保存网页,mozilla_save_image用于保存图像。

对于minimo本身不支持的文件类型,像zip文件等,它有两种选择,一种是保存到本地,另一种是用应用程序打开。它会打开nknownContentType.xul对应的界面,让用户选择具体方式。也可以设定缺省行为,直接打开或者保存到指定目录。

我发现nknownContentType.xul和相关脚本有点问题,点“确定”按钮时,出现JS异常,说dialog对象找不到。我对XUL/XBL/JS不太熟悉,结果花了两个小时也没有查出原因,又因为nknownContentType.xul不适合在小屏幕中显示,最后我通过配置信息绕过了这个界面,直接进入downloads.xul界面进入下载。downloads.xul也不适合在小屏幕中显示,不过稍做调整之后,可以在240x320的情况下显示正常。

相关配置信息主要有:
pref -> SetBoolPref( " browser.download.useDownloadDir " true );
pref
-> SetIntPref( " browser.download.folderList " 2 );
pref
-> SetCharPref( " browser.helperApps.neverAsk.saveToDisk " ,  application_mimes);
pref
-> SetBoolPref( " browser.download.manager.closeWhenDone " , false );
char *  downloads_dir  =  g_strdup_printf( " %s/downloads " , g_get_home_dir());
pref
-> SetCharPref( " browser.download.dir " , downloads_dir);
mkdir(downloads_dir, 
0744 );
free(downloads_dir);


另外,好像缺省的minimo配置并没有把nknownContentType.xul和downloads.xul包含进去,要修改一些编译选项和Makefile才行,我在让minimo支持安装功能一文中已经描述过了。

如果懒得去修改配置文件(如果对minimo不过熟悉,那一个非常麻烦的过程),可以自己开发一个下载管理器。不支持的文件类型是由nsExternalAppHandler处理的,nsExternalAppHandler实现了nsIStreamListener接口,它把接收到的数据存放在一个临时文件中,在OnStopRequest中它用对应的应用程序打开该文件 。重新实现nsExternalAppHandler,加入自己的下载管理器,也可以起动第三方下载工具。


对于minimo不支持的协议。minimo在下载一个文件时,它先通过nsIOService::GetProtocolHandler获取ProtocolHandler,如果是内置支持的Protocol,像http和ftp等几种,GetCachedProtocolHandler会成功返回ProtocolHandler。

对于其它的,nsIOService::GetProtocolHandler再查询配置network.protocol-handler.external.+$scheme的值,如果为false,通过NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX + $schemet生成contractID,从XPCOM查询到ProtocolHandler接口。

如果定义了MOZ_X11,它还可以通过gnomevfs 去下载文件,其contractId为NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX"moz-gnomevfs"。在手机可能一般不会有gnomevfs存在。

如果以上方法都失败了,再调用默认的ProtocolHandler,其contractID为NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX"default"。它其实就是nsExternalHelperAppService。

在linux下,nsExternalHelperAppService的处理方式就是通过配置network.protocol-handler.app.$scheme的值得到应用程序名称,然后运行该应用程序,并把URL作为第一个参数传入。例如下面这个配置项会让mozilla执行test_protocol_handler程序。

pref("network.protocol-handler.app.test", "test_protocol_handler");

~~end~~
 

你可能感兴趣的:(Scheme,application,NetWork,makefile,mozilla,下载工具)