1 var EXPORTED_SYMBOLS = [ "fburl" ]; 2 3 const Cc = Components.classes; 4 const Ci = Components.interfaces; 5 const Cu = Components.utils; 6 7 Cu.import("resource://calendar/modules/calUtils.jsm"); 8 Cu.import("resource:///modules/mailServices.js"); 9 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 10 11 if ("undefined" == typeof(fburl)) { 12 var fburl = {}; 13 }; 14 15 const calIFreeBusyInterval = Ci.calIFreeBusyInterval; 16 const calIDateTime = Ci.calIDateTime; 17 18 fburl.fbUrlProvider = function(cal) { 19 this.cal = cal; 20 this._query = null; 21 this._context = null; 22 this._result = null; 23 this._searched = false; 24 this._error = null; 25 this._listener = null; 26 this._url = null; 27 this._fb = null; 28 }; 29 30 fburl.fbUrlProvider.prototype = { 31 classID: Components.ID("{11291d94-b457-4322-bfba-ae9df4b6a3c1}"), 32 33 getFreeBusyIntervals: function (aCalId, aRangeStart, aRangeEnd, aBusyTypes, aListener) { 34 35 var start = this.cal.createDateTime("20140923T100000Z"); 36 var end = this.cal.createDateTime("20140923T120000Z"); 37 38 var periods = []; 39 var interval = new this.cal.FreeBusyInterval( 40 aCalId, 41 calIFreeBusyInterval.BUSY, // fbType 42 start, end); 43 periods.push(interval); 44 aListener.onResult(null, periods); 45 }, 46 47 getLDAPAddressBooks: function () { 48 49 var abManager = Cc["@mozilla.org/abmanager;1"].getService(Ci.nsIAbManager); 50 var allAddressBooks = abManager.directories; 51 var books = []; 52 53 while (allAddressBooks.hasMoreElements()) { 54 var addressBook = allAddressBooks.getNext().QueryInterface(Ci.nsIAbDirectory); 55 if (addressBook instanceof Ci.nsIAbLDAPDirectory) { 56 books.push(addressBook); 57 } 58 } 59 60 return books; 61 }, 62 63 startSearch: function (aCalId) { 64 65 var service = Cc["@mozilla.org/network/ldap-service;1"].getService(Ci.nsILDAPService); 66 var books = this.getLDAPAddressBooks(); 67 68 this._result = null; 69 aCalId = aCalId.replace(/^mailto:/i, ""); 70 71 for each (var book in books) { 72 var ldap = book.QueryInterface(Ci.nsIAbLDAPDirectory); 73 var attrmap = Cc["@mozilla.org/addressbook/ldap-attribute-map;1"].createInstance(Ci.nsIAbLDAPAttributeMap); 74 var args = Cc["@mozilla.org/addressbook/directory/query-arguments;1"].createInstance(Ci.nsIAbDirectoryQueryArguments); 75 76 attrmap.setAttributeList("PrimaryEmail", "mail", true); 77 attrmap.setAttributeList("FBURL", "calFbUrl", true); 78 args.filter = service.createFilter(aCalId.length * 2, "(%a=%v)", "", "", "mail", aCalId); 79 args.typeSpecificArg = attrmap; 80 args.querySubDirectories = true; 81 82 this._query = Cc["@mozilla.org/addressbook/ldap-directory-query;1"].createInstance(Ci.nsIAbDirectoryQuery); 83 this._context = this._query.doQuery(ldap, args, this, ldap.maxHits, 0); 84 this._searched = true; 85 86 // NOTE: Do only one query for now. 87 88 break; 89 } 90 }, 91 92 stopSearch: function stopSearch() { 93 if (this._context) { 94 this._query.stopQuery(this._context); 95 this._context = null; 96 this._listener = null; 97 } 98 }, 99 100 onSearchFinished: function (aResult, aErrorMsg) { 101 this._context = null; 102 this._error = aErrorMsg; 103 }, 104 105 onSearchFoundCard: function (aCard) { 106 107 this._result = aCard; 108 109 // Obtain the URL from the card. 110 111 this._url = aCard.getProperty("FBURL", ""); 112 113 // Retrieve the resource and parse it. 114 115 var parser = Cc["@mozilla.org/calendar/ics-service;1"].getService(Ci.calIICSService); 116 //var parser = Cc["@mozilla.org/calendar/ics-parser;1"].createInstance(Ci.calIIcsParser); 117 var service = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); 118 var stream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); 119 var channel = service.newChannelFromURI(service.newURI(this._url, null, null)); 120 121 stream.init(channel.open()); 122 this._fb = parser.parseICS(stream.read(-1), null).getFirstSubcomponent("VFREEBUSY"); 123 }, 124 125 QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsIAbDirSearchListener]) 126 }; 127 128 fburl.initProvider = function() { 129 cal.getFreeBusyService().addProvider(new fburl.fbUrlProvider(cal)); 130 } 131 132 fburl.test = function(aCalId) { 133 var fbp = new fburl.fbUrlProvider(cal); 134 fbp.startSearch(aCalId); 135 return fbp; 136 } 137 138 const NSGetFactory = XPCOMUtils.generateNSGetFactory([fburl.fbUrlProvider]);