<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -33,7 +33,7 @@ const int kCallSignStringLength = 10;
 
 @interface HDHomeRunTunerChannelScanThread : NSObject
 
-+ (void) performScan:(HDHomeRunTuner*)aTuner;
++ (void) performScan:(NSManagedObjectID*)aTunerObjectID;
 
 @end;
 
@@ -125,7 +125,7 @@ const int kCallSignStringLength = 10;
 - (void) scanActionReportingProgressTo:(id)progressDisplay
 {
   mCurrentProgressDisplay = progressDisplay;
-    [NSThread detachNewThreadSelector:@selector(performScan:) toTarget:[HDHomeRunTunerChannelScanThread class] withObject:self];
+    [NSThread detachNewThreadSelector:@selector(performScan:) toTarget:[HDHomeRunTunerChannelScanThread class] withObject:[self objectID]];
 }
 
 - (void) startStreaming
@@ -574,13 +574,19 @@ static int cmd_scan_callback(va_list ap, const char *type, const char *str)
         return [theTuner scanCallBackForType:[NSString stringWithCString:type] andData:[NSString stringWithCString:str] withMOC:theMOC];
 }
 
-// Typically called from a seperate thread to carry out the scanning
+// Typically called from a seperate thread to carry out the scanning - the caller must make sure that the instance is
+// in a valid MOC for this thread.
 - (void) performScan
 {
   int scanResult = 0;
-  NSPersistentStoreCoordinator *psc = [[NSApp delegate] persistentStoreCoordinator];
-  NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init];
-  [managedObjectContext setPersistentStoreCoordinator: psc];
+
+  // Delete the old channel station map
+  [[self managedObjectContext] deleteObject:self.lineup.channelStationMap];
+
+  // Create a new empty channel station map
+  HDHomeRunChannelStationMap *anHDHomeRunChannelStationMap = [NSEntityDescription insertNewObjectForEntityForName:@&quot;HDHomeRunChannelStationMap&quot; inManagedObjectContext:[self managedObjectContext]];
+  [anHDHomeRunChannelStationMap setLineup:self.lineup];
+  [anHDHomeRunChannelStationMap setLastUpdateDate:[NSDate date]];
 
   mCurrentActivityToken = 0;
   if (mCurrentProgressDisplay)
@@ -600,7 +606,7 @@ static int cmd_scan_callback(va_list ap, const char *type, const char *str)
       {
         NSLog(@&quot;HDHomeRunTuner - scanAction for %@&quot;, [self longName]);
 
-        scanResult = channelscan_execute_all(mHDHomeRunDevice, channelMap, cmd_scan_callback, self, managedObjectContext);
+        scanResult = channelscan_execute_all(mHDHomeRunDevice, channelMap, cmd_scan_callback, self, [self managedObjectContext]);
       }
     }
     @catch (NSException *anException)
@@ -615,7 +621,7 @@ static int cmd_scan_callback(va_list ap, const char *type, const char *str)
   if (mCurrentHDHomeRunChannel &amp;&amp; [[mCurrentHDHomeRunChannel stations] count] == 0)
   {
     // Destroy the current and channel and make sure it's not in the database
-    [managedObjectContext deleteObject:mCurrentHDHomeRunChannel];
+    [[self managedObjectContext] deleteObject:mCurrentHDHomeRunChannel];
   }
   
   mCurrentHDHomeRunChannel = nil;
@@ -625,14 +631,17 @@ static int cmd_scan_callback(va_list ap, const char *type, const char *str)
     // when we save, we want to update the same object in the UI's MOC. 
     // So listen for the did save notification from the retrieval/parsing thread MOC
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(threadContextDidSave:) 
-        name:NSManagedObjectContextDidSaveNotification object:managedObjectContext];
+        name:NSManagedObjectContextDidSaveNotification object:[self managedObjectContext]];
     
     NSError *error = nil;
-    if (![managedObjectContext save:&amp;error])
+
+    // This save should overwrite whats in the store
+    [[self managedObjectContext] setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
+    if (![[self managedObjectContext] save:&amp;error])
     {
       NSLog(@&quot;Channel scan - save returned an error %@&quot;, error);
     }
-    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:managedObjectContext];
+    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:[self managedObjectContext]];
   }
   NSLog(@&quot;HDHomeRunTuner - performScan complete - sending notification&quot;);
   [[NSDistributedNotificationCenter defaultCenter] postNotificationName:RSChannelScanCompleteNotification object:RSBackgroundApplication userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:scanResult], @&quot;scanResult&quot;, nil] deliverImmediately:NO];
@@ -689,9 +698,13 @@ static int cmd_scan_callback(va_list ap, const char *type, const char *str)
 
 @implementation HDHomeRunTunerChannelScanThread
 
-+ (void) performScan:(HDHomeRunTuner*)aTuner
++ (void) performScan:(NSManagedObjectID*)aTunerObjectID
 {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+  NSPersistentStoreCoordinator *psc = [[NSApp delegate] persistentStoreCoordinator];
+  NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init];
+  [managedObjectContext setPersistentStoreCoordinator: psc];
+  HDHomeRunTuner *aTuner = (HDHomeRunTuner *) [managedObjectContext objectWithID:aTunerObjectID];
   
   [aTuner performScan];
   </diff>
      <filename>recsched/common/HDHomeRunTuner.m</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>6a7e3ae7e5a5bf20b1ee41bd60f203fe10d9b46b</id>
    </parent>
  </parents>
  <author>
    <name>Andrew Kimpton</name>
    <email>awk@awkward.org</email>
  </author>
  <url>http://github.com/awk/iontv/commit/42c274f6c387685ef5e4b601a2d8a0101433f1e5</url>
  <id>42c274f6c387685ef5e4b601a2d8a0101433f1e5</id>
  <committed-date>2008-06-30T04:15:08-07:00</committed-date>
  <authored-date>2008-06-30T04:15:08-07:00</authored-date>
  <message>Improve channel scanning - reset the channel/station map when the scan starts.</message>
  <tree>cbd920ff251cf94dd948667f136597e6330342eb</tree>
  <committer>
    <name>Andrew Kimpton</name>
    <email>awk@awkward.org</email>
  </committer>
</commit>
