home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 December / PCWorld_2006-12_cd.bin / komunikace / netscape / nsb-install-8-1-2.exe / chrome / aim.jar / content / aim / AimMailBridge.js < prev    next >
Text File  |  2006-01-06  |  9KB  |  306 lines

  1.  
  2. const MSG_FLAG_NEW = 0x10000;
  3. const MSG_FLAG_READ = 0x0001;
  4. const MSG_FOLDER_FLAG_INBOX = 0x1000;
  5. var gArray = null;  //holds the screen name, email address and msg keys for new msgs sent by this buddy
  6. var gInboxDB = null;
  7. var gObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  8. var gHeaderParser = null;
  9.  
  10. var gAimMailObserver =
  11. {
  12.     observe: function(aSubject, aTopic, aData)
  13.     {
  14.       if (aTopic == "defaultInboxLoadedOnStartup")
  15.       {
  16.         if (!gArray)
  17.         {
  18.           var emailArray = GetBuddiesEmailAddress();
  19.           CreateAimMailBridge(emailArray);
  20.         }
  21.         gObserverService.removeObserver(gAimMailObserver, "defaultInboxLoadedOnStartup");
  22.       } 
  23.       else if (aTopic == "mailDefaultAccountChanged")
  24.       {
  25.         CleanupGlobals();
  26.         var emailArray = GetBuddiesEmailAddress();
  27.         CreateAimMailBridge(emailArray);
  28.       }
  29.     }
  30. }
  31.  
  32. var gDBChangeListener = 
  33. {
  34.     OnKeyChange: function(keyChanged, oldFlags, newFlags, instigator) 
  35.    {
  36.      if (!(oldFlags & MSG_FLAG_READ) && (newFlags & MSG_FLAG_READ))
  37.        UpdateMsgKeyArray(gInboxDB.GetMsgHdrForKey(keyChanged), false);
  38.    },
  39.  
  40.    OnKeyDeleted: function(keyChanged, parentKey, flags, instigator) 
  41.    {
  42.      if (!(flags & MSG_FLAG_READ))
  43.        UpdateMsgKeyArray(gInboxDB.GetMsgHdrForKey(keyChanged), false); 
  44.    },
  45.  
  46.    OnKeyAdded: function(keyChanged, parentKey, flags, instigator) 
  47.    {
  48.      if (flags & MSG_FLAG_NEW)
  49.        UpdateMsgKeyArray(gInboxDB.GetMsgHdrForKey(keyChanged), true);
  50.    },
  51.  
  52.    OnParentChanged: function(keyChanged, oldParentKey, newParentKey, instigator) { },
  53.  
  54.    OnAnnouncerGoingAway: function(instigator) 
  55.    {
  56.      CleanupGlobals();
  57.    },
  58.  
  59.    OnReadChanged: function(instigator) {}
  60. }
  61.  
  62. function CleanupGlobals()
  63. {
  64.   if (gArray)
  65.     gArray = null;
  66.   if (gInboxDB)
  67.   {
  68.     gInboxDB.RemoveListener(gDBChangeListener);
  69.     gInboxDB = null;
  70.   }
  71.   try
  72.   {
  73.     gObserverService.removeObserver(gAimMailObserver, "mailDefaultAccountChanged"); 
  74.   }
  75.   catch (ex)
  76.   {}
  77. }
  78.  
  79. function GetEmailAddress(line)
  80. {
  81.   if (!gHeaderParser)
  82.     gHeaderParser = Components.classes["@mozilla.org/messenger/headerparser;1"].getService(Components.interfaces.nsIMsgHeaderParser);
  83.  
  84.   var reformattedLine = gHeaderParser.reformatUnquotedAddresses(line);
  85.   var addresses = new Object;
  86.   gHeaderParser.extractHeaderAddressMailboxes(null, reformattedLine, addresses);
  87.   return addresses.value;
  88. }
  89.  
  90. function UpdateMsgKeyArray(msgHdr, add)
  91. {
  92.   var from = GetEmailAddress(msgHdr.author);
  93.  
  94.   var msgKey = msgHdr.messageKey;
  95.   for (var i=0; i <gArray.length; i++)       //you can have two buddies w/ same email address - as per suresh
  96.   {
  97.     if (gArray[i].emailAddress && from == gArray[i].emailAddress)
  98.     {
  99.       var msgKeyArray = gArray[i].msgKeyArray;
  100.       if(add)
  101.         msgKeyArray[msgKeyArray.length] = msgKey;
  102.       else
  103.       {
  104.         for (var j=0;j<msgKeyArray.length;j++)
  105.         {
  106.           if (msgKeyArray[j] == msgKey)
  107.           {
  108.             msgKeyArray.splice(j,1);
  109.             break;
  110.           }
  111.         }
  112.       }
  113.  
  114.       gArray[i].msgKeyArray = msgKeyArray;
  115.  
  116.       if (msgKeyArray.length == 0)
  117.         NotifyChange(gArray[i].screenName, false);
  118.  
  119.       else if (msgKeyArray.length == 1)
  120.         NotifyChange(gArray[i].screenName, true);
  121.  
  122.     }
  123.   }
  124. }
  125.  
  126. function IsMailRunning()
  127. {
  128.   var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  129.   var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
  130.   var mailWindow = windowManagerInterface.getMostRecentWindow("mail:3pane");
  131.   if (mailWindow)
  132.     return true;
  133.   else
  134.     return false;
  135. }
  136.  
  137. function CreateAimMailBridge(buddyListEmailAddresses)
  138. {
  139.   var supportmailim = aimPrefsManager().GetBoolPref("aim.session.supportmailim", null, false);
  140.   if (!supportmailim)
  141.     return;
  142.   
  143.   if (!IsMailRunning())
  144.   {
  145.     //we need to listen when mail starts-up
  146.     gObserverService.addObserver(gAimMailObserver, "defaultInboxLoadedOnStartup", false);  //looks like js objects cannot have weak reference
  147.     return;
  148.   }
  149.  
  150.   var inboxFolder = GetInboxFolderForDefaultAccount();
  151.   if (!inboxFolder)
  152.   {
  153.     gObserverService.addObserver(gAimMailObserver, "defaultInboxLoadedOnStartup", false);  //looks like js objects cannot have weak reference
  154.     return;
  155.   }
  156.  
  157.   gObserverService.addObserver(gAimMailObserver, "mailDefaultAccountChanged", false);  //looks like js objects cannot have weak reference 
  158.  
  159.   gArray = new Array(buddyListEmailAddresses.length);
  160.   for (var i=0; i <gArray.length; i++)    //initialize gArray
  161.   {
  162.     var obj = new Object;
  163.     obj.emailAddress = buddyListEmailAddresses[i].EmailID;
  164.     obj.screenName = buddyListEmailAddresses[i].ScreenName;
  165.     obj.msgKeyArray = new Array;
  166.     gArray[i] = obj;
  167.   }
  168.  
  169.   gInboxDB = inboxFolder.getMsgDatabase(null);
  170.  
  171.   gInboxDB.AddListener(gDBChangeListener);
  172.  
  173.   if (gInboxDB.HasNew()) //need to find out if any buddy has sent new mail
  174.   {
  175.     var msgEnumerator = gInboxDB.EnumerateMessages();
  176.     while (msgEnumerator.hasMoreElements())
  177.     {
  178.       var msgSupports = msgEnumerator.getNext();
  179.       var msgHdr = msgSupports.QueryInterface(Components.interfaces.nsIMsgDBHdr);
  180.       if (msgHdr.flags & MSG_FLAG_NEW)
  181.         UpdateMsgKeyArray(msgHdr, true);
  182.     }
  183.   }
  184. }
  185.   
  186. function GetInboxFolderForDefaultAccount()
  187. {
  188.   var inboxFolder = null;
  189.   var accountManager = null;
  190.   
  191.   try 
  192.   {
  193.     accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager); 
  194.   }
  195.   catch(ex)
  196.   {
  197.     dump("Could not get account manager "+ ex + "\n");
  198.   }
  199.   
  200.   if (!accountManager)
  201.     return null;
  202.  
  203.   try
  204.   {
  205.     var defaultAccount = accountManager.defaultAccount;
  206.   }
  207.   catch (ex)
  208.   { 
  209.     dump ("Could not get default account" + ex + "\n");
  210.   }
  211.  
  212.   if (!defaultAccount)
  213.     return null;
  214.  
  215.   var incomingServer = defaultAccount.incomingServer;
  216.   var rootMsgFolder = incomingServer.rootMsgFolder;
  217.   var outNumFolders = new Object();
  218.   inboxFolder = rootMsgFolder.getFoldersWithFlag(MSG_FOLDER_FLAG_INBOX, 1, outNumFolders);
  219.  
  220.   return inboxFolder;
  221. }
  222.  
  223. function NotifyChange(buddyName, displayMailIcon)
  224. {
  225.   //call aim function that would change the status on aim window
  226.   var aimbuddy = aimBuddyManager();
  227.   if (displayMailIcon)
  228.     aimbuddy.SetUserEmailStateinDS(buddyName, Components.interfaces.nsAimBuddyEmailStates.HasNewEmail);
  229.   else
  230.     aimbuddy.SetUserEmailStateinDS(buddyName, Components.interfaces.nsAimBuddyEmailStates.HasNoEmail);
  231. }
  232.  
  233. function UpdateBuddyEmailAddress(screenName, buddyEmailAddress)
  234. {
  235.   if (!gArray)
  236.     return;
  237.   var index = GetIndexOfBuddyInArray(screenName);
  238.   if (index != -1)
  239.     gArray[index].emailAddress = buddyEmailAddress;
  240. }
  241.     
  242. function AddBuddyEmailAddress(screenName, buddyEmailAddress)
  243. {
  244.   if (!gArray)
  245.     return;
  246.   if (GetIndexOfBuddyInArray(screenName) == -1)
  247.   {
  248.     var obj = new Object;
  249.     obj.emailAddress = buddyEmailAddress;
  250.     obj.screenName = screenName;
  251.     obj.msgKeyArray = new Array;
  252.     gArray[gArray.length] = obj;
  253.   }
  254. }
  255.  
  256. function RemoveBuddyEmailAddress(screenName)
  257. {
  258.   if (!gArray)
  259.     return;
  260.   var index = GetIndexOfBuddyInArray(screenName);
  261.   if ( index != -1)
  262.     gArray.splice(index,1);
  263. }
  264.  
  265. function GetIndexOfBuddyInArray(screenName)
  266. {
  267.   for (var i=0; i <gArray.length; i++)
  268.   {
  269.     if (screenName == gArray[i].screenName)
  270.       return i;
  271.   }
  272.   return -1;
  273. }
  274.  
  275. function ViewUnread(emailAddress)
  276. {
  277.   var inboxFolder = GetInboxFolderForDefaultAccount();
  278.   if (!inboxFolder)
  279.     return OpenMessenger(null, null, null);
  280.   else
  281.     return OpenMessenger(inboxFolder.URI, -1, emailAddress);
  282. }
  283.  
  284. //TODO when mail is not set up
  285. function OpenMessenger(folder, msg, emailaddress)
  286. {
  287.    // MERC: SL Mar 25/05
  288. //  var pref = Components.classes["@mozilla.org/preferences-service;1"]
  289. //             .getService(Components.interfaces.nsIPrefBranch);
  290. //  
  291. //  var windowDoc = "chrome://messenger/content/messenger.xul";
  292. //  try
  293. //  {
  294. //     var layoutType = pref.getIntPref("mail.pane_config");
  295. //     windowDoc = !layoutType ? "chrome://messenger/content/messenger.xul" : 
  296. //                               "chrome://messenger/content/mail3PaneWindowVertLayout.xul";
  297. //  }
  298. //  catch(ex)
  299. //  {}
  300. //
  301. //  window.openDialog(windowDoc, "_blank",
  302. //    "chrome,extrachrome,menubar,resizable,status,toolbar", folder, msg, emailaddress);
  303. }
  304.  
  305.  
  306.