#include "stdafx.h"
#include "objects.h"
#include "maindoc.h"
#include "resource.h"
#include "grpcrtit.h"
#include "delgrpit.h"



/***********************************************************
  Function:    
  Arguments:   
  Return:      
  Purpose:     
  Author(s):   
  Revision:    
  Date:        
***********************************************************/
COleDsPrintQueue::COleDsPrintQueue( )
{
   
}


/***********************************************************
  Function:    
  Arguments:   
  Return:      
  Purpose:     
  Author(s):   
  Revision:    
  Date:        
***********************************************************/
COleDsPrintQueue::COleDsPrintQueue( IUnknown *pIUnk): COleDsObject( pIUnk )
{
   m_bHasChildren = TRUE;
}


/***********************************************************
  Function:    
  Arguments:   
  Return:      
  Purpose:     
  Author(s):   
  Revision:    
  Date:        
***********************************************************/
COleDsPrintQueue::~COleDsPrintQueue( )
{

}


/***********************************************************
  Function:    
  Arguments:   
  Return:      
  Purpose:     
  Author(s):   
  Revision:    
  Date:        
***********************************************************/
DWORD    COleDsPrintQueue::GetChildren( DWORD*     pTokens, 
                                        DWORD      dwMaxChildren,
                                        CDialog*   pQueryStatus,
                                        BOOL*      pFilters, 
                                        DWORD      dwFilters )
{
   HRESULT                       hResult;
   IADsPrintQueue*             pIOleDsPrintQueue = NULL;
   IADsCollection*             pIJobs            = NULL;
   IADsPrintQueueOperations*   pIPQueueOper      = NULL;

   
   if( m_strOleDsPath[ 4 ] == _T(':') )
   {
      // the wort way to find if this is "LDAP:"
      // SWilson (NT) needs this 
      return 0L;
   }

   
   if( NULL == m_pIUnk )
   {
      ASSERT( FALSE );
      return 0L;
   }

   COleDsObject::GetChildren( pTokens, dwMaxChildren, pQueryStatus, 
                              pFilters, dwFilters );

   hResult  = m_pIUnk->QueryInterface( IID_IADsPrintQueue, 
                                       (void**) &pIOleDsPrintQueue );
   if( FAILED( hResult ) )
   {
      TRACE( _T("ERROR: QueryInterface for IID_IADsPrintQueue failed\n") );
   }
   else
   {
      hResult  = m_pIUnk->QueryInterface( IID_IADsPrintQueueOperations, 
                                       (void**) &pIPQueueOper );
      
      if( FAILED( hResult ) )
      {
         TRACE( _T("ERROR: QueryInterface for IID_IADsPrintQueueOperations failed\n") );
      }
      else
      {
         hResult  = pIPQueueOper->PrintJobs( &pIJobs );

         if( NULL != pIJobs )
         {
            COleDsObject::GetChildren( pIJobs );
            pIJobs->Release( );
         }
         pIPQueueOper->Release( );
      }
      pIOleDsPrintQueue->Release( );
   }

   return m_dwCount;
}
  

/***********************************************************
  Function:    
  Arguments:   
  Return:      
  Purpose:     
  Author(s):   
  Revision:    
  Date:        
***********************************************************/
HRESULT  COleDsPrintQueue::DeleteItem  ( COleDsObject* pObject )
{
   DWORD                         dwType;
   HRESULT                       hResult;
   CString                       strQualifiedName;
   CString                       strItemType;
   CString                       strDeleteName;
   CDeleteGroupItem              aDeleteItem;
   IADsCollection*             pIColl      = NULL;
   IADsPrintQueue*             pIPQueue    = NULL;
   BOOL                          bSuccess = FALSE;

   
   hResult  = m_pIUnk->QueryInterface( IID_IADsPrintQueue, (void**)&pIPQueue );
   ASSERT( SUCCEEDED( hResult ) );
   if( FAILED( hResult ) )
   {
      return E_FAIL;
   }

   dwType   = pObject->GetType( );

   switch( dwType )
   {
      case  PRINTJOB:
      {
         IADsPrintQueueOperations*  pIOper   = NULL;

         hResult  = pIPQueue->QueryInterface( IID_IADsPrintQueueOperations, (void**)&pIOper );
         ASSERT( SUCCEEDED( hResult ) );
         if( FAILED( hResult ) )
         {
            break;
         }
         hResult  = pIOper->PrintJobs( &pIColl );
         pIOper->Release( );
         bSuccess = TRUE;
         break;
      }


      default:
         ASSERT( FALSE );
         return E_FAIL;
   }
   
   if( bSuccess )
   {
      strDeleteName  = pObject->GetDeleteName( );   
      MakeQualifiedName( strQualifiedName, m_strOleDsPath, m_dwType );

      strItemType = pObject->GetClass( ); 

      aDeleteItem.m_strItemName  = strDeleteName;
      aDeleteItem.m_strParent    = strQualifiedName;
      aDeleteItem.m_strItemType  = strItemType;
      if( aDeleteItem.DoModal( ) == IDOK )
      {
         VARIANT  var;

         VariantInit( &var );
         V_VT( &var )   = VT_BSTR;
         V_BSTR( &var ) = AllocBSTR( aDeleteItem.m_strItemName.GetBuffer( 128 ) );
         if( NULL != pIColl )
         {
            hResult  = pIColl->Remove( V_BSTR(&var) );
         }
         VariantClear( &var );
      }

      if( NULL != pIColl )
      {
         ULONG ulRef;

         ulRef = pIColl->Release( );
         if( ulRef )
         {
            TRACE( _T("ERROR: Release on PrintJob collection did not returned 0\n") );
         }
      }
   }

   pIPQueue->Release( );

   return hResult;   
}