OSStatus CSecondPage::StartResolve( Printer * printer ) { CPrinterSetupWizardSheet * psheet; OSStatus err = kNoErr; Services::iterator it; psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_quiet( psheet, exit ); check( printer ); for ( it = printer->services.begin(); it != printer->services.end(); it++ ) { if ( (*it)->serviceRef == NULL ) { err = StartResolve( *it ); require_noerr( err, exit ); } } exit: return err; }
void ExplorerBarWindow::OnDoubleClick( NMHDR *inNMHDR, LRESULT *outResult ) { HTREEITEM item; ServiceInfo * service; OSStatus err; DEBUG_UNUSED( inNMHDR ); item = mTree.GetSelectedItem(); require( item, exit ); // Tell Internet Explorer to go to the URL if it's about item if ( item == m_about ) { CString url; check( mOwner ); url.LoadString( IDS_ABOUT_URL ); mOwner->GoToURL( url ); } else { service = reinterpret_cast < ServiceInfo * > ( mTree.GetItemData( item ) ); require_quiet( service, exit ); err = StartResolve( service ); require_noerr( err, exit ); } exit: *outResult = 0; }
OSStatus CPrinterSetupWizardSheet::OnAddService( Printer * printer, uint32_t inInterfaceIndex, const char * inName, const char * inType, const char * inDomain) { Service * service = NULL; OSStatus err = kNoErr; DEBUG_UNUSED( inName ); DEBUG_UNUSED( inDomain ); try { service = new Service; } catch (...) { service = NULL; } require_action( service, exit, err = E_OUTOFMEMORY ); service->printer = printer; service->ifi = inInterfaceIndex; service->type = inType; service->domain = inDomain; service->qtotal = 1; service->refs = 1; service->serviceRef = NULL; printer->services.push_back( service ); // // if the printer is selected, then we'll want to start a // resolve on this guy // if ( printer == m_selectedPrinter ) { StartResolve( service ); } exit: return err; }
void CSecondPage::OnTvnSelchangedBrowseList(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); CPrinterSetupWizardSheet * psheet; int err = 0; HTREEITEM item = m_browseList.GetSelectedItem(); require_quiet( item, exit ); psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_action( psheet, exit, err = kUnknownErr ); Printer * printer; 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 = 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; }
OSStatus CPrinterSetupWizardSheet::StartResolve( Printer * printer ) { OSStatus err = kNoErr; Services::iterator it; check( printer ); for ( it = printer->services.begin(); it != printer->services.end(); it++ ) { if ( (*it)->serviceRef == NULL ) { err = StartResolve( *it ); require_noerr( err, exit ); } } m_selectedPrinter = printer; exit: return err; }
// Printer::EventHandler implementation OSStatus CSecondPage::OnAddPrinter( uint32_t inInterfaceIndex, const char * inName, const char * inType, const char * inDomain, bool moreComing) { Printer * printer; Service * service; CPrinterSetupWizardSheet * psheet; DWORD printerNameCount; bool newPrinter = false; OSStatus err = kNoErr; check( IsWindow( m_hWnd ) ); m_browseList.SetRedraw(FALSE); psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_quiet( psheet, exit ); printer = Lookup( inName ); if (printer == NULL) { try { printer = new Printer; } catch (...) { printer = NULL; } require_action( printer, exit, err = E_OUTOFMEMORY ); printer->window = this; printer->name = inName; err = UTF8StringToStringObject(inName, printer->displayName); check_noerr( err ); printer->actualName = printer->displayName; printer->installed = false; printer->deflt = false; printer->resolving = 0; // // Compare this name against printers that are already installed // to avoid name clashes. Rename as necessary // to come up with a unique name. // printerNameCount = 2; for (;;) { PrinterNameMap::iterator it; it = m_printerNames.find(printer->actualName); if (it != m_printerNames.end()) { printer->actualName.Format(L"%s (%d)", printer->displayName, printerNameCount); } else { break; } printerNameCount++; } newPrinter = true; } check( printer ); service = printer->LookupService( inType ); if ( service != NULL ) { service->refs++; } else { try { service = new Service; } catch (...) { service = NULL; } require_action( service, exit, err = E_OUTOFMEMORY ); service->printer = printer; service->ifi = inInterfaceIndex; service->type = inType; service->domain = inDomain; service->qtotal = 1; service->refs = 1; service->serviceRef = NULL; printer->services.push_back( service ); // // if the printer is selected, then we'll want to start a // resolve on this guy // if ( m_selected == printer ) { StartResolve( service ); } } if ( newPrinter ) { printer->item = m_browseList.InsertItem(printer->displayName); m_browseList.SetItemData( printer->item, (DWORD_PTR) printer ); m_printers.push_back( printer ); m_browseList.SortChildren(TVI_ROOT); if ( printer->name == m_selectedName ) { m_browseList.SelectItem( printer->item ); } // // 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); } } exit: if (!moreComing) { m_browseList.SetRedraw(TRUE); m_browseList.Invalidate(); } return err; }