(FFOS Gecko & Gaia) OTA - 处理check结果

  当通过Checker检测到update以后,会通知UpdatePrompt中的updateCheckListener。

1. UpdateCheckListener.onCheckComplete

onCheckComplete: function UCL_onCheckComplete(request, updates, updateCount) {
  if (Services.um.activeUpdate) {
    // We‘re actively downloading an update, that‘s the update the user should
    // see, even if a newer update is available.
    this._updatePrompt.setUpdateStatus("active-update");
    this._updatePrompt.showUpdateAvailable(Services.um.activeUpdate);
    return;
  }

  if (updateCount == 0) {
    this._updatePrompt.setUpdateStatus("no-updates");

    if (this._updatePrompt._systemUpdateListener) {
      this._updatePrompt._systemUpdateListener.onError("no-updates");
    }

    return;
  }
 // Service.aus就是nsUpdateService.js里的UpdateService对象  // selectUpdate会通过一些预设的policy,返回updates中的某一个合适的update对象
  let update = Services.aus.selectUpdate(updates, updateCount);
  if (!update) {
    this._updatePrompt.setUpdateStatus("already-latest-version");

    if (this._updatePrompt._systemUpdateListener) {
      this._updatePrompt._systemUpdateListener.onError("already-latest-version");
    }

    return;
  }

  this._updatePrompt.setUpdateStatus("check-complete");  // 通知UpdatePrompt有可用的update
  this._updatePrompt.showUpdateAvailable(update);
},

2. UpdatePrompt.showUpdateAvailable(update)

showUpdateAvailable: function UP_showUpdateAvailable(aUpdate) {
  let packageInfo = {};
  packageInfo.version = aUpdate.displayVersion;
  packageInfo.description = aUpdate.statusText;
  packageInfo.buildDate = aUpdate.buildID;
  // 返回一个被选择的patch,或者第一个patch
  let patch = aUpdate.selectedPatch;
  if (!patch && aUpdate.patchCount > 0) {
    // For now we just check the first patch to get size information if a
    // patch hasn‘t been selected yet.
    patch = aUpdate.getPatchAt(0);
  }

  if (patch) {
    packageInfo.size = patch.size;
    packageInfo.type = patch.type;
  } else {
    log("Warning: no patches available in update");
  }

  this._pendingUpdateAvailablePackageInfo = packageInfo;

  if (this._systemUpdateListener) {
    this._systemUpdateListener.onUpdateAvailable(packageInfo.type,
                                           packageInfo.version,
                                           packageInfo.description,
                                           packageInfo.buildDate,
                                           packageInfo.size);
    // Set null since the event is fired.
    this._pendingUpdateAvailablePackageInfo = null;
  }
  // 发送‘update-available‘ event,其实就是通过SystemAppProxy发送一个‘mozChromeEvent‘,  // 还有发送一些附带信息,比如selected patch size和patch type。接收方是谁呢?可以猜到,就是前几篇分析的SystemApp中的UpdateManager。
  if (!this.sendUpdateEvent("update-available", aUpdate)) {
    log("Unable to prompt for available update, forcing download");
    this.downloadUpdate(aUpdate);
  }
},

  

时间: 2024-11-07 08:00:19

(FFOS Gecko & Gaia) OTA - 处理check结果的相关文章

(FFOS Gecko & Gaia) OTA - Do real check

虽然代码分析了很多,但是还没有真正做check的工作,下面就来找到真正的checker. 代码位置:gecko/toolkit/mozapps/update/nsUpdateService.js.参考之前的(FFOS Gecko & Gaia) OTA - 代码模块总览,nsUpdateService.js中的Checker对象,实现了nsIUpdateChecker这个interface.下面就来分析Checker对象的实现. 1.  checkForUpdates函数: 实现略长,在代码中添

(FFOS Gecko & Gaia) OTA - 又回到UpdatePrompt

当download完成时,又回到了UpdatePrompt,因为此时需要提示user下载完成,确认apply. 1. UpdatePrompt.showUpdateDownloaded showUpdateDownloaded: function UP_showUpdateDownloaded(aUpdate, aBackground) { if (this._systemUpdateListener) { this._systemUpdateListener.onUpdateReady();

(FFOS Gecko & Gaia) OTA - 进入Gecko层

代码位置:gecko/b2g/components/UpdatePrompt.js SystemApp发出'force-update-check'事件,也就从gaia进入到了gecko层. 1. 首先大概介绍一下UpdatePrompt.js. (a) UpdatePrompt.js里包含了2个对象,分别是UpdatePrompt和UpdateCheckListener. (b) UpdatePrompt实现了“@mozilla.org/updates/update-prompt;1”这个XPC

(FFOS Gecko & Gaia) OTA - 代码模块总览

OTA整体框架里会涉及以下代码,从gaia到gecko都有,而且由于历史原因,复用了desktop browser的一些模块,还有一些冗余代码,分析时走了不少弯路. 1. Gaia部分 (a) gaia/apps/settings/js/panels/about/update_check.js 这个Settings中OTA功能的入口,通过AMD(Asynchronous Module Definition)规范,定义了一个模块UpdateCheck. (b) gaia/apps/system/j

(FFOS Gecko & Gaia) OTA - 重回Gaia层

SystemApp中的UpdateManager作为gaia和gecko的通信桥梁,会接收gecko中UpdatePrompt发送的'update-available'事件. 1. UpdateManager.handleEvent var detail = evt.detail; if (detail.type && detail.type === 'update-available') { // systemUpdatable是在UpdateManager初始化时new出来的,Upda

(FFOS Gecko & Gaia) OTA - 转移至System App

代码位置:gaia/apps/system/js/update_manager.js 1. update_manager.js向全局的window对象导出了一个对象UpdateManager,其他的js module可以直接访问UpdateManager. exports.UpdateManager = UpdateManager; 2. UpdateManager监听了settings app中对于‘gaia.system.checkForUpdates’的设置,也就是当‘gaia.syste

(FFOS Gecko & Gaia) OTA - 关键的apply

这篇分析已经是尾声了,在UpdatePrompt中,调用了UpdateService的applyOsUpdate函数. 1. UpdateService.applyOsUpdate 这个函数很简单,就是获取到update.zip以后,调用recovery service去完成更新. applyOsUpdate: function AUS_applyOsUpdate(aUpdate) { if (!aUpdate.isOSUpdate || aUpdate.state != STATE_APPLI

(FFOS Gecko & Gaia) OTA - 真正的download

前面分析了这么多,还没有真正的走到download流程.这篇就去了解真正的downloader. 1. UpdateService.downloadUpdate 看来这正的worker就是最后new出来的Downloader. downloadUpdate: function AUS_downloadUpdate(update, background) { if (!update) throw Cr.NS_ERROR_NULL_POINTER; // Don't download the upd

(FFOS Gecko) - several ways of registering a XPCOM Component

1. JavaScript Component (1) add a CustomComponent.manifest # The {classID} here must match the classID in CustomComponent.js component {e6b866e3-41b2-4f05-a4d2-3d4bde0f7ef8} components/CustomComponent.js contract @foobar/customcomponent;1 {e6b866e3-4