| /* -*- Mode: C; tab-width: 4 -*- |
| * |
| * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #pragma once |
| |
| #include <dns_sd.h> |
| #include <string> |
| #include <list> |
| #include <DebugServices.h> |
| |
| class CPrinterSetupWizardSheet; |
| |
| #define kDefaultPriority 50 |
| #define kDefaultQTotal 1 |
| |
| namespace PrinterSetupWizard |
| { |
| struct Printer; |
| struct Service; |
| struct Queue; |
| struct Manufacturer; |
| struct Model; |
| |
| typedef std::list<Queue*> Queues; |
| typedef std::list<Printer*> Printers; |
| typedef std::list<Service*> Services; |
| typedef std::list<Model*> Models; |
| |
| struct Printer |
| { |
| Printer(); |
| |
| ~Printer(); |
| |
| Service* |
| LookupService |
| ( |
| const std::string & type |
| ); |
| |
| CPrinterSetupWizardSheet * window; |
| HTREEITEM item; |
| |
| // |
| // These are from the browse reply |
| // |
| std::string name; |
| CString displayName; |
| CString actualName; |
| |
| // |
| // These keep track of the different services associated with this printer. |
| // the services are ordered according to preference. |
| // |
| Services services; |
| |
| // |
| // these are derived from the printer matching code |
| // |
| // if driverInstalled is false, then infFileName should |
| // have an absolute path to the printers inf file. this |
| // is used to install the printer from printui.dll |
| // |
| // if driverInstalled is true, then model is the name |
| // of the driver to use in AddPrinter |
| // |
| bool driverInstalled; |
| CString infFileName; |
| CString manufacturer; |
| CString displayModelName; |
| CString modelName; |
| CString portName; |
| bool deflt; |
| |
| // This let's us know that this printer was discovered via OSX Printer Sharing. |
| // We use this knowledge to workaround a problem with OS X Printer sharing. |
| |
| bool isCUPSPrinter; |
| |
| // |
| // state |
| // |
| unsigned resolving; |
| bool installed; |
| }; |
| |
| |
| struct Service |
| { |
| Service(); |
| |
| ~Service(); |
| |
| Queue* |
| SelectedQueue(); |
| |
| void |
| EmptyQueues(); |
| |
| Printer * printer; |
| uint32_t ifi; |
| std::string type; |
| std::string domain; |
| |
| // |
| // these are from the resolve |
| // |
| DNSServiceRef serviceRef; |
| CString hostname; |
| unsigned short portNumber; |
| CString protocol; |
| unsigned short qtotal; |
| |
| // |
| // There will usually one be one of these, however |
| // this will handle printers that have multiple |
| // queues. These are ordered according to preference. |
| // |
| Queues queues; |
| |
| // |
| // Reference count |
| // |
| unsigned refs; |
| }; |
| |
| |
| struct Queue |
| { |
| Queue(); |
| |
| ~Queue(); |
| |
| CString name; |
| uint32_t priority; |
| CString pdl; |
| CString usb_MFG; |
| CString usb_MDL; |
| CString description; |
| CString location; |
| CString product; |
| }; |
| |
| |
| struct Manufacturer |
| { |
| CString name; |
| Models models; |
| |
| Model* |
| find( const CString & name ); |
| }; |
| |
| |
| struct Model |
| { |
| bool driverInstalled; |
| CString infFileName; |
| CString displayName; |
| CString name; |
| }; |
| |
| |
| inline |
| Printer::Printer() |
| : |
| isCUPSPrinter( false ) |
| { |
| } |
| |
| inline |
| Printer::~Printer() |
| { |
| while ( services.size() > 0 ) |
| { |
| Service * service = services.front(); |
| services.pop_front(); |
| delete service; |
| } |
| } |
| |
| inline Service* |
| Printer::LookupService |
| ( |
| const std::string & type |
| ) |
| { |
| Services::iterator it; |
| |
| for ( it = services.begin(); it != services.end(); it++ ) |
| { |
| Service * service = *it; |
| |
| if ( strcmp(service->type.c_str(), type.c_str()) == 0 ) |
| { |
| return service; |
| } |
| } |
| |
| return NULL; |
| } |
| |
| inline |
| Service::Service() |
| : |
| qtotal(kDefaultQTotal) |
| { |
| } |
| |
| inline |
| Service::~Service() |
| { |
| check( serviceRef == NULL ); |
| |
| EmptyQueues(); |
| } |
| |
| inline Queue* |
| Service::SelectedQueue() |
| { |
| return queues.front(); |
| } |
| |
| inline void |
| Service::EmptyQueues() |
| { |
| while ( queues.size() > 0 ) |
| { |
| Queue * q = queues.front(); |
| queues.pop_front(); |
| delete q; |
| } |
| } |
| |
| inline |
| Queue::Queue() |
| : |
| priority(kDefaultPriority) |
| { |
| } |
| |
| inline |
| Queue::~Queue() |
| { |
| } |
| |
| inline Model* |
| Manufacturer::find( const CString & name ) |
| { |
| Models::iterator it; |
| |
| for ( it = models.begin(); it != models.end(); it++ ) |
| { |
| Model * model = *it; |
| |
| if ( model->name == name ) |
| { |
| return model; |
| } |
| } |
| |
| return NULL; |
| } |
| } |
| |
| |