From 30fb25a53ab5c9f57d00c8e4730f9ee9aaf6b3a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kan=20Waara?= Date: Wed, 20 Aug 2008 08:58:58 +0200 Subject: [PATCH] bug 394901 - modernize nsIUserInfo and make it actually working (for example for non-ASCII names) on mac. r=vlad --- toolkit/components/build/Makefile.in | 4 +- toolkit/components/startup/src/Makefile.in | 2 +- .../components/startup/src/nsUserInfoMac.cpp | 142 ------------------ .../components/startup/src/nsUserInfoMac.h | 23 +-- .../components/startup/src/nsUserInfoMac.mm | 115 ++++++++++++++ 5 files changed, 123 insertions(+), 163 deletions(-) delete mode 100644 toolkit/components/startup/src/nsUserInfoMac.cpp create mode 100644 toolkit/components/startup/src/nsUserInfoMac.mm diff --git a/toolkit/components/build/Makefile.in b/toolkit/components/build/Makefile.in index 2a605d4f2a9a..f8c79a23bf6b 100644 --- a/toolkit/components/build/Makefile.in +++ b/toolkit/components/build/Makefile.in @@ -159,7 +159,9 @@ EXTRA_DSO_LDOPTS += \ $(NULL) ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT))) -EXTRA_DSO_LDOPTS += $(TK_LIBS) +EXTRA_DSO_LDOPTS += $(TK_LIBS) \ + -framework AddressBook \ + $(NULL) endif ifeq ($(OS_ARCH),WINNT) diff --git a/toolkit/components/startup/src/Makefile.in b/toolkit/components/startup/src/Makefile.in index 7a4f05876cb9..dbeb0c1f3a8f 100644 --- a/toolkit/components/startup/src/Makefile.in +++ b/toolkit/components/startup/src/Makefile.in @@ -74,7 +74,7 @@ ifeq (,$(filter-out WINCE WINNT,$(OS_ARCH))) CPPSRCS += nsUserInfoWin.cpp else ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT))) -CPPSRCS += nsUserInfoMac.cpp +CMMSRCS += nsUserInfoMac.mm else CPPSRCS += nsUserInfoUnix.cpp endif diff --git a/toolkit/components/startup/src/nsUserInfoMac.cpp b/toolkit/components/startup/src/nsUserInfoMac.cpp deleted file mode 100644 index 2fc15a5ff547..000000000000 --- a/toolkit/components/startup/src/nsUserInfoMac.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsUserInfo.h" -#include "nsString.h" -#include "nsReadableUtils.h" - -#include "nsIServiceManager.h" -#include "nsIInternetConfigService.h" - -nsUserInfo::nsUserInfo() -{ -} - -nsUserInfo::~nsUserInfo() -{ -} - -NS_IMPL_ISUPPORTS1(nsUserInfo,nsIUserInfo) - -NS_IMETHODIMP -nsUserInfo::GetFullname(PRUnichar **aFullname) -{ - nsresult result = NS_ERROR_FAILURE; - nsCOMPtr icService (do_GetService(NS_INTERNETCONFIGSERVICE_CONTRACTID)); - if (icService) - { - nsCAutoString cName; - result = icService->GetString(nsIInternetConfigService::eICString_RealName, cName); - if ( NS_SUCCEEDED ( result ) ) - { - nsString fullName; - *aFullname = ToNewUnicode(cName); - } - } - return result; - -} - -NS_IMETHODIMP -nsUserInfo::GetEmailAddress(char * *aEmailAddress) -{ - nsresult result = NS_ERROR_FAILURE; - nsCOMPtr icService (do_GetService(NS_INTERNETCONFIGSERVICE_CONTRACTID)); - if (icService) - { - nsCAutoString tempString; - result = icService->GetString(nsIInternetConfigService::eICString_Email, tempString); - if (NS_SUCCEEDED(result)) - *aEmailAddress = ToNewCString(tempString); - - } - return result; -} - -NS_IMETHODIMP -nsUserInfo::GetUsername(char * *aUsername) -{ - *aUsername = nsnull; - - nsCAutoString tempString; - nsresult rv = NS_ERROR_FAILURE; - nsCOMPtr icService (do_GetService(NS_INTERNETCONFIGSERVICE_CONTRACTID)); - if (icService) - rv = icService->GetString(nsIInternetConfigService::eICString_Email, tempString); - - if ( NS_FAILED( rv ) ) return rv; - - const char* atString = "@"; - PRInt32 atOffset = tempString.Find(atString); - if (atOffset != kNotFound) - tempString.Truncate(atOffset); - - *aUsername = ToNewCString(tempString); - return NS_OK; -} - -NS_IMETHODIMP -nsUserInfo::GetDomain(char * *aDomain) -{ - *aDomain = nsnull; - nsCAutoString tempString; - nsresult rv = NS_ERROR_FAILURE; - nsCOMPtr icService (do_GetService(NS_INTERNETCONFIGSERVICE_CONTRACTID)); - if (icService) - rv = icService->GetString(nsIInternetConfigService::eICString_Email, tempString); - if ( NS_FAILED( rv ) ) return rv; - const char* atString = "@"; - PRInt32 atOffset = tempString.Find(atString); - if (atOffset != kNotFound) - { - nsCAutoString domainString; - tempString.Right(domainString, tempString.Length() - (atOffset + 1)); - *aDomain = ToNewCString(domainString); - return NS_OK; - } - - // no domain in the pref - return NS_ERROR_FAILURE; -} - -#pragma mark - - - - - - - diff --git a/toolkit/components/startup/src/nsUserInfoMac.h b/toolkit/components/startup/src/nsUserInfoMac.h index e086caa4daf5..1179acfe5f6b 100644 --- a/toolkit/components/startup/src/nsUserInfoMac.h +++ b/toolkit/components/startup/src/nsUserInfoMac.h @@ -39,33 +39,18 @@ #define __nsUserInfoMac_h #include "nsIUserInfo.h" - - -#include +#include "nsReadableUtils.h" class nsUserInfo: public nsIUserInfo - { public: - nsUserInfo(void); - virtual ~nsUserInfo(); + nsUserInfo(); + virtual ~nsUserInfo() {} NS_DECL_ISUPPORTS NS_DECL_NSIUSERINFO - - -protected: - - nsresult EnsureInitted(); - - static OSType GetAppCreatorCode(); - static PRUnichar* PStringToNewUCS2(ConstStr255Param str); - -protected: - - ICInstance mInstance; - PRBool mInitted; + nsresult GetPrimaryEmailAddress(nsCString &aEmailAddress); }; #endif /* __nsUserInfo_h */ diff --git a/toolkit/components/startup/src/nsUserInfoMac.mm b/toolkit/components/startup/src/nsUserInfoMac.mm new file mode 100644 index 000000000000..18a8461bf5f0 --- /dev/null +++ b/toolkit/components/startup/src/nsUserInfoMac.mm @@ -0,0 +1,115 @@ +/* -*- Mode: Objective-C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla toolkit code. + * + * The Initial Developer of the Original Code is HÃ¥kan Waara . + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + +#include "nsUserInfoMac.h" +#include "nsObjCExceptions.h" +#include "nsString.h" + +#import +#import + +NS_IMPL_ISUPPORTS1(nsUserInfo, nsIUserInfo) + +nsUserInfo::nsUserInfo() {} + +NS_IMETHODIMP +nsUserInfo::GetFullname(PRUnichar **aFullname) +{ + NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT + + NS_ConvertUTF8toUTF16 fullName([NSFullUserName() UTF8String]); + *aFullname = ToNewUnicode(fullName); + return NS_OK; + + NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT +} + +NS_IMETHODIMP +nsUserInfo::GetUsername(char **aUsername) +{ + NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT + + nsCAutoString username([NSUserName() UTF8String]); + *aUsername = ToNewCString(username); + return NS_OK; + + NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT +} + +nsresult +nsUserInfo::GetPrimaryEmailAddress(nsCString &aEmailAddress) +{ + NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT + + // Try to get this user's primary email from the system addressbook's "me card" + // (if they've filled it) + ABPerson *me = [[ABAddressBook sharedAddressBook] me]; + ABMultiValue *emailAddresses = [me valueForProperty:kABEmailProperty]; + if ([emailAddresses count] > 0) { + // get the index of the primary email, in case there are more than one + int primaryEmailIndex = [emailAddresses indexForIdentifier:[emailAddresses primaryIdentifier]]; + aEmailAddress.Assign([[emailAddresses valueAtIndex:primaryEmailIndex] UTF8String]); + return NS_OK; + } + + return NS_ERROR_FAILURE; + + NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT +} + +NS_IMETHODIMP +nsUserInfo::GetEmailAddress(char **aEmailAddress) +{ + nsCAutoString email; + if (NS_SUCCEEDED(GetPrimaryEmailAddress(email))) + *aEmailAddress = ToNewCString(email); + return NS_OK; +} + +NS_IMETHODIMP +nsUserInfo::GetDomain(char **aDomain) +{ + nsCAutoString email; + if (NS_SUCCEEDED(GetPrimaryEmailAddress(email))) { + PRInt32 index = email.FindChar('@'); + if (index != -1) { + // chop off everything before, and including the '@' + *aDomain = ToNewCString(Substring(email, index + 1)); + } + } + return NS_OK; +}