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; }
// 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; }
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(); }
BOOL CThirdPage::OnKillActive() { CPrinterSetupWizardSheet * psheet; psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_quiet( psheet, exit ); psheet->SetLastPage(this); exit: return CPropertyPage::OnKillActive(); }
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; }
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; }
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; }
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; }
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; }
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; }
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(); }
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; }
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; }
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(); }
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; }
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; }
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(); }
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; }
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; }
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; }