diff options
Diffstat (limited to 'Slimber/Cocoa')
-rw-r--r-- | Slimber/Cocoa/Menulet.h | 3 | ||||
-rw-r--r-- | Slimber/Cocoa/Menulet.m | 49 | ||||
-rw-r--r-- | Slimber/Cocoa/Slimber.h | 4 | ||||
-rw-r--r-- | Slimber/Cocoa/Slimber.mm | 23 |
4 files changed, 61 insertions, 18 deletions
diff --git a/Slimber/Cocoa/Menulet.h b/Slimber/Cocoa/Menulet.h index dfe07a0..fabaa80 100644 --- a/Slimber/Cocoa/Menulet.h +++ b/Slimber/Cocoa/Menulet.h @@ -4,12 +4,13 @@ NSStatusItem* statusItem; NSMenu* statusMenu; NSImage* menuIcon; + NSArray* userNames; BOOL selfOnline; } - (id) init; - (void) updateMenu; -- (void) setUsersOnline: (BOOL) online; +- (void) setUserNames: (NSArray*) names; - (void) setSelfConnected: (BOOL) online; @end diff --git a/Slimber/Cocoa/Menulet.m b/Slimber/Cocoa/Menulet.m index f72078e..9eda07c 100644 --- a/Slimber/Cocoa/Menulet.m +++ b/Slimber/Cocoa/Menulet.m @@ -12,7 +12,7 @@ [statusItem setToolTip: @"Slimber"]; [statusItem setMenu: statusMenu]; - [self setUsersOnline: NO]; + userNames = [[NSArray alloc] init]; selfOnline = NO; [self updateMenu]; @@ -26,13 +26,36 @@ [super dealloc]; } +- (void) updateIcon: (BOOL) online { + NSBundle* bundle = [NSBundle bundleForClass: [self class]]; + NSString* path; + if (online) { + path = [bundle pathForResource: @"Online" ofType:@"png"]; + } + else { + path = [bundle pathForResource: @"Offline" ofType:@"png"]; + } + menuIcon = [[NSImage alloc] initWithContentsOfFile: path]; + [statusItem setImage: menuIcon]; +} + - (void) updateMenu { while ([statusMenu numberOfItems] > 0) { [statusMenu removeItemAtIndex: 0]; } - NSMenuItem* statusMenuItem = [[NSMenuItem alloc] initWithTitle: @"Online Users" action: NULL keyEquivalent: @""]; - [statusMenu addItem: statusMenuItem]; + if ([userNames count] > 0) { + [statusMenu addItem: [[NSMenuItem alloc] initWithTitle: @"Online users:" action: NULL keyEquivalent: @""]]; + int i; + for (i = 0; i < [userNames count]; ++i) { + NSMenuItem* userItem = [[NSMenuItem alloc] initWithTitle: [@" " stringByAppendingString: [userNames objectAtIndex: i]] action: NULL keyEquivalent: @""]; + [statusMenu addItem: userItem]; + } + } + else { + [statusMenu addItem: [[NSMenuItem alloc] initWithTitle: @"No online users" action: NULL keyEquivalent: @""]]; + } + [self updateIcon: [userNames count] > 0]; [statusMenu addItem: [NSMenuItem separatorItem]]; NSMenuItem* loggedInItem; @@ -50,22 +73,16 @@ [statusMenu addItem: exitMenuItem]; } -- (void) setUsersOnline: (BOOL) online { - NSBundle* bundle = [NSBundle bundleForClass: [self class]]; - NSString* path; - if (online) { - path = [bundle pathForResource: @"Online" ofType:@"png"]; - } - else { - path = [bundle pathForResource: @"Offline" ofType:@"png"]; - } - menuIcon = [[NSImage alloc] initWithContentsOfFile: path]; - [statusItem setImage: menuIcon]; -} - - (void) setSelfConnected: (BOOL) online { selfOnline = online; [self updateMenu]; } +- (void) setUserNames: (NSArray*) names { + [names retain]; + [userNames release]; + userNames = names; + [self updateMenu]; +} + @end diff --git a/Slimber/Cocoa/Slimber.h b/Slimber/Cocoa/Slimber.h index f5a02d7..7964581 100644 --- a/Slimber/Cocoa/Slimber.h +++ b/Slimber/Cocoa/Slimber.h @@ -2,8 +2,10 @@ #include <string> #include <boost/bind.hpp> +#include <boost/shared_ptr.hpp> #include "Swiften/LinkLocal/DNSSDService.h" +#include "Swiften/LinkLocal/LinkLocalRoster.h" @class Menulet; namespace Swift { @@ -17,9 +19,11 @@ class Slimber { private: void handleSelfConnected(bool b); + void handleRosterChanged(); private: boost::shared_ptr<Swift::DNSSDService> dnsSDService; + boost::shared_ptr<Swift::LinkLocalRoster>linkLocalRoster; Swift::Server* server; Menulet* menulet; }; diff --git a/Slimber/Cocoa/Slimber.mm b/Slimber/Cocoa/Slimber.mm index 74d95ef..d64cd58 100644 --- a/Slimber/Cocoa/Slimber.mm +++ b/Slimber/Cocoa/Slimber.mm @@ -1,5 +1,7 @@ #include "Slimber/Cocoa/Slimber.h" +#include "Swiften/Base/foreach.h" +#include "Swiften/Elements/RosterPayload.h" #include "Swiften/LinkLocal/AppleDNSSDService.h" #include "Slimber/Cocoa/Menulet.h" #include "Slimber/Server.h" @@ -8,9 +10,15 @@ using namespace Swift; Slimber::Slimber() { dnsSDService = boost::shared_ptr<AppleDNSSDService>(new AppleDNSSDService()); - server = new Server(5222, 5562, dnsSDService); + + linkLocalRoster = boost::shared_ptr<LinkLocalRoster>(new LinkLocalRoster(dnsSDService)); + linkLocalRoster->onRosterChanged.connect(boost::bind(&Slimber::handleRosterChanged, this)); + + server = new Server(5222, 5562, linkLocalRoster, dnsSDService); server->onSelfConnected.connect(boost::bind(&Slimber::handleSelfConnected, this, _1)); + menulet = [[Menulet alloc] init]; + handleRosterChanged(); } Slimber::~Slimber() { @@ -21,3 +29,16 @@ Slimber::~Slimber() { void Slimber::handleSelfConnected(bool b) { [menulet setSelfConnected: b]; } + +void Slimber::handleRosterChanged() { + NSMutableArray* names = [[NSMutableArray alloc] init]; + boost::shared_ptr<RosterPayload> roster = linkLocalRoster->getRoster(); + foreach(const RosterItemPayload& item, roster->getItems()) { + NSString* name = [NSString stringWithUTF8String: item.getName().getUTF8Data()]; + [names addObject: name]; + [name release]; + } + + [menulet setUserNames: names]; + [names release]; +} |