adium/adium
Clone
Summary
Browse
Changes
Graph
Update version number in Info.plist. Add a ticket number to Changes.txt.
adium-1.5.10.3
2017-03-24, Robert Vehse
6194bf1c1f66
Update version number in Info.plist. Add a ticket number to Changes.txt.
/*
* Adium is the legal property of its developers, whose names are listed in the copyright file included
* with this source distribution.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the GNU
* General Public License as published by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program; if not,
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import "ESPurpleNotifyEmailController.h"
#import <AdiumLibpurple/SLPurpleCocoaAdapter.h>
#import <AdiumLibpurple/PurpleCommon.h>
#import <Adium/ESTextAndButtonsWindowController.h>
#import <Adium/AIContactAlertsControllerProtocol.h>
#import <Adium/AIAccount.h>
#import <AIUtilities/AIObjectAdditions.h>
@interface
ESPurpleNotifyEmailController
()
+
(
void
)
openURLString
:
(
NSString
*
)
urlString
;
+
(
void
)
startMailApplication
;
+
(
NSString
*
)
mailApplicationName
;
+
(
void
)
showNotifyEmailWindowForAccount:
(
AIAccount
*
)
account
withMessage:
(
NSAttributedString
*
)
inMessage
URLString:
(
NSString
*
)
inURLString
;
@end
@implementation
ESPurpleNotifyEmailController
/*!
* @brief Handle the notification of emails
*
* This may be called from the purple thread.
*/
+
(
void
*
)
handleNotifyEmailsForAccount:
(
AIAccount
*
)
account
count:
(
size_t
)
count
detailed:
(
BOOL
)
detailed
subjects:
(
const
char
**
)
subjects
froms:
(
const
char
**
)
froms
tos:
(
const
char
**
)
tos
urls:
(
const
char
**
)
urls
{
NSFontManager
*
fontManager
=
[
NSFontManager
sharedFontManager
];
NSFont
*
messageFont
=
[
NSFont
messageFontOfSize
:
11
];
NSMutableParagraphStyle
*
centeredParagraphStyle
;
NSMutableAttributedString
*
message
;
centeredParagraphStyle
=
[[
NSMutableParagraphStyle
defaultParagraphStyle
]
mutableCopy
];
[
centeredParagraphStyle
setAlignment
:
NSCenterTextAlignment
];
message
=
[[
NSMutableAttributedString
alloc
]
init
];
//Title
NSString
*
title
;
NSFont
*
titleFont
;
NSDictionary
*
titleAttributes
;
title
=
AILocalizedString
(
@"You have mail!
\n
"
,
nil
);
titleFont
=
[
fontManager
convertFont
:
[
NSFont
messageFontOfSize
:
12
]
toHaveTrait
:
NSBoldFontMask
];
titleAttributes
=
[
NSDictionary
dictionaryWithObjectsAndKeys
:
titleFont
,
NSFontAttributeName
,
centeredParagraphStyle
,
NSParagraphStyleAttributeName
,
nil
];
[
message
appendAttributedString
:
[[[
NSAttributedString
alloc
]
initWithString
:
title
attributes
:
titleAttributes
]
autorelease
]];
//Message
NSString
*
numberMessage
;
NSDictionary
*
numberMessageAttributes
;
NSString
*
yourName
;
if
(
account
)
{
yourName
=
account
.
formattedUID
;
}
else
if
(
tos
&&
*
tos
)
{
yourName
=
[
NSString
stringWithUTF8String
:*
tos
];
}
else
{
yourName
=
nil
;
}
if
(
yourName
&&
[
yourName
length
])
{
numberMessage
=
((
count
==
1
)
?
[
NSString
stringWithFormat
:
AILocalizedString
(
@"%@ has 1 new message."
,
nil
),
yourName
]
:
[
NSString
stringWithFormat
:
AILocalizedString
(
@"%@ has %u new messages."
,
nil
),
yourName
,
count
]);
}
else
{
numberMessage
=
((
count
==
1
)
?
AILocalizedString
(
@"You have 1 new message."
,
nil
)
:
[
NSString
stringWithFormat
:
AILocalizedString
(
@"You have %u new messages."
,
nil
),
count
]);
}
numberMessageAttributes
=
[
NSDictionary
dictionaryWithObjectsAndKeys
:
messageFont
,
NSFontAttributeName
,
centeredParagraphStyle
,
NSParagraphStyleAttributeName
,
nil
];
[
message
appendAttributedString
:
[[[
NSAttributedString
alloc
]
initWithString
:
numberMessage
attributes
:
numberMessageAttributes
]
autorelease
]];
if
(
count
==
1
)
{
BOOL
haveFroms
=
(
froms
!=
NULL
);
BOOL
haveSubjects
=
(
subjects
!=
NULL
);
if
(
haveFroms
||
haveSubjects
)
{
NSFont
*
fieldFont
;
NSDictionary
*
fieldAttributed
,
*
infoAttributed
;
fieldFont
=
[
fontManager
convertFont
:
messageFont
toHaveTrait
:
NSBoldFontMask
];
fieldAttributed
=
[
NSDictionary
dictionaryWithObject
:
fieldFont
forKey
:
NSFontAttributeName
];
infoAttributed
=
[
NSDictionary
dictionaryWithObject
:
messageFont
forKey
:
NSFontAttributeName
];
//Skip a line
[[
message
mutableString
]
appendString
:
@"
\n\n
"
];
if
(
haveFroms
)
{
NSString
*
fromString
=
[
NSString
stringWithUTF8String
:
(
*
froms
)];
if
(
fromString
&&
[
fromString
length
])
{
[
message
appendAttributedString
:
[[[
NSAttributedString
alloc
]
initWithString
:
AILocalizedString
(
@"From: "
,
nil
)
attributes
:
fieldAttributed
]
autorelease
]];
[
message
appendAttributedString
:
[[[
NSAttributedString
alloc
]
initWithString
:
fromString
attributes
:
infoAttributed
]
autorelease
]];
}
}
if
(
haveFroms
&&
haveSubjects
)
{
[[
message
mutableString
]
appendString
:
@"
\n
"
];
}
if
(
haveSubjects
)
{
NSString
*
subjectString
=
[
NSString
stringWithUTF8String
:
(
*
subjects
)];
if
(
subjectString
&&
[
subjectString
length
])
{
[
message
appendAttributedString
:
[[[
NSAttributedString
alloc
]
initWithString
:
AILocalizedString
(
@"Subject: "
,
nil
)
attributes
:
fieldAttributed
]
autorelease
]];
AILog
(
@"%@: %@ appending %@"
,
self
,
message
,
subjectString
);
[
message
appendAttributedString
:
[[[
NSAttributedString
alloc
]
initWithString
:
subjectString
attributes
:
infoAttributed
]
autorelease
]];
}
else
{
AILog
(
@"Got an invalid subjectString from %s"
,
*
subjects
);
}
}
}
}
NSMutableDictionary
*
infoDict
=
[
NSMutableDictionary
dictionaryWithObjectsAndKeys
:
title
,
@"Title"
,
message
,
@"Message"
,
nil
];
NSString
*
urlString
=
((
urls
&&
*
urls
)
?
[
NSString
stringWithUTF8String
:
(
*
urls
)]
:
nil
);
if
(
urlString
)
{
[
infoDict
setObject
:
urlString
forKey
:
@"URL"
];
}
[
self
mainPerformSelector
:
@selector
(
showNotifyEmailWindowForAccount
:
withMessage
:
URLString
:
)
withObject
:
account
withObject
:
message
withObject
:(
urlString
?
urlString
:
nil
)];
[
centeredParagraphStyle
release
];
[
message
release
];
return
NULL
;
}
/*!
* @brief Show the New Mail message
*
* Displays the New Mail message, optionally offerring an Open Mail button (if a URL to open the webmail is passed).
*
* @param account The account which received new mail
* @param inMessage An attributed message describing the new mail
* @param inURLString The URL to the appropriate webmail, or nil if no webmail link is available
*/
+
(
void
)
showNotifyEmailWindowForAccount:
(
AIAccount
*
)
account
withMessage:
(
NSAttributedString
*
)
inMessage
URLString:
(
NSString
*
)
inURLString
{
NSString
*
mailApplicationName
=
[
self
mailApplicationName
];
if
(
!
[[
NSUserDefaults
standardUserDefaults
]
boolForKey
:
@"AINoNewMailWindow"
])
{
ESTextAndButtonsWindowController
*
textAndButtonsWindowController
=
[[
ESTextAndButtonsWindowController
alloc
]
initWithTitle
:
AILocalizedString
(
@"New Mail"
,
nil
)
defaultButton
:
nil
alternateButton
:(
inURLString
?
AILocalizedString
(
@"Open Mail in Browser"
,
nil
)
:
nil
)
otherButton
:((
mailApplicationName
&&
[
mailApplicationName
length
])
?
[
NSString
stringWithFormat
:
AILocalizedString
(
@"Launch %@"
,
nil
),
mailApplicationName
]
:
nil
)
withMessageHeader
:
nil
andMessage
:
inMessage
target
:
self
userInfo
:
inURLString
];
[
textAndButtonsWindowController
showOnWindow
:
nil
];
}
//XXX - Hook this to the account for listobject
[
adium
.
contactAlertsController
generateEvent
:
ACCOUNT_RECEIVED_EMAIL
forListObject
:
account
userInfo
:[
inMessage
string
]
previouslyPerformedActionIDs
:
nil
];
}
/*!
* @brief Window was closed, either by a button being clicked or the user closing it
*/
+
(
BOOL
)
textAndButtonsWindowDidEnd:
(
NSWindow
*
)
window
returnCode:
(
AITextAndButtonsReturnCode
)
returnCode
suppression:
(
BOOL
)
suppression
userInfo:
(
id
)
userInfo
{
switch
(
returnCode
)
{
case
AITextAndButtonsAlternateReturn
:
if
(
userInfo
)
[
self
openURLString
:
userInfo
];
break
;
case
AITextAndButtonsDefaultReturn
:
break
;
case
AITextAndButtonsOtherReturn
:
if
(
userInfo
)
[
self
startMailApplication
];
break
;
case
AITextAndButtonsClosedWithoutResponse
:
//No action needed
break
;
}
return
YES
;
}
/*!
* @brief Start mail application from the new mail window
*
* Launch the user's mail application instead of opening the webmail-page
*/
+
(
void
)
startMailApplication
{
if
([[
NSWorkspace
sharedWorkspace
]
launchApplication
:
[
self
mailApplicationName
]]
==
NO
)
{
NSLog
(
@"Could not launch mail application '%@'"
,
[
self
mailApplicationName
]);
}
}
/*!
* @brief Open a URL string from the open mail window
*
* The urlString could either be a web address or a path to a local HTML file we are supposed to load.
* The local HTML file will be in the user's temp directory, which Purple obtains with g_get_tmp_dir()...
* so we will, too.
*/
+
(
void
)
openURLString:
(
NSString
*
)
urlString
{
if
([
urlString
rangeOfString
:
[
NSString
stringWithUTF8String
:
g_get_tmp_dir
()]].
location
!=
NSNotFound
)
{
//Local HTML file
CFURLRef
appURL
=
NULL
;
OSStatus
err
;
/* Obtain the default http:// handler. We don't care what would handle _this file_ (its extension doesn't matter)
* nor what normally happens when the user opens a .html file since that is, on many systems, an HTML editor.
* Instead, we want to know what application to use for viewing web pages... and then open this file in it.
*/
err
=
LSGetApplicationForURL
((
CFURLRef
)[
NSURL
URLWithString
:
@"http://www.adium.im"
],
kLSRolesViewer
,
/*outAppRef*/
NULL
,
&
appURL
);
if
(
err
==
noErr
)
{
[[
NSWorkspace
sharedWorkspace
]
openFile
:
[
urlString
stringByExpandingTildeInPath
]
withApplication
:[(
NSURL
*
)
appURL
path
]];
}
else
{
NSURL
*
url
;
//Web address
url
=
[
NSURL
URLWithString
:
urlString
];
[[
NSWorkspace
sharedWorkspace
]
openURL
:
url
];
}
if
(
appURL
)
{
//LSGetApplicationForURL() requires us to release the appURL when we are done with it
CFRelease
(
appURL
);
}
}
else
{
NSURL
*
emailURL
;
//Web address
emailURL
=
[
NSURL
URLWithString
:
urlString
];
[[
NSWorkspace
sharedWorkspace
]
openURL
:
emailURL
];
}
}
/*!
* @brief Returns the name of the user's mail application
*
* Use the LaunchServices to identify the user's mail application and return it's name
* @return NSString with the application's name
*/
+
(
NSString
*
)
mailApplicationName
{
NSString
*
appName
;
FSRef
myAppRef
;
LSGetApplicationForURL
((
CFURLRef
)[
NSURL
URLWithString
:
@"mailto://"
],
kLSRolesAll
,
&
myAppRef
,
NULL
);
LSCopyDisplayNameForRef
(
&
myAppRef
,
(
CFStringRef
*
)
&
appName
);
NSRange
appRange
;
if
((
appRange
=
[
appName
rangeOfString
:
@".app"
options
:
(
NSCaseInsensitiveSearch
|
NSBackwardsSearch
|
NSAnchoredSearch
)]).
location
!=
NSNotFound
)
{
appName
=
[[
appName
substringToIndex
:
appRange
.
location
]
retain
];
}
return
[
appName
autorelease
];
}
@end