/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;

Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/DOMRequestHelper.jsm");

XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
                                   "@mozilla.org/childprocessmessagemanager;1",
                                   "nsIMessageSender");

XPCOMUtils.defineLazyServiceGetter(this, "appsService",
                                   "@mozilla.org/AppsService;1",
                                   "nsIAppsService");

const DEBUG = false;
function debug(aMsg) {
  dump("-- InterAppConnection: " + Date.now() + ": " + aMsg + "\n");
}

/**
 * MozInterAppConnection implementation.
 */

function InterAppConnection() {
  if (DEBUG) debug("InterAppConnection()");
  this.keyword = null;
  this.publisher = null;
  this.subscriber = null;
};

InterAppConnection.prototype = {
  __proto__: DOMRequestIpcHelper.prototype,

  classDescription: "MozInterAppConnection",

  classID: Components.ID("{9dbfa904-0718-11e3-8e77-0721a45514b8}"),

  contractID: "@mozilla.org/dom/inter-app-connection;1",

  QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer,
                                         Ci.nsISupportsWeakReference,
                                         Ci.nsIObserver]),

  __init: function(aKeyword, aPublisher, aSubscriber) {
    if (DEBUG) {
      debug("__init: aKeyword: " + aKeyword +
            " aPublisher: " + aPublisher + " aSubscriber: " + aSubscriber);
    }
    this.keyword = aKeyword;
    this.publisher = aPublisher;
    this.subscriber = aSubscriber;
  },

  // Ci.nsIDOMGlobalPropertyInitializer implementation.
  init: function(aWindow) {
    if (DEBUG) debug("init");

    this.initDOMRequestHelper(aWindow, []);
    let principal = aWindow.document.nodePrincipal;
    this._manifestURL = appsService.getManifestURLByLocalId(principal.appId);
  },

  cancel: function() {
    if (DEBUG) debug("cancel");

    cpmm.sendAsyncMessage("InterAppConnection:Cancel",
                          { keyword: this.keyword,
                            pubAppManifestURL: this.publisher,
                            subAppManifestURL: this.subscriber,
                            manifestURL: this._manifestURL });
  }
};


/**
 * MozInterAppConnectionRequest implementation.
 */

function InterAppConnectionRequest() {
  if (DEBUG) debug("InterAppConnectionRequest()");
  this.keyword = null;
  this.port = null;
  this.from = null;
};

InterAppConnectionRequest.prototype = {
  classDescription: "MozInterAppConnectionRequest",

  classID: Components.ID("{6a77e9e0-0645-11e3-b90b-73bb7c78e06a}"),

  contractID: "@mozilla.org/dom/inter-app-connection-request;1",

  QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]),

  __init: function(aKeyword, aPort, aFrom) {
    if (DEBUG) debug("__init: aKeyword: " + aKeyword + " aPort: " + aPort +
                     " aFrom: " + aFrom);
    this.keyword = aKeyword;
    this.port = aPort;
    this.from = aFrom;
  }
};

/**
 * InterAppConnectionRequestWrapper implementation.
 *
 * This implements nsISystemMessagesWrapper.wrapMessage(), which provides a
 * plugable way to wrap a "connection" type system message.
 *
 * Please see SystemMessageManager.js to know how it customizes the wrapper.
 */

function InterAppConnectionRequestWrapper() {
  if (DEBUG) debug("InterAppConnectionRequestWrapper()");
}

InterAppConnectionRequestWrapper.prototype = {
  // nsISystemMessagesWrapper implementation.
  wrapMessage: function(aMessage, aWindow) {
    if (DEBUG) debug("wrapMessage: " + JSON.stringify(aMessage));

    let port = new aWindow.MozInterAppMessagePort(aMessage.messagePortID);
    let connectionRequest =
      new aWindow.MozInterAppConnectionRequest(aMessage.keyword, port,
                                               aMessage.pubPageURL);

    return connectionRequest;
  },

  classDescription: "InterAppConnectionRequestWrapper",

  classID: Components.ID("{d7c7a466-f91d-11e2-812a-6fab12ece58e}"),

  contractID: "@mozilla.org/dom/system-messages/wrapper/connection;1",

  QueryInterface: XPCOMUtils.generateQI([Ci.nsISystemMessagesWrapper])
}


this.NSGetFactory =
  XPCOMUtils.generateNSGetFactory([InterAppConnection,
                                   InterAppConnectionRequest,
                                   InterAppConnectionRequestWrapper]);
