diff options
Diffstat (limited to 'mailnews')
-rw-r--r-- | mailnews/base/ispdata/moz.build | 4 | ||||
-rw-r--r-- | mailnews/base/src/moz.build | 2 | ||||
-rw-r--r-- | mailnews/base/src/nsMessengerOSXIntegration.h | 63 | ||||
-rw-r--r-- | mailnews/base/src/nsMessengerOSXIntegration.mm | 700 | ||||
-rw-r--r-- | mailnews/build/moz.build | 4 | ||||
-rw-r--r-- | mailnews/compose/src/moz.build | 10 | ||||
-rw-r--r-- | mailnews/compose/src/nsMsgAppleCodes.h | 106 | ||||
-rw-r--r-- | mailnews/compose/src/nsMsgAppleDouble.h | 207 | ||||
-rw-r--r-- | mailnews/compose/src/nsMsgAppleDoubleEncode.cpp | 266 | ||||
-rw-r--r-- | mailnews/compose/src/nsMsgAppleEncode.cpp | 703 | ||||
-rw-r--r-- | mailnews/import/build/moz.build | 7 |
11 files changed, 1 insertions, 2071 deletions
diff --git a/mailnews/base/ispdata/moz.build b/mailnews/base/ispdata/moz.build index 7de5dc2e32..363c2ba0c2 100644 --- a/mailnews/base/ispdata/moz.build +++ b/mailnews/base/ispdata/moz.build @@ -2,6 +2,4 @@ # 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/. -# Disable movemail for Thunderbird on OSX -if CONFIG['MOZ_MOVEMAIL'] and not (CONFIG['MOZ_THUNDERBIRD'] and CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa'): - FINAL_TARGET_FILES.isp += ['movemail.rdf'] +# Stub. This was configuring special snowflake OSX stuff.
\ No newline at end of file diff --git a/mailnews/base/src/moz.build b/mailnews/base/src/moz.build index 91bf235c34..65853daf96 100644 --- a/mailnews/base/src/moz.build +++ b/mailnews/base/src/moz.build @@ -61,8 +61,6 @@ if CONFIG['OS_ARCH'] == 'WINNT': if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'qt'): SOURCES += ['nsMessengerUnixIntegration.cpp'] -elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': - SOURCES += ['nsMessengerOSXIntegration.mm'] EXTRA_COMPONENTS += [ 'folderLookupService.js', diff --git a/mailnews/base/src/nsMessengerOSXIntegration.h b/mailnews/base/src/nsMessengerOSXIntegration.h deleted file mode 100644 index 91f42f2a2a..0000000000 --- a/mailnews/base/src/nsMessengerOSXIntegration.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* 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/. */ - -#ifndef __nsMessengerOSXIntegration_h -#define __nsMessengerOSXIntegration_h - -#include "nsIMessengerOSIntegration.h" -#include "nsIFolderListener.h" -#include "nsIAtom.h" -#include "nsITimer.h" -#include "nsCOMPtr.h" -#include "nsStringGlue.h" -#include "nsIObserver.h" -#include "nsIAlertsService.h" -#include "mozINewMailListener.h" - -#define NS_MESSENGEROSXINTEGRATION_CID \ - {0xaa83266, 0x4225, 0x4c4b, \ - {0x93, 0xf8, 0x94, 0xb1, 0x82, 0x58, 0x6f, 0x93}} - -class nsIStringBundle; - -class nsMessengerOSXIntegration : public nsIMessengerOSIntegration, - public nsIFolderListener, - public nsIObserver, - public mozINewMailListener -{ -public: - nsMessengerOSXIntegration(); - virtual nsresult Init(); - - NS_DECL_ISUPPORTS - NS_DECL_NSIMESSENGEROSINTEGRATION - NS_DECL_NSIFOLDERLISTENER - NS_DECL_NSIOBSERVER - NS_DECL_MOZINEWMAILLISTENER - -private: - virtual ~nsMessengerOSXIntegration(); - - nsCOMPtr<nsIAtom> mBiffStateAtom; - nsCOMPtr<nsIAtom> mNewMailReceivedAtom; - nsresult ShowAlertMessage(const nsAString& aAlertTitle, const nsAString& aAlertText, const nsACString& aFolderURI); - nsresult OnAlertFinished(); - nsresult OnAlertClicked(const char16_t * aAlertCookie); -#ifdef MOZ_SUITE - nsresult OnAlertClickedSimple(); -#endif - nsresult GetStringBundle(nsIStringBundle **aBundle); - void FillToolTipInfo(nsIMsgFolder *aFolder, int32_t aNewCount); - nsresult GetFirstFolderWithNewMail(nsIMsgFolder* aFolder, nsCString& aFolderURI); - nsresult BadgeDockIcon(); - nsresult RestoreDockIcon(); - nsresult BounceDockIcon(); - nsresult GetNewMailAuthors(nsIMsgFolder* aFolder, nsString& aAuthors, int32_t aNewCount, int32_t* aNotDisplayed); - - int32_t mUnreadTotal; - int32_t mUnreadChat; -}; - -#endif // __nsMessengerOSXIntegration_h diff --git a/mailnews/base/src/nsMessengerOSXIntegration.mm b/mailnews/base/src/nsMessengerOSXIntegration.mm deleted file mode 100644 index a38716e179..0000000000 --- a/mailnews/base/src/nsMessengerOSXIntegration.mm +++ /dev/null @@ -1,700 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* 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/. */ - -#include "nscore.h" -#include "nsMsgUtils.h" -#include "nsArrayUtils.h" -#include "nsMessengerOSXIntegration.h" -#include "nsIMsgMailSession.h" -#include "nsIMsgIncomingServer.h" -#include "nsIMsgIdentity.h" -#include "nsIMsgAccount.h" -#include "nsIMsgFolder.h" -#include "nsCOMPtr.h" -#include "nsMsgBaseCID.h" -#include "nsMsgFolderFlags.h" -#include "nsDirectoryServiceDefs.h" -#include "nsIDirectoryService.h" -#include "MailNewsTypes.h" -#include "nsIWindowMediator.h" -#include "nsIDOMChromeWindow.h" -#include "mozIDOMWindow.h" -#include "nsPIDOMWindow.h" -#include "nsIDocShell.h" -#include "nsIBaseWindow.h" -#include "nsIWidget.h" -#include "nsIObserverService.h" -#include "nsIPrefService.h" -#include "nsIPrefBranch.h" -#include "nsIMessengerWindowService.h" -#include "prprf.h" -#include "nsIAlertsService.h" -#include "nsIStringBundle.h" -#include "nsToolkitCompsCID.h" -#include "nsIMsgDatabase.h" -#include "nsIMsgHdr.h" -#include "nsISupportsPrimitives.h" -#include "nsIWindowWatcher.h" -#include "nsMsgLocalCID.h" -#include "nsIMsgMailNewsUrl.h" -#include "nsIMsgWindow.h" -#include "nsIMsgAccountManager.h" -#include "nsIMessenger.h" -#include "nsObjCExceptions.h" -#include "nsComponentManagerUtils.h" -#include "nsServiceManagerUtils.h" -#include "mozINewMailNotificationService.h" -#include "mozilla/mailnews/MimeHeaderParser.h" - -#include <Carbon/Carbon.h> -#import <Cocoa/Cocoa.h> - -#define kBiffAnimateDockIconPref "mail.biff.animate_dock_icon" -#define kMaxDisplayCount 10 - -using namespace mozilla::mailnews; - -// HACK: Limitations in Focus/SetFocus on Mac (see bug 465446) -nsresult FocusAppNative() -{ - ProcessSerialNumber psn; - - if (::GetCurrentProcess(&psn) != 0) - return NS_ERROR_FAILURE; - - if (::SetFrontProcess(&psn) != 0) - return NS_ERROR_FAILURE; - - return NS_OK; -} - -static void openMailWindow(const nsCString& aUri) -{ - nsresult rv; - nsCOMPtr<nsIMsgMailSession> mailSession ( do_GetService(NS_MSGMAILSESSION_CONTRACTID, &rv)); - if (NS_FAILED(rv)) - return; - - nsCOMPtr<nsIMsgWindow> topMostMsgWindow; - rv = mailSession->GetTopmostMsgWindow(getter_AddRefs(topMostMsgWindow)); - if (topMostMsgWindow) - { - if (!aUri.IsEmpty()) - { - nsCOMPtr<nsIMsgMailNewsUrl> msgUri(do_CreateInstance(NS_MAILBOXURL_CONTRACTID, &rv)); - if (NS_FAILED(rv)) - return; - - rv = msgUri->SetSpec(aUri); - if (NS_FAILED(rv)) - return; - - bool isMessageUri = false; - msgUri->GetIsMessageUri(&isMessageUri); - if (isMessageUri) - { - nsCOMPtr<nsIWindowWatcher> wwatch(do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv)); - if (NS_FAILED(rv)) - return; - - // SeaMonkey only supports message uris, whereas Thunderbird only - // supports message headers. This should be simplified/removed when - // bug 507593 is implemented. -#ifdef MOZ_SUITE - nsCOMPtr<mozIDOMWindowProxy> newWindow; - wwatch->OpenWindow(0, "chrome://messenger/content/messageWindow.xul", - "_blank", "all,chrome,dialog=no,status,toolbar", msgUri, - getter_AddRefs(newWindow)); -#else - nsCOMPtr<nsIMessenger> messenger(do_CreateInstance(NS_MESSENGER_CONTRACTID, &rv)); - if (NS_FAILED(rv)) - return; - - nsCOMPtr<nsIMsgDBHdr> msgHdr; - messenger->MsgHdrFromURI(aUri, getter_AddRefs(msgHdr)); - if (msgHdr) - { - nsCOMPtr<mozIDOMWindowProxy> newWindow; - wwatch->OpenWindow(0, "chrome://messenger/content/messageWindow.xul", - "_blank", "all,chrome,dialog=no,status,toolbar", msgHdr, - getter_AddRefs(newWindow)); - } -#endif - } - else - { - nsCOMPtr<nsIMsgWindowCommands> windowCommands; - topMostMsgWindow->GetWindowCommands(getter_AddRefs(windowCommands)); - if (windowCommands) - windowCommands->SelectFolder(aUri); - } - } - - FocusAppNative(); - nsCOMPtr<mozIDOMWindowProxy> domWindow; - topMostMsgWindow->GetDomWindow(getter_AddRefs(domWindow)); - if (domWindow) { - nsCOMPtr<nsPIDOMWindowOuter> privateWindow = nsPIDOMWindowOuter::From(domWindow); - privateWindow->Focus(); - } - } - else - { - // the user doesn't have a mail window open already so open one for them... - nsCOMPtr<nsIMessengerWindowService> messengerWindowService = - do_GetService(NS_MESSENGERWINDOWSERVICE_CONTRACTID); - // if we want to preselect the first account with new mail, - // here is where we would try to generate a uri to pass in - // (and add code to the messenger window service to make that work) - if (messengerWindowService) - messengerWindowService->OpenMessengerWindowWithUri( - "mail:3pane", aUri.get(), nsMsgKey_None); - } -} - -nsMessengerOSXIntegration::nsMessengerOSXIntegration() -{ - mBiffStateAtom = MsgGetAtom("BiffState"); - mNewMailReceivedAtom = MsgGetAtom("NewMailReceived"); - mUnreadTotal = 0; -} - -nsMessengerOSXIntegration::~nsMessengerOSXIntegration() -{ - RestoreDockIcon(); -} - -NS_IMPL_ADDREF(nsMessengerOSXIntegration) -NS_IMPL_RELEASE(nsMessengerOSXIntegration) - -NS_INTERFACE_MAP_BEGIN(nsMessengerOSXIntegration) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIMessengerOSIntegration) - NS_INTERFACE_MAP_ENTRY(nsIMessengerOSIntegration) - NS_INTERFACE_MAP_ENTRY(nsIFolderListener) - NS_INTERFACE_MAP_ENTRY(nsIObserver) - NS_INTERFACE_MAP_ENTRY(mozINewMailListener) -NS_INTERFACE_MAP_END - - -nsresult -nsMessengerOSXIntegration::Init() -{ - nsresult rv; - nsCOMPtr<nsIObserverService> observerService = do_GetService("@mozilla.org/observer-service;1", &rv); - NS_ENSURE_SUCCESS(rv, rv); - return observerService->AddObserver(this, "mail-startup-done", false); -} - -NS_IMETHODIMP -nsMessengerOSXIntegration::OnItemPropertyChanged(nsIMsgFolder *, nsIAtom *, char const *, char const *) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsMessengerOSXIntegration::OnItemUnicharPropertyChanged(nsIMsgFolder *, nsIAtom *, const char16_t *, const char16_t *) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsMessengerOSXIntegration::OnItemRemoved(nsIMsgFolder *, nsISupports *) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsMessengerOSXIntegration::Observe(nsISupports* aSubject, const char* aTopic, const char16_t* aData) -{ - if (!strcmp(aTopic, "alertfinished")) - return OnAlertFinished(); - - if (!strcmp(aTopic, "alertclickcallback")) - return OnAlertClicked(aData); - -#ifdef MOZ_SUITE - // SeaMonkey does most of the GUI work in JS code when clicking on a mail - // notification, so it needs an extra function here - if (!strcmp(aTopic, "alertclicksimplecallback")) - return OnAlertClickedSimple(); -#endif - - if (!strcmp(aTopic, "mail-startup-done")) { - nsresult rv; - nsCOMPtr<nsIObserverService> observerService = do_GetService("@mozilla.org/observer-service;1", &rv); - if (NS_SUCCEEDED(rv)) { - observerService->RemoveObserver(this, "mail-startup-done"); - - nsCOMPtr<nsIPrefBranch> pref(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); - } - - // Register with the new mail service for changes to the unread message count - nsCOMPtr<mozINewMailNotificationService> newmail - = do_GetService(MOZ_NEWMAILNOTIFICATIONSERVICE_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); // This should really be an assert with a helpful message - rv = newmail->AddListener(this, mozINewMailNotificationService::count); - NS_ENSURE_SUCCESS(rv, rv); // This should really be an assert with a helpful message - - // Get the initial unread count. Ignore return value; if code above didn't fail, this won't - rv = newmail->GetMessageCount(&mUnreadTotal); - BadgeDockIcon(); - - // register with the mail sesson for folder events - // we care about new count, biff status - nsCOMPtr<nsIMsgMailSession> mailSession = do_GetService(NS_MSGMAILSESSION_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - return mailSession->AddFolderListener(this, nsIFolderListener::boolPropertyChanged | nsIFolderListener::intPropertyChanged); - } - - return NS_OK; -} - -nsresult -nsMessengerOSXIntegration::GetStringBundle(nsIStringBundle **aBundle) -{ - NS_ENSURE_ARG_POINTER(aBundle); - nsresult rv; - nsCOMPtr<nsIStringBundleService> bundleService = do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); - nsCOMPtr<nsIStringBundle> bundle; - if (bundleService && NS_SUCCEEDED(rv)) - bundleService->CreateBundle("chrome://messenger/locale/messenger.properties", getter_AddRefs(bundle)); - bundle.swap(*aBundle); - return rv; -} - -void -nsMessengerOSXIntegration::FillToolTipInfo(nsIMsgFolder *aFolder, int32_t aNewCount) -{ - if (aFolder) - { - nsString authors; - int32_t numNotDisplayed; - nsresult rv = GetNewMailAuthors(aFolder, authors, aNewCount, &numNotDisplayed); - - // If all senders are vetoed, the authors string will be empty. - if (NS_FAILED(rv) || authors.IsEmpty()) - return; - - // If this isn't the root folder, get it so we can report for it. - // GetRootFolder always returns the server's root, so calling on the root itself is fine. - nsCOMPtr<nsIMsgFolder> rootFolder; - aFolder->GetRootFolder(getter_AddRefs(rootFolder)); - if (!rootFolder) - return; - - nsString accountName; - rootFolder->GetPrettiestName(accountName); - - nsCOMPtr<nsIStringBundle> bundle; - GetStringBundle(getter_AddRefs(bundle)); - if (bundle) - { - nsAutoString numNewMsgsText; - numNewMsgsText.AppendInt(aNewCount); - nsString finalText; - nsCString uri; - aFolder->GetURI(uri); - - if (numNotDisplayed > 0) - { - nsAutoString numNotDisplayedText; - numNotDisplayedText.AppendInt(numNotDisplayed); - const char16_t *formatStrings[3] = { numNewMsgsText.get(), authors.get(), numNotDisplayedText.get() }; - bundle->FormatStringFromName(u"macBiffNotification_messages_extra", - formatStrings, - 3, - getter_Copies(finalText)); - } - else - { - const char16_t *formatStrings[2] = { numNewMsgsText.get(), authors.get() }; - - if (aNewCount == 1) - { - bundle->FormatStringFromName(u"macBiffNotification_message", - formatStrings, - 2, - getter_Copies(finalText)); - // Since there is only 1 message, use the most recent mail's URI instead of the folder's - nsCOMPtr<nsIMsgDatabase> db; - rv = aFolder->GetMsgDatabase(getter_AddRefs(db)); - if (NS_SUCCEEDED(rv) && db) - { - uint32_t numNewKeys; - uint32_t *newMessageKeys; - rv = db->GetNewList(&numNewKeys, &newMessageKeys); - if (NS_SUCCEEDED(rv)) - { - nsCOMPtr<nsIMsgDBHdr> hdr; - rv = db->GetMsgHdrForKey(newMessageKeys[numNewKeys - 1], - getter_AddRefs(hdr)); - if (NS_SUCCEEDED(rv) && hdr) - aFolder->GetUriForMsg(hdr, uri); - } - NS_Free(newMessageKeys); - } - } - else - bundle->FormatStringFromName(u"macBiffNotification_messages", - formatStrings, - 2, - getter_Copies(finalText)); - } - ShowAlertMessage(accountName, finalText, uri); - } // if we got a bundle - } // if we got a folder -} - -nsresult -nsMessengerOSXIntegration::ShowAlertMessage(const nsAString& aAlertTitle, - const nsAString& aAlertText, - const nsACString& aFolderURI) -{ - nsresult rv; - - nsCOMPtr<nsIAlertsService> alertsService (do_GetService(NS_ALERTSERVICE_CONTRACTID, &rv)); - // If we have an nsIAlertsService implementation, use it: - if (NS_SUCCEEDED(rv)) - { - alertsService->ShowAlertNotification(EmptyString(), - aAlertTitle, aAlertText, true, - NS_ConvertASCIItoUTF16(aFolderURI), - this, EmptyString(), - NS_LITERAL_STRING("auto"), - EmptyString(), EmptyString(), - nullptr, - false, - false); - } - - BounceDockIcon(); - - if (NS_FAILED(rv)) - OnAlertFinished(); - - return rv; -} - -NS_IMETHODIMP -nsMessengerOSXIntegration::OnItemIntPropertyChanged(nsIMsgFolder *aFolder, - nsIAtom *aProperty, - int64_t aOldValue, - int64_t aNewValue) -{ - // if we got new mail show an alert - if (aNewValue == nsIMsgFolder::nsMsgBiffState_NewMail) - { - bool performingBiff = false; - nsCOMPtr<nsIMsgIncomingServer> server; - aFolder->GetServer(getter_AddRefs(server)); - if (server) - server->GetPerformingBiff(&performingBiff); - if (!performingBiff) - return NS_OK; // kick out right now... - - // Biff happens for the root folder, but we want info for the child with new mail - nsCString folderUri; - GetFirstFolderWithNewMail(aFolder, folderUri); - nsCOMPtr<nsIMsgFolder> childFolder; - nsresult rv = aFolder->GetChildWithURI(folderUri, true, true, - getter_AddRefs(childFolder)); - if (NS_FAILED(rv) || !childFolder) - return NS_ERROR_FAILURE; - - int32_t numNewMessages = 0; - childFolder->GetNumNewMessages(true, &numNewMessages); - FillToolTipInfo(childFolder, numNewMessages); - } - else if (mNewMailReceivedAtom == aProperty) - { - FillToolTipInfo(aFolder, aNewValue); - } - return NS_OK; -} - -nsresult -nsMessengerOSXIntegration::OnAlertClicked(const char16_t* aAlertCookie) -{ - openMailWindow(NS_ConvertUTF16toUTF8(aAlertCookie)); - return NS_OK; -} - -#ifdef MOZ_SUITE -nsresult -nsMessengerOSXIntegration::OnAlertClickedSimple() -{ - // SeaMonkey only function; only focus the app here, rest of the work will - // be done in suite/mailnews/mailWidgets.xml - FocusAppNative(); - return NS_OK; -} -#endif - -nsresult -nsMessengerOSXIntegration::OnAlertFinished() -{ - return NS_OK; -} - -nsresult -nsMessengerOSXIntegration::BounceDockIcon() -{ - nsresult rv; - nsCOMPtr<nsIPrefBranch> prefBranch(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); - NS_ENSURE_SUCCESS(rv, rv); - - bool bounceDockIcon = false; - rv = prefBranch->GetBoolPref(kBiffAnimateDockIconPref, &bounceDockIcon); - NS_ENSURE_SUCCESS(rv, rv); - - if (!bounceDockIcon) - return NS_OK; - - nsCOMPtr<nsIWindowMediator> mediator(do_GetService(NS_WINDOWMEDIATOR_CONTRACTID)); - if (mediator) - { - nsCOMPtr<mozIDOMWindowProxy> domWindow; - mediator->GetMostRecentWindow(u"mail:3pane", getter_AddRefs(domWindow)); - if (domWindow) - { - nsCOMPtr<nsIDOMChromeWindow> chromeWindow(do_QueryInterface(domWindow)); - chromeWindow->GetAttention(); - } - } - return NS_OK; -} - -nsresult -nsMessengerOSXIntegration::RestoreDockIcon() -{ - NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT; - - id tile = [[NSApplication sharedApplication] dockTile]; - [tile setBadgeLabel: nil]; - - return NS_OK; - - NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT; -} - -nsresult -nsMessengerOSXIntegration::BadgeDockIcon() -{ - NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT; - - int32_t unreadCount = mUnreadTotal; - // If count is less than one, we should restore the original dock icon. - if (unreadCount < 1) - { - RestoreDockIcon(); - return NS_OK; - } - - // Draw the number, first giving extensions a chance to modify. - // Extensions might wish to transform "1000" into "100+" or some - // other short string. Getting back the empty string will cause - // nothing to be drawn and us to return early. - nsresult rv; - nsCOMPtr<nsIObserverService> os - (do_GetService("@mozilla.org/observer-service;1", &rv)); - if (NS_FAILED(rv)) - { - RestoreDockIcon(); - return rv; - } - - nsCOMPtr<nsISupportsString> str - (do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID, &rv)); - if (NS_FAILED(rv)) - { - RestoreDockIcon(); - return rv; - } - - nsAutoString total; - total.AppendInt(unreadCount); - str->SetData(total); - os->NotifyObservers(str, "before-unread-count-display", - total.get()); - nsAutoString badgeString; - str->GetData(badgeString); - if (badgeString.IsEmpty()) - { - RestoreDockIcon(); - return NS_OK; - } - - id tile = [[NSApplication sharedApplication] dockTile]; - [tile setBadgeLabel:[NSString stringWithFormat:@"%S", (const unichar*)badgeString.get()]]; - return NS_OK; - - NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT; -} - -NS_IMETHODIMP -nsMessengerOSXIntegration::OnItemPropertyFlagChanged(nsIMsgDBHdr *item, nsIAtom *property, uint32_t oldFlag, uint32_t newFlag) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsMessengerOSXIntegration::OnItemAdded(nsIMsgFolder *, nsISupports *) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsMessengerOSXIntegration::OnItemBoolPropertyChanged(nsIMsgFolder *aItem, - nsIAtom *aProperty, - bool aOldValue, - bool aNewValue) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsMessengerOSXIntegration::OnItemEvent(nsIMsgFolder *, nsIAtom *) -{ - return NS_OK; -} - -nsresult -nsMessengerOSXIntegration::GetNewMailAuthors(nsIMsgFolder* aFolder, - nsString& aAuthors, - int32_t aNewCount, - int32_t* aNotDisplayed) -{ - // Get a list of names or email addresses for the folder's authors - // with new mail. Note that we only process the most recent "new" - // mail (aNewCount), working from most recently added. Duplicates - // are removed, and names are displayed to a set limit - // (kMaxDisplayCount) with the remaining count being returned in - // aNotDisplayed. Extension developers can listen for - // "newmail-notification-requested" and then make a decision about - // including a given author or not. As a result, it is possible that - // the resulting length of aAuthors will be 0. - nsCOMPtr<nsIMsgDatabase> db; - nsresult rv = aFolder->GetMsgDatabase(getter_AddRefs(db)); - uint32_t numNewKeys = 0; - if (NS_SUCCEEDED(rv) && db) - { - nsCOMPtr<nsIObserverService> os = - do_GetService("@mozilla.org/observer-service;1", &rv); - NS_ENSURE_SUCCESS(rv, rv); - - // Get proper l10n list separator -- ", " in English - nsCOMPtr<nsIStringBundle> bundle; - GetStringBundle(getter_AddRefs(bundle)); - if (!bundle) - return NS_ERROR_FAILURE; - - uint32_t *newMessageKeys; - rv = db->GetNewList(&numNewKeys, &newMessageKeys); - if (NS_SUCCEEDED(rv)) - { - nsString listSeparator; - bundle->GetStringFromName(u"macBiffNotification_separator", getter_Copies(listSeparator)); - - int32_t displayed = 0; - for (int32_t i = numNewKeys - 1; i >= 0; i--, aNewCount--) - { - if (0 == aNewCount || displayed == kMaxDisplayCount) - break; - - nsCOMPtr<nsIMsgDBHdr> hdr; - rv = db->GetMsgHdrForKey(newMessageKeys[i], - getter_AddRefs(hdr)); - if (NS_SUCCEEDED(rv) && hdr) - { - nsString author; - rv = hdr->GetMime2DecodedAuthor(author); - if (NS_FAILED(rv)) - continue; - - nsString name; - ExtractName(DecodedHeader(author), name); - - // Give extensions a chance to suppress notifications for this author - nsCOMPtr<nsISupportsPRBool> notify = - do_CreateInstance(NS_SUPPORTS_PRBOOL_CONTRACTID); - - notify->SetData(true); - os->NotifyObservers(notify, "newmail-notification-requested", - author.get()); - - bool includeSender; - notify->GetData(&includeSender); - - // Don't add unwanted or duplicate names - if (includeSender && aAuthors.Find(name, true) == -1) - { - if (displayed > 0) - aAuthors.Append(listSeparator); - aAuthors.Append(name); - displayed++; - } - } - } - } - NS_Free(newMessageKeys); - } - *aNotDisplayed = aNewCount; - return rv; -} - -nsresult -nsMessengerOSXIntegration::GetFirstFolderWithNewMail(nsIMsgFolder* aFolder, nsCString& aFolderURI) -{ - // Find the subfolder in aFolder with new mail and return the folderURI - if (aFolder) - { - nsCOMPtr<nsIMsgFolder> msgFolder; - // enumerate over the folders under this root folder till we find one with new mail.... - nsCOMPtr<nsIArray> allFolders; - nsresult rv = aFolder->GetDescendants(getter_AddRefs(allFolders)); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr<nsISimpleEnumerator> enumerator; - rv = allFolders->Enumerate(getter_AddRefs(enumerator)); - if (NS_SUCCEEDED(rv) && enumerator) - { - nsCOMPtr<nsISupports> supports; - int32_t numNewMessages = 0; - bool hasMore = false; - while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) - { - rv = enumerator->GetNext(getter_AddRefs(supports)); - if (NS_SUCCEEDED(rv) && supports) - { - msgFolder = do_QueryInterface(supports, &rv); - if (msgFolder) - { - numNewMessages = 0; - msgFolder->GetNumNewMessages(false, &numNewMessages); - if (numNewMessages) - break; // kick out of the while loop - } - } // if we have a folder - } // if we have more potential folders to enumerate - } // if enumerator - - if (msgFolder) - msgFolder->GetURI(aFolderURI); - } - - return NS_OK; -} - -/* - * Method implementations for mozINewMailListener - */ -NS_IMETHODIMP -nsMessengerOSXIntegration::OnCountChanged(uint32_t count) -{ - mUnreadTotal = count; - BadgeDockIcon(); - return NS_OK; -} diff --git a/mailnews/build/moz.build b/mailnews/build/moz.build index 9620e8f3d4..9561fd33d8 100644 --- a/mailnews/build/moz.build +++ b/mailnews/build/moz.build @@ -35,10 +35,6 @@ if CONFIG['OS_ARCH'] == 'WINNT': else: OS_LIBS += CONFIG['MOZ_ZLIB_LIBS'] -if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': - OS_LIBS += CONFIG['TK_LIBS'] - OS_LIBS += ['-framework Cocoa'] - LOCAL_INCLUDES += [ '/mailnews/addrbook/src', '/mailnews/base/search/src', diff --git a/mailnews/compose/src/moz.build b/mailnews/compose/src/moz.build index dcb9960a66..831a0340f4 100644 --- a/mailnews/compose/src/moz.build +++ b/mailnews/compose/src/moz.build @@ -35,16 +35,6 @@ SOURCES += [ 'nsURLFetcher.cpp', ] -if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': - SOURCES += [ - 'nsMsgAppleDoubleEncode.cpp', - 'nsMsgAppleEncode.cpp', - ] - EXPORTS += [ - 'nsMsgAppleCodes.h', - 'nsMsgAppleDouble.h', - ] - EXTRA_COMPONENTS += [ 'nsSMTPProtocolHandler.js', 'nsSMTPProtocolHandler.manifest', diff --git a/mailnews/compose/src/nsMsgAppleCodes.h b/mailnews/compose/src/nsMsgAppleCodes.h deleted file mode 100644 index d8ca2f327c..0000000000 --- a/mailnews/compose/src/nsMsgAppleCodes.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * 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/. */ - -/* -** AD_Codes.h -** -** --------------- -** -** Head file for Apple Decode/Encode essential codes. -** -** -*/ - -#ifndef ad_codes_h -#define ad_codes_h - -/* -** applefile definitions used -*/ -#if PRAGMA_STRUCT_ALIGN - #pragma options align=mac68k -#endif - -#define APPLESINGLE_MAGIC 0x00051600L -#define APPLEDOUBLE_MAGIC 0x00051607L -#define VERSION 0x00020000 - -#define NUM_ENTRIES 6 - -#define ENT_DFORK 1L -#define ENT_RFORK 2L -#define ENT_NAME 3L -#define ENT_COMMENT 4L -#define ENT_DATES 8L -#define ENT_FINFO 9L -#define CONVERT_TIME 1265437696L - -/* -** data type used in the encoder/decoder. -*/ -typedef struct ap_header -{ - int32_t magic; - int32_t version; - char fill[16]; - int16_t entries; - -} ap_header; - -typedef struct ap_entry -{ - int32_t id; - int32_t offset; - int32_t length; - -} ap_entry; - -typedef struct ap_dates -{ - int32_t create, modify, backup, access; - -} ap_dates; - -typedef struct myFInfo /* the mac FInfo structure for the cross platform. */ -{ - int32_t fdType, fdCreator; - int16_t fdFlags; - int32_t fdLocation; /* it really should be a pointer, but just a place-holder */ - int16_t fdFldr; - -} myFInfo; - -PR_BEGIN_EXTERN_C -/* -** string utils. -*/ -int write_stream(appledouble_encode_object *p_ap_encode_obj, const char *s,int len); - -int fill_apple_mime_header(appledouble_encode_object *p_ap_encode_obj); -int ap_encode_file_infor(appledouble_encode_object *p_ap_encode_obj); -int ap_encode_header(appledouble_encode_object* p_ap_encode_obj, bool firstTime); -int ap_encode_data( appledouble_encode_object* p_ap_encode_obj, bool firstTime); - -/* -** the prototypes for the ap_decoder. -*/ -int fetch_a_line(appledouble_decode_object* p_ap_decode_obj, char *buff); -int ParseFileHeader(appledouble_decode_object* p_ap_decode_obj); -int ap_seek_part_start(appledouble_decode_object* p_ap_decode_obj); -void parse_param(char *p, char **param, char**define, char **np); -int ap_seek_to_boundary(appledouble_decode_object* p_ap_decode_obj, bool firstime); -int ap_parse_header(appledouble_decode_object* p_ap_decode_obj,bool firstime); -int ap_decode_file_infor(appledouble_decode_object* p_ap_decode_obj); -int ap_decode_process_header(appledouble_decode_object* p_ap_decode_obj, bool firstime); -int ap_decode_process_data( appledouble_decode_object* p_ap_decode_obj, bool firstime); - -PR_END_EXTERN_C - -#if PRAGMA_STRUCT_ALIGN - #pragma options align=reset -#endif - -#endif /* ad_codes_h */ diff --git a/mailnews/compose/src/nsMsgAppleDouble.h b/mailnews/compose/src/nsMsgAppleDouble.h deleted file mode 100644 index f4ae934add..0000000000 --- a/mailnews/compose/src/nsMsgAppleDouble.h +++ /dev/null @@ -1,207 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * 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/. */ - -/* -* AppleDouble.h -* ------------- -* -* The header file for a stream based apple single/double encodor/decodor. -* -* 2aug95 mym -* -*/ - - -#ifndef AppleDouble_h -#define AppleDouble_h - -#include "msgCore.h" -#include "nsComposeStrings.h" -#include "nsIOutputStream.h" -#include "nsCOMPtr.h" - -#include <CoreServices/CoreServices.h> - -#define NOERR 0 -#define errDone 1 - /* Done with current operation. */ -#define errEOB 2 - /* End of a buffer. */ -#define errEOP 3 - /* End of a Part. */ - - -#define errFileOpen NS_ERROR_GET_CODE(NS_MSG_UNABLE_TO_OPEN_TMP_FILE) -#define errFileWrite -202 /*Error writing temporary file.*/ -#define errUsrCancel -2 /*MK_INTERRUPTED */ -#define errDecoding -1 - -/* -** The envirment block data type. -*/ -enum -{ - kInit, - kDoingHeaderPortion, - kDoneHeaderPortion, - kDoingDataPortion, - kDoneDataPortion -}; - -typedef struct _appledouble_encode_object -{ - char fname[256]; - FSIORefNum fileId; /* the id for the open file (data/resource fork) */ - - int state; - int text_file_type; /* if the file has a text file type with it. */ - char *boundary; /* the boundary string. */ - - int status; /* the error code if anyerror happens. */ - char b_overflow[200]; - int s_overflow; - - int state64; /* the left over state of base64 enocding */ - int ct; /* the character count of base64 encoding */ - int c1, c2; /* the left of the last base64 encoding */ - - char *outbuff; /* the outbuff by the caller. */ - int s_outbuff; /* the size of the buffer. */ - int pos_outbuff; /* the offset in the current buffer. */ - -} appledouble_encode_object; - -/* The possible content transfer encodings */ - -enum -{ - kEncodeNone, - kEncodeQP, - kEncodeBase64, - kEncodeUU -}; - -enum -{ - kGeneralMine, - kAppleDouble, - kAppleSingle -}; - -enum -{ - kInline, - kDontCare -}; - -enum -{ - kHeaderPortion, - kDataPortion -}; - -/* the decode states. */ -enum -{ - kBeginParseHeader = 3, - kParsingHeader, - kBeginSeekBoundary, - kSeekingBoundary, - kBeginHeaderPortion, - kProcessingHeaderPortion, - kBeginDataPortion, - kProcessingDataPortion, - kFinishing -}; - -/* uuencode states */ -enum -{ - kWaitingForBegin = (int) 0, - kBegin, - kMainBody, - kEnd -}; - -typedef struct _appledouble_decode_object -{ - int is_binary; - int is_apple_single; /* if the object encoded is in apple single */ - int write_as_binhex; - - int messagetype; - char* boundary0; /* the boundary for the enclosure. */ - int deposition; /* the deposition. */ - int encoding; /* the encoding method. */ - int which_part; - - char fname[256]; - // nsIOFileStream *fileSpec; /* the stream for data fork work. */ - - int state; - - int rksize; /* the resource fork size count. */ - int dksize; /* the data fork size count. */ - - int status; /* the error code if anyerror happens. */ - char b_leftover[256]; - int s_leftover; - - int encode; /* the encode type of the message. */ - int state64; /* the left over state of base64 enocding */ - int left; /* the character count of base64 encoding */ - int c[4]; /* the left of the last base64 encoding */ - int uu_starts_line; /* is decoder at the start of a line? (uuencode) */ - int uu_state; /* state w/r/t the uuencode body */ - int uu_bytes_written; /* bytes written from the current tuple (uuencode) */ - int uu_line_bytes; /* encoded bytes remaining in the current line (uuencode) */ - - char *inbuff; /* the outbuff by the caller. */ - int s_inbuff; /* the size of the buffer. */ - int pos_inbuff; /* the offset in the current buffer. */ - - - nsCOMPtr <nsIFile> tmpFile; /* the temp file to hold the decode data fork */ - /* when doing the binhex exporting. */ - nsCOMPtr <nsIOutputStream> tmpFileStream; /* The output File Stream */ - int32_t data_size; /* the size of the data in the tmp file. */ - -} appledouble_decode_object; - - -/* -** The protypes. -*/ - -PR_BEGIN_EXTERN_C - -int ap_encode_init(appledouble_encode_object *p_ap_encode_obj, - const char* fname, - char* separator); - -int ap_encode_next(appledouble_encode_object* p_ap_encode_obj, - char *to_buff, - int32_t buff_size, - int32_t* real_size); - -int ap_encode_end(appledouble_encode_object* p_ap_encode_obj, - bool is_aborting); - -int ap_decode_init(appledouble_decode_object* p_ap_decode_obj, - bool is_apple_single, - bool write_as_bin_hex, - void *closure); - -int ap_decode_next(appledouble_decode_object* p_ap_decode_obj, - char *in_buff, - int32_t buff_size); - -int ap_decode_end(appledouble_decode_object* p_ap_decode_obj, - bool is_aborting); - -PR_END_EXTERN_C - -#endif diff --git a/mailnews/compose/src/nsMsgAppleDoubleEncode.cpp b/mailnews/compose/src/nsMsgAppleDoubleEncode.cpp deleted file mode 100644 index 4d71781233..0000000000 --- a/mailnews/compose/src/nsMsgAppleDoubleEncode.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * 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/. */ - -/* -* -* apple-double.c -* -------------- -* -* The codes to do apple double encoding/decoding. -* -* 02aug95 mym created. -* -*/ -#include "nsID.h" -#include "nscore.h" -#include "nsStringGlue.h" -#include "nsMsgAppleDouble.h" -#include "nsMsgAppleCodes.h" -#include "nsMsgCompUtils.h" -#include "nsCExternalHandlerService.h" -#include "nsIMIMEService.h" -#include "nsMimeTypes.h" -#include "prmem.h" -#include "nsNetUtil.h" - - -void -MacGetFileType(nsIFile *fs, - bool *useDefault, - char **fileType, - char **encoding) -{ - if ((fs == NULL) || (fileType == NULL) || (encoding == NULL)) - return; - - bool exists = false; - fs->Exists(&exists); - if (!exists) - return; - - *useDefault = TRUE; - *fileType = NULL; - *encoding = NULL; - - nsCOMPtr<nsILocalFileMac> macFile = do_QueryInterface(fs); - FSRef fsRef; - FSCatalogInfo catalogInfo; - OSErr err = errFileOpen; - if (NS_SUCCEEDED(macFile->GetFSRef(&fsRef))) - err = ::FSGetCatalogInfo(&fsRef, kFSCatInfoFinderInfo, &catalogInfo, nullptr, nullptr, nullptr); - - if ( (err != noErr) || (((FileInfo*)(&catalogInfo.finderInfo))->fileType == 'TEXT') ) - *fileType = strdup(APPLICATION_OCTET_STREAM); - else - { - // At this point, we should call the mime service and - // see what we can find out? - nsresult rv; - nsCOMPtr <nsIURI> tURI; - if (NS_SUCCEEDED(NS_NewFileURI(getter_AddRefs(tURI), fs)) && tURI) - { - nsCOMPtr<nsIMIMEService> mimeFinder (do_GetService(NS_MIMESERVICE_CONTRACTID, &rv)); - if (NS_SUCCEEDED(rv) && mimeFinder) - { - nsAutoCString mimeType; - rv = mimeFinder->GetTypeFromURI(tURI, mimeType); - if (NS_SUCCEEDED(rv)) - { - *fileType = ToNewCString(mimeType); - return; - } - } - } - - // If we hit here, return something...default to this... - *fileType = strdup(APPLICATION_OCTET_STREAM); - } -} - -//#pragma cplusplus reset - -/* -* ap_encode_init -* -------------- -* -* Setup the encode envirment -*/ - -int ap_encode_init( appledouble_encode_object *p_ap_encode_obj, - const char *fname, - char *separator) -{ - nsCOMPtr <nsIFile> myFile; - NS_NewNativeLocalFile(nsDependentCString(fname), true, getter_AddRefs(myFile)); - bool exists; - if (myFile && NS_SUCCEEDED(myFile->Exists(&exists)) && !exists) - return -1; - - nsCOMPtr<nsILocalFileMac> macFile = do_QueryInterface(myFile); - nsAutoCString path; - macFile->GetNativePath(path); - - memset(p_ap_encode_obj, 0, sizeof(appledouble_encode_object)); - - /* - ** Fill out the source file inforamtion. - */ - memcpy(p_ap_encode_obj->fname, path.get(), path.Length()); - p_ap_encode_obj->fname[path.Length()] = '\0'; - - p_ap_encode_obj->boundary = strdup(separator); - return noErr; -} - -/* -** ap_encode_next -** -------------- -** -** return : -** noErr : everything is ok -** errDone : when encoding is done. -** errors : otherwise. -*/ -int ap_encode_next( - appledouble_encode_object* p_ap_encode_obj, - char *to_buff, - int32_t buff_size, - int32_t* real_size) -{ - int status; - - /* - ** install the out buff now. - */ - p_ap_encode_obj->outbuff = to_buff; - p_ap_encode_obj->s_outbuff = buff_size; - p_ap_encode_obj->pos_outbuff = 0; - - /* - ** first copy the outstandind data in the overflow buff to the out buffer. - */ - if (p_ap_encode_obj->s_overflow) - { - status = write_stream(p_ap_encode_obj, - (const char*)(p_ap_encode_obj->b_overflow), - p_ap_encode_obj->s_overflow); - if (status != noErr) - return status; - - p_ap_encode_obj->s_overflow = 0; - } - - /* - ** go the next processing stage based on the current state. - */ - switch (p_ap_encode_obj->state) - { - case kInit: - /* - ** We are in the starting position, fill out the header. - */ - status = fill_apple_mime_header(p_ap_encode_obj); - if (status != noErr) - break; /* some error happens */ - - p_ap_encode_obj->state = kDoingHeaderPortion; - status = ap_encode_header(p_ap_encode_obj, true); - /* it is the first time to calling */ - if (status == errDone) - { - p_ap_encode_obj->state = kDoneHeaderPortion; - } - else - { - break; /* we need more work on header portion. */ - } - - /* - ** we are done with the header, so let's go to the data port. - */ - p_ap_encode_obj->state = kDoingDataPortion; - status = ap_encode_data(p_ap_encode_obj, true); - /* it is first time call do data portion */ - - if (status == errDone) - { - p_ap_encode_obj->state = kDoneDataPortion; - status = noErr; - } - break; - - case kDoingHeaderPortion: - - status = ap_encode_header(p_ap_encode_obj, false); - /* continue with the header portion. */ - if (status == errDone) - { - p_ap_encode_obj->state = kDoneHeaderPortion; - } - else - { - break; /* we need more work on header portion. */ - } - - /* - ** start the data portion. - */ - p_ap_encode_obj->state = kDoingDataPortion; - status = ap_encode_data(p_ap_encode_obj, true); - /* it is the first time calling */ - if (status == errDone) - { - p_ap_encode_obj->state = kDoneDataPortion; - status = noErr; - } - break; - - case kDoingDataPortion: - - status = ap_encode_data(p_ap_encode_obj, false); - /* it is not the first time */ - - if (status == errDone) - { - p_ap_encode_obj->state = kDoneDataPortion; - status = noErr; - } - break; - - case kDoneDataPortion: - status = errDone; /* we are really done. */ - - break; - } - - *real_size = p_ap_encode_obj->pos_outbuff; - return status; -} - -/* -** ap_encode_end -** ------------- -** -** clear the apple encoding. -*/ - -int ap_encode_end( - appledouble_encode_object *p_ap_encode_obj, - bool is_aborting) -{ - /* - ** clear up the apple doubler. - */ - if (p_ap_encode_obj == NULL) - return noErr; - - if (p_ap_encode_obj->fileId) /* close the file if it is open. */ - ::FSCloseFork(p_ap_encode_obj->fileId); - - PR_FREEIF(p_ap_encode_obj->boundary); /* the boundary string. */ - - return noErr; -} diff --git a/mailnews/compose/src/nsMsgAppleEncode.cpp b/mailnews/compose/src/nsMsgAppleEncode.cpp deleted file mode 100644 index 27e39a8cda..0000000000 --- a/mailnews/compose/src/nsMsgAppleEncode.cpp +++ /dev/null @@ -1,703 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * 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/. */ - -/* - * - * apple_double_encode.c - * --------------------- - * - * The routines doing the Apple Double Encoding. - * - * 2aug95 mym Created. - * - */ - -#include "nscore.h" -#include "nsStringGlue.h" -#include "nsMimeTypes.h" -#include "prprf.h" -#include "nsServiceManagerUtils.h" -#include "nsMsgAppleDouble.h" -#include "nsMsgAppleCodes.h" -#include "nsILocalFileMac.h" - -/* -** Local Functions prototypes. -*/ -static int output64chunk( appledouble_encode_object* p_ap_encode_obj, - int c1, int c2, int c3, int pads); - -static int to64(appledouble_encode_object* p_ap_encode_obj, - char *p, - int in_size); - -static int finish64(appledouble_encode_object* p_ap_encode_obj); - - -#define BUFF_LEFT(p) ((p)->s_outbuff - (p)->pos_outbuff) - -/* -** write_stream. -*/ -int write_stream( - appledouble_encode_object *p_ap_encode_obj, - const char *out_string, - int len) -{ - if (p_ap_encode_obj->pos_outbuff + len < p_ap_encode_obj->s_outbuff) - { - memcpy(p_ap_encode_obj->outbuff + p_ap_encode_obj->pos_outbuff, - out_string, - len); - p_ap_encode_obj->pos_outbuff += len; - return noErr; - } - else - { - /* - ** If the buff doesn't have enough space, use the overflow buffer then. - */ - int s_len = p_ap_encode_obj->s_outbuff - p_ap_encode_obj->pos_outbuff; - - memcpy(p_ap_encode_obj->outbuff + p_ap_encode_obj->pos_outbuff, - out_string, - s_len); - memcpy(p_ap_encode_obj->b_overflow + p_ap_encode_obj->s_overflow, - out_string + s_len, - p_ap_encode_obj->s_overflow += (len - s_len)); - p_ap_encode_obj->pos_outbuff += s_len; - return errEOB; - } -} - -int fill_apple_mime_header( - appledouble_encode_object *p_ap_encode_obj) -{ - int status; - - char tmpstr[266]; - -#if 0 -// strcpy(tmpstr, "Content-Type: multipart/mixed; boundary=\"-\"\n\n---\n"); -// status = write_stream(p_ap_encode_env, -// tmpstr, -// strlen(tmpstr)); -// if (status != noErr) -// return status; - - PR_snprintf(tmpstr, sizeof(tmpstr), - "Content-Type: multipart/appledouble; boundary=\"=\"; name=\""); - status = write_stream(p_ap_encode_obj, (const char*)tmpstr, strlen(tmpstr)); - if (status != noErr) - return status; - - status = write_stream(p_ap_encode_obj, - p_ap_encode_obj->fname, - strlen(p_ap_encode_obj->fname)); - if (status != noErr) - return status; - - PR_snprintf(tmpstr, sizeof(tmpstr), - "\"\r\nContent-Disposition: inline; filename=\"%s\"\r\n\r\n\r\n--=\r\n", - p_ap_encode_obj->fname); -#endif /* 0 */ - PR_snprintf(tmpstr, sizeof(tmpstr), "--%s" CRLF, p_ap_encode_obj->boundary); - status = write_stream(p_ap_encode_obj, (const char*)tmpstr, strlen(tmpstr)); - return status; -} - -int ap_encode_file_infor( - appledouble_encode_object *p_ap_encode_obj) -{ - ap_header head; - ap_entry entries[NUM_ENTRIES]; - ap_dates dates; - short i; - long comlen; - char comment[256]; - int status; - - nsCOMPtr <nsIFile> resFile; - NS_NewNativeLocalFile(nsDependentCString(p_ap_encode_obj->fname), true, - getter_AddRefs(resFile)); - if (!resFile) - return errFileOpen; - - FSRef ref; - nsCOMPtr <nsILocalFileMac> macFile = do_QueryInterface(resFile); - if (NS_FAILED(macFile->GetFSRef(&ref))) - return errFileOpen; - - FSCatalogInfo catalogInfo; - if (::FSGetCatalogInfo(&ref, kFSCatInfoFinderInfo, &catalogInfo, nullptr, nullptr, nullptr) != noErr) - { - return errFileOpen; - } - - /* get a file comment, if possible */ -#if 1 - // Carbon doesn't support GetWDInfo(). (Bug 555684) - - // not sure why working directories are needed here... - comlen = 0; -#else - long procID; - procID = 0; - GetWDInfo(p_ap_encode_obj->vRefNum, &fpb->ioVRefNum, &fpb->ioDirID, &procID); - IOParam vinfo; - memset((void *) &vinfo, '\0', sizeof (vinfo)); - GetVolParmsInfoBuffer vp; - vinfo.ioCompletion = nil; - vinfo.ioVRefNum = fpb->ioVRefNum; - vinfo.ioBuffer = (Ptr) &vp; - vinfo.ioReqCount = sizeof (vp); - comlen = 0; - if (PBHGetVolParmsSync((HParmBlkPtr) &vinfo) == noErr && - ((vp.vMAttrib >> bHasDesktopMgr) & 1)) - { - DTPBRec dtp; - memset((void *) &dtp, '\0', sizeof (dtp)); - dtp.ioVRefNum = fpb->ioVRefNum; - if (PBDTGetPath(&dtp) == noErr) - { - dtp.ioCompletion = nil; - dtp.ioDTBuffer = (Ptr) comment; - dtp.ioNamePtr = fpb->ioNamePtr; - dtp.ioDirID = fpb->ioFlParID; - if (PBDTGetCommentSync(&dtp) == noErr) - comlen = dtp.ioDTActCount; - } - } -#endif /* ! 1 */ - - /* write header */ -// head.magic = dfork ? APPLESINGLE_MAGIC : APPLEDOUBLE_MAGIC; - head.magic = APPLEDOUBLE_MAGIC; /* always do apple double */ - head.version = VERSION; - memset(head.fill, '\0', sizeof (head.fill)); - head.entries = NUM_ENTRIES - 1; - status = to64(p_ap_encode_obj, - (char *) &head, - sizeof (head)); - if (status != noErr) - return status; - - /* write entry descriptors */ - nsAutoCString leafname; - macFile->GetNativeLeafName(leafname); - entries[0].offset = sizeof (head) + sizeof (ap_entry) * head.entries; - entries[0].id = ENT_NAME; - entries[0].length = leafname.Length(); - entries[1].id = ENT_FINFO; - entries[1].length = sizeof (FInfo) + sizeof (FXInfo); - entries[2].id = ENT_DATES; - entries[2].length = sizeof (ap_dates); - entries[3].id = ENT_COMMENT; - entries[3].length = comlen; - entries[4].id = ENT_RFORK; - entries[4].length = catalogInfo.rsrcLogicalSize; - entries[5].id = ENT_DFORK; - entries[5].length = catalogInfo.dataLogicalSize; - - /* correct the link in the entries. */ - for (i = 1; i < NUM_ENTRIES; ++i) - { - entries[i].offset = entries[i-1].offset + entries[i-1].length; - } - status = to64(p_ap_encode_obj, - (char *) entries, - sizeof (ap_entry) * head.entries); - if (status != noErr) - return status; - - /* write name */ - status = to64(p_ap_encode_obj, - (char *) leafname.get(), - leafname.Length()); - if (status != noErr) - return status; - - /* write finder info */ - status = to64(p_ap_encode_obj, - (char *) &catalogInfo.finderInfo, - sizeof (FInfo)); - if (status != noErr) - return status; - - status = to64(p_ap_encode_obj, - (char *) &catalogInfo.extFinderInfo, - sizeof (FXInfo)); - if (status != noErr) - return status; - - /* write dates */ - dates.create = catalogInfo.createDate.lowSeconds + CONVERT_TIME; - dates.modify = catalogInfo.contentModDate.lowSeconds + CONVERT_TIME; - dates.backup = catalogInfo.backupDate.lowSeconds + CONVERT_TIME; - dates.access = catalogInfo.accessDate.lowSeconds + CONVERT_TIME; - status = to64(p_ap_encode_obj, - (char *) &dates, - sizeof (ap_dates)); - if (status != noErr) - return status; - - /* write comment */ - if (comlen) - { - status = to64(p_ap_encode_obj, - comment, - comlen * sizeof(char)); - } - /* - ** Get some help information on deciding the file type. - */ - if (((FileInfo*)(&catalogInfo.finderInfo))->fileType == 'TEXT' || - ((FileInfo*)(&catalogInfo.finderInfo))->fileType == 'text') - { - p_ap_encode_obj->text_file_type = true; - } - - return status; -} -/* -** ap_encode_header -** -** encode the file header and the resource fork. -** -*/ -int ap_encode_header( - appledouble_encode_object* p_ap_encode_obj, - bool firstime) -{ - char rd_buff[256]; - FSIORefNum fileId; - OSErr retval = noErr; - int status; - ByteCount inCount; - - if (firstime) - { - PL_strcpy(rd_buff, - "Content-Type: application/applefile\r\nContent-Transfer-Encoding: base64\r\n\r\n"); - status = write_stream(p_ap_encode_obj, (const char*)rd_buff, strlen(rd_buff)); - if (status != noErr) - return status; - - status = ap_encode_file_infor(p_ap_encode_obj); - if (status != noErr) - return status; - - /* - ** preparing to encode the resource fork. - */ - nsCOMPtr <nsIFile> myFile; - NS_NewNativeLocalFile(nsDependentCString(p_ap_encode_obj->fname), true, getter_AddRefs(myFile)); - if (!myFile) - return errFileOpen; - - FSRef ref; - nsCOMPtr <nsILocalFileMac> macFile = do_QueryInterface(myFile); - if (NS_FAILED(macFile->GetFSRef(&ref))) - return errFileOpen; - - HFSUniStr255 forkName; - ::FSGetResourceForkName(&forkName); - retval = ::FSOpenFork(&ref, forkName.length, forkName.unicode, fsRdPerm, &p_ap_encode_obj->fileId); - if (retval != noErr) - return retval; - } - - fileId = p_ap_encode_obj->fileId; - while (retval == noErr) - { - if (BUFF_LEFT(p_ap_encode_obj) < 400) - break; - - inCount = 0; - retval = ::FSReadFork(fileId, fsAtMark, 0, 256, rd_buff, &inCount); - if (inCount) - { - status = to64(p_ap_encode_obj, - rd_buff, - inCount); - if (status != noErr) - return status; - } - } - - if (retval == eofErr) - { - ::FSCloseFork(fileId); - p_ap_encode_obj->fileId = 0; - - status = finish64(p_ap_encode_obj); - if (status != noErr) - return status; - - /* - ** write out the boundary - */ - PR_snprintf(rd_buff, sizeof(rd_buff), - CRLF "--%s" CRLF, - p_ap_encode_obj->boundary); - - status = write_stream(p_ap_encode_obj, (const char*)rd_buff, strlen(rd_buff)); - if (status == noErr) - status = errDone; - } - return status; -} - -#if 0 -// This is unused for now and Clang complains about that is it is ifdefed out -static void replace(char *p, int len, char frm, char to) -{ - for (; len > 0; len--, p++) - if (*p == frm) *p = to; -} -#endif - -/* Description of the various file formats and their magic numbers */ -struct magic -{ - const char *name; /* Name of the file format */ - const char *num; /* The magic number */ - int len; /* Length (0 means strlen(magicnum)) */ -}; - -/* The magic numbers of the file formats we know about */ -static struct magic magic[] = -{ - { "image/gif", "GIF", 0 }, - { "image/jpeg", "\377\330\377", 0 }, - { "video/mpeg", "\0\0\001\263", 4 }, - { "application/postscript", "%!", 0 }, -}; -static int num_magic = MOZ_ARRAY_LENGTH(magic); - -static const char *text_type = TEXT_PLAIN; /* the text file type. */ -static const char *default_type = APPLICATION_OCTET_STREAM; - - -/* - * Determins the format of the file "inputf". The name - * of the file format (or NULL on error) is returned. - */ -static const char *magic_look(char *inbuff, int numread) -{ - int i, j; - - for (i=0; i<num_magic; i++) - { - if (magic[i].len == 0) - magic[i].len = strlen(magic[i].num); - } - - for (i=0; i<num_magic; i++) - { - if (numread >= magic[i].len) - { - for (j=0; j<magic[i].len; j++) - { - if (inbuff[j] != magic[i].num[j]) break; - } - - if (j == magic[i].len) - return magic[i].name; - } - } - - return default_type; -} -/* -** ap_encode_data -** -** --------------- -** -** encode on the data fork. -** -*/ -int ap_encode_data( - appledouble_encode_object* p_ap_encode_obj, - bool firstime) -{ - char rd_buff[256]; - FSIORefNum fileId; - OSErr retval = noErr; - ByteCount in_count; - int status; - - if (firstime) - { - const char* magic_type; - - /* - ** preparing to encode the data fork. - */ - nsCOMPtr <nsIFile> resFile; - NS_NewNativeLocalFile(nsDependentCString(p_ap_encode_obj->fname), true, - getter_AddRefs(resFile)); - if (!resFile) - return errFileOpen; - - FSRef ref; - nsCOMPtr <nsILocalFileMac> macFile = do_QueryInterface(resFile); - if (NS_FAILED(macFile->GetFSRef(&ref))) - return errFileOpen; - - HFSUniStr255 forkName; - ::FSGetDataForkName(&forkName); - retval = ::FSOpenFork(&ref, forkName.length, forkName.unicode, fsRdPerm, &fileId); - if (retval != noErr) - return retval; - - p_ap_encode_obj->fileId = fileId; - - - if (!p_ap_encode_obj->text_file_type) - { - /* - ** do a smart check for the file type. - */ - in_count = 0; - retval = ::FSReadFork(fileId, fsFromStart, 0, 256, rd_buff, &in_count); - magic_type = magic_look(rd_buff, in_count); - - /* don't forget to rewind the index to start point. */ - ::FSSetForkPosition(fileId, fsFromStart, 0); - /* and reset retVal just in case... */ - if (retval == eofErr) - retval = noErr; - } - else - { - magic_type = text_type; /* we already know it is a text type. */ - } - - /* - ** the data portion header information. - */ - nsAutoCString leafName; - resFile->GetNativeLeafName(leafName); - PR_snprintf(rd_buff, sizeof(rd_buff), - "Content-Type: %s; name=\"%s\"" CRLF "Content-Transfer-Encoding: base64" CRLF "Content-Disposition: inline; filename=\"%s\"" CRLF CRLF, - magic_type, - leafName.get(), - leafName.get()); - - status = write_stream(p_ap_encode_obj, (const char*)rd_buff, strlen(rd_buff)); - if (status != noErr) - return status; - } - - while (retval == noErr) - { - if (BUFF_LEFT(p_ap_encode_obj) < 400) - break; - - in_count = 0; - retval = ::FSReadFork(p_ap_encode_obj->fileId, fsAtMark, 0, 256, rd_buff, &in_count); - if (in_count) - { -#if 0 -/* replace(rd_buff, in_count, '\r', '\n'); */ -#endif -/* ** may be need to do character set conversion here for localization. ** */ - status = to64(p_ap_encode_obj, - rd_buff, - in_count); - if (status != noErr) - return status; - } - } - - if (retval == eofErr) - { - ::FSCloseFork(p_ap_encode_obj->fileId); - p_ap_encode_obj->fileId = 0; - - status = finish64(p_ap_encode_obj); - if (status != noErr) - return status; - - /* write out the boundary */ - - PR_snprintf(rd_buff, sizeof(rd_buff), - CRLF "--%s--" CRLF CRLF, - p_ap_encode_obj->boundary); - - status = write_stream(p_ap_encode_obj, (const char*)rd_buff, strlen(rd_buff)); - - if (status == noErr) - status = errDone; - } - return status; -} - -static char basis_64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -/* -** convert the stream in the inbuff to 64 format and put it in the out buff. -** To make the life easier, the caller will responcable of the cheking of the outbuff's bundary. -*/ -static int -to64(appledouble_encode_object* p_ap_encode_obj, - char *p, - int in_size) -{ - int status; - int c1, c2, c3, ct; - unsigned char *inbuff = (unsigned char*)p; - - ct = p_ap_encode_obj->ct; /* the char count left last time. */ - - /* - ** resume the left state of the last conversion. - */ - switch (p_ap_encode_obj->state64) - { - case 0: - p_ap_encode_obj->c1 = c1 = *inbuff ++; - if (--in_size <= 0) - { - p_ap_encode_obj->state64 = 1; - return noErr; - } - p_ap_encode_obj->c2 = c2 = *inbuff ++; - if (--in_size <= 0) - { - p_ap_encode_obj->state64 = 2; - return noErr; - } - c3 = *inbuff ++; --in_size; - break; - case 1: - c1 = p_ap_encode_obj->c1; - p_ap_encode_obj->c2 = c2 = *inbuff ++; - if (--in_size <= 0) - { - p_ap_encode_obj->state64 = 2; - return noErr; - } - c3 = *inbuff ++; --in_size; - break; - case 2: - c1 = p_ap_encode_obj->c1; - c2 = p_ap_encode_obj->c2; - c3 = *inbuff ++; --in_size; - break; - } - - while (in_size >= 0) - { - status = output64chunk(p_ap_encode_obj, - c1, - c2, - c3, - 0); - if (status != noErr) - return status; - - ct += 4; - if (ct > 71) - { - status = write_stream(p_ap_encode_obj, - CRLF, - 2); - if (status != noErr) - return status; - - ct = 0; - } - - if (in_size <= 0) - { - p_ap_encode_obj->state64 = 0; - break; - } - - c1 = (int)*inbuff++; - if (--in_size <= 0) - { - p_ap_encode_obj->c1 = c1; - p_ap_encode_obj->state64 = 1; - break; - } - c2 = *inbuff++; - if (--in_size <= 0) - { - p_ap_encode_obj->c1 = c1; - p_ap_encode_obj->c2 = c2; - p_ap_encode_obj->state64 = 2; - break; - } - c3 = *inbuff++; - in_size--; - } - p_ap_encode_obj->ct = ct; - return status; -} - -/* -** clear the left base64 encodes. -*/ -static int -finish64(appledouble_encode_object* p_ap_encode_obj) -{ - int status; - - switch (p_ap_encode_obj->state64) - { - case 0: - break; - case 1: - status = output64chunk(p_ap_encode_obj, - p_ap_encode_obj->c1, - 0, - 0, - 2); - break; - case 2: - status = output64chunk(p_ap_encode_obj, - p_ap_encode_obj->c1, - p_ap_encode_obj->c2, - 0, - 1); - break; - } - status = write_stream(p_ap_encode_obj, CRLF, 2); - p_ap_encode_obj->state64 = 0; - p_ap_encode_obj->ct = 0; - return status; -} - -static int output64chunk( - appledouble_encode_object* p_ap_encode_obj, - int c1, int c2, int c3, int pads) -{ - char tmpstr[32]; - char *p = tmpstr; - - *p++ = basis_64[c1>>2]; - *p++ = basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)]; - if (pads == 2) - { - *p++ = '='; - *p++ = '='; - } - else if (pads) - { - *p++ = basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)]; - *p++ = '='; - } - else - { - *p++ = basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)]; - *p++ = basis_64[c3 & 0x3F]; - } - return write_stream(p_ap_encode_obj, (const char*) tmpstr, p-tmpstr); -} diff --git a/mailnews/import/build/moz.build b/mailnews/import/build/moz.build index e8ac0751f5..58814a6940 100644 --- a/mailnews/import/build/moz.build +++ b/mailnews/import/build/moz.build @@ -35,13 +35,6 @@ LOCAL_INCLUDES += [ '../vcard/src', ] -if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': - LOCAL_INCLUDES += [ - '../applemail/src', - ] - OS_LIBS += CONFIG['TK_LIBS'] - OS_LIBS += ['-framework Cocoa'] - if CONFIG['OS_ARCH'] == 'WINNT': LOCAL_INCLUDES += [ ] |