5 // Created by Matt Meissner on 10/30/09.
6 // Copyright 2009 Matt Meissner. All rights reserved.
9 #import <Adium/AIStatus.h>
10 #import <Adium/AIHTMLDecoder.h>
12 #import "ESPurpleSIPEAccount.h"
14 #include "sipe-core.h"
17 /* Status identifiers (see also: sipe_status_types()) */
18 #define SIPE_STATUS_ID_UNKNOWN purple_primitive_get_id_from_type(PURPLE_STATUS_UNSET) /* Unset (primitive) */
19 #define SIPE_STATUS_ID_OFFLINE purple_primitive_get_id_from_type(PURPLE_STATUS_OFFLINE) /* Offline (primitive) */
20 #define SIPE_STATUS_ID_AVAILABLE purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE) /* Online */
21 /* PURPLE_STATUS_UNAVAILABLE: */
22 #define SIPE_STATUS_ID_BUSY "busy" /* Busy */
23 #define SIPE_STATUS_ID_DND "do-not-disturb" /* Do Not Disturb */
24 #define SIPE_STATUS_ID_ONPHONE "on-the-phone" /* On The Phone */
25 #define SIPE_STATUS_ID_INVISIBLE purple_primitive_get_id_from_type(PURPLE_STATUS_INVISIBLE) /* Appear Offline */
26 /* PURPLE_STATUS_AWAY: */
27 #define SIPE_STATUS_ID_IDLE "idle" /* Idle/Inactive */
28 #define SIPE_STATUS_ID_BRB "be-right-back" /* Be Right Back */
29 #define SIPE_STATUS_ID_AWAY purple_primitive_get_id_from_type(PURPLE_STATUS_AWAY) /* Away (primitive) */
30 #define SIPE_STATUS_ID_LUNCH "out-to-lunch" /* Out To Lunch */
31 /* ??? PURPLE_STATUS_EXTENDED_AWAY */
32 /* ??? PURPLE_STATUS_MOBILE */
33 /* ??? PURPLE_STATUS_TUNE */
36 @implementation ESPurpleSIPEAccount
37 - (const char*)protocolPlugin
42 - (void)configurePurpleAccount
44 [super configurePurpleAccount];
46 NSLog(@"AccountName: %s\n", self.purpleAccountName ? self.purpleAccountName : "NULL");
47 NSLog(@"Account: %x\n", account);
48 NSLog(@"Port: %d\n", self.port);
49 NSLog(@"Server: %@\n", self.host);
51 purple_account_set_username(account, self.purpleAccountName);
53 if (self.host && [self.host length]) {
55 // TODO: figure out a better size for this!
57 sprintf(tmp, "%s:%d", [self.host UTF8String], self.port);
58 purple_account_set_string(account, "server", tmp);
60 // super-class already set this
64 // TODO: hook up the GUI to actually set this
65 purple_account_set_string(account, "transport", "tls");
68 - (const char *)purpleStatusIDForStatus:(AIStatus *)statusState
69 arguments:(NSMutableDictionary *)arguments
71 const char *statusID = NULL;
73 switch (statusState.statusType) {
74 case AIAvailableStatusType:
75 statusID = purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE);
77 case AIAwayStatusType:
78 statusID = purple_primitive_get_id_from_type(PURPLE_STATUS_AWAY);
81 case AIInvisibleStatusType:
82 statusID = purple_primitive_get_id_from_type(PURPLE_STATUS_INVISIBLE);
85 case AIOfflineStatusType:
86 statusID = purple_primitive_get_id_from_type(PURPLE_STATUS_OFFLINE);
94 #pragma mark File transfer
96 - (BOOL)canSendFolders
101 - (void)beginSendOfFileTransfer:(ESFileTransfer *)fileTransfer
103 [super _beginSendOfFileTransfer:fileTransfer];
106 - (void)acceptFileTransferRequest:(ESFileTransfer *)fileTransfer
108 [super acceptFileTransferRequest:fileTransfer];
111 - (void)rejectFileReceiveRequest:(ESFileTransfer *)fileTransfer
113 [super rejectFileReceiveRequest:fileTransfer];
116 - (void)cancelFileTransfer:(ESFileTransfer *)fileTransfer
118 [super cancelFileTransfer:fileTransfer];
121 #pragma mark Status Messages
123 - (NSString *)statusNameForPurpleBuddy:(PurpleBuddy *)buddy
125 NSString *statusName = nil;
126 PurplePresence *presence = purple_buddy_get_presence(buddy);
127 PurpleStatus *status = purple_presence_get_active_status(presence);
128 const char *purpleStatusID = purple_status_get_id(status);
130 if (!purpleStatusID) return nil;
132 if (!strcmp(purpleStatusID, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT))) {
133 statusName = STATUS_NAME_FREE_FOR_CHAT;
135 } else if (!strcmp(purpleStatusID, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA))) {
136 statusName = STATUS_NAME_EXTENDED_AWAY;
138 } else if (!strcmp(purpleStatusID, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_DND))) {
139 statusName = STATUS_NAME_DND;
148 * @brief Status message for a contact
150 - (NSAttributedString *)statusMessageForPurpleBuddy:(PurpleBuddy *)buddy
152 PurplePresence *presence = purple_buddy_get_presence(buddy);
153 PurpleStatus *status = (presence ? purple_presence_get_active_status(presence) : NULL);
154 const char *message = (status ? purple_status_get_attr_string(status, "message") : NULL);
155 char *sipemessage = NULL;
156 NSString *statusMessage = nil;
158 // TODO: get sipe activity or annotation
160 // Get the plugin's status message for this buddy if they don't have a status message
161 if (!message && !sipemessage) {
162 PurplePluginProtocolInfo *prpl_info = self.protocolInfo;
164 if (prpl_info && prpl_info->status_text) {
165 char *status_text = (prpl_info->status_text)(buddy);
167 // Don't display "Offline" as a status message.
168 if (status_text && strcmp(status_text, _("Offline")) != 0) {
169 statusMessage = [NSString stringWithUTF8String:status_text];
174 } else if (sipemessage) {
175 statusMessage = [NSString stringWithUTF8String:sipemessage];
178 statusMessage = [NSString stringWithUTF8String:message];
181 return statusMessage ? [AIHTMLDecoder decodeHTML:statusMessage] : nil;