コード例 #1
0
ファイル: SecondPage.cpp プロジェクト: HQarroum/android-mdns
void
CSecondPage::InitBrowseList()
{
	CPrinterSetupWizardSheet	*	psheet;
	CString							text;

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_quiet( psheet, exit );

	//
	// load the no rendezvous printers message until something shows up in the browse list
	//
	text.LoadString(IDS_NO_RENDEZVOUS_PRINTERS);

	LoadTextAndDisableWindow( text );

	//
	// disable the next button until there's a printer to select
	//
	psheet->SetWizardButtons(PSWIZB_BACK);

	//
	// disable the printer information box
	//
	SetPrinterInformationState( FALSE );

exit:

	return;
}
コード例 #2
0
// Printer::EventHandler implementation
OSStatus
CSecondPage::OnAddPrinter(
					Printer	*	printer,
					bool		moreComing )
{
	CPrinterSetupWizardSheet	*	psheet;
	Printer						*	selectedPrinter;
	OSStatus						err = kNoErr;

	check( IsWindow( m_hWnd ) );

	m_browseList.SetRedraw(FALSE);

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_quiet( psheet, exit );
	
	selectedPrinter = psheet->GetSelectedPrinter();

	printer->item = m_browseList.InsertItem(printer->displayName);

	m_browseList.SetItemData( printer->item, (DWORD_PTR) printer );

	m_browseList.SortChildren(TVI_ROOT);

	//
	// if the searching item is still in the list
	// get rid of it
	//
	// note that order is important here.  Insert the printer
	// item before removing the placeholder so we always have
	// an item in the list to avoid experiencing the bug
	// in Microsoft's implementation of CTreeCtrl
	//
	if (m_emptyListItem != NULL)
	{
		m_browseList.DeleteItem(m_emptyListItem);
		m_emptyListItem = NULL;
		m_browseList.EnableWindow(TRUE);
	}

	if ( !selectedPrinter )
	{
		psheet->SetSelectedPrinter( printer );
		m_browseList.SelectItem( printer->item );
		::SetFocus( m_browseList );
	}

exit:

	if (!moreComing)
	{
		m_browseList.SetRedraw(TRUE);
		m_browseList.Invalidate();
	}

	return err;
}
コード例 #3
0
ファイル: SecondPage.cpp プロジェクト: HQarroum/android-mdns
BOOL
CSecondPage::OnSetActive()
{
	CPrinterSetupWizardSheet	*	psheet;
	Printer						*	printer;
	OSStatus						err = kNoErr;

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_action( psheet, exit, err = kUnknownErr );

	if ( ( printer = psheet->GetSelectedPrinter() ) != NULL )
	{
		psheet->SetSelectedPrinter( NULL );
		delete printer;
	}

	//
	// initialize the browse list...this will remove everything currently
	// in it, and add the no rendezvous printers item
	//
	InitBrowseList();

	//
	// start browing
	//
	err = StartBrowse();
	require_noerr( err, exit );

exit:

	if ( err != kNoErr )
	{
		if ( err == kDNSServiceErr_Firewall )
		{
			CString text, caption;

			text.LoadString( IDS_FIREWALL );
			caption.LoadString( IDS_FIREWALL_CAPTION );

			MessageBox(text, caption, MB_OK|MB_ICONEXCLAMATION);
		}
		else
		{
			CPrinterSetupWizardSheet::WizardException exc;
			
			exc.text.LoadString( IDS_NO_MDNSRESPONDER_SERVICE_TEXT );
			exc.caption.LoadString( IDS_ERROR_CAPTION );
			
			throw(exc);
		}
	}

	return CPropertyPage::OnSetActive();
}
コード例 #4
0
BOOL
CThirdPage::OnKillActive()
{
    CPrinterSetupWizardSheet * psheet;

    psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
    require_quiet( psheet, exit );

    psheet->SetLastPage(this);

exit:

    return CPropertyPage::OnKillActive();
}
コード例 #5
0
BOOL
CSecondPage::OnSetActive()
{
	CPrinterSetupWizardSheet	*	psheet;
	Printer						*	printer;
	Printers::iterator				it;
	OSStatus						err = kNoErr;
	BOOL							b;

	b = CPropertyPage::OnSetActive();

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_action( psheet, exit, err = kUnknownErr );

	// Stash the selected printer if any

	printer = psheet->GetSelectedPrinter();

	// initialize the browse list...this will remove everything currently
	// in it, and add the no printers item

	InitBrowseList();

	// Populate the list with any printers that we currently know about

	for ( it = psheet->m_printers.begin(); it != psheet->m_printers.end(); it++ )
	{
		OnAddPrinter( *it, false );
	}

	if ( ( !printer && ( psheet->m_printers.size() > 0 ) ) || ( printer != psheet->GetSelectedPrinter() ) )
	{
		if ( !printer )
		{
			printer = psheet->m_printers.front();
		}

		psheet->SetSelectedPrinter( printer );
	}
	
	if ( printer )
	{
		m_browseList.SelectItem( printer->item );
		::SetFocus( m_browseList );
	}

exit:

	return b;
}
コード例 #6
0
ファイル: SecondPage.cpp プロジェクト: HQarroum/android-mdns
OSStatus
CSecondPage::StartResolve( Service * service )
{
	CPrinterSetupWizardSheet	*	psheet;
	OSStatus						err = kNoErr;

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_quiet( psheet, exit );

	check( service->serviceRef == NULL );

	//
	// clean out any queues that were collected during a previous
	// resolve
	//

	service->EmptyQueues();

	//
	// now start the new resolve
	//

	err = DNSServiceResolve( &service->serviceRef, 0, 0, service->printer->name.c_str(), service->type.c_str(), service->domain.c_str(), (DNSServiceResolveReply) OnResolve, service );
	require_noerr( err, exit );

	err = StartOperation( service->serviceRef );
	require_noerr( err, exit );

	//
	// If we're not currently resolving, then disable the next button
	// and set the cursor to hourglass
	//

	if ( !service->printer->resolving )
	{
		psheet->SetWizardButtons( PSWIZB_BACK );

		psheet->m_active = psheet->m_wait;
		SetCursor(psheet->m_active);
	}

	service->printer->resolving++;

exit:

	return err;
}
コード例 #7
0
ファイル: SecondPage.cpp プロジェクト: HQarroum/android-mdns
void
CSecondPage::OnResolveService( Service * service )
{
	CPrinterSetupWizardSheet * psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_quiet( psheet, exit );
	
	check( service );

	if ( !--service->printer->resolving )
	{
		//
		// sort the services now.  we want the service that
		// has the highest priority queue to be first in
		// the list.
		//

		service->printer->services.sort( OrderServiceFunc );

		//
		// and set it to selected
		//

		m_selected		= service->printer;
		m_selectedName	= service->printer->name;

		//
		// and update the printer information box
		//
		SetPrinterInformationState( TRUE );

		m_descriptionField.SetWindowText( service->description );
		m_locationField.SetWindowText( service->location );

		psheet->SetWizardButtons( PSWIZB_BACK|PSWIZB_NEXT );

		//
		// reset the cursor
		//

		psheet->m_active = psheet->m_arrow;
		SetCursor(psheet->m_active);
	}

exit:

	return;
}
コード例 #8
0
void CThirdPage::OnBnClickedDefaultPrinter()
{
    CPrinterSetupWizardSheet	*	psheet;
    Printer						*	printer;

    psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
    require_quiet( psheet, exit );

    printer = psheet->GetSelectedPrinter();
    require_quiet( printer, exit );

    printer->deflt = ( m_defaultPrinterCtrl.GetCheck() == BST_CHECKED ) ? true : false;

exit:

    return;
}
コード例 #9
0
ファイル: SecondPage.cpp プロジェクト: HQarroum/android-mdns
afx_msg BOOL
CSecondPage::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message)
{
	DEBUG_UNUSED(pWnd);
	DEBUG_UNUSED(nHitTest);
	DEBUG_UNUSED(message);

	CPrinterSetupWizardSheet * psheet;

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_quiet( psheet, exit );

	SetCursor(psheet->GetCursor());

exit:

	return TRUE;
}
コード例 #10
0
ファイル: SecondPage.cpp プロジェクト: withwave/RT5350
BOOL
CSecondPage::OnSetActive()
{
	CPrinterSetupWizardSheet	*	psheet;
	Printer						*	printer;
	Printers::iterator				it;
	OSStatus						err = kNoErr;
	BOOL							b;

	b = CPropertyPage::OnSetActive();

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_action( psheet, exit, err = kUnknownErr );

	// Stash the selected printer if any

	printer = psheet->GetSelectedPrinter();

	// initialize the browse list...this will remove everything currently
	// in it, and add the no printers item

	InitBrowseList();

	// Populate the list with any printers that we currently know about

	for ( it = psheet->m_printers.begin(); it != psheet->m_printers.end(); it++ )
	{
		OnAddPrinter( *it, false );
	}

	// And if we hit 'Back' from page 3, then re-select printer

	if ( ( psheet->GetLastPage() == psheet->GetPage( 2 ) ) && printer )
	{
		psheet->SetSelectedPrinter( printer );
		m_browseList.Select( printer->item, TVGN_FIRSTVISIBLE );
	}

exit:

	return b;
}
コード例 #11
0
BOOL
CFirstPage::OnSetActive()
{
	CPrinterSetupWizardSheet * psheet;
	CString greetingText;

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_quiet( psheet, exit );   
   
	psheet->SetWizardButtons(PSWIZB_NEXT);

	m_greeting.SetFont(&m_largeFont);

	greetingText.LoadString(IDS_GREETING);
	m_greeting.SetWindowText(greetingText);

exit:

	return CPropertyPage::OnSetActive();
}
コード例 #12
0
void CThirdPage::OnLvnItemchangedPrinterModel(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLISTVIEW					pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

    CPrinterSetupWizardSheet	*	psheet;
    Printer						*	printer;
    Service						*	service;

    psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
    require_quiet( psheet, exit );

    printer = psheet->GetSelectedPrinter();
    require_quiet( printer, exit );

    service = printer->services.front();
    require_quiet( service, exit );

    check ( m_manufacturerSelected );

    POSITION p = m_modelListCtrl.GetFirstSelectedItemPosition();
    int nSelected = m_modelListCtrl.GetNextSelectedItem(p);

    if (nSelected != -1)
    {
        m_modelSelected = (Model*) m_modelListCtrl.GetItemData(nSelected);

        CopyPrinterSettings( printer, service, m_manufacturerSelected, m_modelSelected );

        psheet->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT);
    }
    else
    {
        psheet->SetWizardButtons(PSWIZB_BACK);
    }

exit:

    *pResult = 0;
}
コード例 #13
0
void
CSecondPage::InitBrowseList()
{
	CPrinterSetupWizardSheet	*	psheet;
	CString							text;

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_quiet( psheet, exit );

	// Initialize so that nothing is selected when we add to the list

	psheet->SetSelectedPrinter( NULL );
	m_gotChoice = false;
	m_browseList.Select( NULL, TVGN_FIRSTVISIBLE );

	//
	// load the no printers message until something shows up in the browse list
	//
	text.LoadString(IDS_NO_PRINTERS);

	LoadTextAndDisableWindow( text );

	//
	// disable the next button until there's a printer to select
	//
	psheet->SetWizardButtons(PSWIZB_BACK);

	//
	// disable the printer information box
	//
	SetPrinterInformationState( FALSE );
	m_descriptionField.SetWindowText( L"" );
	m_locationField.SetWindowText( L"" );

exit:

	return;
}
コード例 #14
0
ファイル: SecondPage.cpp プロジェクト: HQarroum/android-mdns
BOOL
CSecondPage::OnKillActive()
{
	OSStatus err = kNoErr;

	if ( m_selected )
	{
		CPrinterSetupWizardSheet * psheet;

		psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
		require_quiet( psheet, exit );

		psheet->SetSelectedPrinter( m_selected );
		m_printers.remove( m_selected );
		m_selected = NULL;
	}

	err = StopBrowse();
	require_noerr( err, exit );

exit:

	return CPropertyPage::OnKillActive();
}
コード例 #15
0
void CThirdPage::OnBnClickedHaveDisk()
{
    CPrinterSetupWizardSheet	*	psheet;
    Printer						*	printer;
    Service						*	service;
    Manufacturers					manufacturers;

    CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_FILEMUSTEXIST, L"Setup Information (*.inf)|*.inf||", this);

    psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
    require_quiet( psheet, exit );

    printer = psheet->GetSelectedPrinter();
    require_quiet( printer, exit );

    service = printer->services.front();
    require_quiet( service, exit );

    for ( ;; )
    {
        if ( dlg.DoModal() == IDOK )
        {
            CString filename = dlg.GetPathName();

            LoadPrintDriverDefsFromFile( manufacturers, filename, true );

            // Sanity check

            if ( manufacturers.size() > 0 )
            {
                PopulateUI( manufacturers );

                if ( MatchPrinter( manufacturers, printer, service, false ) != kNoErr )
                {
                    CString errorMessage;
                    CString errorCaption;

                    errorMessage.LoadString( IDS_NO_MATCH_INF_FILE );
                    errorCaption.LoadString( IDS_NO_MATCH_INF_FILE_CAPTION );

                    MessageBox( errorMessage, errorCaption, MB_OK );
                }

                break;
            }
            else
            {
                CString errorMessage;
                CString errorCaption;

                errorMessage.LoadString( IDS_BAD_INF_FILE );
                errorCaption.LoadString( IDS_BAD_INF_FILE_CAPTION );

                MessageBox( errorMessage, errorCaption, MB_OK );
            }
        }
        else
        {
            break;
        }
    }

exit:

    FreeManufacturers( manufacturers );
    return;
}
コード例 #16
0
void CSecondPage::OnTvnSelchangedBrowseList(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW					pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
	CPrinterSetupWizardSheet	*	psheet;
	Printer						*	printer;
	int								err = 0;

	psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
	require_action( psheet, exit, err = kUnknownErr );

	// The strange code here is to workaround a bug in the CTreeCtrl, whereupon the item
	// we selected isn't passed through correctly to this callback routine.

	if ( !m_gotChoice )
	{
		printer = psheet->GetSelectedPrinter();

		// If we really haven't selected a printer, then re-select NULL and exit

		if ( !printer )
		{
			m_browseList.SelectItem( NULL );

			goto exit;
		}

		// If we already have selected a printer, fake like we've clicked on it, but only
		// if the CTreeCtrl hasn't already selected it
		
		else if ( printer->item != m_browseList.GetSelectedItem() )
		{
			m_gotChoice = true;

			m_browseList.SelectItem( printer->item );

			goto exit;
		}
	}

	HTREEITEM item = m_browseList.GetSelectedItem();
	require_quiet( item, exit );

	printer = reinterpret_cast<Printer*>(m_browseList.GetItemData( item ) );
	require_quiet( printer, exit );

	//
	// this call will trigger a resolve.  When the resolve is complete,
	// our OnResolve will be called.
	//
	err = psheet->StartResolve( printer );
	require_noerr( err, exit );

	//
	// And clear out the printer information box
	//
	SetPrinterInformationState( FALSE );
	m_descriptionField.SetWindowText(L"");
	m_locationField.SetWindowText(L"");

exit:

	if (err != 0)
	{
		CString text;
		CString caption;

		text.LoadString(IDS_ERROR_SELECTING_PRINTER_TEXT);
		caption.LoadString(IDS_ERROR_SELECTING_PRINTER_CAPTION);

		MessageBox(text, caption, MB_OK|MB_ICONEXCLAMATION);
	}

	*pResult = 0;
}
コード例 #17
0
BOOL
CThirdPage::OnSetActive()
{
    CPrinterSetupWizardSheet	*	psheet;
    Printer						*	printer;
    Service						*	service;

    psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
    require_quiet( psheet, exit );

    psheet->SetWizardButtons( PSWIZB_BACK );

    printer = psheet->GetSelectedPrinter();
    require_quiet( printer, exit );

    service = printer->services.front();
    require_quiet( service, exit );

    //
    // call OnInitPage once
    //
    if (!m_initialized)
    {
        OnInitPage();
        m_initialized = true;
    }

    //
    // <rdar://problem/4580061> mDNS: Printers added using Bonjour should be set as the default printer.
    //
    if ( DefaultPrinterExists() )
    {
        m_defaultPrinterCtrl.SetCheck( BST_UNCHECKED );
        printer->deflt = false;
    }
    else
    {
        m_defaultPrinterCtrl.SetCheck( BST_CHECKED );
        printer->deflt = true;
    }

    //
    // update the UI with the printer name
    //
    m_printerName.SetWindowText(printer->displayName);

    //
    // populate the list controls with the manufacturers and models
    // from ntprint.inf
    //
    PopulateUI( m_manufacturers );

    //
    // and try and match the printer
    //

    if ( psheet->GetLastPage() == psheet->GetPage(0) )
    {
        MatchPrinter( m_manufacturers, printer, service, true );

        if ( ( m_manufacturerSelected != NULL ) && ( m_modelSelected != NULL  ) )
        {
            GetParent()->PostMessage(PSM_SETCURSEL, 2 );
        }
    }
    else
    {
        SelectMatch(printer, service, m_manufacturerSelected, m_modelSelected);
    }

exit:

    return CPropertyPage::OnSetActive();
}
コード例 #18
0
void DNSSD_API
CPrinterSetupWizardSheet::OnBrowse(
							DNSServiceRef 			inRef,
							DNSServiceFlags 		inFlags,
							uint32_t 				inInterfaceIndex,
							DNSServiceErrorType 	inErrorCode,
							const char *			inName,	
							const char *			inType,	
							const char *			inDomain,	
							void *					inContext )
{
	DEBUG_UNUSED(inRef);

	CPrinterSetupWizardSheet	*	self;
	bool							moreComing = (bool) (inFlags & kDNSServiceFlagsMoreComing);
	CPropertyPage				*	active;
	Printer						*	printer = NULL;
	Service						*	service = NULL;
	OSStatus						err = kNoErr;

	require_noerr( inErrorCode, exit );
	
	self = reinterpret_cast <CPrinterSetupWizardSheet*>( inContext );
	require_quiet( self, exit );

	active = self->GetActivePage();
	require_quiet( active, exit );

	// Have we seen this printer before?

	printer = self->Lookup( inName );

	if ( printer )
	{
		service = printer->LookupService( inType );
	}

	if ( inFlags & kDNSServiceFlagsAdd )
	{
		if (printer == NULL)
		{
			// If not, then create a new one

			printer = self->OnAddPrinter( inInterfaceIndex, inName, inType, inDomain, moreComing );
			require_action( printer, exit, err = kUnknownErr );
		}

		if ( !service )
		{
			err = self->OnAddService( printer, inInterfaceIndex, inName, inType, inDomain );
			require_noerr( err, exit );
		}
		else
		{
			service->refs++;
		}
	}
	else if ( printer )
	{
		check( service );

		err = self->OnRemoveService( service );
		require_noerr( err, exit );

		if ( printer->services.size() == 0 )
		{
			err = self->OnRemovePrinter( printer, moreComing );
			require_noerr( err, exit );
		}
	}

exit:
	
	return;
}
コード例 #19
0
void DNSSD_API
CPrinterSetupWizardSheet::OnResolve(
								DNSServiceRef			inRef,
								DNSServiceFlags			inFlags,
								uint32_t				inInterfaceIndex,
								DNSServiceErrorType		inErrorCode,
								const char *			inFullName,	
								const char *			inHostName, 
								uint16_t 				inPort,
								uint16_t 				inTXTSize,
								const char *			inTXT,
								void *					inContext )
{
	DEBUG_UNUSED(inFullName);
	DEBUG_UNUSED(inInterfaceIndex);
	DEBUG_UNUSED(inFlags);
	DEBUG_UNUSED(inRef);

	CPrinterSetupWizardSheet	*	self;
	Service						*	service;
	Queue						*	q;
	int								idx;
	OSStatus						err;

	require_noerr( inErrorCode, exit );

	service = reinterpret_cast<Service*>( inContext );
	require_quiet( service, exit);

	check( service->refs != 0 );

	self = service->printer->window;
	require_quiet( self, exit );

	err = self->StopOperation( service->serviceRef );
	require_noerr( err, exit );
	
	//
	// hold on to the hostname...
	//
	err = UTF8StringToStringObject( inHostName, service->hostname );
	require_noerr( err, exit );

	//
	// <rdar://problem/3739200> remove the trailing dot on hostname
	//
	idx = service->hostname.ReverseFind('.');

	if ((idx > 1) && ((service->hostname.GetLength() - 1) == idx))
	{
		service->hostname.Delete(idx, 1);
	}

	//
	// hold on to the port
	//
	service->portNumber = ntohs(inPort);

	if ( service->qtotal == 1 )
	{	
		//
		// create a new queue
		//
		try
		{
			q = new Queue;
		}
		catch (...)
		{
			q = NULL;
		}

		require_action( q, exit, err = E_OUTOFMEMORY );

		//
		// parse the text record.
		//

		err = self->ParseTextRecord( service, q, inTXTSize, inTXT );
		require_noerr( err, exit );

		service->queues.push_back( q );

		//
		// we've completely resolved this service
		//

		self->OnResolveService( service );
	}
	else
	{
		//
		// if qtotal is more than 1, then we need to get additional
		// text records.  if not, then this service is considered
		// resolved
		//

		err = DNSServiceQueryRecord(&service->serviceRef, 0, inInterfaceIndex, inFullName, kDNSServiceType_TXT, kDNSServiceClass_IN, OnQuery, (void*) service );
		require_noerr( err, exit );

		err = self->StartOperation( service->serviceRef );
		require_noerr( err, exit );
	}

exit:

	return;
}
コード例 #20
0
void DNSSD_API
CPrinterSetupWizardSheet::OnQuery(
							DNSServiceRef		inRef, 
							DNSServiceFlags		inFlags, 
							uint32_t			inInterfaceIndex, 
							DNSServiceErrorType inErrorCode,
							const char		*	inFullName, 
							uint16_t			inRRType, 
							uint16_t			inRRClass, 
							uint16_t			inRDLen, 
							const void		*	inRData, 
							uint32_t			inTTL, 
							void			*	inContext)
{
	DEBUG_UNUSED( inTTL );
	DEBUG_UNUSED( inRRClass );
	DEBUG_UNUSED( inRRType );
	DEBUG_UNUSED( inFullName );
	DEBUG_UNUSED( inInterfaceIndex );
	DEBUG_UNUSED( inRef );

	Service						*	service = NULL;
	Queue						*	q;
	CPrinterSetupWizardSheet	*	self;
	OSStatus						err = kNoErr;

	require_noerr( inErrorCode, exit );

	service = reinterpret_cast<Service*>( inContext );
	require_quiet( service, exit);

	self = service->printer->window;
	require_quiet( self, exit );

	if ( ( inFlags & kDNSServiceFlagsAdd ) && ( inRDLen > 0 ) && ( inRData != NULL ) )
	{
		const char * inTXT = ( const char * ) inRData;

		//
		// create a new queue
		//
		try
		{
			q = new Queue;
		}
		catch (...)
		{
			q = NULL;
		}

		require_action( q, exit, err = E_OUTOFMEMORY );

		err = service->printer->window->ParseTextRecord( service, q, inRDLen, inTXT );
		require_noerr( err, exit );

		//
		// add this queue
		//

		service->queues.push_back( q );

		if ( service->queues.size() == service->qtotal )
		{
			//
			// else if moreComing is not set, then we're going
			// to assume that we're done
			//

			self->StopOperation( service->serviceRef );

			//
			// sort the queues
			//

			service->queues.sort( OrderQueueFunc );

			//
			// we've completely resolved this service
			//

			self->OnResolveService( service );
		}
	}

exit:

	if ( err && service && ( service->serviceRef != NULL ) )
	{
		service->printer->window->StopOperation( service->serviceRef );
	}

	return;
}