Fixed an assertion failure in MenuController
authorKent Sutherland <ksuther@ithinksw.com>
Mon, 11 Oct 2004 15:11:11 +0000 (15:11 +0000)
committerKent Sutherland <ksuther@ithinksw.com>
Mon, 11 Oct 2004 15:11:11 +0000 (15:11 +0000)
Added to checks to prevent memory leaks in iTunesRemote

MenuController.m
iTunesRemote.h
iTunesRemote.m

index 4ceb31f..dfa9a03 100755 (executable)
         } else if ([nextObject isEqualToString:@"trackInfo"]) {
             ITDebugLog(@"Check to see if a Track is playing...");
             //Handle playing radio too
-            if (_currentPlaylist) {
+            if (_currentTrack != -1 && _currentPlaylist) {
                 NSString *title = nil;
                 NS_DURING
                     title = [mtr currentSongTitle];
                ITDebugLog(@"Beginning Rebuild of \"EQ Presets\" submenu.");
                _eqMenu = [self eqMenu];
        }
-    
     if (_continue && [menu containsObject:@"artists"]) {
         ITDebugLog(@"Releasing artists menu");
         [_artistsMenu release];
                [playlistsMenu release];
                return nil;
        }
-       
        NS_DURING
     ITDebugLog(@"Building \"Playlists\" menu.");
     {
         ITDebugLog(@"Adding index to the index array.");
         [indices addObject:[curPlaylist objectAtIndex:2]];
     }
+       
     if ([playlists count] > 1) {
         if ([[[playlists objectAtIndex:1] objectAtIndex:1] intValue] == ITMTRemoteRadioSource) {
             [indices addObject:[[playlists objectAtIndex:1] objectAtIndex:2]];
             [playlistsMenu addItem:[NSMenuItem separatorItem]];
         }
     }
-    
+       
     if ([playlists count] > 1) {
         for (i = 1; i < [playlists count]; i++) {
             NSArray *curPlaylist = [playlists objectAtIndex:i];
     }
     ITDebugLog(@"Checking the current source.");
        NS_DURING
-    if ( (source == ITMTRemoteSharedLibrarySource) || (source == ITMTRemoteiPodSource) || (source == ITMTRemoteGenericDeviceSource) || (source == ITMTRemoteCDSource) ) {
-        tempItem = [playlistsMenu itemAtIndex:[playlistsMenu numberOfItems] + [indices indexOfObject:[NSNumber numberWithInt:[[[MainController sharedController] currentRemote] currentSourceIndex]]] - [indices count]];
-        [tempItem setState:NSOnState];
-        [[[tempItem submenu] itemAtIndex:_currentPlaylist - 1] setState:NSOnState];
-    } else if (source == ITMTRemoteLibrarySource && _currentPlaylist) {
-        [[playlistsMenu itemAtIndex:_currentPlaylist - 1] setState:NSOnState];
-    }
+       if (_currentPlaylist != -1) {
+               if ( (source == ITMTRemoteSharedLibrarySource) || (source == ITMTRemoteiPodSource) || (source == ITMTRemoteGenericDeviceSource) || (source == ITMTRemoteCDSource) ) {
+                       tempItem = [playlistsMenu itemAtIndex:[playlistsMenu numberOfItems] + [indices indexOfObject:[NSNumber numberWithInt:[[[MainController sharedController] currentRemote] currentSourceIndex]]] - [indices count]];
+                       [tempItem setState:NSOnState];
+                       [[[tempItem submenu] itemAtIndex:_currentPlaylist - 1] setState:NSOnState];
+               } else if (source == ITMTRemoteLibrarySource && _currentPlaylist) {
+                       [[playlistsMenu itemAtIndex:_currentPlaylist - 1] setState:NSOnState];
+               }
+       }
        NS_HANDLER
        NS_ENDHANDLER
     [indices release];
index fc1e3a0..ca615b1 100755 (executable)
@@ -16,6 +16,7 @@
 {
     ProcessSerialNumber savedPSN;
 }
+- (BOOL)isPlaying;
 - (ProcessSerialNumber)iTunesPSN;
 - (NSString*)formatTimeInSeconds:(long)seconds;
 - (NSString*)zeroSixty:(int)seconds;
index 0689704..971e99b 100755 (executable)
                         ([ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pvis'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }", 'core', 'getd', &savedPSN) booleanValue] != 0) &&
              [[[[NSWorkspace sharedWorkspace] activeApplication] objectForKey:@"NSApplicationName"] isEqualToString:@"iTunes"] ) {
             //set minimized of browser window 1 to true
-                       ITSendAEWithString(@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }", 'core', 'setd', &savedPSN);
+                       ITSendAEWithString(@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:long(1), from:'null'() } }", 'core', 'setd', &savedPSN);
         } else {
             //set minimized of browser window 1 to false
-                       ITSendAEWithString(@"data:long(0), '----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }", 'core', 'setd', &savedPSN);
+                       ITSendAEWithString(@"data:long(0), '----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:long(1), from:'null'() } }", 'core', 'setd', &savedPSN);
         }
         //set visible of browser window 1 to true
-               ITSendAEWithString(@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pvis'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }", 'core', 'setd', &savedPSN);
+               ITSendAEWithString(@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pvis'), from:obj { form:'indx', want:type('cBrW'), seld:long(1), from:'null'() } }", 'core', 'setd', &savedPSN);
         //active iTunes
                ITSendAEWithString(@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pisf'), from:'null'() }", 'core', 'setd', &savedPSN);
         ITDebugLog(@"Done showing player primary interface.");
 
     ITDebugLog(@"Getting current source.");   
     
-    fourcc = [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pKnd'), from:obj { form:'prop', want:type('prop'), seld:type('ctnr'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } } }", 'core', 'getd', &savedPSN) int32Value];
+    fourcc = ([self isPlaying]) ? [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pKnd'), from:obj { form:'prop', want:type('prop'), seld:type('ctnr'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } } }", 'core', 'getd', &savedPSN) int32Value] : 'kLib';
     
     switch (fourcc) {
         case 'kTun':
 {  
     int temp1;
     ITDebugLog(@"Getting current playlist index.");
-    temp1 = [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pidx'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value];
+    temp1 = ([self isPlaying] ? [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pidx'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value] : -1);
     ITDebugLog(@"Getting current playlist index done.");
     return temp1;
 }
 {
     int temp1;
     ITDebugLog(@"Getting current song index.");
-       temp1 = (([ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pcls'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value] != 'prop') ? [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pidx'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value] : -1);
+       temp1 = ([self isPlaying] ? [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pidx'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value] : -1);
     ITDebugLog(@"Getting current song index done.");
     return temp1;
 }
 {
     NSString *temp1;
     ITDebugLog(@"Getting current song title.");
-    
+    SInt32 result = [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pcls'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value];
+       
     //If we're listening to the radio.
-    if ([ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pcls'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value] == 'cURT') {
+    if (result == 'cURT') {
         NSString *bad = [NSString stringWithUTF8String:"浳湧"];
         temp1 = [ITSendAEWithKey('pStT', 'core', 'getd', &savedPSN) stringValue];
         if ([temp1 isEqualToString:bad]) {
             temp1 = [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) stringValue];
         }
         temp1 = [temp1 stringByAppendingString:@" (Stream)"];
-    } else {
+    } else if (result == 'prop') {
+               temp1 = nil;
+       } else {
         temp1 = [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) stringValue];
     }
     ITDebugLog(@"Getting current song title done.");
 - (NSImage *)currentSongAlbumArt
 {
     ITDebugLog(@"Getting current song album art.");
-    NSData *data = [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pPCT'), from:obj { form:'indx', want:type('cArt'), seld:long(1), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } } }", 'core', 'getd', &savedPSN) data];
+    NSData *data = ([self isPlaying]) ? [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pPCT'), from:obj { form:'indx', want:type('cArt'), seld:long(1), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } } }", 'core', 'getd', &savedPSN) data] : nil;
     ITDebugLog(@"Getting current song album art done.");    
     if (data) {
         return [[[NSImage alloc] initWithData:data] autorelease];
 {
     float temp1;
     ITDebugLog(@"Getting current song rating.");
-    temp1 = ((float)[ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pRte'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value] / 100.0);
-    if ( [self currentPlaylistClass] == ITMTRemotePlayerRadioPlaylist ) { temp1 = -1.0; }
+    temp1 = (![self isPlaying] || ([self currentPlaylistClass] == ITMTRemotePlayerRadioPlaylist)) ? -1.0 : ((float)[ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pRte'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value] / 100.0);
     ITDebugLog(@"Getting current song rating done.");
     return temp1;
 }
     return YES;
 }
 
+- (BOOL)isPlaying
+{
+       return ([ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pcls'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } }", 'core', 'getd', &savedPSN) int32Value] != 'prop');
+}
+
 - (ProcessSerialNumber)iTunesPSN
 {
     /*NSArray *apps = [[NSWorkspace sharedWorkspace] launchedApplications];