• 让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~~
     
  • 相关阅读:
    Django的是如何工作的
    Robot Framework自动化测试(五)--- 开发系统关键字
    Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)
    如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)
    Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)
    神奇的 routing mesh
    如何访问 Service?- 每天5分钟玩转 Docker 容器技术(99)
    Swarm 如何实现 Failover?- 每天5分钟玩转 Docker 容器技术(98)
    如何实现 Service 伸缩?- 每天5分钟玩转 Docker 容器技术(97)
    运行第一个 Service
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167693.html
Copyright © 2020-2023  润新知