mpdcon.app-1.1.99/0000755000175000017510000000000010405367772012730 5ustar tarDebian-NMmpdcon.app-1.1.99/CVS/0000755000175000017510000000000010405367754013363 5ustar tarDebian-NMmpdcon.app-1.1.99/CVS/Root0000644000175000017510000000004210404417636014217 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/CVS/Repository0000644000175000017510000000000710404417636015454 0ustar tarDebian-NMMPDCon mpdcon.app-1.1.99/CVS/Entries0000644000175000017510000000412210405367754014716 0ustar tarDebian-NM/AppController.h/1.2/Thu Feb 23 20:53:12 2006// /AppController.m/1.2/Thu Feb 23 20:53:12 2006// /ChangeLog/1.1.1.1/Wed Feb 22 22:35:37 2006// /CollectionController.h/1.4/Sun Feb 26 22:47:47 2006// /CollectionController.m/1.10/Fri Mar 10 23:20:59 2006// /CrossfadeController.h/1.1.1.1/Wed Feb 22 22:35:37 2006// /CrossfadeController.m/1.1.1.1/Wed Feb 22 22:35:37 2006// /GNUmakefile/1.6/Fri Feb 24 15:41:47 2006// /GNUmakefile.postamble/1.1.1.1/Wed Feb 22 22:35:37 2006// /GNUmakefile.preamble/1.1.1.1/Wed Feb 22 22:35:37 2006// /Info-gnustep.plist/1.1.1.1/Wed Feb 22 22:35:37 2006// /MPDController.h/1.1.1.1/Wed Feb 22 22:35:37 2006// /MPDController.m/1.3/Thu Feb 23 21:44:56 2006// /OwnTableView.h/1.1.1.1/Wed Feb 22 22:35:37 2006// /OwnTableView.m/1.5/Fri Mar 10 23:20:59 2006// /PlaylistController.h/1.3/Thu Feb 23 21:15:08 2006// /PlaylistController.m/1.10/Mon Feb 27 22:53:25 2006// /PlaylistItem.h/1.2/Thu Feb 23 21:44:56 2006// /PlaylistItem.m/1.2/Thu Feb 23 21:44:56 2006// /PlaylistsManagerController.h/1.1.1.1/Wed Feb 22 22:35:37 2006// /PlaylistsManagerController.m/1.1.1.1/Wed Feb 22 22:35:37 2006// /StatisticsController.h/1.1.1.1/Wed Feb 22 22:35:37 2006// /StatisticsController.m/1.2/Thu Feb 23 20:40:50 2006// /StatisticsItem.h/1.1.1.1/Wed Feb 22 22:35:37 2006// /StatisticsItem.m/1.1.1.1/Wed Feb 22 22:35:37 2006// /libmpdclient.c/1.1.1.1/Wed Feb 22 22:35:37 2006// /libmpdclient.h/1.1.1.1/Wed Feb 22 22:35:37 2006// /main.m/1.1.1.1/Wed Feb 22 22:35:37 2006// D/Documentation//// D/Resources//// /BoldCell.h/1.2/Mon Mar 13 22:17:31 2006// /BoldCell.m/1.2/Mon Mar 13 22:17:08 2006// /BoldFormatter.h/1.2/Mon Mar 13 22:17:42 2006// /BoldFormatter.m/1.2/Mon Mar 13 22:17:19 2006// /NormalFormatter.h/1.2/Mon Mar 13 22:17:54 2006// /NormalFormatter.m/1.2/Mon Mar 13 22:16:51 2006// /PC.project/1.23/Mon Mar 13 22:18:52 2006// /PC.project.backup/1.23/Mon Mar 13 22:18:52 2006// /PlayView.h/1.2/Sat Mar 11 01:14:13 2006// /PlayView.m/1.4/Sun Mar 12 23:21:29 2006// /PreferencesController.h/1.2/Sun Mar 12 23:10:42 2006// /PreferencesController.m/1.2/Sun Mar 12 23:21:03 2006// /Strings.h/1.5/Mon Mar 13 22:18:20 2006// mpdcon.app-1.1.99/AppController.h0000644000175000017510000000566610377420270015671 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Application Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_APPCONTROLLER_H #define _PCAPPPROJ_APPCONTROLLER_H #include #include "PlayView.h" #include "PreferencesController.h" #include "PlaylistController.h" #include "PlaylistItem.h" #include "MPDController.h" #include "PlaylistsManagerController.h" #include "StatisticsController.h" #include "CrossfadeController.h" #include "Strings.h" #define player_MPD 0 #define player_CD 1 @interface AppController : NSObject { IBOutlet NSButton *playButton; IBOutlet NSButton *stopButton; IBOutlet NSButton *prevButton; IBOutlet NSButton *nextButton; IBOutlet NSButton *shuffleButton; IBOutlet NSButton *repeatButton; IBOutlet PlayView *playView; IBOutlet NSSlider *percentSlider; IBOutlet NSSlider *volumeSlider; IBOutlet NSWindow *window; IBOutlet NSMenuItem *statisticsItem; IBOutlet NSMenuItem *browseItem; IBOutlet NSMenuItem *updateItem; IBOutlet NSMenuItem *showItem; IBOutlet NSMenuItem *manageItem; NSTimer *anTimer; int player; int playedSong; int prevState; BOOL connected; BOOL didDisconnect; MPDController *mpdController; } // Gui Methods - (void) showPrefPanel:(id)sender; - (void) showPlaylist: (id)sender; - (void) managePlaylists: (id)sender; - (void) browseCollection: (id)sender; - (void) serverStatistics: (id)sender; - (void) showCrossfade: (id)sender; - (void) connect: (id)sender; - (void) updateCollection: (id)sender; - (void) play: (id)sender; - (void) stop: (id)sender; - (void) prev: (id)sender; - (void) next: (id)sender; - (void) shuffle: (id)sender; - (void) repeat: (id)sender; - (void) percentChanged: (id)sender; - (void) volumeChanged: (id)sender; // Notification Methods - (void) didDisconnect: (NSNotification *)notif; - (void) didConnect: (NSNotification *)notif; - (void) prefsChanged: (NSNotification *)notif; // Service Methods - (void) getPlaylist: (NSPasteboard*)pboard userData: (NSString*)userData error: (NSString**)error; - (void) getAlbums: (NSPasteboard*)pboard userData: (NSString*)userData error: (NSString**)error; @end #endif mpdcon.app-1.1.99/AppController.m0000644000175000017510000003067210377420270015671 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Application Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "AppController.h" /* --------------------- - Private Interface - ---------------------*/ @interface AppController(Private) - (void) _updateView: (id)sender; @end @implementation AppController /* -------------------------- - Initialization Methods - --------------------------*/ - (void) dealloc { RELEASE(mpdController); RELEASE(anTimer); [super dealloc]; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { NSNotificationCenter *defCenter; BOOL reversedTime; defCenter = [NSNotificationCenter defaultCenter]; [[NSApp mainMenu] setTitle:@"MPDCon"]; [window setFrameAutosaveName: @"PlayerWindow"]; mpdController = [MPDController sharedMPDController]; prevState = state_NOCONN; [defCenter addObserver: self selector: @selector(didDisconnect:) name: DidNotConnectNotification object: nil]; [defCenter addObserver: self selector: @selector(didConnect:) name: DidConnectNotification object: nil]; [defCenter addObserver: self selector: @selector(prefsChanged:) name: PreferencesChangedNotification object: nil]; didDisconnect = NO; [self connect: self]; reversedTime = [[NSUserDefaults standardUserDefaults] boolForKey: @"reversedTime"]; [playView setReversedTime: reversedTime]; } - (void) showPrefPanel: (id)sender { [[PreferencesController sharedPreferencesController] showWindow: sender]; } - (void) showPlaylist: (id)sender { if (! connected) { return; } [[PlaylistController sharedPlaylistController] showWindow: sender]; } - (void) managePlaylists: (id)sender { if (! connected) { return; } [[PlaylistsManagerController sharedPLManagerController] showWindow: sender]; } - (void) browseCollection: (id)sender { if (! connected) { return; } [[CollectionController sharedCollectionController] showWindow: self]; } - (void) serverStatistics: (id)sender { if (! connected) { return; } [[StatisticsController sharedStatisticsController] showWindow: sender]; } - (void) showCrossfade: (id)sender { if (! connected) { return; } [[CrossfadeController sharedCrossfadeController] showWindow: sender]; } - (void) connect: (id)sender { NSString *host; NSString *port; NSString *pword; host = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdHost"]; port = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdPort"]; pword = nil; if ([[NSUserDefaults standardUserDefaults] integerForKey: @"usePassword"] != 0) { pword = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdPassword"]; } if ((host == nil) || (port == nil)) { [self showPrefPanel: self]; } else { didDisconnect = NO; [mpdController connectToServer: host port: port password: pword]; } } - (void) updateCollection: (id) sender { [mpdController updateCollection]; } - (void) play: (id)sender { if (! connected) { return; } [mpdController play]; } - (void) stop: (id)sender { if (! connected) { return; } [mpdController stop]; } - (void) prev: (id)sender { if (! connected) { return; } [mpdController prev]; } - (void) next: (id)sender { if (! connected) { return; } [mpdController next]; } - (void) shuffle: (id)sender { if (! connected) return; [mpdController toggleShuffle]; } - (void) repeat: (id)sender { if (! connected) { return; } [mpdController toggleRepeat]; } - (void) percentChanged: (id)sender { int seekTime; if (! connected) { [percentSlider setFloatValue: 0.0]; return; } if ([mpdController getState] == state_NOCONN) { [percentSlider setFloatValue: 0.0]; return; } seekTime = (int) [percentSlider floatValue]; [mpdController seekToTime: seekTime]; [playView setElapsedTime: seekTime]; } - (void) volumeChanged: (id)sender { if ((! connected) || ([mpdController getState] == state_NOCONN) || ([mpdController getVolume] == MPD_STATUS_NO_VOLUME)) { [volumeSlider setFloatValue: 0.0]; return; } [mpdController setVolume: [volumeSlider floatValue]]; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) didDisconnect: (NSNotification *)notif { if (!didDisconnect) { didDisconnect = YES; if (connected) { if (anTimer) { [anTimer invalidate]; } } connected = NO; [playView enableDisplay: NO]; [playButton setImage: [NSImage imageNamed: @"Play.tiff"]]; [percentSlider setFloatValue: 0.0]; NSRunAlertPanel(_(@"Server Problems"), [notif object], nil, nil, nil); } } - (void) didConnect: (NSNotification *)aNotif { if (! connected) { connected = YES; anTimer = [NSTimer scheduledTimerWithTimeInterval: 1 target: self selector: @selector(_updateView:) userInfo: nil repeats: YES]; } didDisconnect = NO; } - (void) prefsChanged: (NSNotification *)notif { [self connect: self]; } /* ------------------- - Service Methods - -------------------*/ - (void) getPlaylist: (NSPasteboard*)pboard userData: (NSString*)userData error: (NSString**)error { NSMutableString *allSongsString; NSString *formString; NSArray *playlist; int length; int totaltime, tMin, tSecs, tHour; int i, j; allSongsString = [[NSMutableString alloc] init]; playlist = [mpdController getPlaylist]; length = [[NSString stringWithFormat: @"%d", [playlist count]] length]; formString = [NSString stringWithFormat: @"Track %s%d%s - ", "%", length, "d/%d"]; j = [playlist count]; totaltime = 0; for (i = 0; i < j; i++) { int time; [allSongsString appendString: [NSString stringWithFormat: formString, i+1, j]]; [allSongsString appendString: [[playlist objectAtIndex: i] getArtist]]; [allSongsString appendString: @" - "]; [allSongsString appendString: [[playlist objectAtIndex: i] getTitle]]; [allSongsString appendString: @" - "]; time = [[playlist objectAtIndex: i] getTotalTime]; totaltime += time; tSecs = (time % 60); tMin = (int) time/60; [allSongsString appendString: [NSString stringWithFormat: @"%d:%02d\n", tMin, tSecs]]; } tSecs = (totaltime % 60); tMin = (int) (totaltime/60) % 60; tHour = (int) totaltime/3600; [allSongsString appendString: [NSString stringWithFormat: @"\nTotal Playtime: %d:%02d:%02d\n", tHour, tMin, tSecs]]; [pboard declareTypes: [NSArray arrayWithObject: NSStringPboardType] owner: nil]; [pboard setString: allSongsString forType: NSStringPboardType]; return; } - (void) getAlbums: (NSPasteboard*)pboard userData: (NSString*)userData error: (NSString**)error { NSMutableString *allAlbumsString; NSArray *artists; int i; allAlbumsString = [[NSMutableString alloc] init]; artists = [mpdController getAllArtists]; for (i = 0; i < [artists count]; i++) { NSString *artist; NSArray *albums; int j; artist = [artists objectAtIndex: i]; albums = [mpdController getAlbumsForArtist: artist]; for (j = 0; j < [albums count]; j++) { NSString *album; album = [albums objectAtIndex: j]; [allAlbumsString appendString: [NSString stringWithFormat: @"%@ - %@\n", artist, album]]; } } [pboard declareTypes: [NSArray arrayWithObject: NSStringPboardType] owner: nil]; [pboard setString: allAlbumsString forType: NSStringPboardType]; return; } /* -------------------------------- - Application Delegate Methods - --------------------------------*/ - (void) applicationDidFinishLaunching: (NSNotification *)not { [NSApp setServicesProvider: self]; } - (BOOL) validateMenuItem: (id)menuItem { switch ([menuItem tag]) { case 10: case 14: case 15: case 16: case 17: case 18: return connected; break; case 13: return didDisconnect; break; default: return YES; break; } } @end /* ------------------- - Private Methods - -------------------*/ @implementation AppController(Private) - (void) _updateView: (id)sender { int volume; int state; if (! connected) { return; } if ([mpdController getState] == state_NOCONN) { return; } if ([mpdController playlistChanged]) { NSNotification *aNotif; aNotif = [NSNotification notificationWithName: PlaylistChangedNotification object: nil]; [[NSNotificationCenter defaultCenter] postNotification: aNotif]; } if ([mpdController isRandom]) { [shuffleButton highlight: YES]; } else { [shuffleButton highlight: NO]; } if ([mpdController isRepeat]) { [repeatButton highlight: YES]; } else { [repeatButton highlight: NO]; } volume = [mpdController getVolume]; if (volume == MPD_STATUS_NO_VOLUME) { [volumeSlider setIntValue: 0]; } else { [volumeSlider setIntValue: [mpdController getVolume]]; } state = [mpdController getState]; if((state == state_PLAY) || (state == state_PAUSE)) { PlaylistItem *currSong; int currentSongNr; int playlistLength; currentSongNr = [mpdController getCurrentSongNr]; playlistLength = [mpdController getPlaylistLength]; currSong = RETAIN([mpdController getCurrentSong]); if (currentSongNr != playedSong) { playedSong = currentSongNr; if ([currSong getTotalTime] != 0) { [percentSlider setMaxValue: (double) [currSong getTotalTime]]; } [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: SongChangedNotification object: nil]]; } [playView enableDisplay: YES]; [playView setCurrentSong: currentSongNr]; [playView setTotalSongs: playlistLength]; if((state == state_PAUSE) && (prevState != state_PAUSE)) { NSImage *pImage; prevState = state_PAUSE; pImage = [NSImage imageNamed: @"Play.tiff"]; [playButton setImage: pImage]; } else if ((state == state_PLAY) &&(prevState != state_PLAY)) { NSImage *pImage; prevState = state_PLAY; pImage = [NSImage imageNamed: @"Pause.tiff"]; [playButton setImage: pImage]; [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: SongChangedNotification object: nil]]; } [playView setDisplaySong: currSong]; if ([currSong getTotalTime] != 0) { [percentSlider setDoubleValue: (double)[currSong getElapsedTime]]; } RELEASE(currSong); } else if (prevState != state_STOP) { NSImage *pImage; prevState = state_STOP; pImage = [NSImage imageNamed: @"Play.tiff"]; [playButton setImage: pImage]; [playButton setTitle: @"Play"]; [percentSlider setFloatValue: 0.0]; [playView enableDisplay: NO]; [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: SongChangedNotification object: nil]]; } } @end mpdcon.app-1.1.99/BoldCell.h0000644000175000017510000000204210405367573014556 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:44:24 +0100 by mrsanders This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _BOLDCELL_H_ #define _BOLDCELL_H_ #include #include #include "BoldFormatter.h" @interface BoldCell : NSTextFieldCell { } @end #endif // _BOLDCELL_H_ mpdcon.app-1.1.99/BoldCell.m0000644000175000017510000000202110405367544014556 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:44:24 +0100 by mrsanders This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "BoldCell.h" @implementation BoldCell - (void) awakeFromNib { BoldFormatter *bForm = [[BoldFormatter alloc] init]; [self setFormatter: [bForm autorelease]]; } @end mpdcon.app-1.1.99/BoldFormatter.h0000644000175000017510000000202710405367606015642 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:52:30 +0100 by mrsanders This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _BOLDFORMATTER_H_ #define _BOLDFORMATTER_H_ #include #include @interface BoldFormatter : NSFormatter { } @end #endif // _BOLDFORMATTER_H_ mpdcon.app-1.1.99/BoldFormatter.m0000644000175000017510000000321110405367557015650 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:52:30 +0100 by mrsanders This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "BoldFormatter.h" @implementation BoldFormatter - (NSString *) stringForObjectValue: (id) anObject { return anObject; } - (NSAttributedString *)attributedStringForObjectValue: (id) anObject withDefaultAttributes: (NSDictionary *) attr { NSFont *theFont = [NSFont boldSystemFontOfSize: [NSFont systemFontSize]]; NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString: anObject]; NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithDictionary: attr]; [attrs setObject: theFont forKey: NSFontAttributeName]; [aString setAttributes: attrs range: NSMakeRange(0, [aString length])]; return [aString autorelease]; } - (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error { *obj = string; } @end mpdcon.app-1.1.99/ChangeLog0000644000175000017510000001663310377163471014511 0ustar tarDebian-NM2004-06-14 Daniel Luederwald * OwnTableView.m, FindController.m: Code Reformatting * CrossfadeController.m, CollectionController.m, AppController.m: Reformatted Code 2004-06-13 Daniel Luederwald * FindController.m, CollectionController.m, CollectionController.h: *** empty log message *** * AppController.m, AppController.h: Implemented getAlbums service * FindController.m, FindController.h, CrossfadeController.m, CrossfadeController.h, CollectionController.m, CollectionController.h, MPDController.m, MPDController.h: Refactoring * PlaylistController.m, PlaylistController.h: More Refactoring * PlayView.m, PlayView.h: Refactoring * AppController.h: *** empty log message *** * AppController.h, AppController.m: More Refactoring 2004-06-12 Daniel Luederwald * OwnPanel.h, OwnPanel.m: *** empty log message *** * OwnPanel.h, OwnPanel.m: New file. 2004-06-04 Daniel Luederwald * FindController.m, FindController.h, AppController.m: Bugfix * AppController.m: *** empty log message *** * PlaylistsManagerController.m: Begin of localization * PlaylistController.m: *** empty log message *** * PlayView.m, MPDController.m, FindController.m, AppController.m: Begin of localization * Strings.h: New file. * StatisticsController.h, PreferencesController.h, PlaylistsManagerController.h, PlaylistController.h, PlayView.h, OwnTableView.h, MPDController.h, FindController.h, CrossfadeController.h, CollectionController.h: *** empty log message *** * AppController.h: Service Method * StatisticsController.m, PreferencesController.m, PlaylistsManagerController.m, PlaylistController.m, PlayView.m, MPDController.m, FindController.m: *** empty log message *** * CollectionController.m: Find Capability * AppController.m: Service Method 2004-06-02 Daniel Luederwald * AppController.m, FindController.m: *** empty log message *** * FindController.h, AppController.h, FindController.m, AppController.m: Refactoring * CollectionController.m, FindController.m, FindController.h, AppController.m, CollectionController.h, PlaylistController.h: *** empty log message *** * CollectionController.h, PlaylistController.m: Find Capability * CollectionController.m: Find Capabilities * FindController.h, FindController.m: *** empty log message *** 2004-06-01 Daniel Luederwald * CollectionController.m: *** empty log message *** * CollectionController.m, PlaylistController.m, CollectionController.h: Implemented Find Capabilities * PlaylistController.h: *** empty log message *** * PlaylistController.h: Implemented Find Capabilities * FindController.h: *** empty log message *** * AppController.h, AppController.m: Added Find Capabilities * FindController.m, FindController.h: New file. 2004-05-30 Daniel Luederwald * PlaylistController.m: Highlight moved Song * OwnTableView.h: Bugfix * OwnTableView.h, OwnTableView.m: New file. 2004-05-27 Daniel Luederwald * PlaylistController.m: *** empty log message *** * PreferencesController.h: Minor Bugfix * MPDController.m: More Refactoring 2004-05-26 Daniel Luederwald * MPDController.m: Bugfix * MPDController.h, MPDController.m, PlaylistController.m, PlaylistController.h, PlayView.m, PlayView.h, AppController.m: Refactoring * AppController.h, PreferencesController.h: *** empty log message *** * PreferencesController.m: Refactoring * PlaylistItem.h: *** empty log message *** * PlaylistItem.m: Refactoring * CollectionController.h: *** empty log message *** * CollectionController.m, PlaylistsManagerController.h, PlaylistsManagerController.m: Refactoring * StatisticsController.h: *** empty log message *** * StatisticsController.m: Refactoring * StatisticsItem.h: *** empty log message *** * StatisticsItem.m: Refactoring * CrossfadeController.h: *** empty log message *** * CrossfadeController.m, AppController.m: Refactoring 2004-05-22 Daniel Luederwald * MPDController.h, MPDController.m: Refactoring + Handling of missing Tags * CrossfadeController.m: *** empty log message *** * PreferencesController.m: Bugfix * AppController.m: *** empty log message *** 2004-05-21 Daniel Luederwald * AppController.m, AppController.h: *** empty log message *** * AppController.m, AppController.h: Remember PlayerWindow screen-location * PlayView.h, PlayView.m: More Refactoring + Bugfix 2004-05-20 Daniel Luederwald * PlayView.m: Modified Scrolling * AppController.m, AppController.h, CrossfadeController.h, StatisticsItem.h: Refactoring * StatisticsController.h: *** empty log message *** * StatisticsController.m, StatisticsController.h: Refactoring * PlaylistsManagerController.m, PlaylistsManagerController.h, CollectionController.m, CollectionController.h: *** empty log message *** * PlaylistsManagerController.m: Refactoring * PlaylistsManagerController.h: *** empty log message *** * PlaylistsManagerController.h: Refactoring 2004-05-19 Daniel Luederwald * CollectionController.m, CollectionController.h, PlaylistItem.h, PlayView.h, PlayView.m: Refactoring * PreferencesController.m: Refactoring + Bugfix * PreferencesController.h: Bugfix * PreferencesController.h, PlaylistController.m, PlaylistController.h, MPDController.h, MPDController.m: Refactoring * CrossfadeController.h: New file. * MPDController.h, AppController.h, AppController.m, MPDController.m: Implemented Crossfade * CrossfadeController.m: New file. * AppController.h, AppController.m: *** empty log message *** * MPDController.h: Passwords for MPD implemented Error Handling * AppController.h: *** empty log message *** * PreferencesController.h: Passwords for MPD implemented * StatisticsController.m, CollectionController.m: *** empty log message *** * MPDController.m: Passwords for MPD implemented Error Handling * PreferencesController.m, AppController.m: Passwords for MPD implemented 2004-05-18 Daniel Luederwald * MPDController.h, PlaylistController.m, PlaylistController.h: Implemented ShuffleList * PreferencesController.m: *** empty log message *** * AppController.m, AppController.h: Try to connect to Server if Preferences changed. * MPDController.m: Fixed Server-Errors * PreferencesController.m: *** empty log message *** * AppController.m, AppController.h: Fixed Server-Errors * StatisticsItem.h, StatisticsController.h: New file. * MPDController.h, AppController.h: Added Server-Statistics 2004-05-17 Daniel Luederwald * StatisticsItem.m, StatisticsController.m: New file. * MPDController.m, AppController.m: Added Server-Statistics * AppController.m: *** empty log message *** * PlaylistsManagerController.h, CollectionController.h, PlaylistItem.h, MPDController.h, PlaylistController.h, libmpdclient.h, PlayView.h, PreferencesController.h, AppController.h, PlaylistsManagerController.m, CollectionController.m, MPDController.m, PlaylistItem.m, PlaylistController.m, PlayView.m, PreferencesController.m, AppController.m: New file. mpdcon.app-1.1.99/CollectionController.h0000644000175000017510000000472510400430023017217 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Collection Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_COLLECTIONCONTROLLER_H #define _PCAPPPROJ_COLLECTIONCONTROLLER_H #include #include "MPDController.h" #include "PlaylistItem.h" #include "Strings.h" #include "BoldFormatter.h" #include "NormalFormatter.h" @interface CollectionController : NSWindowController { IBOutlet NSBrowser *collectionView; IBOutlet NSTableView *trackView; IBOutlet NSWindow *window; IBOutlet NSTextField *filterField; NSArray *allArtists; NSArray *allAlbums; NSArray *allSongs; NSArray *filteredTracks; } // Initialization Methods + (id) sharedCollectionController; // Playlist Methods - (void) addSelected: (id)sender; // Gui Methods - (void) updateCollection: (id)sender; - (void) doubleClicked: (id)sender; - (void) filterCollection: (id)sender; - (void) clearFilter: (id)sender; // TableView dataSource Methods - (int) numberOfRowsInTableView: (NSTableView *)tableView; - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(int) row; // Browser delegate Methods - (int)browser:(NSBrowser *)sender numberOfRowsInColumn:(int)column; - (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(int)row column:(int)column; - (NSString *)browser:(NSBrowser *)sender titleOfColumn:(int)column; - (void) selectionChanged: (id)sender; // TableView dragging Methods - (BOOL) tableView: (NSTableView *)tv writeRows: (NSArray *)rows toPasteboard: (NSPasteboard*)pboard; // Notification Methods - (void) didNotConnect: (NSNotification *)aNotif; @end #endif mpdcon.app-1.1.99/CollectionController.m0000644000175000017510000003334110404404733017235 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Collection Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "CollectionController.h" /* --------------------- - Private Interface - ---------------------*/ @interface CollectionController(Private) - (void) _refreshViews; - (void) _filterCollectionByString: (NSString *)filterString; - (void) _getAllAlbumsForArtistAt: (int)row; - (void) _getAllTracksForArtistAt: (int)artistRow albumAt: (int)albumRow; int _artistSort(id artist1, id artist2, void *context); int _albumSort(id album1, id album2, void *context); int _trackSort(id track1, id track2, void *context); int _titleSort(id title1, id title2, void *context); int _aSort(id string1, id string2, void *context); @end @implementation CollectionController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedCollectionController { static CollectionController *_sharedCollectionController = nil; if (! _sharedCollectionController) { _sharedCollectionController = [[CollectionController allocWithZone: [self zone]] init]; } return _sharedCollectionController; } - (id) init { self = [self initWithWindowNibName: @"Collection"]; if (self) { [self setWindowFrameAutosaveName: @"Collection"]; } return self; } - (void) dealloc { RELEASE(allSongs); RELEASE(allArtists); RELEASE(allAlbums); RELEASE(filteredTracks); [super dealloc]; } /* -------------------- - Playlist Methods - --------------------*/ - (void) addSelected: (id)sender { NSEnumerator *songEnum = [trackView selectedRowEnumerator]; NSNumber *songNumber; int i = 0; while (songNumber = [songEnum nextObject]) { [[MPDController sharedMPDController] addTrack: [[allSongs objectAtIndex: [songNumber intValue]] getPath]]; i++; } } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { [trackView setAutosaveName: @"CollectionTrackTable"]; [trackView setAutosaveTableColumns: YES]; [trackView setTarget: self]; [trackView setDoubleAction: @selector(doubleClicked:)]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(didNotConnect:) name: DidNotConnectNotification object: nil]; [self _refreshViews]; } - (void) updateCollection: (id)sender { [[MPDController sharedMPDController] updateCollection]; [self _refreshViews]; } - (void) doubleClicked: (id)sender { if ([trackView clickedRow] >= 0) { [self addSelected: self]; } else { NSString *identifier; identifier = [(NSTableColumn *)[[trackView tableColumns] objectAtIndex: [trackView clickedColumn]] identifier]; if ([identifier isEqual: @"artist"]) { NSArray *tmpArray = RETAIN([AUTORELEASE(allSongs) sortedArrayUsingFunction: _artistSort context: NULL]); allSongs = tmpArray; } else if ([identifier isEqual: @"album"]) { NSArray *tmpArray = RETAIN([AUTORELEASE(allSongs) sortedArrayUsingFunction: _albumSort context: NULL]); allSongs = tmpArray; } else if ([identifier isEqual: @"title"]) { NSArray *tmpArray = RETAIN([AUTORELEASE(allSongs) sortedArrayUsingFunction: _titleSort context: NULL]); allSongs = tmpArray; } else if ([identifier isEqual: @"trackNr"]) { NSArray *tmpArray = RETAIN([AUTORELEASE(allSongs) sortedArrayUsingFunction: _trackSort context: NULL]); allSongs = tmpArray; } [trackView reloadData]; } } - (void) filterCollection: (id) sender { [self _refreshViews]; } - (void) clearFilter: (id)sender { if ([[filterField stringValue] compare: @""] == NSOrderedSame) { return; } [filterField setStringValue: @""]; [self _refreshViews]; } /* -------------------------------- - TableView dataSource Methods - --------------------------------*/ - (int) numberOfRowsInTableView: (NSTableView *)tableView { return [allSongs count]; } - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(int) row { NSString *identifier = [tableColumn identifier]; return [[allSongs objectAtIndex: row] valueForKey: identifier]; } /* ---------------------------- - Browser delegate Methods - ----------------------------*/ - (int)browser:(NSBrowser *)sender numberOfRowsInColumn:(int)column { if (column == 0) { return [allArtists count] + 1; } else { [self _getAllAlbumsForArtistAt: [sender selectedRowInColumn: 0]]; return [allAlbums count]+1; } } - (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(int)row column:(int)column { if (column == 0) { [cell setLeaf: NO]; if (row == 0) { [cell setStringValue: [NSString stringWithFormat: @"All (%d Artists)", [allArtists count]]]; } else { [cell setFormatter: [[[NormalFormatter alloc] init] autorelease]]; [cell setStringValue: [allArtists objectAtIndex: row-1]]; } } else { [cell setLeaf: YES]; if (row == 0) { [cell setFormatter: [[[BoldFormatter alloc] init] autorelease]]; [cell setStringValue: [NSString stringWithFormat: @"All (%d Albums)", [allAlbums count]]]; } else { [cell setStringValue: [allAlbums objectAtIndex: row-1]]; } } } - (NSString *)browser:(NSBrowser *)sender titleOfColumn:(int)column { if (column == 0) { return @"Artists"; } else if (column == 1) { return @"Albums"; } } - (void) selectionChanged: (id) sender { [self _getAllTracksForArtistAt: [sender selectedRowInColumn: 0] albumAt: [sender selectedRowInColumn: 1]]; [trackView reloadData]; [trackView deselectAll: sender]; if ([trackView numberOfRows] > 0) { [trackView scrollRowToVisible: 0]; } } /* ------------------------------ - TableView dragging Methods - ------------------------------*/ - (BOOL) tableView: (NSTableView *)tv writeRows: (NSArray *)rows toPasteboard: (NSPasteboard*)pboard { NSArray *typeArray; NSMutableArray *songArray; BOOL accept; unsigned int count; count = [rows count]; if (count > 0) { int i; songArray = [[NSMutableArray alloc] init]; for (i = 0; i < count; i++) { [songArray addObject: [[allSongs objectAtIndex: [[rows objectAtIndex: i] intValue]] getPath]]; } accept = YES; typeArray = [NSArray arrayWithObjects: CollectionDragType, nil]; [pboard declareTypes: typeArray owner: self]; [pboard setPropertyList: [songArray autorelease] forType: CollectionDragType]; } else { accept = NO; } return accept; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) didNotConnect: (NSNotification *)aNotif { [[self window] performClose: self]; } @end /* ------------------- - Private Methods - -------------------*/ @implementation CollectionController(Private) - (void) _refreshViews { [self _filterCollectionByString: [filterField stringValue]]; [collectionView reloadColumn: 0]; [collectionView selectRow: 0 inColumn: 0]; [self selectionChanged: collectionView]; } - (void) _getAllAlbumsForArtistAt: (int)row { RELEASE(allAlbums); NSMutableSet *tmpAlbums = [[NSMutableSet alloc] init]; int i; for (i = 0; i < [filteredTracks count]; i++) { if (row <= 0) { [tmpAlbums addObject: [[filteredTracks objectAtIndex: i] getAlbum]]; } else { if ([[[filteredTracks objectAtIndex: i] getArtist] compare: [allArtists objectAtIndex: (row-1)]] == NSOrderedSame) { [tmpAlbums addObject: [[filteredTracks objectAtIndex: i] getAlbum]]; } } } allAlbums = [[[[tmpAlbums autorelease] allObjects] sortedArrayUsingFunction: _aSort context: NULL] retain]; } - (void) _getAllTracksForArtistAt: (int)artistRow albumAt: (int)albumRow { RELEASE(allSongs); if (artistRow < 1) { if (albumRow < 1) { allSongs = [[NSArray arrayWithArray: filteredTracks] retain]; } else { NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; int i; for (i = 0; i < [filteredTracks count]; i++) { if ([[[filteredTracks objectAtIndex: i] getAlbum] compare: [allAlbums objectAtIndex: (albumRow -1)]] == NSOrderedSame) { [tmpArray addObject: [filteredTracks objectAtIndex: i]]; } } allSongs = [[NSArray arrayWithArray: [tmpArray autorelease]] retain]; } } else { if (albumRow < 1) { NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; int i; for (i = 0; i < [filteredTracks count]; i++) { if ([[[filteredTracks objectAtIndex: i] getArtist] compare: [allArtists objectAtIndex: (artistRow -1)]] == NSOrderedSame) { [tmpArray addObject: [filteredTracks objectAtIndex: i]]; } } allSongs = [[NSArray arrayWithArray: [tmpArray autorelease]] retain]; } else { NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; int i; for (i = 0; i < [filteredTracks count]; i++) { if (([[[filteredTracks objectAtIndex: i] getArtist] compare: [allArtists objectAtIndex: (artistRow -1)]] == NSOrderedSame) && ([[[filteredTracks objectAtIndex: i] getAlbum] compare: [allAlbums objectAtIndex: (albumRow -1)]] == NSOrderedSame)) { [tmpArray addObject: [filteredTracks objectAtIndex: i]]; } } allSongs = [[NSArray arrayWithArray: [tmpArray autorelease]] retain]; } } } - (void) _filterCollectionByString: (NSString *) fString { RELEASE(allArtists); RELEASE(filteredTracks); if ([fString compare: @""] == NSOrderedSame) { allArtists = RETAIN([[MPDController sharedMPDController] getAllArtists]); filteredTracks = RETAIN([[MPDController sharedMPDController] getAllTracks]); } else { NSArray *allTracks = [[[MPDController sharedMPDController] getAllTracks] retain]; NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; NSMutableSet *tmpArtists = [[NSMutableSet alloc] init]; int i; for (i = 0; i < [allTracks count]; i++) { if ([[[allTracks objectAtIndex: i] getArtist] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [allTracks objectAtIndex: i]]; } else if ([[[allTracks objectAtIndex: i] getTitle] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [allTracks objectAtIndex: i]]; } else if ([[[allTracks objectAtIndex: i] getAlbum] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [allTracks objectAtIndex: i]]; } } [allTracks release]; filteredTracks = [[NSArray arrayWithArray: [tmpArray autorelease]] retain]; for (i = 0; i < [filteredTracks count]; i++) { [tmpArtists addObject: [[filteredTracks objectAtIndex: i] getArtist]]; } allArtists = [[[[tmpArtists autorelease] allObjects] sortedArrayUsingFunction: _aSort context: NULL] retain]; } } int _artistSort(id artist1, id artist2, void *context) { PlaylistItem *pl1, *pl2; pl1 = (PlaylistItem *)artist1; pl2 = (PlaylistItem *)artist2; return [[pl1 getArtist] caseInsensitiveCompare: [pl2 getArtist]]; } int _albumSort(id album1, id album2, void *context) { PlaylistItem *pl1, *pl2; pl1 = (PlaylistItem *)album1; pl2 = (PlaylistItem *)album2; return [[pl1 getAlbum] caseInsensitiveCompare: [pl2 getAlbum]]; } int _titleSort(id track1, id track2, void *context) { PlaylistItem *pl1, *pl2; pl1 = (PlaylistItem *)track1; pl2 = (PlaylistItem *)track2; return [[pl1 getTitle] caseInsensitiveCompare: [pl2 getTitle]]; } int _trackSort(id track1, id track2, void *context) { PlaylistItem *pl1, *pl2; pl1 = (PlaylistItem *)track1; pl2 = (PlaylistItem *)track2; return [[pl1 getTrackNr] caseInsensitiveCompare: [pl2 getTrackNr]]; } int _aSort(id string1, id string2, void *context) { return [string1 caseInsensitiveCompare: string2]; } @end mpdcon.app-1.1.99/CrossfadeController.h0000644000175000017510000000253710377163471017063 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Crossfade Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_CROSSFADECONTROLLER_H #define _PCAPPPROJ_CROSSFADECONTROLLER_H #include #include "MPDController.h" #include "Strings.h" @interface CrossfadeController : NSWindowController { IBOutlet NSTextField *valueField; IBOutlet NSStepper *valueStepper; IBOutlet NSWindow *window; } // Initialization Methods + (id) sharedCrossfadeController; // Gui Methods - (void) valueChanged: (id)sender; - (void) apply: (id)sender; - (void) revert: (id)sender; @end #endif mpdcon.app-1.1.99/CrossfadeController.m0000644000175000017510000000446310377163471017070 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Crossfade Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "CrossfadeController.h" /* --------------------- - Private Interface - ---------------------*/ @interface CrossfadeController(Private) - (void) _getValues; @end @implementation CrossfadeController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedCrossfadeController { static CrossfadeController *_sharedCrossfadeController = nil; if (! _sharedCrossfadeController) { _sharedCrossfadeController = [[CrossfadeController allocWithZone: [self zone]] init]; } return _sharedCrossfadeController; } - (id) init { self = [self initWithWindowNibName: @"CrossfadeView"]; if (self) { [self setWindowFrameAutosaveName: @"CrossfadeView"]; } return self; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { [self _getValues]; } - (void) valueChanged: (id)sender { [valueField setIntValue: [valueStepper intValue]]; } - (void) apply: (id)sender { [[MPDController sharedMPDController] setCrossfade: [valueStepper intValue]]; [[self window] performClose: self]; } - (void) revert: (id)sender { [self _getValues]; } @end /* ------------------- - Private Methods - -------------------*/ @implementation CrossfadeController(Private) - (void) _getValues { [valueStepper setIntValue: [[MPDController sharedMPDController] getCrossfade]]; [self valueChanged: self]; } @end mpdcon.app-1.1.99/GNUmakefile0000644000175000017510000000352110405367771015002 0ustar tarDebian-NM# # GNUmakefile - Generated by ProjectCenter # include $(GNUSTEP_MAKEFILES)/common.make # # Application # VERSION = 1.1.99 PACKAGE_NAME = MPDCon APP_NAME = MPDCon MPDCon_APPLICATION_ICON = MPDCon.tiff GNUSTEP_INSTALLATION_DIR = $(HOME) # # Resource files # MPDCon_RESOURCE_FILES = \ Resources/Player.gorm \ Resources/Preferences.gorm \ Resources/PlaylistViewer.gorm \ Resources/Collection.gorm \ Resources/PlaylistsManager.gorm \ Resources/StatisticsViewer.gorm \ Resources/CrossfadeView.gorm\ Resources/Play.tiff \ Resources/Pause.tiff \ Resources/Next.tiff \ Resources/Prev.tiff \ Resources/Stop.tiff \ Resources/GNUstep.tiff \ Resources/Repeat.tiff \ Resources/Shuffle.tiff \ Resources/Playlist.tiff \ Resources/Crossfade.tiff \ Resources/MPDCon.tiff \ Resources/MoveSong.tiff \ Resources/Current.tiff\ Resources/Info-gnustep.plist\ Resources/Install \ Resources/COPYING \ Resources/TODO.txt # # Header files # MPDCon_HEADER_FILES = \ AppController.h \ PreferencesController.h \ PlayView.h \ libmpdclient.h \ PlaylistController.h \ MPDController.h \ PlaylistItem.h \ CollectionController.h \ PlaylistsManagerController.h \ StatisticsController.h \ StatisticsItem.h \ CrossfadeController.h \ OwnTableView.h \ Strings.h \ BoldCell.h \ BoldFormatter.h \ NormalFormatter.h # # Class files # MPDCon_OBJC_FILES = \ AppController.m \ PreferencesController.m \ PlayView.m \ PlaylistController.m \ MPDController.m \ PlaylistItem.m \ CollectionController.m \ PlaylistsManagerController.m \ StatisticsController.m \ StatisticsItem.m \ CrossfadeController.m \ OwnTableView.m \ BoldCell.m \ BoldFormatter.m \ NormalFormatter.m # # C files # MPDCon_C_FILES = \ libmpdclient.c MPDCon_OBJC_FILES += \ main.m # # Makefiles # -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/application.make -include GNUmakefile.postamble mpdcon.app-1.1.99/GNUmakefile.postamble0000644000175000017510000000124410377163471016766 0ustar tarDebian-NM# # GNUmakefile.postamble - Generated by ProjectCenter # # Things to do before compiling # before-all:: # Things to do after compiling # after-all:: # Things to do before installing # before-install:: # Things to do after installing # after-install:: # Things to do before uninstalling # before-uninstall:: # Things to do after uninstalling # after-uninstall:: # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning # after-distclean:: # Things to do before checking # before-check:: # Things to do after checking # after-check:: mpdcon.app-1.1.99/GNUmakefile.preamble0000644000175000017510000000077410405367771016577 0ustar tarDebian-NM# # GNUmakefile.preamble - Generated by ProjectCenter # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS += # Additional flags to pass to Objective C compiler ADDITIONAL_OBJCFLAGS += # Additional flags to pass to C compiler ADDITIONAL_CFLAGS += # Additional flags to pass to the linker ADDITIONAL_LDFLAGS += # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS += # Additional library directories the linker should search ADDITIONAL_LIB_DIRS += mpdcon.app-1.1.99/Info-gnustep.plist0000644000175000017510000000167610377163471016373 0ustar tarDebian-NM{ ApplicationDescription = "GNUstep Client for MPD"; ApplicationIcon = MPDCon.tiff; ApplicationName = MPDCon; ApplicationRelease = 1.1; Authors = ( "Daniel Luederwald " ); Copyright = "Copyright (C) 2004 Daniel Luederwald"; CopyrightDescription = "Released under the GNU General Public License 2.0"; FullVersionID = 1.1; NSExecutable = MPDCon; NSIcon = MPDCon.tiff; NSMainNibFile = Player.gorm; NSPrincipalClass = NSApplication; NSRole = Application; NSTypes = ( ); NSServices = ( { NSPortName = MPDCon; NSMessage = getPlaylist; NSMenuItem = { default = "MPDCon/Get Playlist"; English = "MPDCon/Get Playlist"; }; NSReturnTypes = (NSStringPboardType); }, { NSPortName = MPDCon; NSMessage = getAlbums; NSMenuItem = { default = "MPDCon/Get Albums"; English = "MPDCon/Get Albums"; }; NSReturnTypes = (NSStringPboardType); } ); } mpdcon.app-1.1.99/MPDController.h0000644000175000017510000000556310377163471015574 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-14 11:37:03 +0200 by flip MPD Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_MPDCONTROLLER_H_ #define _PCAPPPROJ_MPDCONTROLLER_H_ #include #include "PlaylistItem.h" #include "StatisticsItem.h" #include "Strings.h" #include "libmpdclient.h" #define state_NOCONN -1 #define state_STOP 0 #define state_PLAY 1 #define state_PAUSE 2 @interface MPDController : NSObject { mpd_Connection *mpdConnection; NSString *host; NSString *port; NSString *password; long long currPlaylist; } // Initialization Methods + (id) sharedMPDController; // Connection Methods - (BOOL) connectToServer: (NSString *)hostName port: (NSString *)port password: (NSString *)pword; // Play Methods - (void) play; - (void) playSong: (int)song; - (void) stop; - (void) prev; - (void) next; - (void) toggleShuffle; - (void) toggleRepeat; - (void) seekToTime: (int)time; - (void) setVolume: (int)volume; - (void) setCrossfade: (int)cfTime; // Information Methods - (int) getState; - (BOOL) isRandom; - (BOOL) isRepeat; - (int) getVolume; - (int) getCrossfade; - (StatisticsItem *) getStatistics; // Playlist Commands - (PlaylistItem *) getCurrentSong; - (int) getCurrentSongNr; - (int) getPlaylistLength; - (NSArray *) getPlaylist; - (BOOL) playlistChanged; - (void) shuffleList; - (void) clearPlaylist; - (void) removeSong: (int)song; - (void) addTrack: (NSString *)file; - (void) moveSongNr: (int)song1 to: (int)song2; - (void) moveSongWithID: (int)song1 to: (int)song2; - (NSArray *) getAllPlaylists; - (void) loadPlaylist: (NSString *)title; - (void) savePlaylist: (NSString *)title; - (void) removePlaylist: (NSString *)title; // Collection Commands - (NSArray *) getAllArtists; - (NSArray *) getAllAlbums; - (NSArray *) getAllTracks; - (NSArray *) getAlbumsForArtist: (NSString *)artist; - (NSArray *) getAllTracksForArtist: (NSString *)artist; - (NSArray *) getAllTracksForArtist: (NSString *)artist album: (NSString *)album; - (NSArray *) getAllTracksForAlbum: (NSString *)album; - (void) updateCollection; @end #endif mpdcon.app-1.1.99/MPDController.m0000644000175000017510000005707510377426330015602 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-14 11:37:03 +0200 by flip This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "MPDController.h" /* --------------------- - Private Interface - ---------------------*/ @interface MPDController(Private) - (BOOL) _doConnect; - (BOOL) _checkConnection; - (PlaylistItem *) _getPlaylistItemForSong: (mpd_Song *)anSong; int _stringSort(id string1, id string2, void *context); @end @implementation MPDController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedMPDController { static MPDController *_sharedMPDController = nil; if (! _sharedMPDController) { _sharedMPDController = [[MPDController allocWithZone: [self zone]] init]; } return _sharedMPDController; } - (void) dealloc { mpd_closeConnection(mpdConnection); RELEASE(host); RELEASE(port); RELEASE(password); [super dealloc]; } /* ---------------------- - Connection Methods - ----------------------*/ - (BOOL) connectToServer: (NSString *)hostName port: (NSString *)portNr password: (NSString *)pword { if ((hostName) && (portNr)) { BOOL didConnect; if (host) { RELEASE(host); } if (port) { RELEASE(port); } if (password) { RELEASE(password); } host = [hostName copy]; port = [portNr copy]; password = [pword copy]; didConnect = [self _doConnect]; mpd_closeConnection(mpdConnection); return didConnect; } else { return NO; } } /* ---------------- - Play Methods - ----------------*/ - (void) play { [self playSong: MPD_PLAY_AT_BEGINNING]; } - (void) playSong: (int)theSong { mpd_Status *mpdStatus; if (![self _doConnect]) { return; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (theSong != MPD_PLAY_AT_BEGINNING) { mpd_sendPlayCommand(mpdConnection, theSong); } else { if(mpdStatus->state == MPD_STATUS_STATE_STOP) { mpd_sendPlayCommand(mpdConnection, 0); } else { mpd_sendPauseCommand(mpdConnection,3-mpdStatus->state); } } mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); } - (void) stop { mpd_Status *mpdStatus; if (! [self _doConnect]) { return; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if((mpdStatus->state == MPD_STATUS_STATE_PLAY) || (mpdStatus->state == MPD_STATUS_STATE_PAUSE)) { mpd_sendStopCommand(mpdConnection); mpd_finishCommand(mpdConnection); } mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); } - (void) prev { mpd_Status *mpdStatus; if (! [self _doConnect]) { return; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if((mpdStatus->state == MPD_STATUS_STATE_PLAY) || (mpdStatus->state == MPD_STATUS_STATE_PAUSE)) { mpd_sendPrevCommand(mpdConnection); mpd_finishCommand(mpdConnection); } mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); } - (void) next { mpd_Status *mpdStatus; if (! [self _doConnect]) { return; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if((mpdStatus->state == MPD_STATUS_STATE_PLAY) || (mpdStatus->state == MPD_STATUS_STATE_PAUSE)) { mpd_sendNextCommand(mpdConnection); mpd_finishCommand(mpdConnection); } mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); } - (void) toggleShuffle { mpd_Status *mpdStatus; if (! [self _doConnect]) { return; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); mpd_sendRandomCommand(mpdConnection, (mpdStatus->random == 0) ? 1 : 0); mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); } - (void) toggleRepeat { mpd_Status *mpdStatus; if (! [self _doConnect]) { return; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); mpd_sendRepeatCommand(mpdConnection, (mpdStatus->repeat == 0) ? 1 : 0); mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); } - (void) seekToTime: (int)time { mpd_Status *mpdStatus; if (! [self _doConnect]) { return; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if ((mpdStatus->state == MPD_STATUS_STATE_PLAY) || (mpdStatus->state == MPD_STATUS_STATE_PAUSE)) { mpd_sendSeekCommand(mpdConnection, mpdStatus->song, time); mpd_finishCommand(mpdConnection); } mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); } - (void) setVolume: (int)volume { if (! [self _doConnect]) { return; } mpd_sendSetvolCommand(mpdConnection, volume); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } - (void) setCrossfade: (int)cfTime { if (! [self _doConnect]) { return; } mpd_sendCrossfadeCommand(mpdConnection, cfTime); mpd_finishCommand(mpdConnection); mpd_closeConnection; } /* ----------------------- - Information Methods - -----------------------*/ - (int) getState { int state; mpd_Status *mpdStatus; if (! [self _doConnect]) { return state_NOCONN; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (! [self _checkConnection]) { return state_NOCONN; } switch (mpdStatus->state) { case MPD_STATUS_STATE_STOP: state = state_STOP; break; case MPD_STATUS_STATE_PLAY: state = state_PLAY; break; case MPD_STATUS_STATE_PAUSE: state = state_PAUSE; break; } mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); return state; } - (BOOL) isRandom { BOOL random; mpd_Status *mpdStatus; if (! [self _doConnect]) { return NO; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (! [self _checkConnection]) { return NO; } if ((mpdStatus->random) == 1) { random = YES; } else { random = NO; } mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); return random; } - (BOOL) isRepeat { BOOL repeat; mpd_Status *mpdStatus; if (! [self _doConnect]) { return NO; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (! [self _checkConnection]) { return NO; } if ((mpdStatus->repeat) == 1) { repeat = YES; } else { repeat = NO; } mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); return repeat; } - (int) getVolume { int volume; mpd_Status *mpdStatus; if (! [self _doConnect]) { return 0.0; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (! [self _checkConnection]) { return 0; } volume = mpdStatus->volume; mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); return volume; } - (int) getCrossfade { int cfTime; mpd_Status *mpdStatus; if (! [self _doConnect]) { return 0; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (! [self _checkConnection]) { return 0; } cfTime = mpdStatus->crossfade; mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); return cfTime; } - (StatisticsItem *) getStatistics { mpd_Stats *mpdStats; StatisticsItem *statItem; if (! [self _doConnect]) { return nil; } mpd_sendStatsCommand(mpdConnection); mpdStats = mpd_getStats(mpdConnection); if (! [self _checkConnection]) { return nil; } statItem = [[StatisticsItem alloc] init]; [statItem setNumberOfArtists: mpdStats->numberOfArtists]; [statItem setNumberOfAlbums: mpdStats->numberOfAlbums]; [statItem setNumberOfSongs: mpdStats->numberOfSongs]; [statItem setUptime: mpdStats->uptime]; [statItem setDbUpdatetime: mpdStats->dbUpdateTime]; [statItem setPlaytime: mpdStats->playTime]; [statItem setDbPlaytime: mpdStats->dbPlayTime]; mpd_freeStats(mpdStats); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return AUTORELEASE(statItem); } /* --------------------- - Playlist Commands - ---------------------*/ - (PlaylistItem *) getCurrentSong { mpd_Status *mpdStatus; mpd_InfoEntity *mpdInfoEntity; PlaylistItem *currSong; if (! [self _doConnect]) { return nil; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (! [self _checkConnection]) { return nil; } if(mpdStatus->state == MPD_STATUS_STATE_PLAY || mpdStatus->state == MPD_STATUS_STATE_PAUSE) { mpd_sendPlaylistInfoCommand(mpdConnection, mpdStatus->song); while((mpdInfoEntity = mpd_getNextInfoEntity(mpdConnection))) { mpd_Song *mpdSong; if(mpdInfoEntity->type!=MPD_INFO_ENTITY_TYPE_SONG) { mpd_freeInfoEntity(mpdInfoEntity); continue; } mpdSong = mpdInfoEntity->info.song; currSong = RETAIN([self _getPlaylistItemForSong: mpdSong]); [currSong setElapsedTime: mpdStatus->elapsedTime]; [currSong setTotalTime: mpdStatus->totalTime]; mpd_freeInfoEntity(mpdInfoEntity); break; } mpd_finishCommand(mpdConnection); } mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); if (currSong) { return AUTORELEASE(currSong); } else { return nil; } } - (int) getCurrentSongNr { int songNr; mpd_Status *mpdStatus; if (! [self _doConnect]) { return -1; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (! [self _checkConnection]) { return -1; } songNr = mpdStatus->song+1; mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); return songNr; } - (int) getPlaylistLength { int length; mpd_Status *mpdStatus; if (! [self _doConnect]) { return 0; } mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (! [self _checkConnection]) { return 0; } length = mpdStatus->playlistLength; mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); return length; } - (NSArray *) getPlaylist { NSMutableArray *playlist; mpd_InfoEntity *mpdInfoEntity; if (! [self _doConnect]) { return nil; } mpd_sendPlaylistInfoCommand(mpdConnection, -1); if (! [self _checkConnection]) { mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return nil; } playlist = [[NSMutableArray alloc] init]; while((mpdInfoEntity = mpd_getNextInfoEntity(mpdConnection))) { if(mpdInfoEntity->type=MPD_INFO_ENTITY_TYPE_SONG) { mpd_Song *mpdSong; PlaylistItem *tmpSong; mpdSong = mpdInfoEntity->info.song; tmpSong = RETAIN([self _getPlaylistItemForSong: mpdSong]); [playlist addObject: tmpSong]; RELEASE(tmpSong); } mpd_freeInfoEntity(mpdInfoEntity); } mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return AUTORELEASE(playlist); } - (BOOL) playlistChanged { BOOL changed; mpd_Status *mpdStatus; if (! [self _doConnect]) { return NO; } changed = NO; mpd_sendStatusCommand(mpdConnection); mpdStatus = mpd_getStatus(mpdConnection); if (! [self _checkConnection]) { return NO; } if (mpdStatus->playlist != currPlaylist) { currPlaylist = mpdStatus->playlist; changed = YES; } mpd_finishCommand(mpdConnection); mpd_freeStatus(mpdStatus); mpd_closeConnection(mpdConnection); return changed; } - (void) shuffleList { if (! [self _doConnect]) { return; } mpd_sendShuffleCommand(mpdConnection); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } - (void) clearPlaylist { if (! [self _doConnect]) { return; } mpd_sendClearCommand(mpdConnection); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } - (void) removeSong: (int)song { if (! [self _doConnect]) { return; } mpd_sendDeleteCommand(mpdConnection, song); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } - (void) addTrack: (NSString *)file { if (! [self _doConnect]) { return; } mpd_sendAddCommand(mpdConnection, [file UTF8String]); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } - (void) moveSongNr: (int)song1 to: (int)song2 { if (! [self _doConnect]) { return; } mpd_sendMoveCommand(mpdConnection, song1, song2); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } - (void) moveSongWithID: (int)song1 to: (int)song2 { if (! [self _doConnect]) { return; } mpd_sendMoveIdCommand(mpdConnection, song1, song2); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } - (NSArray *) getAllPlaylists { NSMutableArray *tmpArray; mpd_InfoEntity *mpdInfoEntity; if (! [self _doConnect]) { return nil; } mpd_sendLsInfoCommand(mpdConnection, ""); if (! [self _checkConnection]) { return nil; } tmpArray = [[NSMutableArray alloc] init]; while((mpdInfoEntity = mpd_getNextInfoEntity(mpdConnection))) { if(mpdInfoEntity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { mpd_PlaylistFile *mpdPlaylistFile = mpdInfoEntity->info.playlistFile; [tmpArray addObject: [NSString stringWithUTF8String: mpdPlaylistFile->path]]; } mpd_freeInfoEntity(mpdInfoEntity); } mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return AUTORELEASE(tmpArray); } - (void) loadPlaylist: (NSString *)title { if (! [self _doConnect]) { return; } mpd_sendLoadCommand(mpdConnection, [title cString]); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } - (void) savePlaylist: (NSString *)title { if (! [self _doConnect]) { return; } mpd_sendSaveCommand(mpdConnection, [title cString]); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } - (void) removePlaylist: (NSString *)title { if (! [self _doConnect]) { return; } mpd_sendRmCommand(mpdConnection, [title cString]); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } /* ----------------------- - Collection Commands - -----------------------*/ - (NSArray *) getAllArtists { NSMutableArray *allArtists; char *artistName; if (! [self _doConnect]) { return nil; } mpd_sendListCommand(mpdConnection, MPD_TABLE_ARTIST, NULL); if (! [self _checkConnection]) { return nil; } allArtists = [[NSMutableArray alloc] init]; while ((artistName = mpd_getNextArtist(mpdConnection)) != NULL) { [allArtists addObject: [NSString stringWithUTF8String: artistName]]; free(artistName); } mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return [AUTORELEASE(allArtists) sortedArrayUsingFunction: _stringSort context: NULL]; } - (NSArray *) getAllAlbums { NSMutableArray *allAlbums; char *albumName; if (! [self _doConnect]) { return nil; } mpd_sendListCommand(mpdConnection, MPD_TABLE_ALBUM,NULL); if (! [self _checkConnection]) { return nil; } allAlbums = [[NSMutableArray alloc] init]; while ((albumName = mpd_getNextAlbum(mpdConnection)) != NULL) { [allAlbums addObject: [NSString stringWithUTF8String: albumName]]; free(albumName); } mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return [AUTORELEASE(allAlbums) sortedArrayUsingFunction: _stringSort context: NULL]; } - (NSArray *) getAllTracks { NSMutableArray *allTracks; mpd_InfoEntity *mpdInfoEntity; if (! [self _doConnect]) { return nil; } mpd_sendListallInfoCommand(mpdConnection, ""); if (! [self _checkConnection]) { return nil; } allTracks = [[NSMutableArray alloc] init]; while((mpdInfoEntity = mpd_getNextInfoEntity(mpdConnection))) { if(mpdInfoEntity->type == MPD_INFO_ENTITY_TYPE_SONG) { mpd_Song *mpdSong; PlaylistItem *tmpSong; mpdSong = mpdInfoEntity->info.song; tmpSong = RETAIN([self _getPlaylistItemForSong: mpdSong]); [allTracks addObject: tmpSong]; RELEASE(tmpSong); } mpd_freeInfoEntity(mpdInfoEntity); } mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return AUTORELEASE(allTracks); } - (NSArray *) getAlbumsForArtist: (NSString *)artist { NSMutableArray *allAlbums; char *albumName; if (! [self _doConnect]) { return nil; } mpd_sendListCommand(mpdConnection, MPD_TABLE_ALBUM, [artist UTF8String]); if (! [self _checkConnection]) { return nil; } allAlbums = [[NSMutableArray alloc] init]; while ((albumName = mpd_getNextAlbum(mpdConnection)) != NULL) { [allAlbums addObject: [NSString stringWithUTF8String: albumName]]; free(albumName); } mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return [AUTORELEASE(allAlbums) sortedArrayUsingFunction: _stringSort context:NULL]; } - (NSArray *) getAllTracksForArtist: (NSString *)artist { NSMutableArray *allTracks; mpd_InfoEntity *mpdInfoEntity; if (! [self _doConnect]) { return nil; } mpd_sendFindCommand(mpdConnection, MPD_TABLE_ARTIST, [artist UTF8String]); if (! [self _checkConnection]) { return nil; } allTracks = [[NSMutableArray alloc] init]; while((mpdInfoEntity = mpd_getNextInfoEntity(mpdConnection))) { if(mpdInfoEntity->type == MPD_INFO_ENTITY_TYPE_SONG) { mpd_Song *mpdSong; PlaylistItem *tmpSong; mpdSong = mpdInfoEntity->info.song; tmpSong = RETAIN([self _getPlaylistItemForSong: mpdSong]); [allTracks addObject: tmpSong]; RELEASE(tmpSong); } mpd_freeInfoEntity(mpdInfoEntity); } mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return AUTORELEASE(allTracks); } - (NSArray *) getAllTracksForArtist: (NSString *)artist album: (NSString *)album { NSArray *tmpArray; NSMutableArray *allTracks; int i; tmpArray = RETAIN([self getAllTracksForArtist: artist]); if (! tmpArray) { return nil; } allTracks = [[NSMutableArray alloc] init]; for (i = 0; i < [tmpArray count]; i++) { if ([[[tmpArray objectAtIndex: i] getAlbum] isEqual: album]) { [allTracks addObject: [tmpArray objectAtIndex: i]]; } } RELEASE(tmpArray); return AUTORELEASE(allTracks); } - (NSArray *) getAllTracksForAlbum: (NSString *)album { NSMutableArray *allTracks; mpd_InfoEntity *mpdInfoEntity; if (! [self _doConnect]) { return nil; } mpd_sendFindCommand(mpdConnection, MPD_TABLE_ALBUM, [album UTF8String]); if (! [self _checkConnection]) { return nil; } allTracks = [[NSMutableArray alloc] init]; while((mpdInfoEntity = mpd_getNextInfoEntity(mpdConnection))) { if(mpdInfoEntity->type == MPD_INFO_ENTITY_TYPE_SONG) { mpd_Song *mpdSong; PlaylistItem *tmpSong; mpdSong = mpdInfoEntity->info.song; tmpSong = RETAIN([self _getPlaylistItemForSong: mpdSong]); [allTracks addObject: tmpSong]; RELEASE(tmpSong); } mpd_freeInfoEntity(mpdInfoEntity); } mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return AUTORELEASE(allTracks);; } - (void) updateCollection { if (! [self _doConnect]) { return; } mpd_sendUpdateCommand(mpdConnection, ""); mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); } @end /* ------------------- - Private Methods - -------------------*/ @implementation MPDController(Private) - (BOOL) _doConnect { char *mpdHost; int mpdPort; mpdHost = (char *)[host cString]; mpdPort = (int) [port floatValue]; mpdConnection = mpd_newConnection(mpdHost, mpdPort, 10); if (password) { mpd_sendPasswordCommand(mpdConnection, (char *)[password cString]); mpd_finishCommand(mpdConnection); } if (mpdConnection->error != 0) { [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: DidNotConnectNotification object: [NSString stringWithUTF8String: mpdConnection->errorStr]]]; return NO; } else { [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: DidConnectNotification object: nil]]; return YES; } } - (BOOL) _checkConnection { if (mpdConnection->error != 0) { [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: DidNotConnectNotification object: [NSString stringWithUTF8String: mpdConnection->errorStr]]]; mpd_finishCommand(mpdConnection); mpd_closeConnection(mpdConnection); return NO; } else { return YES; } } - (PlaylistItem *) _getPlaylistItemForSong: (mpd_Song *)anSong { PlaylistItem *plItem; plItem = [[PlaylistItem alloc] init]; if (anSong->artist == NULL) { [plItem setArtist: _(@"Unknown Artist")]; } else { [plItem setArtist: [NSString stringWithUTF8String: anSong->artist]]; } if (anSong->title == NULL) { [plItem setTitle: _(@"Unknown Title")]; } else { [plItem setTitle: [NSString stringWithUTF8String: anSong->title]]; } if (anSong->album == NULL) { [plItem setAlbum: _(@"Unknown Album")]; } else { [plItem setAlbum: [NSString stringWithUTF8String: anSong->album]]; } [plItem setPath: [NSString stringWithUTF8String: anSong->file]]; if (anSong->track == NULL) { [plItem setTrackNr: @""]; } else { [plItem setTrackNr: [NSString stringWithUTF8String: anSong->track]]; } [plItem setTotalTime: anSong->time]; [plItem setID: anSong->id]; [plItem setPos: anSong->pos]; return AUTORELEASE(plItem); } int _stringSort(id string1, id string2, void *context) { NSString *str1, *str2; str1 = (NSString *) string1; str2 = (NSString *) string2; return [str1 caseInsensitiveCompare: str2]; } @end mpdcon.app-1.1.99/NormalFormatter.h0000644000175000017510000000203710405367622016211 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:52:30 +0100 by mrsanders This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _NORMALFORMATTER_H_ #define _NORMALFORMATTER_H_ #include #include @interface NormalFormatter : NSFormatter { } @end #endif // _NORMALFORMATTER_H_ mpdcon.app-1.1.99/NormalFormatter.m0000644000175000017510000000321110405367523016211 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:52:30 +0100 by mrsanders This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "NormalFormatter.h" @implementation NormalFormatter - (NSString *) stringForObjectValue: (id) anObject { return anObject; } - (NSAttributedString *)attributedStringForObjectValue: (id) anObject withDefaultAttributes: (NSDictionary *) attr { NSFont *theFont = [NSFont systemFontOfSize: [NSFont systemFontSize]]; NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString: anObject]; NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithDictionary: attr]; [attrs setObject: theFont forKey: NSFontAttributeName]; [aString setAttributes: attrs range: NSMakeRange(0, [aString length])]; return [aString autorelease]; } - (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error { *obj = string; } @end mpdcon.app-1.1.99/OwnTableView.h0000644000175000017510000000177610377163471015460 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_OWNTABLEVIEW_H #define _PCAPPPROJ_OWNTABLEVIEW_H #include #include "Strings.h" @interface OwnTableView : NSTableView { } @end #endif mpdcon.app-1.1.99/OwnTableView.m0000644000175000017510000000546210404404733015447 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-17 23:17:38 +0200 by flip This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "OwnTableView.h" @implementation OwnTableView /* -------------------- - Delegate Methods - --------------------*/ - (NSImage*) dragImageForRows: (NSArray*)dragRows event: (NSEvent*)dragEvent dragImageOffset: (NSPoint*)dragImageOffset { return [NSImage imageNamed: @"MoveSong"]; } - (void) selectAll: (id) sender { [super selectAll: sender]; [self setNeedsDisplay: YES]; } - (void) keyDown: (NSEvent *) theEvent { NSString *characters = [theEvent characters]; unichar character = 0; if ([characters length] > 0) { character = [characters characterAtIndex: 0]; } switch (character) { case NSUpArrowFunctionKey: { int row = [self selectedRow]; if (row > 0) { [self selectRow: row-1 byExtendingSelection: NO]; [self scrollRowToVisible: row-1]; } break; } case NSDownArrowFunctionKey: { int row = [self selectedRow]; int maxRow = [self numberOfRows]; if (row < maxRow-1) { [self selectRow: row+1 byExtendingSelection: NO]; [self scrollRowToVisible: row+1]; } break; } case NSHomeFunctionKey: { if ([self numberOfRows] > 0) { [self selectRow: 0 byExtendingSelection: NO]; [self scrollRowToVisible: 0]; } break; } case NSEndFunctionKey: { int rows = [self numberOfRows]; if (rows > 0) { [self selectRow: rows-1 byExtendingSelection: NO]; [self scrollRowToVisible: rows-1]; } break; } case '\r': { [[self target] performSelector: [self doubleAction]]; break; } default: [super keyDown: theEvent]; break; } } @end mpdcon.app-1.1.99/PC.project0000644000175000017510000000553310405367771014627 0ustar tarDebian-NM{ APPLICATIONICON = MPDCon.tiff; APP_DOCUMENT_BASED = NO; BUILDTOOL = "/usr/local/bin/gmake"; CLASS_FILES = ( AppController.m, PreferencesController.m, PlayView.m, PlaylistController.m, MPDController.m, PlaylistItem.m, CollectionController.m, PlaylistsManagerController.m, StatisticsController.m, StatisticsItem.m, CrossfadeController.m, OwnTableView.m, BoldCell.m, BoldFormatter.m, NormalFormatter.m ); COMPILEROPTIONS = ""; CPPOPTIONS = ""; CREATION_DATE = "2004-05-12 17:59:14 +0200"; DOCU_FILES = ( Install, COPYING, TODO.txt ); FRAMEWORKS = ( ); HEADER_FILES = ( AppController.h, PreferencesController.h, PlayView.h, libmpdclient.h, PlaylistController.h, MPDController.h, PlaylistItem.h, CollectionController.h, PlaylistsManagerController.h, StatisticsController.h, StatisticsItem.h, CrossfadeController.h, OwnTableView.h, Strings.h, BoldCell.h, BoldFormatter.h, NormalFormatter.h ); IMAGES = ( Play.tiff, Pause.tiff, Next.tiff, Prev.tiff, Stop.tiff, GNUstep.tiff, Repeat.tiff, Shuffle.tiff, Playlist.tiff, Crossfade.tiff, MPDCon.tiff, MoveSong.tiff, Current.tiff ); INSTALLDIR = "$(HOME)"; INTERFACES = ( Player.gorm, Preferences.gorm, PlaylistViewer.gorm, Collection.gorm, PlaylistsManager.gorm, StatisticsViewer.gorm, CrossfadeView.gorm ); LANGUAGE = English; LAST_EDITING = "2006-03-13 23:19:37 +0100"; LIBRARIES = ( "gnustep-base", "gnustep-gui" ); LINKEROPTIONS = ""; LOCALIZED_RESOURCES = ( ); MAININTERFACE = Player.gorm; MAKEFILEDIR = "$(GNUSTEP_MAKEFILES)"; OBJC_COMPILEROPTIONS = ""; OTHER_FILES = ( ); OTHER_RESOURCES = ( "Info-gnustep.plist" ); OTHER_SOURCES = ( main.m, libmpdclient.c ); PC_WINDOWS = { ProjectWindow = "389 325 736 621 0 0 1280 1024 "; ShowToolbar = YES; }; PRINCIPAL_CLASS = NSApplication; PROJECT_AUTHORS = ( "Daniel Luederwald " ); PROJECT_COPYRIGHT = "Copyright (C) 2004-06 Daniel Luederwald"; PROJECT_COPYRIGHT_DESC = "Released under the GNU General Public License 2.0"; PROJECT_CREATOR = "Daniel Luederwald"; PROJECT_DESCRIPTION = "GNUstep Client for MPD"; PROJECT_DOCUMENTEXTENSIONS = ( ); PROJECT_DOCUMENTTYPES = ( ); PROJECT_GROUP = "No group avaliable!"; PROJECT_MAINTAINER = "Daniel Luederwald"; PROJECT_NAME = MPDCon; PROJECT_RELEASE = 1.1.99; PROJECT_SOURCE = "%{gs_name}-%{gs_version}.tar.gz"; PROJECT_SUMMARY = "No summary avaliable!"; PROJECT_TYPE = Application; PROJECT_URL = ""; PROJECT_VERSION = 0.1; SEARCH_HEADER_DIRS = ( ); SEARCH_LIB_DIRS = ( ); SUBPROJECTS = ( ); SUPPORTING_FILES = ( GNUmakefile.preamble, GNUmakefile, GNUmakefile.postamble ); USER_LANGUAGES = ( AmericanEnglish, English ); }mpdcon.app-1.1.99/PC.project.backup0000644000175000017510000000553310405367763016074 0ustar tarDebian-NM{ APPLICATIONICON = MPDCon.tiff; APP_DOCUMENT_BASED = NO; BUILDTOOL = "/usr/local/bin/gmake"; CLASS_FILES = ( AppController.m, PreferencesController.m, PlayView.m, PlaylistController.m, MPDController.m, PlaylistItem.m, CollectionController.m, PlaylistsManagerController.m, StatisticsController.m, StatisticsItem.m, CrossfadeController.m, OwnTableView.m, BoldCell.m, BoldFormatter.m, NormalFormatter.m ); COMPILEROPTIONS = ""; CPPOPTIONS = ""; CREATION_DATE = "2004-05-12 17:59:14 +0200"; DOCU_FILES = ( Install, COPYING, TODO.txt ); FRAMEWORKS = ( ); HEADER_FILES = ( AppController.h, PreferencesController.h, PlayView.h, libmpdclient.h, PlaylistController.h, MPDController.h, PlaylistItem.h, CollectionController.h, PlaylistsManagerController.h, StatisticsController.h, StatisticsItem.h, CrossfadeController.h, OwnTableView.h, Strings.h, BoldCell.h, BoldFormatter.h, NormalFormatter.h ); IMAGES = ( Play.tiff, Pause.tiff, Next.tiff, Prev.tiff, Stop.tiff, GNUstep.tiff, Repeat.tiff, Shuffle.tiff, Playlist.tiff, Crossfade.tiff, MPDCon.tiff, MoveSong.tiff, Current.tiff ); INSTALLDIR = "$(HOME)"; INTERFACES = ( Player.gorm, Preferences.gorm, PlaylistViewer.gorm, Collection.gorm, PlaylistsManager.gorm, StatisticsViewer.gorm, CrossfadeView.gorm ); LANGUAGE = English; LAST_EDITING = "2006-03-13 23:19:31 +0100"; LIBRARIES = ( "gnustep-base", "gnustep-gui" ); LINKEROPTIONS = ""; LOCALIZED_RESOURCES = ( ); MAININTERFACE = Player.gorm; MAKEFILEDIR = "$(GNUSTEP_MAKEFILES)"; OBJC_COMPILEROPTIONS = ""; OTHER_FILES = ( ); OTHER_RESOURCES = ( "Info-gnustep.plist" ); OTHER_SOURCES = ( main.m, libmpdclient.c ); PC_WINDOWS = { ProjectWindow = "389 325 736 621 0 0 1280 1024 "; ShowToolbar = YES; }; PRINCIPAL_CLASS = NSApplication; PROJECT_AUTHORS = ( "Daniel Luederwald " ); PROJECT_COPYRIGHT = "Copyright (C) 2004-06 Daniel Luederwald"; PROJECT_COPYRIGHT_DESC = "Released under the GNU General Public License 2.0"; PROJECT_CREATOR = "Daniel Luederwald"; PROJECT_DESCRIPTION = "GNUstep Client for MPD"; PROJECT_DOCUMENTEXTENSIONS = ( ); PROJECT_DOCUMENTTYPES = ( ); PROJECT_GROUP = "No group avaliable!"; PROJECT_MAINTAINER = "Daniel Luederwald"; PROJECT_NAME = MPDCon; PROJECT_RELEASE = 1.1.99; PROJECT_SOURCE = "%{gs_name}-%{gs_version}.tar.gz"; PROJECT_SUMMARY = "No summary avaliable!"; PROJECT_TYPE = Application; PROJECT_URL = ""; PROJECT_VERSION = 0.1; SEARCH_HEADER_DIRS = ( ); SEARCH_LIB_DIRS = ( ); SUBPROJECTS = ( ); SUPPORTING_FILES = ( GNUmakefile.preamble, GNUmakefile, GNUmakefile.postamble ); USER_LANGUAGES = ( AmericanEnglish, English ); }mpdcon.app-1.1.99/PlayView.h0000644000175000017510000000324610404422145014627 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Custom View : Shows Trackinfos etc. This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PLAYVIEW_H #define _PCAPPPROJ_PLAYVIEW_H #include #include "PlaylistItem.h" #include "Strings.h" @interface PlayView : NSView { PlaylistItem *dispSong; int currentSong, totalSongs; BOOL displayEnabled; int artistScroll, titleScroll, albumScroll; BOOL artistScrollForward, titleScrollForward, albumScrollForward; BOOL reversedTime; BOOL notificationAdded; } // Display Methods - (void) setDisplaySong: (PlaylistItem *)newSong; - (void) setCurrentSong: (int)newSong; - (void) setTotalSongs: (int)newSong; - (void) setElapsedTime: (int)newTime; - (void) setReversedTime: (BOOL)reversed; - (void) enableDisplay: (BOOL)enable; // Notification Methods - (void) songChanged: (NSNotification *)aNotif; //NSColor *colorFromDict(NSDictionary *dict); @end #endif mpdcon.app-1.1.99/PlayView.m0000644000175000017510000002267710405126371014650 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Custom View : Shows Trackinfos etc. This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "PlayView.h" /* --------------------- - Private Interface - ---------------------*/ @interface PlayView(Private) - (NSString *) _getTime; - (void) _drawTrack; - (void) _drawArtist; - (void) _drawAlbum; - (void) _drawTitle; - (void) _drawTime; @end @implementation PlayView /* -------------------------- - Initialization Methods - --------------------------*/ + (id) init { self = [super init]; return self; } - (void) dealloc { RELEASE(dispSong); [super dealloc]; } /* ------------------- - Display Methods - -------------------*/ - (void) drawRect: (NSRect)rect { NSRect myBounds; NSData *colorData; NSColor *displayColor; if (! notificationAdded) { notificationAdded = YES; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(songChanged:) name: SongChangedNotification object: nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(songChanged:) name: PreferencesChangedNotification object: nil]; } colorData = [[NSUserDefaults standardUserDefaults] dataForKey: @"displayColor"]; if (! colorData) { displayColor = [NSColor grayColor]; } else { displayColor = [NSUnarchiver unarchiveObjectWithData: colorData]; } [displayColor set]; myBounds = [self bounds]; [NSBezierPath fillRect: myBounds]; [[NSColor blackColor] set]; NSRect strokeRect = NSMakeRect(myBounds.origin.x, myBounds.origin.y+1, myBounds.size.width-1, myBounds.size.height-1); [NSBezierPath strokeRect: strokeRect]; if (displayEnabled) { [self _drawTrack]; [self _drawArtist]; [self _drawAlbum]; [self _drawTitle]; [self _drawTime]; } else { NSImage *gnustepImage; int bWidth, bHeight, iWidth, iHeight; bWidth = myBounds.size.width; bHeight = myBounds.size.height; gnustepImage = [NSImage imageNamed: @"GNUstep.tiff"]; iWidth = [gnustepImage size].width; iHeight = [gnustepImage size].height; [gnustepImage compositeToPoint: NSMakePoint((bWidth/2.0) - (iWidth/2.0), (bHeight/2.0) - (iHeight/2.0)) fromRect: myBounds operation: NSCompositeSourceOver]; } } - (void) setDisplaySong: (PlaylistItem *)newSong { RELEASE(dispSong); dispSong = RETAIN(newSong); [self setNeedsDisplay: YES]; } - (void) setCurrentSong: (int)newSong { currentSong = newSong; } - (void) setTotalSongs: (int)newSong { totalSongs = newSong; } - (void) setElapsedTime: (int)newTime { if (dispSong) { [dispSong setElapsedTime: newTime]; } [self setNeedsDisplay: YES]; } - (void) setReversedTime: (BOOL)reversed { reversedTime = reversed; } - (void) enableDisplay: (BOOL)enabled { displayEnabled = enabled; [self setNeedsDisplay: YES]; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) songChanged: (NSNotification *)aNotif { artistScroll = 0; titleScroll = 0; albumScroll = 0; artistScrollForward = YES; titleScrollForward = YES; albumScrollForward = YES; [self setNeedsDisplay: YES]; } /* -------------------- - Delegate Methods - --------------------*/ - (void) mouseUp: (NSEvent *)anEvent { if (reversedTime) { reversedTime = NO; } else { reversedTime = YES; } [[NSUserDefaults standardUserDefaults] setBool: reversedTime forKey: @"reversedTime"]; } @end /* ------------------- - Private Methods - -------------------*/ @implementation PlayView(Private) - (NSString *) _getTime { int totalTime, elapsedTime; int tSecs, eSecs; int tMin, eMin; totalTime = [dispSong getTotalTime]; elapsedTime = [dispSong getElapsedTime]; tSecs = (totalTime % 60); tMin = (int)totalTime/60; eSecs = 0; eMin = 0; if (! reversedTime) { eSecs = (elapsedTime % 60); eMin = (int)elapsedTime/60; return [NSString stringWithFormat: @"%d:%02d/%d:%02d" , eMin, eSecs, tMin, tSecs]; } else { eSecs = ((totalTime - elapsedTime) % 60); eMin = (int) (totalTime - elapsedTime) / 60; return [NSString stringWithFormat: @"- %d:%02d/%d:%02d" , eMin, eSecs, tMin, tSecs]; } } - (void) _drawTrack { [[NSString stringWithFormat: _(@"Playing Track %d of %d") , currentSong, totalSongs] drawAtPoint: NSMakePoint(5, 60) withAttributes: nil]; } - (void) _drawArtist { NSString *theArtist; NSRect myBounds; NSMutableDictionary *attributes; NSFont *theFont; int enableScroll; theArtist = [dispSong getArtist]; myBounds = [self bounds]; attributes = [NSMutableDictionary dictionary]; enableScroll = [[NSUserDefaults standardUserDefaults] integerForKey: @"enableScroll"]; theFont = [NSFont boldSystemFontOfSize: 18]; [attributes setObject: theFont forKey: NSFontAttributeName]; if (([theArtist sizeWithAttributes: attributes].width > myBounds.size.width-10) && enableScroll) { if ([theArtist sizeWithAttributes: attributes].width-artistScroll < myBounds.size.width - 20) { artistScrollForward=NO; } if (artistScroll == 0) { artistScrollForward=YES; } if (artistScrollForward) { artistScroll+=5; } else { artistScroll-=5; } } [theArtist drawAtPoint: NSMakePoint(10-artistScroll, 37) withAttributes: attributes]; } - (void) _drawAlbum { NSString *theAlbum; NSRect myBounds; NSMutableDictionary *attributes; NSFont *theFont; int enableScroll; myBounds = [self bounds]; attributes = [NSMutableDictionary dictionary]; enableScroll = [[NSUserDefaults standardUserDefaults] integerForKey: @"enableScroll"]; theAlbum = [dispSong getAlbum]; theFont = [NSFont systemFontOfSize: 11]; [attributes setObject: theFont forKey: NSFontAttributeName]; if (([theAlbum sizeWithAttributes: attributes].width > myBounds.size.width-3) && enableScroll) { if ([theAlbum sizeWithAttributes: attributes].width-albumScroll < myBounds.size.width - 10) { albumScrollForward=NO; } if (albumScroll == 0) { albumScrollForward=YES; } if (albumScrollForward) { albumScroll+=5; } else { albumScroll-=5; } } [theAlbum drawAtPoint: NSMakePoint(5-albumScroll, 2) withAttributes: attributes]; } - (void) _drawTitle { NSString *theTitle; NSString *theTrack; NSRect myBounds; NSMutableDictionary *attributes; NSFont *theFont; int enableScroll; myBounds = [self bounds]; attributes = [NSMutableDictionary dictionary]; enableScroll = [[NSUserDefaults standardUserDefaults] integerForKey: @"enableScroll"]; theTrack = [dispSong getTrackNr]; if ([theTrack compare: @""] != NSOrderedSame) { theTitle = [theTrack stringByAppendingString: [@" - " stringByAppendingString: [dispSong getTitle]]]; } else { theTitle = [dispSong getTitle]; } theFont = [NSFont boldSystemFontOfSize: 13]; [attributes setObject: theFont forKey: NSFontAttributeName]; if (([theTitle sizeWithAttributes: attributes].width > myBounds.size.width-10) && enableScroll) { if ([theTitle sizeWithAttributes: attributes].width-titleScroll < myBounds.size.width - 10) { titleScrollForward=NO; } if (titleScroll == 0) { titleScrollForward=YES; } if (titleScrollForward) { titleScroll+=5; } else { titleScroll-=5; } } [theTitle drawAtPoint: NSMakePoint(10-titleScroll, 22) withAttributes: attributes]; } - (void) _drawTime { NSRect myBounds; NSMutableDictionary *attributes; NSFont *theFont; myBounds = [self bounds]; attributes = [NSMutableDictionary dictionary]; theFont = [NSFont boldSystemFontOfSize: 12]; [attributes setObject: theFont forKey: NSFontAttributeName]; NSString *timeString = [self _getTime]; NSSize timeSize = [timeString sizeWithAttributes: attributes]; [timeString drawAtPoint: NSMakePoint(myBounds.size.width-timeSize.width-2 , 60) withAttributes: attributes]; } /*NSColor *colorFromDict(NSDictionary *dict) { if(dict != nil) { return [NSColor colorWithCalibratedRed: [[dict objectForKey: @"red"] floatValue] green: [[dict objectForKey: @"green"] floatValue] blue: [[dict objectForKey: @"blue"] floatValue] alpha: [[dict objectForKey: @"alpha"] floatValue]]; } return nil; }*/ @end mpdcon.app-1.1.99/PlaylistController.h0000644000175000017510000000546610377422734016757 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Playlist Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PLAYLISTCONTROLLER_H #define _PCAPPPROJ_PLAYLISTCONTROLLER_H #include #include "MPDController.h" #include "PlaylistItem.h" #include "CollectionController.h" #include "PlaylistsManagerController.h" #include "Strings.h" @interface PlaylistController : NSWindowController { IBOutlet NSTableView *playlistTable; IBOutlet NSTextField *lengthView; IBOutlet NSPopUpButton *playlistSelector; IBOutlet NSPopUpButton *removeSelector; IBOutlet NSWindow *window; IBOutlet NSTextField *filterField; MPDController *mpdController; NSArray *playlist; NSMutableArray *playlistTimes; int currentSong; } // Initialization Methods + (id) sharedPlaylistController; // GUI Methods - (void) removeSongs: (id)sender; - (void) managePlaylists: (id)sender; - (void) doubleClicked: (id)sender; - (void) showCurrentSong: (id)sender; - (void) shuffleList: (id)sender; - (void) browseCollection: (id)sender; - (void) filterList: (id)sender; - (void) clearFilter: (id)sender; // TableView dataSource Methods - (int) numberOfRowsInTableView: (NSTableView *)tableView; - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(int) row; // TableView dragging Methods - (NSDragOperation) tableView: (NSTableView *)tv validateDrop: (id )info proposedRow: (int)row proposedDropOperation: (NSTableViewDropOperation)dropOperation; - (BOOL) tableView: (NSTableView *)tv acceptDrop: (id )info row: (int)row dropOperation: (NSTableViewDropOperation)dropOperation; - (BOOL) tableView: (NSTableView *)tv writeRows: (NSArray *)rows toPasteboard: (NSPasteboard*)pboard; // Notification Methods - (void) songChanged: (NSNotification *)aNotif; - (void) playlistChanged: (NSNotification *)aNotif; - (void) didNotConnect: (NSNotification *)aNotif; @end #endif mpdcon.app-1.1.99/PlaylistController.m0000644000175000017510000003050410400701345016734 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Playlist Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "PlaylistController.h" /* --------------------- - Private Interface - ---------------------*/ @interface PlaylistController(Private) - (void) _doRemove; - (void) _moveRows: (NSArray *)rows atRow: (int)row; - (void) _addSongs: (NSArray *)paths atRow: (int)row; - (void) _filterListByString: (NSString *)filterString; @end @implementation PlaylistController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedPlaylistController { static PlaylistController *_sharedPlaylistController = nil; if (! _sharedPlaylistController) { _sharedPlaylistController = [[PlaylistController allocWithZone: [self zone]] init]; } return _sharedPlaylistController; } - (id) init { self = [self initWithWindowNibName: @"PlaylistViewer"]; if (self) { [self setWindowFrameAutosaveName: @"PlaylistViewer"]; } mpdController = [MPDController sharedMPDController]; return self; } - (void) dealloc { RELEASE(playlist); RELEASE(playlistTimes); [super dealloc]; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { NSNotificationCenter *defCenter; [playlistTable setAutosaveName: @"PlaylistTable"]; [playlistTable setAutosaveTableColumns: YES]; [playlistTable setTarget: self]; [playlistTable setDoubleAction: @selector(doubleClicked:)]; [playlistTable registerForDraggedTypes: [NSArray arrayWithObjects: PlaylistDragType, CollectionDragType, nil]]; [lengthView setFont: [NSFont systemFontOfSize: 12]]; defCenter = [NSNotificationCenter defaultCenter]; [defCenter addObserver: self selector: @selector(songChanged:) name: SongChangedNotification object: nil]; [defCenter addObserver: self selector: @selector(playlistChanged:) name: PlaylistChangedNotification object: nil]; [defCenter addObserver: self selector: @selector(didNotConnect:) name: DidNotConnectNotification object: nil]; currentSong = [mpdController getCurrentSongNr]; [self playlistChanged: nil]; } - (void) removeSongs: (id)sender { switch ([removeSelector indexOfSelectedItem]) { case 0: [self _doRemove]; break; case 1: [mpdController clearPlaylist]; break; } } - (void) managePlaylists: (id)sender { [[PlaylistsManagerController sharedPLManagerController] showWindow: self]; } - (void) doubleClicked: (id)sender { int row; if ([playlistTable clickedRow] == -1) { return; } row = [playlistTable selectedRow]; [mpdController playSong: [[playlist objectAtIndex: row] getPos]]; } - (void) showCurrentSong: (id)sender { int state; state = [mpdController getState]; if ((state == state_PAUSE) || (state == state_PLAY)) { if (([playlist count] >= currentSong) && ([[playlist objectAtIndex: currentSong -1] getPos] == currentSong -1)) { [playlistTable scrollRowToVisible: currentSong-1]; [playlistTable selectRow: currentSong-1 byExtendingSelection: NO]; } else { NSBeep(); } } } - (void) shuffleList: (id)sender { [mpdController shuffleList]; } - (void) browseCollection: (id)sender { [[CollectionController sharedCollectionController] showWindow: self]; } - (void) filterList: (id)sender { int selectedRow; int selectedPos = -1; selectedRow = [playlistTable selectedRow]; if (selectedRow != -1) { selectedPos = [[playlist objectAtIndex: selectedRow] getPos]; } [self playlistChanged: nil]; if (selectedPos != -1) { int i; for (i = 0; i < [playlist count]; i++) { if ([[playlist objectAtIndex: i] getPos] == selectedPos) { [playlistTable scrollRowToVisible: i]; [playlistTable selectRow: i byExtendingSelection: NO]; break; } } } } - (void) clearFilter: (id)sender { [filterField setStringValue: @""]; [self filterList: sender]; } /* -------------------------------- - TableView dataSource Methods - --------------------------------*/ - (int) numberOfRowsInTableView: (NSTableView *)tableView { return [playlist count]; } - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(int)row { NSString *identifier; identifier = [tableColumn identifier]; if ([identifier isEqual: @"pos"]) { return [NSString stringWithFormat: @"%d", [[playlist objectAtIndex: row] getPos]+1]; } else if ([identifier isEqual: @"time"]) { return [playlistTimes objectAtIndex: row]; } else if ([identifier isEqual: @"play"]) { if (([[playlist objectAtIndex: row] getPos] == currentSong-1)) { int mState = [mpdController getState]; if ((mState == state_PAUSE) || (mState == state_PLAY)) { return [NSImage imageNamed: @"Current.tiff"]; } else { return nil; } } else { return nil; } } else { return [[playlist objectAtIndex: row] valueForKey: identifier]; } } /* ------------------------------ - TableView dragging Methods - ------------------------------*/ - (NSDragOperation) tableView: (NSTableView *)tv validateDrop: (id )info proposedRow: (int)row proposedDropOperation: (NSTableViewDropOperation)dropOperation { NSArray *typeArray; NSString *availableType; NSPasteboard *pboard; NSDragOperation dragOperation; pboard = [info draggingPasteboard]; typeArray = [NSArray arrayWithObjects: PlaylistDragType, CollectionDragType, nil]; availableType = [pboard availableTypeFromArray: typeArray]; dragOperation = NSDragOperationNone; if (availableType) { [tv setDropRow: row dropOperation: NSTableViewDropAbove]; if ([[filterField stringValue] compare: @""] == NSOrderedSame) { if (([availableType isEqualToString: PlaylistDragType]) || ([availableType isEqualToString: CollectionDragType])) { dragOperation = NSDragOperationMove; } } } return dragOperation; } - (BOOL) tableView: (NSTableView *)tv acceptDrop: (id )info row: (int)row dropOperation: (NSTableViewDropOperation)dropOperation { NSPasteboard *pboard; NSArray *objectsList, *typeArray; NSString *availableType; BOOL accept; pboard = [info draggingPasteboard]; typeArray = [NSArray arrayWithObjects: PlaylistDragType, CollectionDragType, nil]; availableType = [pboard availableTypeFromArray: typeArray]; objectsList = [pboard propertyListForType: availableType]; if ([objectsList count]) { if ([availableType isEqualToString: PlaylistDragType]) { [self _moveRows: objectsList atRow: row]; [tv deselectAll: nil]; } else if ([availableType isEqualToString: CollectionDragType]) { [self _addSongs: objectsList atRow: row]; } accept = YES; } else { accept = NO; } return accept; } - (BOOL) tableView: (NSTableView *)tv writeRows: (NSArray *)rows toPasteboard: (NSPasteboard*)pboard { NSArray *typeArray; BOOL accept; unsigned int count; count = [rows count]; if (count > 0) { accept = YES; typeArray = [NSArray arrayWithObjects: PlaylistDragType, nil]; [pboard declareTypes: typeArray owner: self]; [pboard setPropertyList: rows forType: PlaylistDragType]; } else { accept = NO; } return accept; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) songChanged: (NSNotification *)aNotif { currentSong = [mpdController getCurrentSongNr]; [playlistTable reloadData]; } - (void) playlistChanged: (NSNotification *)aNotif { int length; int j; AUTORELEASE(playlist); playlist = RETAIN([mpdController getPlaylist]); if ([[filterField stringValue] compare: @""] != NSOrderedSame) { [self _filterListByString: [filterField stringValue]]; } length=0; if ([playlist count] != 0) { int i; int tSecs, tMins, tHours; for (i = 0; i < [playlist count]; i++) { length += [[playlist objectAtIndex: i] getTotalTime]; } tSecs = (length % 60); tMins = (int) (length/60) % 60; tHours = (int) length/3600; [lengthView setStringValue: [NSString stringWithFormat: _(@"Playlist Length: %d:%02d:%02d"), tHours, tMins, tSecs]]; } else { [lengthView setStringValue: _(@"Playlist Length: 0:00:00")]; } AUTORELEASE(playlistTimes); playlistTimes = [[NSMutableArray alloc] init]; for (j = 0; j < [playlist count]; j++) { int time; int tSecs, tMins; time = [[playlist objectAtIndex: j] getTotalTime]; tSecs = (time % 60); tMins = (int) time/60; [playlistTimes addObject: [NSString stringWithFormat: @"%d:%02d", tMins, tSecs]]; } [playlistTable reloadData]; [playlistTable deselectAll: nil]; } - (void) didNotConnect: (NSNotification *)aNotif { [[self window] performClose: self]; } @end /* ------------------- - Private Methods - -------------------*/ @implementation PlaylistController(Private) - (void) _doRemove { NSEnumerator *songEnum; NSNumber *songNumber; int i; if ([playlistTable numberOfSelectedRows] == [mpdController getPlaylistLength]) { [mpdController clearPlaylist]; return; } songEnum = [playlistTable selectedRowEnumerator]; i = 0; songNumber; while (songNumber = [songEnum nextObject]) { [mpdController removeSong: [[playlist objectAtIndex: [songNumber intValue]-i] getPos]]; i++; } [playlistTable deselectAll: self]; } - (void) _moveRows: (NSArray *)rows atRow: (int)row { int i; int count = [rows count]; int ids[count]; for (i = 0; i < count; i++) { ids[i] = [[playlist objectAtIndex: [[rows objectAtIndex: i] intValue]] getID]; } for (i = 0; i < count; i++) { if ([[rows objectAtIndex: 0] intValue] < row) [mpdController moveSongWithID: ids[i] to: row-1]; else [mpdController moveSongWithID: ids[i] to: row+i]; } [playlistTable reloadData]; } - (void) _addSongs: (NSArray *)songs atRow: (int)row { int i; for (i = 0; i < [songs count]; i++) { [mpdController addTrack: [songs objectAtIndex: i]]; [mpdController moveSongNr: [mpdController getPlaylistLength]-1 to: (row+i)]; } } - (void) _filterListByString: (NSString *) fString { NSMutableArray *tmpArray; int i; tmpArray = [[NSMutableArray alloc] init]; for (i = 0; i < [playlist count]; i++) { if ([[[playlist objectAtIndex: i] getArtist] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [playlist objectAtIndex: i]]; } else if ([[[playlist objectAtIndex: i] getTitle] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [playlist objectAtIndex: i]]; } else if ([[[playlist objectAtIndex: i] getAlbum] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [playlist objectAtIndex: i]]; } } [playlist release]; playlist = tmpArray; } @end mpdcon.app-1.1.99/PlaylistItem.h0000644000175000017510000000332210377426330015513 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-14 11:53:40 +0200 by flip PlaylistItem This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PLAYLISTITEM_H_ #define _PCAPPPROJ_PLAYLISTITEM_H_ #include @interface PlaylistItem : NSObject { NSString *artist; NSString *title; NSString *album; NSString *trackNr; NSString *path; int elapsedTime; int totalTime; int ID; int pos; } // Accessor Methods - (NSString *) getArtist; - (void) setArtist: (NSString *)newArtist; - (NSString *) getTitle; - (void) setTitle: (NSString *)newTitle; - (NSString *) getAlbum; - (void) setAlbum: (NSString *)newAlbum; - (NSString *) getTrackNr; - (void) setTrackNr: (NSString *)newNr; - (int) getElapsedTime; - (void) setElapsedTime: (int)newTime; - (int) getTotalTime; - (void) setTotalTime: (int)newTime; - (NSString *) getPath; - (void) setPath: (NSString *)newPath; - (void) setID: (int) newID; - (int) getID; - (void) setPos: (int) newPos; - (int) getPos; @end #endif mpdcon.app-1.1.99/PlaylistItem.m0000644000175000017510000000441510377426330015524 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-14 11:53:40 +0200 by flip PlaylistItem This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "PlaylistItem.h" @implementation PlaylistItem /* -------------------------- - Initialization Methods - --------------------------*/ - (void) dealloc { RELEASE(artist); RELEASE(title); RELEASE(album); RELEASE(trackNr); RELEASE(path); [super dealloc]; } /* -------------------- - Accessor Methods - --------------------*/ - (NSString *) getArtist { return artist; } - (void) setArtist: (NSString *)newArtist { AUTORELEASE(artist); artist = [newArtist copy]; } - (NSString *) getAlbum { return album; } - (void) setAlbum: (NSString *)newAlbum { AUTORELEASE(album); album = [newAlbum copy]; } - (NSString *) getTitle { return title; } - (void) setTitle: (NSString *)newTitle { AUTORELEASE(title); title = [newTitle copy]; } - (NSString *) getTrackNr { return trackNr; } - (void) setTrackNr: (NSString *)newNr { AUTORELEASE(trackNr); trackNr = [newNr copy]; } - (int) getElapsedTime { return elapsedTime; } - (void) setElapsedTime: (int)newTime { elapsedTime = newTime; } - (int) getTotalTime { return totalTime; } - (void) setTotalTime: (int)newTime { totalTime = newTime; } - (NSString *) getPath { return path; } - (void) setPath: (NSString *)newPath { AUTORELEASE(path); path = [newPath copy]; } - (void) setID: (int) newID { ID = newID; } - (int) getID { return ID; } - (void) setPos: (int) newPos { pos = newPos; } - (int) getPos { return pos; } @end mpdcon.app-1.1.99/PlaylistsManagerController.h0000644000175000017510000000352410377163471020426 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip PlaylistsManager Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PLAYLISTSMANAGERCONTROLLER_H #define _PCAPPPROJ_PLAYLISTSMANAGERCONTROLLER_H #include #include "MPDController.h" #include "Strings.h" @interface PlaylistsManagerController : NSWindowController { IBOutlet NSTableView *listView; IBOutlet NSTextField *saveField; IBOutlet NSWindow *window; MPDController *mpdController; NSArray *playlists; } // Initialization Methods + (id) sharedPLManagerController; // Gui Methods - (void) updateLists: (id)sender; - (void) loadList: (id)sender; - (void) saveList: (id)sender; - (void) removeList: (id)sender; // TableView dataSource Methods - (int) numberOfRowsInTableView: (NSTableView *)tableView; - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(int)row; // Notification Methods - (void) tableViewSelectionDidChange: (NSNotification *)aNotif; - (void) didNotConnect: (NSNotification *)aNotif; @end #endif mpdcon.app-1.1.99/PlaylistsManagerController.m0000644000175000017510000000756710377163471020446 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip PlaylistsManager Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "PlaylistsManagerController.h" @implementation PlaylistsManagerController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedPLManagerController { static PlaylistsManagerController *_sharedPLManagerController = nil; if (! _sharedPLManagerController) { _sharedPLManagerController = [[PlaylistsManagerController allocWithZone: [self zone]] init]; } return _sharedPLManagerController; } - (id) init { self = [self initWithWindowNibName: @"PlaylistsManager"]; if (self) { [self setWindowFrameAutosaveName: @"PlaylistsManager"]; } mpdController = [MPDController sharedMPDController]; return self; } - (void) dealloc { RELEASE(playlists); [super dealloc]; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { [listView setTarget: self]; [listView setDoubleAction: @selector(loadList:)]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(didNotConnect:) name: DidNotConnectNotification object: nil]; [self updateLists: self]; } - (void) updateLists: (id)sender { RELEASE(playlists); playlists = RETAIN([mpdController getAllPlaylists]); [listView deselectAll: self]; [listView reloadData]; } - (void) loadList: (id)sender { if ([listView selectedRow] >= 0) { [mpdController loadPlaylist: [playlists objectAtIndex: [listView selectedRow]]]; } } - (void) saveList: (id)sender { NSString *name; name = [saveField stringValue]; if ([name isEqual: @""]) { return; } if ([playlists containsObject: name]) { int answer; answer = NSRunAlertPanel(_(@"Playlist exists"), _(@"Overwrite it?"), _(@"Ok"), _(@"Cancel"), nil); if (answer != NSAlertDefaultReturn) { return; } } [mpdController removePlaylist: name]; [mpdController savePlaylist: name]; [saveField setStringValue: @""]; [self updateLists: self]; } - (void) removeList: (id)sender { if ([listView selectedRow] >= 0) { [mpdController removePlaylist: [playlists objectAtIndex: [listView selectedRow]]]; } [self updateLists: self]; } /* -------------------------------- - TableView dataSource Methods - --------------------------------*/ - (int) numberOfRowsInTableView: (NSTableView *)tableView { return [playlists count]; } - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(int)row { return [playlists objectAtIndex: row]; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) tableViewSelectionDidChange: (NSNotification *)aNotif { if ([listView selectedRow] == -1) { [saveField setStringValue: @""]; } else { [saveField setStringValue: [playlists objectAtIndex: [listView selectedRow]]]; } } - (void) didNotConnect: (NSNotification *)aNotif { [[self window] performClose: self]; } @end mpdcon.app-1.1.99/PreferencesController.h0000644000175000017510000000273710405125162017400 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Preferences Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PREFERENCESCONTROLLER_H #define _PCAPPPROJ_PREFERENCESCONTROLLER_H #include #include "Strings.h" @interface PreferencesController : NSWindowController { IBOutlet NSTextField *mpdHost; IBOutlet NSTextField *mpdPort; IBOutlet NSSecureTextField *password; IBOutlet NSButton *scrollSwitch; IBOutlet NSButton *usePassword; IBOutlet NSColorWell *colorWell; NSUserDefaults *defaults; } // Initialization Methods + (id) sharedPreferencesController; // Gui Methods - (void) apply: (id)sender; - (void) revert: (id)sender; - (void) usePasswordChanged: (id)sender; @end #endif mpdcon.app-1.1.99/PreferencesController.m0000644000175000017510000000731210405126337017404 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Preferences Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "PreferencesController.h" @implementation PreferencesController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedPreferencesController { static PreferencesController *_sharedPrefsController = nil; if (! _sharedPrefsController) { _sharedPrefsController = [[PreferencesController allocWithZone: [self zone]] init]; } return _sharedPrefsController; } - (id) init { self = [self initWithWindowNibName: @"Preferences"]; if (self) { [self setWindowFrameAutosaveName: @"Preferences"]; defaults = [NSUserDefaults standardUserDefaults]; } return self; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { [self revert: nil]; } - (void) apply: (id)sender { NSNotification *aNotif; if ([mpdHost stringValue] != nil) { [defaults setObject: [mpdHost stringValue] forKey: @"mpdHost"]; } if ([mpdPort stringValue] != nil) { [defaults setObject: [mpdPort stringValue] forKey: @"mpdPort"]; } if (([password stringValue] != nil) && ([usePassword state] != 0)) { [defaults setObject: [password stringValue] forKey: @"mpdPassword"]; } else { [defaults removeObjectForKey: @"mpdPassword"]; } [defaults setInteger: [usePassword state] forKey: @"usePassword"]; [defaults setInteger: [scrollSwitch state] forKey: @"enableScroll"]; [defaults setObject: [NSArchiver archivedDataWithRootObject: [colorWell color]] forKey: @"displayColor"]; [defaults synchronize]; [[self window] close]; aNotif = [NSNotification notificationWithName: PreferencesChangedNotification object: nil]; [[NSNotificationCenter defaultCenter] postNotification: aNotif]; } - (void) revert: (id)sender { NSData *colorData; [mpdHost setStringValue: [defaults objectForKey: @"mpdHost"]]; [mpdPort setStringValue: [defaults objectForKey: @"mpdPort"]]; [password setStringValue: [defaults objectForKey: @"mpdPassword"]]; [scrollSwitch setState: [defaults integerForKey: @"enableScroll"]]; [usePassword setState: [defaults integerForKey: @"usePassword"]]; colorData = [defaults dataForKey: @"displayColor"]; if (colorData != nil) { [colorWell setColor: [NSUnarchiver unarchiveObjectWithData: colorData]]; } [self usePasswordChanged: sender]; } - (void) usePasswordChanged: (id)sender { if ([usePassword state] != 0) { [password setEditable: YES]; [password setEnabled: YES]; [password setBackgroundColor: [NSColor whiteColor]]; [password setSelectable: YES]; } else { [password setEditable: NO]; [password setEnabled: NO]; [password setBackgroundColor: [NSColor lightGrayColor]]; [password setSelectable: NO]; } } @end mpdcon.app-1.1.99/StatisticsController.h0000644000175000017510000000314210377163471017275 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Statistics Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_STATISTICSCONTROLLER_H #define _PCAPPPROJ_STATISTICSCONTROLLER_H #include #include "StatisticsItem.h" #include "MPDController.h" #include "Strings.h" @interface StatisticsController : NSWindowController { IBOutlet NSTextField *songs; IBOutlet NSTextField *artists; IBOutlet NSTextField *albums; IBOutlet NSTextField *uptime; IBOutlet NSTextField *playtime; IBOutlet NSTextField *dbPlaytime; IBOutlet NSTextField *dbUpdatetime; IBOutlet NSTextField *window; } // Initialization Methods + (id) sharedStatisticsController; // Gui Methods - (void) closeWindow: (id)sender; - (void) updateStatistics: (id)sender; // Notification Methods - (void) didNotConnect: (NSNotification *)aNotif; @end #endif mpdcon.app-1.1.99/StatisticsController.m0000644000175000017510000000627710377416722017316 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Statistics Controller This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "StatisticsController.h" @implementation StatisticsController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedStatisticsController { static StatisticsController *_sharedStatisticsController = nil; if (! _sharedStatisticsController) { _sharedStatisticsController = [[StatisticsController allocWithZone: [self zone]] init]; } return _sharedStatisticsController; } - (id) init { self = [self initWithWindowNibName: @"StatisticsViewer"]; if (self) { [self setWindowFrameAutosaveName: @"StatisticsViewer"]; } return self; } /* --------------- - Gui Methods - ---------------*/ - (void) closeWindow: (id)sender { [[self window] performClose: self]; } - (void) updateStatistics: (id)sender { StatisticsItem *statItem; int secs, mins, hours; statItem = RETAIN([[MPDController sharedMPDController] getStatistics]); [songs setIntValue: [statItem getNumberOfSongs]]; [artists setIntValue: [statItem getNumberOfArtists]]; [albums setIntValue: [statItem getNumberOfAlbums]]; secs = [statItem getUptime] % 60; mins = ((int) [statItem getUptime] / 60) % 60; hours = (int) [statItem getUptime] / 3600; [uptime setStringValue: [NSString stringWithFormat: @"%d:%02d:%02d", hours, mins, secs]]; [dbUpdatetime setStringValue: [[NSDate dateWithTimeIntervalSince1970: [statItem getDbUpdatetime]] description]]; secs = [statItem getPlaytime] % 60; mins = ((int) [statItem getPlaytime] / 60) % 60; hours = (int) [statItem getPlaytime] / 3600; [playtime setStringValue: [NSString stringWithFormat: @"%d:%02d:%02d", hours, mins, secs]]; secs = [statItem getDbPlaytime] % 60; mins = ((int) [statItem getDbPlaytime] / 60) % 60; hours = (int) [statItem getDbPlaytime] / 3600; [dbPlaytime setStringValue: [NSString stringWithFormat: @"%d:%02d:%02d", hours, mins, secs]]; RELEASE(statItem); } - (void) awakeFromNib { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(didNotConnect:) name: DidNotConnectNotification object: nil]; [self updateStatistics: self]; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) didNotConnect: (NSNotification *)aNotif { [[self window] performClose: self]; } @end mpdcon.app-1.1.99/StatisticsItem.h0000644000175000017510000000314610377163471016054 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-17 23:17:38 +0200 by flip This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_STATISTICSITEM_H_ #define _PCAPPPROJ_STATISTICSITEM_H_ #include @interface StatisticsItem : NSObject { int numberOfSongs; int numberOfArtists; int numberOfAlbums; int uptime; int playtime; int dbUpdatetime; int dbPlaytime; } // Accessor Methods - (int) getNumberOfSongs; - (void) setNumberOfSongs: (int)newSongs; - (int) getNumberOfArtists; - (void) setNumberOfArtists: (int)newArtists; - (int) getNumberOfAlbums; - (void) setNumberOfAlbums: (int)newAlbums; - (int) getUptime; - (void) setUptime: (int)newUptime; - (int) getPlaytime; - (void) setPlaytime: (int)newPlaytime; - (int) getDbUpdatetime; - (void) setDbUpdatetime: (int)newDbUpdatetime; - (int) getDbPlaytime; - (void) setDbPlaytime: (int)newDbPlaytime; @end #endif mpdcon.app-1.1.99/StatisticsItem.m0000644000175000017510000000351610377163471016062 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-17 23:17:38 +0200 by flip This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "StatisticsItem.h" @implementation StatisticsItem /* -------------------- - Accessor Methods - --------------------*/ - (int) getNumberOfSongs { return numberOfSongs; } - (void) setNumberOfSongs: (int)newSongs { numberOfSongs = newSongs; } - (int) getNumberOfArtists { return numberOfArtists; } - (void) setNumberOfArtists: (int)newArtists; { numberOfArtists = newArtists; } - (int) getNumberOfAlbums { return numberOfAlbums; } - (void) setNumberOfAlbums: (int)newAlbums { numberOfAlbums = newAlbums; } - (int) getUptime { return uptime; } - (void) setUptime: (int)newUptime { uptime = newUptime; } - (int) getPlaytime { return playtime; } - (void) setPlaytime: (int)newPlaytime { playtime = newPlaytime; } - (int) getDbUpdatetime { return dbUpdatetime; } - (void) setDbUpdatetime: (int)newDbUpdatetime { dbUpdatetime = newDbUpdatetime; } - (int) getDbPlaytime { return dbPlaytime; } - (void) setDbPlaytime: (int)newDbPlaytime { dbPlaytime = newDbPlaytime; } @end mpdcon.app-1.1.99/Strings.h0000644000175000017510000000325710405367654014540 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-06-03 12:54:16 +0200 by flip This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _OWNSTRINGS_H_ #define _OWNSTRINGS_H_ static NSString *PlaylistDragType = @"PlaylistDragType"; static NSString *CollectionDragType = @"CollectionDragType"; static NSString *PlaylistChangedNotification = @"PlaylistChangedNotification"; static NSString *SongChangedNotification = @"SongChangedNotification"; static NSString *ShownCollectionChangedNotification = @"ShownCollectionChangedNotification"; static NSString *DidNotConnectNotification = @"DidNotConnectNotification"; static NSString *DidConnectNotification = @"DidConnectNotification"; static NSString *PreferencesChangedNotification = @"PreferencesChangedNotification"; static NSString *GetTracksNotification = @"GetTracksNotification"; static NSString *TracksSendNotification = @"TracksSendNotification"; static NSString *KeyEventNotification = @"KeyEventNotification"; #endif // _OWNSTRINGS_H_ mpdcon.app-1.1.99/libmpdclient.c0000644000175000017510000011140110377163471015536 0ustar tarDebian-NM/* libmpdclient (c)2003-2004 by Warren Dukes (shank@mercury.chem.pitt.edu) This project's homepage is: http://www.musicpd.org Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Music Player Daemon nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "libmpdclient.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifndef MPD_NO_IPV6 #ifdef AF_INET6 #define MPD_HAVE_IPV6 #endif #endif #define COMMAND_LIST 1 #define COMMAND_LIST_OK 2 #ifdef MPD_HAVE_IPV6 int mpd_ipv6Supported() { int s; s = socket(AF_INET6,SOCK_STREAM,0); if(s == -1) return 0; close(s); return 1; } #endif char * mpd_sanitizeArg(const char * arg) { size_t i; int count=0; char * ret; for(i=0;iname = strdup(name); ret->value = strdup(value); return ret; } void mpd_freeReturnElement(mpd_ReturnElement * re) { free(re->name); free(re->value); free(re); } void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout) { connection->timeout.tv_sec = (int)timeout; connection->timeout.tv_usec = (int)(timeout*1e6 - connection->timeout.tv_sec*1000000+0.5); } mpd_Connection * mpd_newConnection(const char * host, int port, float timeout) { int err; struct hostent * he; struct sockaddr * dest; #ifdef HAVE_SOCKLEN_T socklen_t destlen; #else int destlen; #endif struct sockaddr_in sin; char * rt; char * output; mpd_Connection * connection = malloc(sizeof(mpd_Connection)); struct timeval tv; fd_set fds; #ifdef MPD_HAVE_IPV6 struct sockaddr_in6 sin6; #endif strcpy(connection->buffer,""); connection->buflen = 0; connection->bufstart = 0; strcpy(connection->errorStr,""); connection->error = 0; connection->doneProcessing = 0; connection->commandList = 0; connection->listOks = 0; connection->doneListOk = 0; connection->returnElement = NULL; if(!(he=gethostbyname(host))) { snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "host \"%s\" not found",host); connection->error = MPD_ERROR_UNKHOST; return connection; } memset(&sin,0,sizeof(struct sockaddr_in)); /*dest.sin_family = he->h_addrtype;*/ sin.sin_family = AF_INET; sin.sin_port = htons(port); #ifdef MPD_HAVE_IPV6 memset(&sin6,0,sizeof(struct sockaddr_in6)); sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(port); #endif switch(he->h_addrtype) { case AF_INET: memcpy((char *)&sin.sin_addr.s_addr,(char *)he->h_addr, he->h_length); dest = (struct sockaddr *)&sin; destlen = sizeof(struct sockaddr_in); break; #ifdef MPD_HAVE_IPV6 case AF_INET6: if(!mpd_ipv6Supported()) { strcpy(connection->errorStr,"no IPv6 suuport but a " "IPv6 address found\n"); connection->error = MPD_ERROR_SYSTEM; return connection; } memcpy((char *)&sin6.sin6_addr.s6_addr,(char *)he->h_addr, he->h_length); dest = (struct sockaddr *)&sin6; destlen = sizeof(struct sockaddr_in6); break; #endif default: strcpy(connection->errorStr,"address type is not IPv4 or " "IPv6\n"); connection->error = MPD_ERROR_SYSTEM; return connection; break; } if((connection->sock = socket(dest->sa_family,SOCK_STREAM,0))<0) { strcpy(connection->errorStr,"problems creating socket"); connection->error = MPD_ERROR_SYSTEM; return connection; } mpd_setConnectionTimeout(connection,timeout); /* connect stuff */ { int flags = fcntl(connection->sock, F_GETFL, 0); fcntl(connection->sock, F_SETFL, flags | O_NONBLOCK); if(connect(connection->sock,dest,destlen)<0 && errno!=EINPROGRESS) { snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "problems connecting to \"%s\" on port" " %i",host,port); connection->error = MPD_ERROR_CONNPORT; return connection; } } while(!(rt = strstr(connection->buffer,"\n"))) { tv.tv_sec = connection->timeout.tv_sec; tv.tv_usec = connection->timeout.tv_usec; FD_ZERO(&fds); FD_SET(connection->sock,&fds); if((err = select(connection->sock+1,&fds,NULL,NULL,&tv)) == 1) { int readed; readed = recv(connection->sock, &(connection->buffer[connection->buflen]), MPD_BUFFER_MAX_LENGTH-connection->buflen,0); if(readed<=0) { snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "problems getting a response from" " \"%s\" on port %i",host, port); connection->error = MPD_ERROR_NORESPONSE; return connection; } connection->buflen+=readed; connection->buffer[connection->buflen] = '\0'; tv.tv_sec = connection->timeout.tv_sec; tv.tv_usec = connection->timeout.tv_usec; } else if(err<0) { switch(errno) { case EINTR: continue; default: snprintf(connection->errorStr, MPD_BUFFER_MAX_LENGTH, "problems connecting to \"%s\" on port" " %i",host,port); connection->error = MPD_ERROR_CONNPORT; return connection; } } else { snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "timeout in attempting to get a response from" " \"%s\" on port %i",host,port); connection->error = MPD_ERROR_NORESPONSE; return connection; } } *rt = '\0'; output = strdup(connection->buffer); strcpy(connection->buffer,rt+1); connection->buflen = strlen(connection->buffer); if(strncmp(output,MPD_WELCOME_MESSAGE,strlen(MPD_WELCOME_MESSAGE))) { free(output); snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "mpd not running on port %i on host \"%s\"", port,host); connection->error = MPD_ERROR_NOTMPD; return connection; } { char * test; char * version[3]; char * tmp = &output[strlen(MPD_WELCOME_MESSAGE)]; char * search = "."; int i; for(i=0;i<3;i++) { char * tok; if(i==3) search = " "; version[i] = strtok_r(tmp,search,&tok); if(!version[i]) { free(output); snprintf(connection->errorStr, MPD_BUFFER_MAX_LENGTH, "error parsing version number at " "\"%s\"", &output[strlen(MPD_WELCOME_MESSAGE)]); connection->error = MPD_ERROR_NOTMPD; return connection; } connection->version[i] = strtol(version[i],&test,10); if(version[i]==test || *test!='\0') { free(output); snprintf(connection->errorStr, MPD_BUFFER_MAX_LENGTH, "error parsing version number at " "\"%s\"", &output[strlen(MPD_WELCOME_MESSAGE)]); connection->error = MPD_ERROR_NOTMPD; return connection; } tmp = NULL; } } free(output); connection->doneProcessing = 1; return connection; } void mpd_clearError(mpd_Connection * connection) { connection->error = 0; connection->errorStr[0] = '\0'; } void mpd_closeConnection(mpd_Connection * connection) { close(connection->sock); if(connection->returnElement) free(connection->returnElement); free(connection); } void mpd_executeCommand(mpd_Connection * connection, char * command) { int ret; struct timeval tv; fd_set fds; char * commandPtr = command; int commandLen = strlen(command); if(!connection->doneProcessing && !connection->commandList) { strcpy(connection->errorStr,"not done processing current command"); connection->error = 1; return; } mpd_clearError(connection); FD_ZERO(&fds); FD_SET(connection->sock,&fds); tv.tv_sec = connection->timeout.tv_sec; tv.tv_usec = connection->timeout.tv_usec; while((ret = select(connection->sock+1,NULL,&fds,NULL,&tv)==1) || (ret==-1 && errno==EINTR)) { ret = send(connection->sock,commandPtr,commandLen, MSG_DONTWAIT); if(ret<=0) { if(ret==EAGAIN || ret==EINTR) continue; snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "problems giving command \"%s\"",command); connection->error = MPD_ERROR_SENDING; return; } else { commandPtr+=ret; commandLen-=ret; } if(commandLen<=0) break; } if(commandLen>0) { perror(""); snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "timeout sending command \"%s\"",command); connection->error = MPD_ERROR_TIMEOUT; return; } if(!connection->commandList) connection->doneProcessing = 0; else if(connection->commandList == COMMAND_LIST_OK) { connection->listOks++; } } void mpd_getNextReturnElement(mpd_Connection * connection) { char * output = NULL; char * rt = NULL; char * name = NULL; char * value = NULL; fd_set fds; struct timeval tv; char * tok = NULL; int readed; char * bufferCheck = NULL; int err; if(connection->returnElement) mpd_freeReturnElement(connection->returnElement); connection->returnElement = NULL; if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { strcpy(connection->errorStr,"already done processing current command"); connection->error = 1; return; } bufferCheck = connection->buffer+connection->bufstart; while(connection->bufstart>=connection->buflen || !(rt = strstr(bufferCheck,"\n"))) { if(connection->buflen>=MPD_BUFFER_MAX_LENGTH) { memmove(connection->buffer, connection->buffer+ connection->bufstart, connection->buflen- connection->bufstart+1); bufferCheck-=connection->bufstart; connection->buflen-=connection->bufstart; connection->bufstart = 0; } if(connection->buflen>=MPD_BUFFER_MAX_LENGTH) { strcpy(connection->errorStr,"buffer overrun"); connection->error = MPD_ERROR_BUFFEROVERRUN; connection->doneProcessing = 1; connection->doneListOk = 0; return; } bufferCheck+=connection->buflen-connection->bufstart; tv.tv_sec = connection->timeout.tv_sec; tv.tv_usec = connection->timeout.tv_usec; FD_ZERO(&fds); FD_SET(connection->sock,&fds); if((err = select(connection->sock+1,&fds,NULL,NULL,&tv) == 1)) { readed = recv(connection->sock, connection->buffer+connection->buflen, MPD_BUFFER_MAX_LENGTH-connection->buflen, MSG_DONTWAIT); if(readed<0 && (errno==EAGAIN || errno==EINTR)) { continue; } if(readed<=0) { strcpy(connection->errorStr,"connection" " closed"); connection->error = MPD_ERROR_CONNCLOSED; connection->doneProcessing = 1; connection->doneListOk = 0; return; } connection->buflen+=readed; connection->buffer[connection->buflen] = '\0'; } else if(err<0 && errno==EINTR) continue; else { strcpy(connection->errorStr,"connection timeout"); connection->error = MPD_ERROR_TIMEOUT; connection->doneProcessing = 1; connection->doneListOk = 0; return; } } *rt = '\0'; output = connection->buffer+connection->bufstart; connection->bufstart = rt - connection->buffer + 1; if(strcmp(output,"OK")==0) { if(connection->listOks > 0) { strcpy(connection->errorStr, "expected more list_OK's"); connection->error = 1; } connection->listOks = 0; connection->doneProcessing = 1; connection->doneListOk = 0; return; } if(strcmp(output, "list_OK") == 0) { if(!connection->listOks) { strcpy(connection->errorStr, "got an unexpected list_OK"); connection->error = 1; } else { connection->doneListOk = 1; connection->listOks--; } return; } if(strncmp(output,"ACK",strlen("ACK"))==0) { char * test; char * needle; int val; strcpy(connection->errorStr, output); connection->error = MPD_ERROR_ACK; connection->errorCode = MPD_ACK_ERROR_UNK; connection->errorAt = MPD_ERROR_AT_UNK; connection->doneProcessing = 1; connection->doneListOk = 0; needle = strchr(output, '['); if(!needle) return; val = strtol(needle+1, &test, 10); if(*test != '@') return; connection->errorCode = val; val = strtol(test+1, &test, 10); if(*test != ']') return; connection->errorAt = val; return; } name = strtok_r(output,":",&tok); if(name && (value = strtok_r(NULL,"",&tok)) && value[0]==' ') { connection->returnElement = mpd_newReturnElement(name,&(value[1])); } else { if(!name || !value) { snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "error parsing: %s",output); } else { snprintf(connection->errorStr,MPD_BUFFER_MAX_LENGTH, "error parsing: %s:%s",name,value); } connection->errorStr[MPD_BUFFER_MAX_LENGTH] = '\0'; connection->error = 1; } } void mpd_finishCommand(mpd_Connection * connection) { while(!connection->doneProcessing) { if(connection->doneListOk) connection->doneListOk = 0; mpd_getNextReturnElement(connection); } } void mpd_finishListOkCommand(mpd_Connection * connection) { while(!connection->doneProcessing && connection->listOks && !connection->doneListOk ) { mpd_getNextReturnElement(connection); } } int mpd_nextListOkCommand(mpd_Connection * connection) { mpd_finishListOkCommand(connection); if(!connection->doneProcessing) connection->doneListOk = 0; if(connection->listOks == 0 || connection->doneProcessing) return -1; return 0; } void mpd_sendStatusCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"status\n"); } mpd_Status * mpd_getStatus(mpd_Connection * connection) { mpd_Status * status; /*mpd_executeCommand(connection,"status\n"); if(connection->error) return NULL;*/ if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(!connection->returnElement) mpd_getNextReturnElement(connection); status = malloc(sizeof(mpd_Status)); status->volume = -1; status->repeat = 0; status->random = 0; status->playlist = -1; status->playlistLength = -1; status->state = -1; status->song = 0; status->elapsedTime = 0; status->totalTime = 0; status->bitRate = 0; status->sampleRate = 0; status->bits = 0; status->channels = 0; status->crossfade = -1; status->error = NULL; status->updatingDb = 0; if(connection->error) { free(status); return NULL; } while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"volume")==0) { status->volume = atoi(re->value); } else if(strcmp(re->name,"repeat")==0) { status->repeat = atoi(re->value); } else if(strcmp(re->name,"random")==0) { status->random = atoi(re->value); } else if(strcmp(re->name,"playlist")==0) { status->playlist = strtol(re->value,NULL,10); } else if(strcmp(re->name,"playlistlength")==0) { status->playlistLength = atoi(re->value); } else if(strcmp(re->name,"bitrate")==0) { status->bitRate = atoi(re->value); } else if(strcmp(re->name,"state")==0) { if(strcmp(re->value,"play")==0) { status->state = MPD_STATUS_STATE_PLAY; } else if(strcmp(re->value,"stop")==0) { status->state = MPD_STATUS_STATE_STOP; } else if(strcmp(re->value,"pause")==0) { status->state = MPD_STATUS_STATE_PAUSE; } else { status->state = MPD_STATUS_STATE_UNKNOWN; } } else if(strcmp(re->name,"song")==0) { status->song = atoi(re->value); } else if(strcmp(re->name,"songid")==0) { status->songid = atoi(re->value); } else if(strcmp(re->name,"time")==0) { char * tok; char * copy; char * temp; copy = strdup(re->value); temp = strtok_r(copy,":",&tok); if(temp) { status->elapsedTime = atoi(temp); temp = strtok_r(NULL,"",&tok); if(temp) status->totalTime = atoi(temp); } free(copy); } else if(strcmp(re->name,"error")==0) { status->error = strdup(re->value); } else if(strcmp(re->name,"xfade")==0) { status->crossfade = atoi(re->value); } else if(strcmp(re->name,"updating_db")==0) { status->updatingDb = atoi(re->value); } else if(strcmp(re->name,"audio")==0) { char * tok; char * copy; char * temp; copy = strdup(re->value); temp = strtok_r(copy,":",&tok); if(temp) { status->sampleRate = atoi(temp); temp = strtok_r(NULL,":",&tok); if(temp) { status->bits = atoi(temp); temp = strtok_r(NULL,"",&tok); if(temp) status->channels = atoi(temp); } } free(copy); } mpd_getNextReturnElement(connection); if(connection->error) { free(status); return NULL; } } if(connection->error) { free(status); return NULL; } else if(status->state<0) { strcpy(connection->errorStr,"state not found"); connection->error = 1; free(status); return NULL; } return status; } void mpd_freeStatus(mpd_Status * status) { if(status->error) free(status->error); free(status); } void mpd_sendStatsCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"stats\n"); } mpd_Stats * mpd_getStats(mpd_Connection * connection) { mpd_Stats * stats; /*mpd_executeCommand(connection,"stats\n"); if(connection->error) return NULL;*/ if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(!connection->returnElement) mpd_getNextReturnElement(connection); stats = malloc(sizeof(mpd_Stats)); stats->numberOfArtists = 0; stats->numberOfAlbums = 0; stats->numberOfSongs = 0; stats->uptime = 0; stats->dbUpdateTime = 0; stats->playTime = 0; stats->dbPlayTime = 0; if(connection->error) { free(stats); return NULL; } while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"artists")==0) { stats->numberOfArtists = atoi(re->value); } else if(strcmp(re->name,"albums")==0) { stats->numberOfAlbums = atoi(re->value); } else if(strcmp(re->name,"songs")==0) { stats->numberOfSongs = atoi(re->value); } else if(strcmp(re->name,"uptime")==0) { stats->uptime = strtol(re->value,NULL,10); } else if(strcmp(re->name,"db_update")==0) { stats->dbUpdateTime = strtol(re->value,NULL,10); } else if(strcmp(re->name,"playtime")==0) { stats->playTime = strtol(re->value,NULL,10); } else if(strcmp(re->name,"db_playtime")==0) { stats->dbPlayTime = strtol(re->value,NULL,10); } mpd_getNextReturnElement(connection); if(connection->error) { free(stats); return NULL; } } if(connection->error) { free(stats); return NULL; } return stats; } void mpd_freeStats(mpd_Stats * stats) { free(stats); } void mpd_initSong(mpd_Song * song) { song->file = NULL; song->artist = NULL; song->album = NULL; song->track = NULL; song->title = NULL; song->name = NULL; song->time = MPD_SONG_NO_TIME; song->pos = MPD_SONG_NO_NUM; song->id = MPD_SONG_NO_ID; } void mpd_finishSong(mpd_Song * song) { if(song->file) free(song->file); if(song->artist) free(song->artist); if(song->album) free(song->album); if(song->title) free(song->title); if(song->track) free(song->track); if(song->name) free(song->name); } mpd_Song * mpd_newSong() { mpd_Song * ret = malloc(sizeof(mpd_Song)); mpd_initSong(ret); return ret; } void mpd_freeSong(mpd_Song * song) { mpd_finishSong(song); free(song); } mpd_Song * mpd_songDup(mpd_Song * song) { mpd_Song * ret = mpd_newSong(); if(song->file) ret->file = strdup(song->file); if(song->artist) ret->artist = strdup(song->artist); if(song->album) ret->album = strdup(song->album); if(song->title) ret->title = strdup(song->title); if(song->track) ret->track = strdup(song->track); if(song->name) ret->name = strdup(song->name); ret->time = song->time; ret->pos = song->pos; ret->id = song->id; return ret; } void mpd_initDirectory(mpd_Directory * directory) { directory->path = NULL; } void mpd_finishDirectory(mpd_Directory * directory) { if(directory->path) free(directory->path); } mpd_Directory * mpd_newDirectory () { mpd_Directory * directory = malloc(sizeof(mpd_Directory));; mpd_initDirectory(directory); return directory; } void mpd_freeDirectory(mpd_Directory * directory) { mpd_finishDirectory(directory); free(directory); } mpd_Directory * mpd_directoryDup(mpd_Directory * directory) { mpd_Directory * ret = mpd_newDirectory(); if(directory->path) ret->path = strdup(directory->path); return ret; } void mpd_initPlaylistFile(mpd_PlaylistFile * playlist) { playlist->path = NULL; } void mpd_finishPlaylistFile(mpd_PlaylistFile * playlist) { if(playlist->path) free(playlist->path); } mpd_PlaylistFile * mpd_newPlaylistFile() { mpd_PlaylistFile * playlist = malloc(sizeof(mpd_PlaylistFile)); mpd_initPlaylistFile(playlist); return playlist; } void mpd_freePlaylistFile(mpd_PlaylistFile * playlist) { mpd_finishPlaylistFile(playlist); free(playlist); } mpd_PlaylistFile * mpd_playlistFileDup(mpd_PlaylistFile * playlist) { mpd_PlaylistFile * ret = mpd_newPlaylistFile(); if(playlist->path) ret->path = strdup(playlist->path); return ret; } void mpd_initInfoEntity(mpd_InfoEntity * entity) { entity->info.directory = NULL; } void mpd_finishInfoEntity(mpd_InfoEntity * entity) { if(entity->info.directory) { if(entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { mpd_freeDirectory(entity->info.directory); } else if(entity->type == MPD_INFO_ENTITY_TYPE_SONG) { mpd_freeSong(entity->info.song); } else if(entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { mpd_freePlaylistFile(entity->info.playlistFile); } } } mpd_InfoEntity * mpd_newInfoEntity() { mpd_InfoEntity * entity = malloc(sizeof(mpd_InfoEntity)); mpd_initInfoEntity(entity); return entity; } void mpd_freeInfoEntity(mpd_InfoEntity * entity) { mpd_finishInfoEntity(entity); free(entity); } void mpd_sendInfoCommand(mpd_Connection * connection, char * command) { mpd_executeCommand(connection,command); } mpd_InfoEntity * mpd_getNextInfoEntity(mpd_Connection * connection) { mpd_InfoEntity * entity = NULL; if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } if(!connection->returnElement) mpd_getNextReturnElement(connection); if(connection->returnElement) { if(strcmp(connection->returnElement->name,"file")==0) { entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_SONG; entity->info.song = mpd_newSong(); entity->info.song->file = strdup(connection->returnElement->value); } else if(strcmp(connection->returnElement->name, "directory")==0) { entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_DIRECTORY; entity->info.directory = mpd_newDirectory(); entity->info.directory->path = strdup(connection->returnElement->value); } else if(strcmp(connection->returnElement->name,"playlist")==0) { entity = mpd_newInfoEntity(); entity->type = MPD_INFO_ENTITY_TYPE_PLAYLISTFILE; entity->info.playlistFile = mpd_newPlaylistFile(); entity->info.playlistFile->path = strdup(connection->returnElement->value); } else { connection->error = 1; strcpy(connection->errorStr,"problem parsing song info"); return NULL; } } else return NULL; mpd_getNextReturnElement(connection); while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,"file")==0) return entity; else if(strcmp(re->name,"directory")==0) return entity; else if(strcmp(re->name,"playlist")==0) return entity; if(entity->type == MPD_INFO_ENTITY_TYPE_SONG && strlen(re->value)) { if(!entity->info.song->artist && strcmp(re->name,"Artist")==0) { entity->info.song->artist = strdup(re->value); } else if(!entity->info.song->album && strcmp(re->name,"Album")==0) { entity->info.song->album = strdup(re->value); } else if(!entity->info.song->title && strcmp(re->name,"Title")==0) { entity->info.song->title = strdup(re->value); } else if(!entity->info.song->track && strcmp(re->name,"Track")==0) { entity->info.song->track = strdup(re->value); } else if(!entity->info.song->name && strcmp(re->name,"Name")==0) { entity->info.song->name = strdup(re->value); } else if(entity->info.song->time==MPD_SONG_NO_TIME && strcmp(re->name,"Time")==0) { entity->info.song->time = atoi(re->value); } else if(entity->info.song->pos==MPD_SONG_NO_NUM && strcmp(re->name,"Pos")==0) { entity->info.song->pos = atoi(re->value); } else if(entity->info.song->id==MPD_SONG_NO_ID && strcmp(re->name,"Id")==0) { entity->info.song->id = atoi(re->value); } } else if(entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { } else if(entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { } mpd_getNextReturnElement(connection); } return entity; } char * mpd_getNextReturnElementNamed(mpd_Connection * connection, const char * name) { if(connection->doneProcessing || (connection->listOks && connection->doneListOk)) { return NULL; } mpd_getNextReturnElement(connection); while(connection->returnElement) { mpd_ReturnElement * re = connection->returnElement; if(strcmp(re->name,name)==0) return strdup(re->value); mpd_getNextReturnElement(connection); } return NULL; } char * mpd_getNextArtist(mpd_Connection * connection) { return mpd_getNextReturnElementNamed(connection,"Artist"); } char * mpd_getNextAlbum(mpd_Connection * connection) { return mpd_getNextReturnElementNamed(connection,"Album"); } void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songPos) { char * string = malloc(strlen("playlistinfo")+25); sprintf(string,"playlistinfo \"%i\"\n",songPos); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendPlaylistIdCommand(mpd_Connection * connection, int id) { char * string = malloc(strlen("playlistid")+25); sprintf(string, "playlistid \"%i\"\n", id); mpd_sendInfoCommand(connection, string); free(string); } void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist) { char * string = malloc(strlen("plchanges")+25); sprintf(string,"plchanges \"%lld\"\n",playlist); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendListallCommand(mpd_Connection * connection, const char * dir) { char * sDir = mpd_sanitizeArg(dir); char * string = malloc(strlen("listall")+strlen(sDir)+5); sprintf(string,"listall \"%s\"\n",sDir); mpd_sendInfoCommand(connection,string); free(string); free(sDir); } void mpd_sendListallInfoCommand(mpd_Connection * connection, const char * dir) { char * sDir = mpd_sanitizeArg(dir); char * string = malloc(strlen("listallinfo")+strlen(sDir)+5); sprintf(string,"listallinfo \"%s\"\n",sDir); mpd_sendInfoCommand(connection,string); free(string); free(sDir); } void mpd_sendLsInfoCommand(mpd_Connection * connection, const char * dir) { char * sDir = mpd_sanitizeArg(dir); char * string = malloc(strlen("lsinfo")+strlen(sDir)+5); sprintf(string,"lsinfo \"%s\"\n",sDir); mpd_sendInfoCommand(connection,string); free(string); free(sDir); } void mpd_sendCurrentSongCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"currentsong\n"); } void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char * str) { char st[10]; char * string; char * sanitStr = mpd_sanitizeArg(str); if(table == MPD_TABLE_ARTIST) strcpy(st,"artist"); else if(table == MPD_TABLE_ALBUM) strcpy(st,"album"); else if(table == MPD_TABLE_TITLE) strcpy(st,"title"); else if(table == MPD_TABLE_FILENAME) strcpy(st,"filename"); else { connection->error = 1; strcpy(connection->errorStr,"unknown table for search"); return; } string = malloc(strlen("search")+strlen(sanitStr)+strlen(st)+6); sprintf(string,"search %s \"%s\"\n",st,sanitStr); mpd_sendInfoCommand(connection,string); free(string); free(sanitStr); } void mpd_sendFindCommand(mpd_Connection * connection, int table, const char * str) { char st[10]; char * string; char * sanitStr = mpd_sanitizeArg(str); if(table == MPD_TABLE_ARTIST) strcpy(st,"artist"); else if(table == MPD_TABLE_ALBUM) strcpy(st,"album"); else if(table == MPD_TABLE_TITLE) strcpy(st,"title"); else { connection->error = 1; strcpy(connection->errorStr,"unknown table for find"); return; } string = malloc(strlen("find")+strlen(sanitStr)+strlen(st)+6); sprintf(string,"find %s \"%s\"\n",st,sanitStr); mpd_sendInfoCommand(connection,string); free(string); free(sanitStr); } void mpd_sendListCommand(mpd_Connection * connection, int table, const char * arg1) { char st[10]; char * string; if(table == MPD_TABLE_ARTIST) strcpy(st,"artist"); else if(table == MPD_TABLE_ALBUM) strcpy(st,"album"); else { connection->error = 1; strcpy(connection->errorStr,"unknown table for list"); return; } if(arg1) { char * sanitArg1 = mpd_sanitizeArg(arg1); string = malloc(strlen("list")+strlen(sanitArg1)+strlen(st)+6); sprintf(string,"list %s \"%s\"\n",st,sanitArg1); free(sanitArg1); } else { string = malloc(strlen("list")+strlen(st)+3); sprintf(string,"list %s\n",st); } mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendAddCommand(mpd_Connection * connection, const char * file) { char * sFile = mpd_sanitizeArg(file); char * string = malloc(strlen("add")+strlen(sFile)+5); sprintf(string,"add \"%s\"\n",sFile); mpd_executeCommand(connection,string); free(string); free(sFile); } void mpd_sendDeleteCommand(mpd_Connection * connection, int songPos) { char * string = malloc(strlen("delete")+25); sprintf(string,"delete \"%i\"\n",songPos); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendDeleteIdCommand(mpd_Connection * connection, int id) { char * string = malloc(strlen("deleteid")+25); sprintf(string, "deleteid \"%i\"\n", id); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSaveCommand(mpd_Connection * connection, const char * name) { char * sName = mpd_sanitizeArg(name); char * string = malloc(strlen("save")+strlen(sName)+5); sprintf(string,"save \"%s\"\n",sName); mpd_executeCommand(connection,string); free(string); free(sName); } void mpd_sendLoadCommand(mpd_Connection * connection, const char * name) { char * sName = mpd_sanitizeArg(name); char * string = malloc(strlen("load")+strlen(sName)+5); sprintf(string,"load \"%s\"\n",sName); mpd_executeCommand(connection,string); free(string); free(sName); } void mpd_sendRmCommand(mpd_Connection * connection, const char * name) { char * sName = mpd_sanitizeArg(name); char * string = malloc(strlen("rm")+strlen(sName)+5); sprintf(string,"rm \"%s\"\n",sName); mpd_executeCommand(connection,string); free(string); free(sName); } void mpd_sendShuffleCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"shuffle\n"); } void mpd_sendClearCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"clear\n"); } void mpd_sendPlayCommand(mpd_Connection * connection, int songPos) { char * string = malloc(strlen("play")+25); sprintf(string,"play \"%i\"\n",songPos); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendPlayIdCommand(mpd_Connection * connection, int id) { char * string = malloc(strlen("playid")+25); sprintf(string,"playid \"%i\"\n",id); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendStopCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"stop\n"); } void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode) { char * string = malloc(strlen("pause")+25); sprintf(string,"pause \"%i\"\n",pauseMode); mpd_executeCommand(connection,string); free(string); } void mpd_sendNextCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"next\n"); } void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to) { char * string = malloc(strlen("move")+25); sprintf(string,"move \"%i\" \"%i\"\n",from,to); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendMoveIdCommand(mpd_Connection * connection, int id, int to) { char * string = malloc(strlen("moveid")+25); sprintf(string, "moveid \"%i\" \"%i\"\n", id, to); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2) { char * string = malloc(strlen("swap")+25); sprintf(string,"swap \"%i\" \"%i\"\n",song1,song2); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSwapIdCommand(mpd_Connection * connection, int id1, int id2) { char * string = malloc(strlen("swapid")+25); sprintf(string, "swapid \"%i\" \"%i\"\n", id1, id2); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time) { char * string = malloc(strlen("seek")+25); sprintf(string,"seek \"%i\" \"%i\"\n",song,time); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendSeekIdCommand(mpd_Connection * connection, int id, int time) { char * string = malloc(strlen("seekid")+25); sprintf(string,"seekid \"%i\" \"%i\"\n",id,time); mpd_sendInfoCommand(connection,string); free(string); } void mpd_sendUpdateCommand(mpd_Connection * connection, char * path) { char * sPath = mpd_sanitizeArg(path); char * string = malloc(strlen("update")+strlen(sPath)+5); sprintf(string,"update \"%s\"\n",sPath); mpd_sendInfoCommand(connection,string); free(string); free(sPath); } int mpd_getUpdateId(mpd_Connection * connection) { char * jobid; int ret = 0; jobid = mpd_getNextReturnElementNamed(connection,"updating_db"); if(jobid) { ret = atoi(jobid); free(jobid); } return ret; } void mpd_sendPrevCommand(mpd_Connection * connection) { mpd_executeCommand(connection,"previous\n"); } void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode) { char * string = malloc(strlen("repeat")+25); sprintf(string,"repeat \"%i\"\n",repeatMode); mpd_executeCommand(connection,string); free(string); } void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode) { char * string = malloc(strlen("random")+25); sprintf(string,"random \"%i\"\n",randomMode); mpd_executeCommand(connection,string); free(string); } void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange) { char * string = malloc(strlen("setvol")+25); sprintf(string,"setvol \"%i\"\n",volumeChange); mpd_executeCommand(connection,string); free(string); } void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange) { char * string = malloc(strlen("volume")+25); sprintf(string,"volume \"%i\"\n",volumeChange); mpd_executeCommand(connection,string); free(string); } void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds) { char * string = malloc(strlen("crossfade")+25); sprintf(string,"crossfade \"%i\"\n",seconds); mpd_executeCommand(connection,string); free(string); } void mpd_sendPasswordCommand(mpd_Connection * connection, const char * pass) { char * sPass = mpd_sanitizeArg(pass); char * string = malloc(strlen("password")+strlen(sPass)+5); sprintf(string,"password \"%s\"\n",sPass); mpd_executeCommand(connection,string); free(string); free(sPass); } void mpd_sendCommandListBegin(mpd_Connection * connection) { if(connection->commandList) { strcpy(connection->errorStr,"already in command list mode"); connection->error = 1; return; } connection->commandList = COMMAND_LIST; mpd_executeCommand(connection,"command_list_begin\n"); } void mpd_sendCommandListOkBegin(mpd_Connection * connection) { if(connection->commandList) { strcpy(connection->errorStr,"already in command list mode"); connection->error = 1; return; } connection->commandList = COMMAND_LIST_OK; mpd_executeCommand(connection,"command_list_ok_begin\n"); connection->listOks = 0; } void mpd_sendCommandListEnd(mpd_Connection * connection) { if(!connection->commandList) { strcpy(connection->errorStr,"not in command list mode"); connection->error = 1; return; } connection->commandList = 0; mpd_executeCommand(connection,"command_list_end\n"); } mpdcon.app-1.1.99/libmpdclient.h0000644000175000017510000003573210377163471015557 0ustar tarDebian-NM/* libmpdclient (c)2003-2004 by Warren Dukes (shank@mercury.chem.pitt.edu) This project's homepage is: http://www.musicpd.org Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Music Player Daemon nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef LIBMPDCLIENT_H #define LIBMPDCLIENT_H #include #define MPD_BUFFER_MAX_LENGTH 50000 #define MPD_WELCOME_MESSAGE "OK MPD " #define MPD_ERROR_TIMEOUT 10 /* timeout trying to talk to mpd */ #define MPD_ERROR_SYSTEM 11 /* system error */ #define MPD_ERROR_UNKHOST 12 /* unknown host */ #define MPD_ERROR_CONNPORT 13 /* problems connecting to port on host */ #define MPD_ERROR_NOTMPD 14 /* mpd not running on port at host */ #define MPD_ERROR_NORESPONSE 15 /* no response on attempting to connect */ #define MPD_ERROR_SENDING 16 /* error sending command */ #define MPD_ERROR_CONNCLOSED 17 /* connection closed by mpd */ #define MPD_ERROR_ACK 18 /* ACK returned! */ #define MPD_ERROR_BUFFEROVERRUN 19 /* Buffer was overrun! */ #define MPD_ACK_ERROR_UNK -1 #define MPD_ERROR_AT_UNK -1 #define MPD_ACK_ERROR_NOT_LIST 1 #define MPD_ACK_ERROR_ARG 2 #define MPD_ACK_ERROR_PASSWORD 3 #define MPD_ACK_ERROR_PERMISSION 4 #define MPD_ACK_ERROR_UNKNOWN_CMD 5 #define MPD_ACK_ERROR_NO_EXIST 50 #define MPD_ACK_ERROR_PLAYLIST_MAX 51 #define MPD_ACK_ERROR_SYSTEM 52 #define MPD_ACK_ERROR_PLAYLIST_LOAD 53 #define MPD_ACK_ERROR_UPDATE_ALREADY 54 #define MPD_ACK_ERROR_PLAYER_SYNC 55 #define MPD_ACK_ERROR_EXIST 56 #ifdef __cplusplus extern "C" { #endif /* internal stuff don't touch this struct */ typedef struct _mpd_ReturnElement { char * name; char * value; } mpd_ReturnElement; /* mpd_Connection * holds info about connection to mpd * use error, and errorStr to detect errors */ typedef struct _mpd_Connection { /* use this to check the version of mpd */ int version[3]; /* IMPORTANT, you want to get the error messages from here */ char errorStr[MPD_BUFFER_MAX_LENGTH+1]; int errorCode; int errorAt; /* this will be set to MPD_ERROR_* if there is an error, 0 if not */ int error; /* DON'T TOUCH any of the rest of this stuff */ int sock; char buffer[MPD_BUFFER_MAX_LENGTH+1]; int buflen; int bufstart; int doneProcessing; int listOks; int doneListOk; int commandList; mpd_ReturnElement * returnElement; struct timeval timeout; } mpd_Connection; /* mpd_newConnection * use this to open a new connection * you should use mpd_closeConnection, when your done with the connection, * even if an error has occurred * _timeout_ is the connection timeout period in seconds */ mpd_Connection * mpd_newConnection(const char * host, int port, float timeout); void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout); /* mpd_closeConnection * use this to close a connection and free'ing subsequent memory */ void mpd_closeConnection(mpd_Connection * connection); /* mpd_clearError * clears error */ void mpd_clearError(mpd_Connection * connection); /* STATUS STUFF */ /* use these with status.state to determine what state the player is in */ #define MPD_STATUS_STATE_UNKNOWN 0 #define MPD_STATUS_STATE_STOP 1 #define MPD_STATUS_STATE_PLAY 2 #define MPD_STATUS_STATE_PAUSE 3 /* us this with status.volume to determine if mpd has volume support */ #define MPD_STATUS_NO_VOLUME -1 /* mpd_Status * holds info return from status command */ typedef struct mpd_Status { /* 0-100, or MPD_STATUS_NO_VOLUME when there is no volume support */ int volume; /* 1 if repeat is on, 0 otherwise */ int repeat; /* 1 if random is on, 0 otherwise */ int random; /* playlist length */ int playlistLength; /* playlist, use this to determine when the playlist has changed */ long long playlist; /* use with MPD_STATUS_STATE_* to determine state of player */ int state; /* crossfade setting in seconds */ int crossfade; /* if a song is currently selected (always the case when state is * PLAY or PAUSE), this is the position of the currently * playing song in the playlist, beginning with 0 */ int song; /* Song ID of the currently selected song */ int songid; /* time in seconds that have elapsed in the currently playing/paused * song */ int elapsedTime; /* length in seconds of the currently playing/paused song */ int totalTime; /* current bit rate in kbs */ int bitRate; /* audio sample rate */ unsigned int sampleRate; /* audio bits */ int bits; /* audio channels */ int channels; /* 1 if mpd is updating, 0 otherwise */ int updatingDb; /* error */ char * error; } mpd_Status; void mpd_sendStatusCommand(mpd_Connection * connection); /* mpd_getStatus * returns status info, be sure to free it with mpd_freeStatus() * call this after mpd_sendStatusCommand() */ mpd_Status * mpd_getStatus(mpd_Connection * connection); /* mpd_freeStatus * free's status info malloc'd and returned by mpd_getStatus */ void mpd_freeStatus(mpd_Status * status); typedef struct _mpd_Stats { int numberOfArtists; int numberOfAlbums; int numberOfSongs; unsigned long uptime; unsigned long dbUpdateTime; unsigned long playTime; unsigned long dbPlayTime; } mpd_Stats; void mpd_sendStatsCommand(mpd_Connection * connection); mpd_Stats * mpd_getStats(mpd_Connection * connection); void mpd_freeStats(mpd_Stats * stats); /* SONG STUFF */ #define MPD_SONG_NO_TIME -1 #define MPD_SONG_NO_NUM -1 #define MPD_SONG_NO_ID -1 /* mpd_Song * for storing song info returned by mpd */ typedef struct _mpd_Song { /* filename of song */ char * file; /* artist, maybe NULL if there is no tag */ char * artist; /* title, maybe NULL if there is no tag */ char * title; /* album, maybe NULL if there is no tag */ char * album; /* track, maybe NULL if there is no tag */ char * track; /* name, maybe NULL if there is no tag; it's the name of the current * song, f.e. the icyName of the stream */ char * name; /* length of song in seconds, check that it is not MPD_SONG_NO_TIME */ int time; /* if plchanges/playlistinfo/playlistid used, is the position of the * song in the playlist */ int pos; /* song id for a song in the playlist */ int id; } mpd_Song; /* mpd_newSong * use to allocate memory for a new mpd_Song * file, artist, etc all initialized to NULL * if your going to assign values to file, artist, etc * be sure to malloc or strdup the memory * use mpd_freeSong to free the memory for the mpd_Song, it will also * free memory for file, artist, etc, so don't do it yourself */ mpd_Song * mpd_newSong(); /* mpd_freeSong * use to free memory allocated by mpd_newSong * also it will free memory pointed to by file, artist, etc, so be careful */ void mpd_freeSong(mpd_Song * song); /* mpd_songDup * works like strDup, but for a mpd_Song */ mpd_Song * mpd_songDup(mpd_Song * song); /* DIRECTORY STUFF */ /* mpd_Directory * used to store info fro directory (right now that just the path) */ typedef struct _mpd_Directory { char * path; } mpd_Directory; /* mpd_newDirectory * allocates memory for a new directory * use mpd_freeDirectory to free this memory */ mpd_Directory * mpd_newDirectory (); /* mpd_freeDirectory * used to free memory allocated with mpd_newDirectory, and it frees * path of mpd_Directory, so be careful */ void mpd_freeDirectory(mpd_Directory * directory); /* mpd_directoryDup * works like strdup, but for mpd_Directory */ mpd_Directory * mpd_directoryDup(mpd_Directory * directory); /* PLAYLISTFILE STUFF */ /* mpd_PlaylistFile * stores info about playlist file returned by lsinfo */ typedef struct _mpd_PlaylistFile { char * path; } mpd_PlaylistFile; /* mpd_newPlaylistFile * allocates memory for new mpd_PlaylistFile, path is set to NULL * free this memory with mpd_freePlaylistFile */ mpd_PlaylistFile * mpd_newPlaylistFile(); /* mpd_freePlaylist * free memory allocated for freePlaylistFile, will also free * path, so be careful */ void mpd_freePlaylistFile(mpd_PlaylistFile * playlist); /* mpd_playlistFileDup * works like strdup, but for mpd_PlaylistFile */ mpd_PlaylistFile * mpd_playlistFileDup(mpd_PlaylistFile * playlist); /* INFO ENTITY STUFF */ /* the type of entity returned from one of the commands that generates info * use in conjunction with mpd_InfoEntity.type */ #define MPD_INFO_ENTITY_TYPE_DIRECTORY 0 #define MPD_INFO_ENTITY_TYPE_SONG 1 #define MPD_INFO_ENTITY_TYPE_PLAYLISTFILE 2 /* mpd_InfoEntity * stores info on stuff returned info commands */ typedef struct mpd_InfoEntity { /* the type of entity, use with MPD_INFO_ENTITY_TYPE_* to determine * what this entity is (song, directory, etc...) */ int type; /* the actual data you want, mpd_Song, mpd_Directory, etc */ union { mpd_Directory * directory; mpd_Song * song; mpd_PlaylistFile * playlistFile; } info; } mpd_InfoEntity; mpd_InfoEntity * mpd_newInfoEntity(); void mpd_freeInfoEntity(mpd_InfoEntity * entity); /* INFO COMMANDS AND STUFF */ /* use this function to loop over after calling Info/Listall functions */ mpd_InfoEntity * mpd_getNextInfoEntity(mpd_Connection * connection); /* fetches the currently seeletect song (the song referenced by status->song * and status->songid*/ void mpd_sendCurrentSongCommand(mpd_Connection * connection); /* songNum of -1, means to display the whole list */ void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songNum); /* use this to get the changes in the playlist since version _playlist_ */ void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist); /* recursivel fetches all songs/dir/playlists in "dir* (no metadata is * returned) */ void mpd_sendListallCommand(mpd_Connection * connection, const char * dir); /* same as sendListallCommand, but also metadata is returned */ void mpd_sendListallInfoCommand(mpd_Connection * connection, const char * dir); /* non-recursive version of ListallInfo */ void mpd_sendLsInfoCommand(mpd_Connection * connection, const char * dir); #define MPD_TABLE_ARTIST 0 #define MPD_TABLE_ALBUM 1 #define MPD_TABLE_TITLE 2 #define MPD_TABLE_FILENAME 3 void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char * str); void mpd_sendFindCommand(mpd_Connection * connection, int table, const char * str); /* LIST TAG COMMANDS */ /* use this function fetch next artist entry, be sure to free the returned * string. NULL means there are no more. Best used with sendListArtists */ char * mpd_getNextArtist(mpd_Connection * connection); char * mpd_getNextAlbum(mpd_Connection * connection); /* list artist or albums by artist, arg1 should be set to the artist if * listing albums by a artist, otherwise NULL for listing all artists or albums */ void mpd_sendListCommand(mpd_Connection * connection, int table, const char * arg1); /* SIMPLE COMMANDS */ void mpd_sendAddCommand(mpd_Connection * connection, const char * file); void mpd_sendDeleteCommand(mpd_Connection * connection, int songNum); void mpd_sendDeleteIdCommand(mpd_Connection * connection, int songNum); void mpd_sendSaveCommand(mpd_Connection * connection, const char * name); void mpd_sendLoadCommand(mpd_Connection * connection, const char * name); void mpd_sendRmCommand(mpd_Connection * connection, const char * name); void mpd_sendShuffleCommand(mpd_Connection * connection); void mpd_sendClearCommand(mpd_Connection * connection); /* use this to start playing at the beginning, useful when in random mode */ #define MPD_PLAY_AT_BEGINNING -1 void mpd_sendPlayCommand(mpd_Connection * connection, int songNum); void mpd_sendPlayIdCommand(mpd_Connection * connection, int songNum); void mpd_sendStopCommand(mpd_Connection * connection); void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode); void mpd_sendNextCommand(mpd_Connection * connection); void mpd_sendPrevCommand(mpd_Connection * connection); void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to); void mpd_sendMoveIdCommand(mpd_Connection * connection, int from, int to); void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2); void mpd_sendSwapIdCommand(mpd_Connection * connection, int song1, int song2); void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time); void mpd_sendSeekIdCommand(mpd_Connection * connection, int song, int time); void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode); void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode); void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange); /* WARNING: don't use volume command, its depreacted */ void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange); void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds); void mpd_sendUpdateCommand(mpd_Connection * connection, char * path); /* returns the update job id, call this after a update command*/ int mpd_getUpdateId(mpd_Connection * connection); void mpd_sendPasswordCommand(mpd_Connection * connection, const char * pass); /* after executing a command, when your done with it to get its status * (you want to check connection->error for an error) */ void mpd_finishCommand(mpd_Connection * connection); /* command list stuff, use this to do things like add files very quickly */ void mpd_sendCommandListBegin(mpd_Connection * connection); void mpd_sendCommandListOkBegin(mpd_Connection * connection); void mpd_sendCommandListEnd(mpd_Connection * connection); /* advance to the next listOk * returns 0 if advanced to the next list_OK, * returns -1 if it advanced to an OK or ACK */ int mpd_nextListOkCommand(mpd_Connection * connection); #ifdef __cplusplus } #endif #endif mpdcon.app-1.1.99/main.m0000644000175000017510000000170310377163471014031 0ustar tarDebian-NM/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip This application 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 application 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 Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include int main(int argc, const char *argv[]) { return NSApplicationMain (argc, argv); } mpdcon.app-1.1.99/Documentation/0000755000175000017510000000000010404417636015533 5ustar tarDebian-NMmpdcon.app-1.1.99/Documentation/CVS/0000755000175000017510000000000010404417636016166 5ustar tarDebian-NMmpdcon.app-1.1.99/Documentation/CVS/Root0000644000175000017510000000004210404417636017030 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Documentation/CVS/Repository0000644000175000017510000000002510404417636020265 0ustar tarDebian-NMMPDCon/Documentation mpdcon.app-1.1.99/Documentation/CVS/Entries0000644000175000017510000000013210404417636017516 0ustar tarDebian-NM/COPYING/1.1.1.1/Wed Feb 22 22:35:37 2006// /Install/1.1.1.1/Wed Feb 22 22:35:37 2006// D mpdcon.app-1.1.99/Documentation/COPYING0000644000175000017510000004307610377163471016604 0ustar tarDebian-NM GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. mpdcon.app-1.1.99/Documentation/Install0000644000175000017510000000043210377163471017067 0ustar tarDebian-NMInstallation Instructions: Make sure you first have MPD installed (See http://www.musicpd.org). Tested with MPD 0.10.3 Second, you need GNUstep installed (See http://www.gnustep.org). Tested with CVS as of 24 May 2004. Then, just type make make install as root to install it. mpdcon.app-1.1.99/Resources/0000755000175000017510000000000010405367771014701 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/CVS/0000755000175000017510000000000010404417637015330 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/CVS/Root0000644000175000017510000000004210404417636016171 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Resources/CVS/Repository0000644000175000017510000000002110404417636017422 0ustar tarDebian-NMMPDCon/Resources mpdcon.app-1.1.99/Resources/CVS/Entries0000644000175000017510000000166710404417637016676 0ustar tarDebian-NM/COPYING/1.1.1.1/Wed Feb 22 22:35:37 2006// /Crossfade.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Current.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /GNUstep.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Info-gnustep.plist/1.2/Wed Feb 22 23:40:58 2006// /Install/1.1.1.1/Wed Feb 22 22:35:37 2006// /MPDCon.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /MoveSong.tiff/1.2/Thu Feb 23 00:22:11 2006// /Next.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Pause.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Play.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Playlist.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Prev.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Repeat.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Shuffle.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Stop.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// D/Collection.gorm//// D/CrossfadeView.gorm//// D/FindPanel.gorm//// D/Player.gorm//// D/PlaylistViewer.gorm//// D/PlaylistsManager.gorm//// D/Preferences.gorm//// D/StatisticsViewer.gorm//// mpdcon.app-1.1.99/Resources/COPYING0000644000175000017510000004307610377163471015745 0ustar tarDebian-NM GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. mpdcon.app-1.1.99/Resources/Crossfade.tiff0000644000175000017510000000356010377163471017467 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿþ& .J@@`h(R/Users/flip/Crossfade.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Current.tiff0000644000175000017510000000210210377163471017167 0ustar tarDebian-NMII*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþö þ@2:(R/Users/mrsanders/Current.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/GNUstep.tiff0000644000175000017510000000161210377163471017077 0ustar tarDebian-NMII*x $h°à!B† &l¸ð"FŠ%jXf1üsíŸ&M†qã'L/I¢¤‰S¦ˆÁÌ´ô2FKã?KŠÓÊ O¾œrÌ[8_ꘙJ– Ÿ%6÷”E+ª\¤Jþj•ªÖʇ§nžÒ 2eKT³zí¦-j´jÞºN½†–kÖ¥e›î]ÛvëÙ#GÇýzôÜkè a}Úá©ß?ÒÀ‘C†Oš0bâȺ£³'Ÿln…È3¦Lž¶djÛWÆYU¾lœ¥Ý;­_¶xË¢í½;ûß½gï¾ý²l¼óáãÛNôØuàì¹ã'†ÙqòêÖë#Ïœ¿}gþõ ¯]¹qjû­»/ö›ý8Äã÷O?¶}þò뾇|xôéÉgq| Ð>¯™·H¿ý 2ˆ } (8 Õ Üß Cv8Øàô˯Pý 7(9CÃ×@t !¼P"GÞ#ò"’¨¢?J#¢‰ÖWÇbŽ)®= ¶hãˆ;†„=Š5~wŒ'‘„"O,q·“LÚ{+ıÎZ1uNMÖ4¬N5å­á?’äÃH1Îx’Ë$«¬Ë,™ìÅŠ/›œsq>»¤’Í)×¼óI2²BË+Ÿ‚³Q4ìÌí,¨¢1¥"•/¦¤l¶±øXŠ*¹,w ¨Ü<œ.³ìŠíÞ0ïJW;ËJJÊ_4)¢Œ«©µ2÷…®ÀÍŠj-¦|…E¨KѪëͪ~­EiHîF-Eù*uɰ¥t3h%#ošÍ¥ö¦Ü¢Íöh»Ó2î âÆ È¼™Î|‹¤‹vzèº{rï¸&7tî´ÑHzí½‡Z®%Àûﯷ.‡4n--2  ::t-pR/home/dan/GNUstep/Library/WindowMaker/Pixmaps/GNUstep.tifcreated with The GIMPmpdcon.app-1.1.99/Resources/Info-gnustep.plist0000644000175000017510000000102710405367771020334 0ustar tarDebian-NM{ ApplicationDescription = "GNUstep Client for MPD"; ApplicationIcon = MPDCon.tiff; ApplicationName = MPDCon; ApplicationRelease = 1.1.99; Authors = ( "Daniel Luederwald " ); Copyright = "Copyright (C) 2004-06 Daniel Luederwald"; CopyrightDescription = "Released under the GNU General Public License 2.0"; FullVersionID = 1.1.99; NSExecutable = MPDCon; NSIcon = MPDCon.tiff; NSMainNibFile = Player.gorm; NSPrincipalClass = NSApplication; NSRole = Application; }mpdcon.app-1.1.99/Resources/Install0000644000175000017510000000043210377163471016230 0ustar tarDebian-NMInstallation Instructions: Make sure you first have MPD installed (See http://www.musicpd.org). Tested with MPD 0.10.3 Second, you need GNUstep installed (See http://www.gnustep.org). Tested with CVS as of 24 May 2004. Then, just type make make install as root to install it. mpdcon.app-1.1.99/Resources/MPDCon.tiff0000644000175000017510000002251210377163471016634 0ustar tarDebian-NMII*$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿÿÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ00æ$ 6î$$%@$:%B%(R/Users/flip/Projects/deploy/MPDCon/Images/MPDCon.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/MoveSong.tiff0000644000175000017510000002253010377200063017276 0ustar tarDebian-NMII*$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ<<<ÿÿÿ888ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ[[[ÿ&&&ÿÿÿÿÿÿÿÿ///ÿ‘‘‘ÿâââÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ[[[ÿ&&&ÿÿÿÿÿÿÿÿ///ÿ‘‘‘ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ[[[ÿ&&&ÿÿÿÿÿÿÿÿ///ÿ‘‘‘ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%%%ÿZZZÿ´´´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%%%ÿZZZÿ´´´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´´´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿ___ÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿ___ÿÿÿ___ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿaaaÿÿÿÿÿÿÿaaaÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿTTTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿ___ÿÿÿ___ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿaaaÿÿÿÿÿÿÿaaaÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿ___ÿÿÿ___ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ00æ$ Cî$2%@$H%P%(R/Users/mrsanders/Dokumente/Projects/MPDCon/Resources/MoveSong.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Next.tiff0000644000175000017510000000355210377163471016475 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Next.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Pause.tiff0000644000175000017510000000355410377163471016636 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .F@@\d(R/Users/flip/Pause.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Play.tiff0000644000175000017510000000355210377163471016464 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Play.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Playlist.tiff0000644000175000017510000000355610377163471017364 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .H@@^f(R/Users/flip/Playlist.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Prev.tiff0000644000175000017510000000355210377163471016473 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Prev.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Repeat.tiff0000644000175000017510000000360410377163471016775 0ustar tarDebian-NMII*HüÅÐ@ðýþúÙ—3–ÿÿÿÿ”®ëÿ—¸þƒÐÜJݸ–ÿ] ¹!Ö—1ÿ} "û8—Ø—ÙoTÙú&/úú9úÙ+XÙ—g°—8Þ*þ7—ƒä—¸‹R踗ç|A2C|Üÿ—8—ÙúúÙ—1þ& /.^@@t|(R/Users/flip/Projects/MPDCon/Images/Repeat.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Shuffle.tiff0000644000175000017510000000360410377163471017151 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& 0.^@@t|(R/Users/flip/Projects/MPDCon/Images/Shuffle.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Stop.tiff0000644000175000017510000000355210377163471016504 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Stop.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Collection.gorm/0000755000175000017510000000000010404420050017712 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/Collection.gorm/CVS/0000755000175000017510000000000010405367737020374 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/Collection.gorm/CVS/Root0000644000175000017510000000004210404417637021230 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Resources/Collection.gorm/CVS/Repository0000644000175000017510000000004110404417637022463 0ustar tarDebian-NMMPDCon/Resources/Collection.gorm mpdcon.app-1.1.99/Resources/Collection.gorm/CVS/Entries0000644000175000017510000000020610405367737021726 0ustar tarDebian-NM/data.classes/1.4/Sun Feb 26 22:47:50 2006// /data.info/1.2/Sat Mar 11 00:56:08 2006// /objects.gorm/1.8/Sat Mar 11 00:56:08 2006// D mpdcon.app-1.1.99/Resources/Collection.gorm/data.classes0000644000175000017510000000134310404420050022203 0ustar tarDebian-NM{ "## Comment" = "Do NOT change this file, Gorm maintains it"; BoldCell = { Actions = ( ); Outlets = ( ); Super = NSTextFieldCell; }; CollectionController = { Actions = ( "addSelected:", "updateCollection:", "selectionChanged:", "doubleClicked:", "filterCollection:", "clearFilter:" ); Outlets = ( collectionView, trackView, filterField ); Super = NSWindowController; }; FirstResponder = { Actions = ( "addSelected:", "doubleClicked:", "filterCollection:", "clearFilter:", "selectionChanged:", "updateCollection:" ); Super = NSObject; }; OwnTableView = { Actions = ( ); Outlets = ( ); Super = NSTableView; }; }mpdcon.app-1.1.99/Resources/Collection.gorm/data.info0000644000175000017510000000032210404420050021475 0ustar tarDebian-NMGNUstep archive00002b5e:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&% Latest Version0±& %  Typed Streammpdcon.app-1.1.99/Resources/Collection.gorm/objects.gorm0000644000175000017510000002711610404420050022240 0ustar tarDebian-NMGNUstep archive00002b5e:0000002e:00000127:00000003:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString& %  GormNSBrowser01 NSBrowser1 NSControl1NSView1 NSResponder%  D@ C  D@ C&01 NSMutableArray1 NSArray&01 NSScroller% @ ?€ D@ A  D@ A&0± &%01 NSCell0 ±&0 1NSFont%&&&&&&&&&’0 1 NSScrollView% A¸ C† Bþ  C† Bþ&0 ± &0 1 NSClipView% A¨ @ Cu Bö  Cu Bö&0± &01NSMatrix%  Cu BÈ  Cu BÈ&0± &%01 NSActionCell0±&° &&&&&&&&%’% Cu BÈ 01NSColor0±&%?NSNamedColorSpace0±&%?System0±&%?controlBackgroundColor°0±& %? NSBrowserCell01 NSBrowserCell° 0±%&&&&&&&&%%0± &°2doClick:2doDoubleClick:’0±°0±&% System0±&% controlBackgroundColor0± % @ @ A Bö  A Bö&0± &%0 ± ° ° &&&&&&&&&° 2 _doScroll:v12@0:4@8° % A A A A °0!±% Cˆ A¸ C†€ Bþ  C†€ Bþ&0"± &0#±% A¨ @ Cv Bö  Cv Bö&0$± &0%±°0&±&% System0'±& %  controlColor0(± % @ @ A Bö  A Bö&0)± &%0*± 0+±&° &&&&&&&&&’°#% A A A A °(%0,±° °&&&&&&&&°0-±&%?NSMatrix0.±&% /% BȰ @ ?€ D@ A C† Bþ’’0/± &001NSBrowserColumn° °%°.01±°!%%%02±& %  TableColumn031 NSTableColumn04±&% artist C! A  GÃP051NSTableHeaderCell1NSTextFieldCell06±&% Artist07±% °6&&&&&&&&0%’08±°°09±&%?controlShadowColor0:±°°0;±&%?windowFrameTextColor0<1GSObjectTemplate1GSClassSwapper0=±&% BoldCell±0>±&%?nine° °>&&&&&&&&0%’0?±°0@±&% System0A±&% textBackgroundColor0B±°°@0C±& %  textColor0D±&% CollectionWindow0E1GSWindowTemplate0F±&%?NSPanel1NSPanel1NSWindow%  D@ CÌ€& % BÆ D^@0G±%  D@ CÌ€  D@ CÌ€&0H± &0I1NSButton% Cò€  B` AÀ  B` AÀ&!0J± &%0K1 NSButtonCell0L±&% Add° °L&&&&&&&&%’0M±&0N±&&&&0O±%  B` AÀ  B` AÀ&0P± &%0Q±0R±&% Update° &&&&&&&&%’0S±&0T±&&&&0U1 NSSplitView% Bl D@ C¯  D@ C¯&0V± &°0W±% C D@ CB  D@ CB&0X± &0Y±% A˜ A° D€ C  D€ C&0Z± &0[1!GSControlTemplate0\±& %  OwnTableView1" NSTableView%  D€ C!  D€ C!&0]± &%0^± 0_±&° &&&&&&&&0`± &°30a±0b±&% album C A  GÃP0c±0d±&% Album°7°d&&&&&&&&0%’°8°:0e±°>° °>&&&&&&&&0%’0f±°0g±&% System0h±&% textBackgroundColor0i±°°g0j±& %  textColor0k±0l±&% trackNr Bd A  GÃP0m±0n±&% Track°7°n&&&&&&&&0%’°8°:0o±°>° °>&&&&&&&&0%’0p±°0q±&% System0r±&% textBackgroundColor0s±°°q0t±& %  textColor0u±0v±&% title C/ A  GÃP0w±0x±&% Title°7°x&&&&&&&&0%’°8°:0y±°=±°>° °>&&&&&&&&0%’°?°B0z±°°g0{±& %  gridColor0|±°°g0}±&% controlBackgroundColor0~1#NSTableHeaderView%  D€ A°  D€ A°&0± &0€1$GSTableCornerView%  A˜ A°  A˜ A°&0± &%% A€’ @  @°|0‚± % A° A C,  A C,&0ƒ± &%0„± °_° &&&&&&&&&°W²0…±% A˜  D€ A°  D€ A°&0†± &°~0‡±°°g0ˆ±& %  controlColor0‰± % A˜ C0 D€ A  D€ A&0б &%0‹± 0Œ±&° &&&&&&&&&°W²°€°Y% A A A A °‰°‚°…01%NSImage0ޱ&% common_Dimple.tiff0±°0±&% System0‘±&% controlBackgroundColor0’±°°0“±&% controlShadowColor%A0”1&NSBox% À AÀ D@ B   D@ B &"0•± &0–±% @à @à DÀ A¨  DÀ A¨&0—± &0˜1' NSTextField% @@ Að A  Að A&$0™± &%0š±0›±&% Filter:0œ±% A@°›&&&&&&&&0%’0±°0ž±&% System0Ÿ±&% textBackgroundColor0 ±°°ž0¡±& %  textColor’0¢±'% B  Cä€ A¨  Cä€ A¨&"0£± &%0¤±0¥±&° °¥&&&&&&&&0%’0¦±°0§±&% System0¨±&% textBackgroundColor0©±°°§0ª±& %  textColor’0«±% Cø€ À@ B AÀ  B AÀ&!0¬± &%0­±0®±&% Clear° °®&&&&&&&&%’0¯±&0°±&&&&0±± 0²±&% Title° &&&&&&&& @  @ %%0³±°0´±&% System0µ±&% windowBackgroundColor0¶±&% Window0·±& %  Collection°· ?€ B F@ F@%0¸±%0¹±&%?NSApplicationIcon&   D  D€0º±&% Button°I0»±& %  TextField°¢0¼±& %  Scroller1°(0½±&% GSCustomClassMap0¾±&0¿±&% TextFieldCell1°=0À±& %  TextFieldCell°=0Á±&% TextFieldCell2°=0±&% GormNSTableView°\0ñ&% TextFieldCell3°=0ı& %  SplitView°U0ű&% ClipView°#0Ʊ& %  TextFieldCell0DZ°=±0ȱ&% nine° °È&&&&&&&&0%’°?°B°¿°<°Á0ɱ°=±°È° °È&&&&&&&&0%’°?°B0ʱ& %  ScrollView° 0˱&% Scroller°°Ã°y0̱&% Box°”0ͱ& %  TextField1°˜°Â°[0α& %  ScrollView1°W0ϱ& %  ScrollView2°!0б&%?NSOwner0ѱ&% CollectionController0Ò±& %  TableColumn10Ó±0Ô±&% column2 BT A  GÃP0Õ±0Ö±&%  °7&&&&&&&&0%’0×±°°´0ر&% controlShadowColor0Ù±°0Ú±&% System0Û±&% windowFrameTextColor0ܱ0ݱ&% three° °Ý&&&&&&&&0%’0Þ±°°Ú0ß±&% textBackgroundColor0à±°°Ú0á±& %  textColor0â±& %  TableColumn2°a0ã±& %  TableColumn3°k0ä±&% Button1°O0å±&% Button2°«0æ±& %  TableColumn4°u0ç±&% View°–0è± &++0é1(NSNibConnector°D°Ð0ê±(°Ò0ë±(°º0ì1)NSNibOutletConnector°Ð°D0í±&% window0î±(°ä0ï±(°°Ä0ð±(°Ë°0ñ1*NSNibControlConnector°Ë°0ò±&% scrollViaScroller:0ó±(°Ê°0ô±)°°Ð0õ1+NSMutableString&% delegate0ö±*°°Ð0÷±&% selectionChanged:0ø±(°Î°Ä0ù±(°Â°Î0ú±(°2°Â0û±(°â°Â0ü±)°Â°Ð0ý±+&% delegate0þ±)°Â°Ð0ÿ±+& %  dataSourceP±)°Ð°ÂP±& %  trackViewP±)°Ð°P±+&% collectionViewP±)°D°P±+&% initialFirstResponderP±)°°ÂP±+& %  nextKeyViewP±)°Â°ÐP ±*°º°ÐP ±+& %  addSelected:P ±*°ä°ÐP ±+&% updateCollection:P ±(°Æ°2P±(°¿°2P±(°ÁP±(°ÃP±(°ÄP±(°Ï°P±(°Å°ÏP±(°¼°ÏP±*°¼°ÏP±& %  _doScroll:P±(°ã°ÂP±(°æ°ÂP±(°å°ÌP±(°»°ÌP±(°Í°ÌP±(°ÌP±(°ç°ÌP±)°Ð°»P±& %  filterFieldP ±*°»°ÐP!±&% filterCollection:P"±*°å°ÐP#±& %  clearFilter:P$1, GSMutableSet1- NSMutableSet1.NSSet&°Empdcon.app-1.1.99/Resources/CrossfadeView.gorm/0000755000175000017510000000000010404417637020404 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/CrossfadeView.gorm/CVS/0000755000175000017510000000000010404417637021037 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/CrossfadeView.gorm/CVS/Root0000644000175000017510000000004210404417637021701 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Resources/CrossfadeView.gorm/CVS/Repository0000644000175000017510000000004410404417637023137 0ustar tarDebian-NMMPDCon/Resources/CrossfadeView.gorm mpdcon.app-1.1.99/Resources/CrossfadeView.gorm/CVS/Entries0000644000175000017510000000022210404417637022367 0ustar tarDebian-NM/data.classes/1.1.1.1/Wed Feb 22 22:35:37 2006// /data.info/1.1.1.1/Wed Feb 22 22:35:37 2006// /objects.gorm/1.1.1.1/Wed Feb 22 22:35:37 2006// D mpdcon.app-1.1.99/Resources/CrossfadeView.gorm/data.classes0000644000175000017510000000056310377163471022703 0ustar tarDebian-NM{ "## Comment" = "Do NOT change this file, Gorm maintains it"; CrossfadeController = { Actions = ( "valueChanged:", "apply:", "revert:" ); Outlets = ( valueField, valueStepper ); Super = NSWindowController; }; FirstResponder = { Actions = ( "valueChanged:", "apply:", "revert:" ); Super = NSObject; }; }mpdcon.app-1.1.99/Resources/CrossfadeView.gorm/data.info0000644000175000017510000000027010377163471022174 0ustar tarDebian-NMGNUstep archive00002b5e:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed Streammpdcon.app-1.1.99/Resources/CrossfadeView.gorm/objects.gorm0000644000175000017510000000644010377163471022732 0ustar tarDebian-NMGNUstep archive00002b5e:00000022:00000051:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%NSOwner0±&% CrossfadeController0±&% GSCustomClassMap0±&0±&% Button101NSButton1 NSControl1NSView1 NSResponder% A A  B` AÀ  B` AÀ&0 1 NSMutableArray1 NSArray&%0 1 NSButtonCell1 NSActionCell1NSCell0 ±&% Revert0 1NSFont%&&&&&&&&%’0 ±&0±&&&&0±& %  GormNSPanel01GSWindowTemplate1GSClassSwapper0±&%NSPanel1NSPanel1NSWindow%  C B&% C“€ D@0±%  C B  C B&0± &01 NSStepper% BÞ B A€ A¸  A€ A¸&0± &%01 NSStepperCell0±&% 001NSNumber1NSValued &&&&&&&&%’ @Y ?ð%%01 NSTextField% A B$ B` A¨  B` A¨&0± &%01NSTextFieldCell0±&° &&&&&&&&0%’01NSColor0±&%NSNamedColorSpace0±&% System0 ±&% textBackgroundColor0!±°°0"±& %  textColor’0#±% BŽ A  B` AÀ  B` AÀ&0$± &%0%± 0&±&% Apply° &&&&&&&&%’0'±&0(±&&&&0)±% Bš B0 Aè A  Aè A&0*± &%0+±0,±&% secs0-±% A`&&&&&&&&0%’0.±°0/±&% System00±&% textBackgroundColor01±°°/02±& %  textColor’°03±°04±&% System05±&% windowBackgroundColor06±&% Window07±& %  Crossfade°7 ?€ B F@ F@%081NSImage09±&%NSApplicationIcon&   D  D€0:±&% Button°#0;±&% Stepper°0<±& %  TextField°0=±& %  TextField1°)0>± &  0?1NSNibConnector°°0@±°;0A±°<0B±°:0C1NSNibOutletConnector°°0D±&% window0E±°=0F±°0G±°°<0H1NSMutableString& %  valueField0I±°°;0J±& %  valueStepper0K1NSNibControlConnector°;°0L±& %  valueChanged:0M±°°0N±&% revert:0O±°:°0P±&% apply:0Q1 GSMutableSet1! NSMutableSet1"NSSet&°mpdcon.app-1.1.99/Resources/FindPanel.gorm/0000755000175000017510000000000010404417637017500 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/FindPanel.gorm/CVS/0000755000175000017510000000000010404417637020133 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/FindPanel.gorm/CVS/Root0000644000175000017510000000004210404417637020775 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Resources/FindPanel.gorm/CVS/Repository0000644000175000017510000000004010404417637022227 0ustar tarDebian-NMMPDCon/Resources/FindPanel.gorm mpdcon.app-1.1.99/Resources/FindPanel.gorm/CVS/Entries0000644000175000017510000000014410404417637021466 0ustar tarDebian-NM/data.classes/1.1.1.1/Wed Feb 22 22:35:37 2006// /objects.gorm/1.1.1.1/Wed Feb 22 22:35:37 2006// D mpdcon.app-1.1.99/Resources/FindPanel.gorm/data.classes0000644000175000017510000000711210377163471021774 0ustar tarDebian-NM{ FindController = { Actions = ( "findNext:", "findPrevious:", "optionsChanged:" ); Outlets = ( findField, scopeMatrix, optionsMatrix, targetMatrix, notFoundField ); Super = NSWindowController; }; FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "findNext:", "findPrevious:", "optionsChanged:" ); Super = NSObject; }; }mpdcon.app-1.1.99/Resources/FindPanel.gorm/objects.gorm0000644000175000017510000001623210377163471022026 0ustar tarDebian-NMGNUstep archive00002a95:0000001b:000000cb:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%?NSOwner0±&%?FindController0±&% Box101NSBox1NSView1 NSResponder% C€ B, C Bœ  C Bœ&01 NSMutableArray1 NSArray&0±% @à @à Bø BH  Bø BH&0 ± &0 1 NSMatrix1 NSControl%  Bø BH  Bø BH&0 ± &%0 1 NSActionCell1NSCell0 ±&01NSFont%&&&&&&&&%’% Bø AÈ 01NSColor0±&%?NSNamedColorSpace0±&%?System0±&%?controlBackgroundColor°0±& %? NSButtonCell01 NSButtonCell0±&%?Switch01NSImage0±&%?common_SwitchOff°&&&&&&&&%’0±&0±&0±0±&%?common_SwitchOn&&&%%0± &0±0±& %? Ignore Case°°&&&&&&&&%’°0±&°&&&0 ±0!±& %? Whole String°°&&&&&&&&%’°0"±&°&&&’’’° 0#±0$±& %? Find Options°&&&&&&&& @  @ %%0%±& %  TextField10&1 NSTextField% B– Bò CŸ€ A¨  CŸ€ A¨&0'± &%0(1NSTextFieldCell0)±&°&&&&&&&&%’0*±°0+±&%?System0,±&%?textBackgroundColor0-±°°+0.±& %? textColor’0/±&% Box200±% A B, BÄ Bœ  BÄ Bœ&01± &02±% @à @à B¨ BH  B¨ BH&03± &04± %  B¨ BH  B¨ BH&05± &%06± 07±&°&&&&&&&&%’% B¨ AÈ 08±°09±&%?System0:±&%?controlBackgroundColor°80;±& %? NSButtonCell0<±0=±&%?Radio0>±0?±&%?common_RadioOff°&&&&&&&&%’0@±&0A±&0B±0C±&%?common_RadioOn&&&%%0D± &0E±0F±& %? Collection°>°&&&&&&&&%’°@0G±&°B&&&0H±0I±&%?Playlist°>°&&&&&&&&%’°@0J±&°B&&&’’’°E0K±0L±& %? Find Target°&&&&&&&& @  @ %%°0M1 GSNibItem°  &0N±& %  TextField20O±% A Ap C A  C A&0P± &%0Q±0R±&0S±% A`&&&&&&&&%’0T±°0U±&%?System0V±&%?textBackgroundColor0W±°0X±&%?System0Y±&%?controlShadowColor’0Z±& %? TextField0[±% B Bø B A  B A&0\± &%0]±0^±&%?Find:°S&&&&&&&&%’0_±°0`±&%?System0a±&%?textBackgroundColor0b±°°`0c±& %? textColor’0d±&%?GSCustomClassMap0e±&0f±&%?Button0g1NSButton% C¤ A B„ AÀ  B„ AÀ&0h± &%0i±0j±&%?Next°&&&&&&&&%’0k±&0l±&&&&0m±&% Matrix1° 0n±&% Matrix2°40o±&%?Box0p±% Bâ B, C Bœ  C Bœ&0q± &0r±% @à @à Bø BH  Bø BH&0s± &0t± %  Bø BH  Bø BH&0u± &%0v± ° °&&&&&&&&%’% Bx AÈ °°0w±& %? NSButtonCell0x±0y±&%?Radio°>°&&&&&&&&%’0z±&0{±&°B&&&%%0|± &0}±0~±&%?All°>°&&&&&&&&%’°z0±&°B&&&0€±0±&%?Artist°>°&&&&&&&&%’°z0‚±&°B&&&0ƒ±0„±&%?Album°>°&&&&&&&&%’°z0…±&°B&&&0†±0‡±&%?Title°>°&&&&&&&&%’°z0ˆ±&°B&&&’’’°}0‰±0б& %? Find Scope°&&&&&&&& @  @ %%0‹±& %? GormNSPanel0Œ1NSPanel1NSWindow%  CÊ C&% Cª Dh@0±%  CÊ C  CÊ C&0ޱ &°[°&°g0±% C€ A B„ AÀ  B„ AÀ&0± &%0‘±0’±&%?Previous°&&&&&&&&%’0“±&0”±&&&&°p°°0°O0•±°°0–±&%?windowBackgroundColor0—±&%?Window0˜±&%?Find°˜ ?€ B F@ F@%0™±0š±&%?NSApplicationIcon0›±&%?Matrix°t0œ±&% Button1°0± &0ž1NSNibConnector°‹0Ÿ±&%?NSOwner0 ±°Z0¡±°%0¢±°f0£±°œ0¤±°›0¥±°o0¦±°m0§±°0¨±°°Ÿ0©1NSNibControlConnector°œ°0ª±& %  findPrevious:0«±°f°0¬±& %  findNext:0­±°%°°¬0®1NSNibOutletConnector°Ÿ°‹0¯±&%?window0°±°°‹°¯0±±°°›0²±& %? scopeMatrix0³±°°m0´±& %? optionsMatrix0µ±°n0¶±°/0·±°°n0¸±& %? targetMatrix0¹±°N0º±°°N0»±& %? notFoundField0¼±°°%0½±& %? findField0¾±°n°0¿±&% optionsChanged:0À±°›°°¿0Á±°m°°¿0±°‹°%0ñ&%?initialFirstResponder0ı°%°0ű&%?delegatempdcon.app-1.1.99/Resources/Player.gorm/0000755000175000017510000000000010404417637017074 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/Player.gorm/CVS/0000755000175000017510000000000010404417637017527 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/Player.gorm/CVS/Root0000644000175000017510000000004210404417637020371 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Resources/Player.gorm/CVS/Repository0000644000175000017510000000003510404417637021627 0ustar tarDebian-NMMPDCon/Resources/Player.gorm mpdcon.app-1.1.99/Resources/Player.gorm/CVS/Entries0000644000175000017510000000114310404417637021062 0ustar tarDebian-NM/CD.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Crossfade.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Next.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Pause.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Play.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Playlist.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Prev.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Repeat.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Shuffle.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /Stop.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /data.classes/1.2/Thu Feb 23 20:53:18 2006// /data.info/1.1.1.1/Wed Feb 22 22:35:37 2006// /objects.gorm/1.2/Thu Feb 23 20:53:18 2006// D mpdcon.app-1.1.99/Resources/Player.gorm/CD.tiff0000644000175000017510000000355010377163471020242 0ustar tarDebian-NMII*H Y¹õõ¹Y YÿÿÿÿÿÿÿÿY…ÿÿÿÿÿÿÿÿÿÿ…YÿÿÿÿÿÿÿÿÿÿÿÿY ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ YÿÿÿÿÿÿÿÿÿÿÿÿÿÿY¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹õÿÿÿÿÿÿÿÿÿÿÿÿõõÿÿÿÿÿÿÿÿÿÿÿÿõ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹YÿÿÿÿÿÿÿÿÿÿÿÿÿÿY ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ YÿÿÿÿÿÿÿÿÿÿÿÿY…ÿÿÿÿÿÿÿÿÿÿ…YÿÿÿÿÿÿÿÿY Y¹õõ¹Y þ& .B@@X`(R/Users/flip/CD.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/Crossfade.tiff0000644000175000017510000000356010377163471021666 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿþ& .J@@`h(R/Users/flip/Crossfade.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/Next.tiff0000644000175000017510000000355210377163471020674 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Next.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/Pause.tiff0000644000175000017510000000355410377163471021035 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .F@@\d(R/Users/flip/Pause.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/Play.tiff0000644000175000017510000000355210377163471020663 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Play.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/Playlist.tiff0000644000175000017510000000355610377163471021563 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .H@@^f(R/Users/flip/Playlist.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/Prev.tiff0000644000175000017510000000355210377163471020672 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Prev.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/Repeat.tiff0000644000175000017510000000355410377163471021200 0ustar tarDebian-NMII*HÿÿÿÿˆÓúÿÿÿdúÿÿúÿÿÿúddÿþyÿÿßÿdúÿiÿ Ôúˆÿ´3ÿˆÓüÑÓúǯúúª¶úÓÞòÓˆÿSmÿˆúï*-øúdÿúƒ`ôÿddúÿÿÛÜöÿúdˆÓúúÓˆþ& .F@@\d(R/Users/flip/Repeat.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/Shuffle.tiff0000644000175000017510000000360410377163471021350 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& 0.^@@t|(R/Users/flip/Projects/MPDCon/Images/Shuffle.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/Stop.tiff0000644000175000017510000000355210377163471020703 0ustar tarDebian-NMII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Stop.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/Player.gorm/data.classes0000644000175000017510000000163510377420276021373 0ustar tarDebian-NM{ "## Comment" = "Do NOT change this file, Gorm maintains it"; AppController = { Actions = ( "play:", "stop:", "prev:", "next:", "shuffle:", "repeat:", "percentChanged:", "volumeChanged:", "showPrefPanel:", "managePlaylists:", "connect:", "browseCollection:", "serverStatistics:", "showPlaylist:", "updateCollection:", "showCrossfade:" ); Outlets = ( playButton, stopButton, prevButton, nextButton, shuffleButton, repeatButton, playView, percentSlider, volumeSlider, playerButton, window, statisticsItem, browseItem, updateItem, showItem, manageItem ); Super = NSObject; }; FirstResponder = { Actions = ( "setText:" ); Super = NSObject; }; PlayView = { Actions = ( "setText:" ); Outlets = ( ); Super = NSView; }; }mpdcon.app-1.1.99/Resources/Player.gorm/data.info0000644000175000017510000000027010377163471020664 0ustar tarDebian-NMGNUstep archive00002b5e:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed Streammpdcon.app-1.1.99/Resources/Player.gorm/objects.gorm0000644000175000017510000006530710377420276021430 0ustar tarDebian-NMGNUstep archive00002b5e:00000029:000001b3:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&:01NSString& %  MenuItem1901 NSMenuItem0±&% Browse0±&% b&&ÿ%01NSImage01NSMutableString&% common_2DCheckMark’%0 ±&% Button10 1 NSButton1 NSControl1 NSView1 NSResponder% B @à AÀ AÀ  AÀ AÀ&0 1 NSMutableArray1NSArray&%0 1 NSButtonCell1 NSActionCell1NSCell0 ±&% Stop0± A  A 01NSColor0±&%NSCalibratedWhiteColorSpace 0± &01NSBitmapImageRep1 NSImageRep0±&%NSDeviceRGBColorSpace A  A %%%01 NSDataMalloc1 NSDataStatic1NSData&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R01NSFont%&&&&&&&&%’0±&0±&&&&0±&% GormCustomView01 GSCustomView1 GSNibItem0±&% PlayView A Bd Cn B–&0±&% Button20± % B| @à AÀ AÀ  AÀ AÀ&0± &%0±0±&% Prev0 ± A  A 0!±° 0"± &0#±° A  A %%%0$±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°&&&&&&&&%’0%±&0&±&&&&0'±&% Button30(± % B¸ @à AÀ AÀ  AÀ AÀ&0)± &%0*±0+±&% Next0,± A  A °!0-± &0.±° A  A %%%0/±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°&&&&&&&&%’00±&01±&&&&02±&% Button403± % C] @à AÀ AÀ  AÀ AÀ&04± &%05±06±&% S07± A  A 08±° 09± &0:±° A  A %%%0;±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°&&&&&&&&%’0<±&0=±&&&&0>±& %  MenuItem10?±0@±&% Quit0A±&% q&&ÿ%°’%0B±& %  NSVisible0C± &0D1GSWindowTemplate1GSClassSwapper0E±&%NSWindow1NSWindow%  CŠ€ C&% DjÀ C0F± %  CŠ€ C  CŠ€ C&0G± &  °0H± % A @à AÀ AÀ  AÀ AÀ&0I± &%0J±0K±&% Play0L± A  A °0M± &0N±° A  A %%%0O±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°&&&&&&&&%’0P±&0Q±&&&&° °°(°30R± % Cu @à AÀ AÀ  AÀ AÀ&0S± &%0T±0U±&% R0V± A  A °!0W± &0X±° A  A %%%0Y±&ÚÚII*HÿÿÿÿˆÓúÿÿÿdúÿÿúÿÿÿúddÿþyÿÿßÿdúÿiÿ Ôúˆÿ´3ÿˆÓüÑÓúǯúúª¶úÓÞòÓˆÿSmÿˆúï*-øúdÿúƒ`ôÿddúÿÿÛÜöÿúdˆÓúúÓˆ þÿÒ@R°&&&&&&&&%’0Z±&0[±&&&&0\1NSSlider% A B C€ A€  C€ A€&0]± &%0^1 NSSliderCell0_±&% 0°0`1 NSNumber1!NSValued &&&&&&&&%’ BÈ ¿€%0a1"NSTextFieldCell0b±&°&&&&&&&&0%’0c±0d±&%NSNamedColorSpace0e±&% System0f±&% textBackgroundColor0g±°d°e0h±&% controlTextColor0i±0j±&0k±0l±&%common_SliderHoriz°&&&&&&&&%%0m±% C} Bd A€ B–  A€ B–&0n± &%0o±0p±&% 0°0q± d &&&&&&&&%’ BÈ ¿€%0r±"0s±&°&&&&&&&&0%’0t±°d0u±&% System0v±&% textBackgroundColor0w±°d°u0x±&% controlTextColor0y±0z±&0{±0|±&%common_SliderVert°&&&&&&&&%%0}± % C* @à AÀ AÀ  AÀ AÀ&0~± &%0±0€±&% PL0± A  A °!0‚± &0ƒ±° A  A %%%0„±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°&&&&&&&&%’0…±&0†±&&&&0‡± % C @à AÀ AÀ  AÀ AÀ&0ˆ± &%0‰±0б&% CF0‹± A  A °!0Œ± &0±° A  A %%%0ޱ&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ þÿÒ@R°&&&&&&&&%’0±&0±&&&&0‘±°d0’±&% System0“±&% windowBackgroundColor0”±&% Window0•±&% Player°• ?€ B F@ F@%0–±0—±&%NSApplicationIcon&   D  D€0˜±& %  MenuItem20™±0š±&% Hide0›±&% h&&ÿ%°’%0œ±&% Button5°R0±& %  MenuItem330ž±0Ÿ±&%Edit0 ±&&&ÿ%°0¡±0¢±& %  common_2DDash2submenuAction:%0£1#NSMenu°Ÿ0¤± &0¥±0¦±&%Cut0§±&%x&&ÿ%°°¡’%0¨±0©±&%Copy0ª±&%c&&ÿ%°°¡’%0«±0¬±&%Paste0­±&%v&&ÿ%°°¡’%0®±0¯±& % Select All0°±&%a&&ÿ%°°¡’%0±±#0²±& %  Main Menu0³± &0´±0µ±&% Info0¶±&&&ÿ%°²%0·±#°µ0¸± &0¹±0º±& %  Info Panel...0»±&&&ÿ%°’%0¼±0½±&% Preferences...0¾±&&&ÿ%°’%0¿±0À±&% Help...0Á±&% ?&&ÿ%°’% °±°ž0±0ñ&% Server0ı&&&ÿ%°²%0ű#°Ã0Ʊ &0DZ0ȱ&% Connect0ɱ&% C&&ÿ%°’% 0ʱ0˱& %  Statistics0̱&% s&&ÿ%°’%°±0ͱ0α& %  Playlists0ϱ&&&ÿ%°²%0б#°Î0ѱ &0Ò±0Ó±& %  Show Current0Ô±&% p&&ÿ%°’%0Õ±0Ö±&% Manage0×±&% m&&ÿ%°’%°±0ر0Ù±& %  Collection0Ú±&&&ÿ%°²%0Û±#°Ù0ܱ &°0ݱ0Þ±&% Update0ß±&% u&&ÿ%°’%°±°™°?0à±& %  MenuItem3°?0á±&% Button6°‡0â±& %  MenuItem34°¥0ã±& %  MenuItem4°™0ä±&% Button7°}0å±& %  MenuItem35°¨0æ±& %  MenuItem5°?0ç±& %  MenuItem36°«0è±& %  MenuItem6°´0é±& %  MenuItem37°®0ê±&% MenuItem°™0ë±& %  MenuItem7°¹0ì±& %  MenuItem8°¼0í±& %  AppController0î±°í  &0ï±&% Slider°\0ð±& %  MenuItem9°¿0ñ±& %  My Window°D0ò±&% Button°H0ó±& %  GormNSMenu°·0ô±& %  MenuItem20°Â0õ±& %  MenuItem21°Ç0ö±& %  MenuItem22°Ê0÷±& %  MenuItem23°Â0ø±& %  MenuItem24°Í0ù±& %  MenuItem25°Ò0ú±& %  MenuItem26°Õ0û±& %  MenuItem27°Ý0ü±& %  MenuItem28°Ø0ý±&% Slider1°m0þ±& %  GormNSMenu1°·0ÿ±& %  GormNSMenu2°ÛP±& %  GormNSMenu3°ÅP±& %  GormNSMenu4°ÐP±& %  GormNSMenu6P±#P±&% WindowsP± &P±P±&% Arrange In FrontP±&&&ÿ%°°¡’%P ±P ±&% Miniaturize WindowP ±&% m&&ÿ%°°¡’%P ±P ±& %  Close WindowP±&% w&&ÿ%°°¡’%P±& %  GormNSMenu7°£P±& %  MenuItem10°¹P±&% GSCustomClassMapP±&P±& %  MenuItem11°¼P±& %  MenuItem12°¿P±& %  MenuItem13°´P±& %  MenuItem14°™P±&% NSMenu°±P±& %  MenuItem15°?P±& %  MenuItem16°ØP±&%NSOwnerP±& %  NSApplicationP±& %  MenuItem17°ÝP±& %  MenuItem18°ØP± &UUP1$NSNibConnector°ñÐP ±$ÐÐP!±$ÐÐP"1%NSNibControlConnectorÐP#±&%NSFirstP$±&% hide:P%±$ÐÐP&±%ÐÐ#P'±& %  terminate:P(±$°P)±$°òP*±$° P+±$°P,±$°'P-±$°2P.±$°œP/±$°íÐP01&NSNibOutletConnector°í°òP1±& %  playButtonP2±&°í° P3±& %  stopButtonP4±&°í°P5±& %  prevButtonP6±&°í°'P7±& %  nextButtonP8±&°í°2P9±& %  shuffleButtonP:±&°í°œP;±& %  repeatButtonP<±%°ò°íP=±&% play:P>±%° °íP?±&% stop:P@±%°°íPA±&% prev:PB±%°'°íPC±&% next:PD±%°2°íPE±&% shuffle:PF±%°œ°íPG±&% repeat:PH±&°í°PI±&% playViewPJ±&аíPK±&% delegatePL±$°ïPM±&°í°ïPN±& %  percentSliderPO±%°ï°íPP±&% percentChanged:PQ±$ÐÐPR±%ÐÐPS±&% submenuAction:PT±$°þÐPU±$аþPV±%ÐÐ#PW±&% orderFrontStandardInfoPanel:PX±$аþPY±$аþPZ±%ÐÐ#P[±&% orderFrontHelpPanel:P\±$°ýP]±&°í°ýP^±& %  volumeSliderP_±%°ý°íP`±&% volumeChanged:Pa±%аíPb±&% showPrefPanel:Pc±$ÐÐPd±%ÐÐPe±&% submenuAction:Pf±$°ÿÐPg±$°äÐPh±$°°ÿPi±%°°íPj±&% browseCollection:Pk±$°÷ÐPl±%°÷ÐPm±&% submenuAction:Pn±$а÷Po±$°õÐPp±$°öÐPq±%°õ°íPr±&% connect:Ps±%°ö°íPt±&% serverStatistics:Pu±%°ä°íPv±& %  showPlaylist:Pw±$°øÐPx±%°øÐPy±&% submenuAction:Pz±$аøP{±$°ùÐP|±$°úÐP}±%°ù°íP~±& %  showPlaylist:P±$аÿP€±%аíP±&% updateCollection:P‚±$°áÐPƒ±%°á°íP„±&% showCrossfade:P…±&°í°ñP†±&% windowP‡±&°í°ùPˆ±&% showItemP‰±&°í°úPб& %  manageItemP‹±&°í°PŒ±& %  browseItemP±&°íÐPޱ& %  updateItemP±&°í°öP±&% statisticsItemP‘±%°ú°íP’±&% managePlaylists:P“±$°ÐP”±$аP•±$°âÐP–±%°âÐ#P—±&%cut:P˜±$°åÐP™±%°åÐ#Pš±&%copy:P›±$°çÐPœ±%°çÐ#P±&%paste:Pž±$°éÐPŸ±%°éÐ#P ±& % selectAll:P¡±%°ÐP¢±&%submenuAction:P£1' GSMutableSet1( NSMutableSet1)NSSet&°±°î°Dmpdcon.app-1.1.99/Resources/PlaylistViewer.gorm/0000755000175000017510000000000010404420040020601 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/PlaylistViewer.gorm/CVS/0000755000175000017510000000000010405367745021263 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/PlaylistViewer.gorm/CVS/Root0000644000175000017510000000004210404417637022120 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Resources/PlaylistViewer.gorm/CVS/Repository0000644000175000017510000000004510404417637023357 0ustar tarDebian-NMMPDCon/Resources/PlaylistViewer.gorm mpdcon.app-1.1.99/Resources/PlaylistViewer.gorm/CVS/Entries0000644000175000017510000000026710405367745022624 0ustar tarDebian-NM/Current.tiff/1.1.1.1/Wed Feb 22 22:35:37 2006// /data.classes/1.2/Thu Feb 23 21:15:11 2006// /data.info/1.2/Sat Mar 11 00:56:00 2006// /objects.gorm/1.6/Sat Mar 11 00:56:00 2006// D mpdcon.app-1.1.99/Resources/PlaylistViewer.gorm/Current.tiff0000644000175000017510000000210210377163471023115 0ustar tarDebian-NMII*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþö þ@2:(R/Users/mrsanders/Current.tiffCreated with The GIMPHHmpdcon.app-1.1.99/Resources/PlaylistViewer.gorm/data.classes0000644000175000017510000000152710404420040023076 0ustar tarDebian-NM{ "## Comment" = "Do NOT change this file, Gorm maintains it"; BoldCell = { Actions = ( ); Outlets = ( ); Super = NSTextFieldCell; }; FirstResponder = { Actions = ( "browseCollection:", "doubleClick:", "filterList:", "managePlaylists:", "clearFilter:", "removeSongs:", "showCurrentSong:", "shuffleList:" ); Super = NSObject; }; OwnTableView = { Actions = ( ); Outlets = ( ); Super = NSTableView; }; PlaylistController = { Actions = ( "doubleClick:", "showCurrentSong:", "managePlaylists:", "removeSongs:", "browseCollection:", "shuffleList:", "filterList:", "clearFilter:" ); Outlets = ( playlistTable, lengthView, playlistSelector, removeSelector, filterField ); Super = NSWindowController; }; }mpdcon.app-1.1.99/Resources/PlaylistViewer.gorm/data.info0000644000175000017510000000032210404420040022364 0ustar tarDebian-NMGNUstep archive00002b5e:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&% Latest Version0±& %  Typed Streammpdcon.app-1.1.99/Resources/PlaylistViewer.gorm/objects.gorm0000644000175000017510000002542210404420040023125 0ustar tarDebian-NMGNUstep archive00002b5e:0000002f:00000114:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%?NSOwner0±&% PlaylistController0±& %  MenuItem101 NSMenuItem0±&% Item 20±&&&ÿ%’%0 ±& %  TextField0 1 NSTextField1 NSControl1 NSView1 NSResponder% C† @@ C‡ A˜  C‡ A˜&!0 1 NSMutableArray1 NSArray&%0 1 NSTextFieldCell1 NSActionCell1NSCell0 ±&% Playlist Length:01NSFont% A`&&&&&&&&0%’01NSColor0±&%?NSNamedColorSpace0±&% System0±&% textBackgroundColor0±°°0±& %  textColor’0±& %  MenuItem20±0±&% Item 3°&&ÿ%’%0±& %  MenuItem30±0±&% Remove0±&&&ÿ%01NSImage0±&%?common_3DArrowDown’%0±&% TextFieldCell101GSObjectTemplate1GSClassSwapper0 ±&% BoldCell± 0!±&%?nine0"±%°!&&&&&&&&0%’0#±°0$±&% System0%±&% textBackgroundColor0&±°°$0'±& %  textColor0(±&% TextFieldCell20)±° ± 0*±&% nine°"°*&&&&&&&&0%’°#°&0+±&% Button0,1NSButton%  Bî AÀ  Bî AÀ&$0-± &%0.1 NSButtonCell0/±&% Show current Song°"&&&&&&&&%’00±&01±&&&&02±& %  MenuItem403±04±&% All°&&ÿ%’%05±&% TextFieldCell306±° ± °!°"°!&&&&&&&&0%’°#°&07±&% PlaylistWindow081GSWindowTemplate09±&%?NSPanel1NSPanel1NSWindow%  D D€& % CE Dx€0:± %  D D€  D D€&0;± &0<1 NSScrollView% Bl D Cá  D Cá&0=± &0>1 NSClipView% A˜ A° D@ CÌ€  D@ CÌ€&0?± &0@1GSControlTemplate0A±& %  OwnTableView1 NSTableView%  D@ C!  D@ C!&0B± &%0C±0D±&°"&&&&&&&&0E± &0F1 NSTableColumn0G±&% play A¸ A  GÃP0H1NSTableHeaderCell0I±&0J±% °I&&&&&&&&0%’0K±°0L±&%?System0M±&%?controlShadowColor0N±°°L0O±&%?windowFrameTextColor0P1 NSImageCell°!°"°!&&&&&&&&%%% 0Q±0R±&% pos B A  GÃP0S±0T±&% #°J°T&&&&&&&&0%’°K°N0U± °!°"°!&&&&&&&&0%’0V±°0W±&% System0X±&% textBackgroundColor0Y±°°W0Z±& %  textColor0[±0\±&% artist C A  GÃP0]±0^±&% Artist°J°^&&&&&&&&0%’°K°N°0_±0`±&% title C A  GÃP0a±0b±&% Title°J&&&&&&&&0%’°K°N0c± °!°"°!&&&&&&&&0%’0d±°0e±&% System0f±&% textBackgroundColor0g±°°e0h±& %  textColor0i±0j±&% album Bö A  GÃP0k±0l±&% Album°J&&&&&&&&0%’°K°N0m± °!°"°!&&&&&&&&0%’°d°g0n±0o±&% time B` A  GÃP0p±0q±&% Time°J°q&&&&&&&&0%’°K°N°60r±°0s±&% System0t±& %  gridColor0u±°0v±&% System0w±&% controlBackgroundColor0x1!NSTableHeaderView%  D@ A°  D@ A°&0y± &0z1"GSTableCornerView%  A˜ A°  A˜ A°&0{± &%% A€’ @ @@0|±°°s0}±&% controlBackgroundColor0~1# NSScroller% A° A CÖ  A CÖ&0± &%0€±°D°"&&&&&&&&&°<2 _doScroll:v12@0:4@80±% A˜  D@ A°  D@ A°&0‚± &°x0ƒ±°°s0„±& %  controlColor0…±#% A˜ CØ D@ A  D@ A&0†± &%0‡±0ˆ±&°"&&&&&&&&&°<²°z°>% A A A A °…°~°° °,0‰1$ NSPopUpButton% C°€ Cþ€ CC A   CC A & 0б &%0‹1%NSPopUpButtonCell1&NSMenuItemCell0Œ±&°"&&&&&&&&01'NSMenu0ޱ&0± &°°3%’0±&0‘±&&&&°°%%%%%0’±% Bâ Cþ€ BÞ A   BÞ A & 0“± &%0”±0•±&% Browse Collection°"&&&&&&&&%’0–±&0—±&&&&0˜±% A Cÿ BÄ A˜  BÄ A˜& 0™± &%0š±0›±&% Manage playlists°"&&&&&&&&%’0œ±&0±&&&&0ž±% Bø  B„ AÀ  B„ AÀ&$0Ÿ± &%0 ±0¡±& %  Shuffle List°"&&&&&&&&%’0¢±&0£±&&&&0¤1(NSBox% À AÀ D B   D B &"0¥± &0¦± % @à @à D€ A¨  D€ A¨&0§± &0¨±% @ Að A  Að A&$0©± &%0ª± 0«±&% Filter:0¬±% A@°«&&&&&&&&0%’0­±°0®±&% System0¯±&% textBackgroundColor0°±°°®0±±& %  textColor’0²±% B  Cì€ A¨  Cì€ A¨&"0³± &%0´± 0µ±&°"°µ&&&&&&&&0%’0¶±°0·±&% System0¸±&% textBackgroundColor0¹±°°·0º±& %  textColor’0»±% D@ À@ AÈ AÀ  AÈ AÀ&!0¼± &%0½±0¾±&% Clear°"°¾&&&&&&&&%’0¿±&0À±&&&&0Á±0±&% Title°"&&&&&&&& @  @ %%0ñ°°e0ı&% windowBackgroundColor0ű&% Window0Ʊ&% Current Playlist°Æ C〠CH F@ F@%0DZ0ȱ&%?NSApplicationIcon&   D  D€0ɱ&% MenuItem0ʱ0˱& %  Playlists°&&ÿ%°’%0̱&% GSCustomClassMap0ͱ&0α& %  TextFieldCell° °° °(° °5° 0ϱ&% GormNSTableView°A0б& %  ScrollView°<0ѱ&% Box°¤0Ò±& %  TableColumn1°[0Ó±&% GormNSPopUpButton1°‰0Ô±& %  TextField1°¨0Õ±& %  TextField2°²0Ö±& %  TableColumn°F0×±& %  TextFieldCell0ر° ± °*°"°*&&&&&&&&0%’°#°&0Ù±&% Button1°’°Ï°@0Ú±&% Button2°˜0Û±&% Button3°ž0ܱ&% View°¦0ݱ&% Button4°»0Þ± &''0ß1)NSNibConnector°7°0à±)°Ð0á±)°Ï0â±)°Ö0ã±)°Ò0ä±)° 0å±)°+0æ±)°É0ç±)°0è±)°0é±)°Ó°0ê±)°0ë±)°20ì±)°Ù0í±)°Ú0î±)°Û°0ï1*NSNibOutletConnector°°70ð±&% window0ñ±)°×°Ò0ò±)°°Ò0ó±)°(0ô±)°50õ±*°°Ó0ö1+NSMutableString&% removeSelector0÷±*°° 0ø±+& %  lengthView0ù1,NSNibControlConnector°Ú°0ú±+&% managePlaylists:0û±,°Ù°0ü±+&% browseCollection:0ý±,°+°0þ±+&% showCurrentSong:0ÿ±,°Û°P±+& %  shuffleList:P±,°Ó°P±+& %  removeSongs:P±*°°ÏP±+& %  playlistTableP±*°Ï°P±+&% delegateP±*°Ï°P±+& %  dataSourceP ±)°Õ°ÑP ±*°°ÕP ±& %  filterFieldP ±,°Õ°P ±& %  filterList:P±)°Ý°ÑP±,°Ý°P±& %  clearFilter:P±)°Ô°ÑP±)°ÑP±)°Ü°ÑP1- GSMutableSet1. NSMutableSet1/NSSet&°8mpdcon.app-1.1.99/Resources/PlaylistsManager.gorm/0000755000175000017510000000000010404417637021117 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/PlaylistsManager.gorm/CVS/0000755000175000017510000000000010404417637021552 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/PlaylistsManager.gorm/CVS/Root0000644000175000017510000000004210404417637022414 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Resources/PlaylistsManager.gorm/CVS/Repository0000644000175000017510000000004710404417637023655 0ustar tarDebian-NMMPDCon/Resources/PlaylistsManager.gorm mpdcon.app-1.1.99/Resources/PlaylistsManager.gorm/CVS/Entries0000644000175000017510000000021210404417637023101 0ustar tarDebian-NM/data.classes/1.2/Fri Feb 24 16:32:29 2006// /data.info/1.1.1.1/Wed Feb 22 22:35:37 2006// /objects.gorm/1.2/Fri Feb 24 16:32:29 2006// D mpdcon.app-1.1.99/Resources/PlaylistsManager.gorm/data.classes0000644000175000017510000000077110377632435023420 0ustar tarDebian-NM{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "updateLists:", "loadList:", "saveList:", "removeList:" ); Super = NSObject; }; OwnTableView = { Actions = ( ); Outlets = ( ); Super = NSTableView; }; PlaylistsManagerController = { Actions = ( "updateLists:", "loadList:", "saveList:", "removeList:" ); Outlets = ( listView, saveField ); Super = NSWindowController; }; }mpdcon.app-1.1.99/Resources/PlaylistsManager.gorm/data.info0000644000175000017510000000027010377163471022707 0ustar tarDebian-NMGNUstep archive00002b5e:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed Streammpdcon.app-1.1.99/Resources/PlaylistsManager.gorm/objects.gorm0000644000175000017510000001363410377632435023451 0ustar tarDebian-NMGNUstep archive00002b5e:00000027:00000096:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary& 01NSString&% Button201NSButton1 NSControl1NSView1 NSResponder% C’€ A  B` AÀ  B` AÀ&!01 NSMutableArray1 NSArray&%01 NSButtonCell1 NSActionCell1NSCell0±&% Save01NSFont%&&&&&&&&%’0 ±&0 ±&&&&0 ±&% Button30 ±% Cc B Bt AÀ  Bt AÀ&!0 ± &%0± 0±&% Remove°&&&&&&&&%’0±&0±&&&&0±&%NSOwner0±&% PlaylistsManagerController0±& %  ScrollView01 NSScrollView% Bˆ C³€ Cž  C³€ Cž&0± &01 NSClipView% A¨ AÀ C¨ C‘  C¨ C‘&0± &01GSControlTemplate1GSClassSwapper0±& %  OwnTableView1 NSTableView%  C¨ C!  C¨ C!&0± &%0±0±&°&&&&&&&&0± &01 NSTableColumn0 ±&% column1 C¨ A  GÃP0!1NSTableHeaderCell1NSTextFieldCell0"±& %  Playlists0#±% &&&&&&&&0%’0$1NSColor0%±&%NSNamedColorSpace0&±&%System0'±&%controlShadowColor0(±°%°&0)±&%windowFrameTextColor0*±0+±&%neuf°°+&&&&&&&&0%’0,±°%0-±&% System0.±&% textBackgroundColor0/±°%°-00±& %  textColor01±°%°-02±& %  gridColor03±°%04±&% System05±&% controlBackgroundColor061NSTableHeaderView%  C¨ A°  C¨ A°&07± &081GSTableCornerView% @ @ A˜ A°  A˜ A°&09± &%% A€’ @ @@0:±°%°-0;±&% controlBackgroundColor0<1 NSScroller% @ AÀ A C‘  A C‘&0=± &%0>±°°&&&&&&&&&°2 _doScroll:v12@0:4@80?±% A¨ @ C¨ A°  C¨ A°&0@± &°60A±°%°-0B±& %  controlColor°8°% A A A A °<°?0C±& %  TextField0D1 NSTextField% A AP C‹ A¨  C‹ A¨&"0E± &%0F±0G±&°&&&&&&&&0%’0H±°%0I±&% System0J±&% textBackgroundColor0K±°%°I0L±& %  textColor’0M±&% GSCustomClassMap0N±&0O±&% GormNSTableView°0P±&% Button0Q±% A B B` AÀ  B` AÀ&$0R± &%0S± 0T±&% Update°&&&&&&&&%’0U±&0V±&&&&0W±& %  TableColumn°0X±& %  GormNSPanel0Y1GSWindowTemplate0Z±&%NSPanel1NSPanel1NSWindow%  C³€ CÀ& % C• Dr€0[±%  C³€ CÀ  C³€ CÀ&0\± &°°Q0]±% C’€ B B` AÀ  B` AÀ&!0^± &%0_± 0`±&% Load°&&&&&&&&%’0a±&0b±&&&&°D°° 0c±°%0d±&% System0e±&% windowBackgroundColor0f±&% Window0g±& %  Playlists°g Cz Cz F@ F@%0h1 NSImage0i±&%NSApplicationIcon&   D  D€°O°0j±& %  TableColumn10k±0l±&% column2 CŽ A  GÃP0m±0n±&%  °#&&&&&&&&0%’0o±°%°d0p±&% controlShadowColor0q±°%°-0r±&% windowFrameTextColor0s±0t±&% three°°t&&&&&&&&0%’°,°/0u±&% Button1°]0v± &0w1!NSNibConnector°X°0x±!°0y±!°O0z±!°W0{±!°j0|±!°P0}±!°u0~±!°C0±!°0€1"NSNibOutletConnector°°X0±&% window0‚±!° 0ƒ±"°X°C0„±&% initialFirstResponder0…±"°°O0†1#NSMutableString&% listView0‡±"°°C0ˆ±#& %  saveField0‰1$NSNibControlConnector°P°0б#& %  updateLists:0‹±$° °0Œ±#& %  removeList:0±$°u°0ޱ#& %  loadList:0±$°°0±#& %  saveList:0‘±$°C°°0’±"°O°0“±#& %  dataSource0”±"°O°0•±#&% delegate0–1% GSMutableSet1& NSMutableSet1'NSSet&°Ympdcon.app-1.1.99/Resources/Preferences.gorm/0000755000175000017510000000000010404422715020072 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/Preferences.gorm/CVS/0000755000175000017510000000000010405367754020541 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/Preferences.gorm/CVS/Root0000644000175000017510000000004210404417637021376 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Resources/Preferences.gorm/CVS/Repository0000644000175000017510000000004210404417637022632 0ustar tarDebian-NMMPDCon/Resources/Preferences.gorm mpdcon.app-1.1.99/Resources/Preferences.gorm/CVS/Entries0000644000175000017510000000020610405367754022073 0ustar tarDebian-NM/data.classes/1.2/Sat Mar 11 01:20:13 2006// /data.info/1.2/Sat Mar 11 01:20:13 2006// /objects.gorm/1.2/Sat Mar 11 01:20:13 2006// D mpdcon.app-1.1.99/Resources/Preferences.gorm/data.classes0000644000175000017510000000067510404422715022372 0ustar tarDebian-NM{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "apply:", "revert:", "usePasswordChanged:" ); Super = NSObject; }; PreferencesController = { Actions = ( "apply:", "revert:", "usePasswordChanged:" ); Outlets = ( mpdHost, mpdPort, password, scrollSwitch, usePassword, colorWell ); Super = NSWindowController; }; }mpdcon.app-1.1.99/Resources/Preferences.gorm/data.info0000644000175000017510000000032210404422715021655 0ustar tarDebian-NMGNUstep archive00002b5e:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&% Latest Version0±& %  Typed Streammpdcon.app-1.1.99/Resources/Preferences.gorm/objects.gorm0000644000175000017510000001575710404422715022430 0ustar tarDebian-NMGNUstep archive00002b5e:00000022:000000b9:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&% Button201NSButton1 NSControl1NSView1 NSResponder% Bº B C& A€  C& A€&01 NSMutableArray1 NSArray&%01 NSButtonCell1 NSActionCell1NSCell0±&% Enable Scrolling of Titles01NSImage0 1NSMutableString&% common_SwitchOff0 1NSFont%&&&&&&&&%’0 ±&0 ±&0 ±0±&% common_SwitchOn&&&0±&% Button30±% C AÐ BØ A€  BØ A€&0± &%0± 0±& %  Use Password°° &&&&&&&&%’0±&0±&° &&&0±&%?NSOwner0±&% PreferencesController0±& %  TextField101 NSTextField% ?€ BD B€ A˜  B€ A˜&0± &%01NSTextFieldCell0±& %  MPD Port:0±% A`&&&&&&&&0%’01NSColor0±&%?NSNamedColorSpace0 ±&% System0!±&% textBackgroundColor0"±°° 0#±& %  textColor’0$±&% Box20%1NSBox% A B  C‰ B¢  C‰ B¢&0&± &0'±% @à @à C‚ Bd  C‚ Bd&0(± &°0)1 NSColorWell% CN @ BT Að  BT Að&0*± &%0+±0,±&° &&&&&&&&0-±0.±&%?NSCalibratedWhiteColorSpace ?€’0/±% Bì A B¦ A  B¦ A&00± &%01±02±& %? Display Color03±% A@°2&&&&&&&&0%’04±°05±&% System06±&% textBackgroundColor07±°°508±& %  textColor’09±0:±& %  Misc Settings° &&&&&&&& @  @ %%0;±& %  TextField20<±% B B’ C< A¨  C< A¨&0=± &%0>±0?±&° &&&&&&&&0%’0@±°0A±&% System0B±&% textBackgroundColor0C±°°A0D±& %  textColor’0E±& %  TextField0F±% ?€ B– B„ A˜  B„ A˜&0G± &%0H±0I±& %  MPD Host:°&&&&&&&&0%’0J±°0K±&% System0L±&% textBackgroundColor0M±°°K0N±& %  textColor’0O±& %  TextField30P±% B B< C< A¨  C< A¨&0Q± &%0R±0S±&° &&&&&&&&0%’0T±°0U±&% System0V±&% textBackgroundColor0W±°°U0X±& %  textColor’0Y±& %  TextField40Z±% @@ B‚ A  B‚ A&0[± &%0\±0]±& %  Password:°&&&&&&&&0%’0^±°0_±&% System0`±&% textBackgroundColor0a±°°_0b±& %  textColor’0c±& %  TextField50d1GSControlTemplate1GSClassSwapper0e±&% NSSecureTextField±% B  C< A¨  C< A¨&0f± &%0g1NSSecureTextFieldCell0h±&° &&&&&&&&0%’0i±°. ?€ ?€0j±°0k±&% System0l±& %  textColor’0m±&% GSCustomClassMap0n±&°c°e0o±& %  TextField6°/0p±&% Button0q±% Cd @À B` AÀ  B` AÀ&0r± &%0s± 0t±&% Apply° &&&&&&&&%’0u±&0v±&&&&0w±&% Box0x±% A Bò C‰ Bô  C‰ Bô&0y± &0z±% @à @à C‚ BÄ  C‚ BÄ&0{± &°F°<°°P°°Z°d0|±0}±& %  MPD Settings° &&&&&&&& @  @ %%0~±& %  GormNSPanel01GSWindowTemplate0€±&%?NSPanel1NSPanel1NSWindow%  C“ C}&% CÊ€ DB€0±%  C“ C}  C“ C}&0‚± &°q0ƒ±% C' @À B` AÀ  B` AÀ&0„± &%0…± 0†±&% Revert° &&&&&&&&%’0‡±&0ˆ±&&&&°%°x0‰±°0б&% System0‹±&% windowBackgroundColor0Œ±&% Window0±& %  Preferences° ?€ B F@ F@%0ޱ0±&%?NSApplicationIcon&   D  D€0±& %? ColorWell°)0‘±&% Button1°ƒ0’± &0“1NSNibConnector°~°0”±°;°0•±°O°0–±°p0—±°‘0˜1NSNibOutletConnector°°~0™±&% window0š±°;°O0›±& %  nextKeyView0œ±°0±°$0ž±°0Ÿ±°Y0 ±°c0¡±°w0¢±°O°c0£±& %  nextKeyView0¤±°c°;°£0¥±°°;0¦±&% mpdHost0§±°°O0¨±&% mpdPort0©±°°c0ª±&% password0«±°°0¬±& %  usePassword0­±°°0®±& %  scrollSwitch0¯1NSNibControlConnector°p°0°±&% apply:0±±°‘°0²±&% revert:0³±°°0´±&% usePasswordChanged:0µ±°0¶±°o0·±°°0¸±& %  colorWell0¹1 GSMutableSet1! NSMutableSet1"NSSet&°mpdcon.app-1.1.99/Resources/StatisticsViewer.gorm/0000755000175000017510000000000010404417637021154 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/StatisticsViewer.gorm/CVS/0000755000175000017510000000000010404417637021607 5ustar tarDebian-NMmpdcon.app-1.1.99/Resources/StatisticsViewer.gorm/CVS/Root0000644000175000017510000000004210404417637022451 0ustar tarDebian-NM/Users/mrsanders/Library/CVSRepo/ mpdcon.app-1.1.99/Resources/StatisticsViewer.gorm/CVS/Repository0000644000175000017510000000004710404417637023712 0ustar tarDebian-NMMPDCon/Resources/StatisticsViewer.gorm mpdcon.app-1.1.99/Resources/StatisticsViewer.gorm/CVS/Entries0000644000175000017510000000022210404417637023137 0ustar tarDebian-NM/data.classes/1.1.1.1/Wed Feb 22 22:35:37 2006// /data.info/1.1.1.1/Wed Feb 22 22:35:37 2006// /objects.gorm/1.1.1.1/Wed Feb 22 22:35:37 2006// D mpdcon.app-1.1.99/Resources/StatisticsViewer.gorm/data.classes0000644000175000017510000000065310377163471023453 0ustar tarDebian-NM{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "closeWindow:", "updateStatistics:" ); Super = NSObject; }; StatisticsController = { Actions = ( "closeWindow:", "updateStatistics:" ); Outlets = ( songs, artists, albums, uptime, playtime, dbPlaytime, dbUpdatetime ); Super = NSWindowController; }; }mpdcon.app-1.1.99/Resources/StatisticsViewer.gorm/data.info0000644000175000017510000000027010377163471022744 0ustar tarDebian-NMGNUstep archive00002b5e:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed Streammpdcon.app-1.1.99/Resources/StatisticsViewer.gorm/objects.gorm0000644000175000017510000002151510377163471023502 0ustar tarDebian-NMGNUstep archive00002b5e:0000001f:000000ee:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%NSOwner0±&% StatisticsController0±& %  GormNSPanel01GSWindowTemplate1GSClassSwapper0±&%NSPanel1NSPanel1 NSWindow1 NSResponder%  C« C€&% C` DX01 NSView%  C« C€  C« C€&0 1 NSMutableArray1 NSArray&0 1NSBox% A C9 C € B¸  C € B¸&0 ± &0 ± % @à @à C™€ Bˆ  C™€ Bˆ&0 ± &01 NSTextField1 NSControl% B8 B, A  B, A&0± &%01NSTextFieldCell1 NSActionCell1NSCell0±&% Artists:01NSFont% A`&&&&&&&&0%’01NSColor0±&%NSNamedColorSpace0±&% System0±&% textBackgroundColor0±°°0±& %  textColor’0±% A¸ BH A  BH A&0± &%0±0±&% Albums:°&&&&&&&&0%’0±°0±&% System0±&% textBackgroundColor0 ±°°0!±& %  textColor’0"±%  B0 A  B0 A&0#± &%0$±0%±&% Songs:°&&&&&&&&0%’0&±°0'±&% System0(±&% textBackgroundColor0)±°°'0*±& %  textColor’0+±% BŒ B8 Cg A  Cg A&0,± &%0-±0.±&°&&&&&&&&0%’0/±°00±&% System01±&% textBackgroundColor02±°°003±& %  textColor’04±% BŒ A¸ Cg A  Cg A&05± &%06±07±&°&&&&&&&&0%’08±°09±&% System0:±&% textBackgroundColor0;±°°90<±& %  textColor’0=±% BŒ  Cg A  Cg A&0>± &%0?±0@±&°&&&&&&&&0%’0A±°0B±&% System0C±&% textBackgroundColor0D±°°B0E±& %  textColor’0F±0G±& %  Collection0H±%&&&&&&&& @  @ %%0I±% A BÞ C € BŠ  C € BŠ&0J± &0K± % @à @à C™€ B4  C™€ B4&0L± &0M±% A¸ B< A  B< A&0N± &%0O±0P±&% Uptime:°&&&&&&&&0%’0Q±°0R±&% System0S±&% textBackgroundColor0T±°°R0U±& %  textColor’0V±%  Bd A  Bd A&0W± &%0X±0Y±& %  Playtime:°&&&&&&&&0%’0Z±°0[±&% System0\±&% textBackgroundColor0]±°°[0^±& %  textColor’0_±% BŒ A¸ Ci A  Ci A&0`± &%0a±0b±&°&&&&&&&&0%’0c±°0d±&% System0e±&% textBackgroundColor0f±°°d0g±& %  textColor’0h±% BŒ  Ci A  Ci A&0i± &%0j±0k±&°&&&&&&&&0%’0l±°0m±&% System0n±&% textBackgroundColor0o±°°m0p±& %  textColor’0q±0r±&% Server°H&&&&&&&& @  @ %%0s±% A B C € BŠ  C € BŠ&0t± &0u± % @à @à C™€ B4  C™€ B4&0v± &0w±% A¸ B˜ A  B˜ A&0x± &%0y±0z±& %  Updatetime:°&&&&&&&&0%’0{±°0|±&% System0}±&% textBackgroundColor0~±°°|0±& %  textColor’0€±%  Bd A  Bd A&0± &%0‚±0ƒ±& %  Playtime:°&&&&&&&&0%’0„±°0…±&% System0†±&% textBackgroundColor0‡±°°…0ˆ±& %  textColor’0‰±% B¢ A¸ C_ A  C_ A&0б &%0‹±0Œ±&°&&&&&&&&0%’0±°0ޱ&% System0±&% textBackgroundColor0±°°Ž0‘±& %  textColor’0’±% B¢  C_ A  C_ A&0“± &%0”±0•±&°&&&&&&&&0%’0–±°0—±&% System0˜±&% textBackgroundColor0™±°°—0š±& %  textColor’0›±0œ±&% Database°H&&&&&&&& @  @ %%01NSButton% C‰€ A B` AÀ  B` AÀ&0ž± &%0Ÿ1 NSButtonCell0 ±&% Close°H&&&&&&&&%’0¡±&0¢±&&&&0£±% A A B` AÀ  B` AÀ&0¤± &%0¥±0¦±&% Update°H&&&&&&&&%’0§±&0¨±&&&&0©±°0ª±&% System0«±&% windowBackgroundColor0¬±&% Window0­±&% Server Statistics°­ ?€ B F@ F@%0®1NSImage0¯±&%NSApplicationIcon&   D  D€0°±& %  TextField7°V0±±& %  TextField8°_0²±& %  TextField°0³±& %  TextField9°h0´±&% Button°0µ±& %  TextField10°w0¶±& %  TextField11°€0·±&% GSCustomClassMap0¸±&0¹±& %  TextField12°‰0º±& %  TextField13°’0»±&% Box° 0¼±& %  TextField1°0½±& %  TextField2°"0¾±&% Button1°£0¿±& %  TextField3°+0À±& %  TextField4°40Á±&% Box1°I0±& %  TextField5°=0ñ&% Box2°s0ı& %  TextField6°M0ű &0Æ1NSNibConnector°°0DZ°²0ȱ°¼0ɱ°½0ʱ°¿0˱°À°0̱°Â°0ͱ°Ä0α°°0ϱ°±°0б°³°0ѱ°µ°0Ò±°¶°0Ó±°¹°0Ô±°º°0Õ±°»0Ö±°Á0×±°Ã0ر°´0Ù1NSNibOutletConnector°°0Ú±&% window0Û±°¾0ܱ°°¿0Ý1NSMutableString&% artists0Þ±°°À0ß±&% albums0à±°°Â0á±&% songs0â±°°±0ã±&% uptime0ä±°°³0å±&% playtime0æ±°°¹0ç±& %  dbUpdatetime0è±°°º0é±& %  dbPlaytime0ê1NSNibControlConnector°¾°0ë±&% updateStatistics:0ì±°´°0í±& %  closeWindow:0î1 GSMutableSet1 NSMutableSet1NSSet&°