private void Service_Copy_And_Hash()
        {
            switch ( m_BackgroundTask.Get_Completion_Status() )
            {
                case EWorkStatus.CompletionFailure:
                case EWorkStatus.Invalid:
                    throw new Exception( "Attempt to copy and hash package failed" );

                case EWorkStatus.CompletionSuccess:
                    Console.WriteLine( "Successfully built output: " + Config.Tag );
                    Update_Output_Hashes( ( m_BackgroundTask as CCopyAndHashWorker ).CumulativeHash );

                    State = EOutputPackageState.Finished;
                    m_BackgroundTask = null;
                    break;
            }
        }
 // Private interface
 private void Service_Waiting_On_Input()
 {
     CPackageInputState input = CPackageManager.Get_Package_Input( InputID );
     if ( input.State == EInputPackageState.Finished )
     {
         State = EOutputPackageState.CopyAndHash;
         m_BackgroundTask = new CCopyAndHashWorker( CPackageManager.UnpackDirectory + @"/" + Config.Source, Config.Destination );
         m_BackgroundTask.RunWorkerAsync();
         Console.WriteLine( "Building output: " + Config.Tag );
     }
 }
 public static uint Get_Output_Packages_In_State_Count( EOutputPackageState state )
 {
     return (uint) m_PackageOutputs.Values.Where( n => n.State == state ).Count();
 }