1/* -*- Mode: C; tab-width: 4 -*- 2 * 3 * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18#pragma once 19 20#include <dns_sd.h> 21#include <string> 22#include <list> 23#include <DebugServices.h> 24 25class CPrinterSetupWizardSheet; 26 27#define kDefaultPriority 50 28#define kDefaultQTotal 1 29 30namespace PrinterSetupWizard 31{ 32struct Printer; 33struct Service; 34struct Queue; 35struct Manufacturer; 36struct Model; 37 38typedef std::list<Queue*> Queues; 39typedef std::list<Printer*> Printers; 40typedef std::list<Service*> Services; 41typedef std::list<Model*> Models; 42 43struct Printer 44{ 45 Printer(); 46 47 ~Printer(); 48 49 Service* 50 LookupService 51 ( 52 const std::string & type 53 ); 54 55 CPrinterSetupWizardSheet * window; 56 HTREEITEM item; 57 58 // 59 // These are from the browse reply 60 // 61 std::string name; 62 CString displayName; 63 CString actualName; 64 65 // 66 // These keep track of the different services associated with this printer. 67 // the services are ordered according to preference. 68 // 69 Services services; 70 71 // 72 // these are derived from the printer matching code 73 // 74 // if driverInstalled is false, then infFileName should 75 // have an absolute path to the printers inf file. this 76 // is used to install the printer from printui.dll 77 // 78 // if driverInstalled is true, then model is the name 79 // of the driver to use in AddPrinter 80 // 81 bool driverInstalled; 82 CString infFileName; 83 CString manufacturer; 84 CString displayModelName; 85 CString modelName; 86 CString portName; 87 bool deflt; 88 89 // This let's us know that this printer was discovered via OSX Printer Sharing. 90 // We use this knowledge to workaround a problem with OS X Printer sharing. 91 92 bool isCUPSPrinter; 93 94 // 95 // state 96 // 97 unsigned resolving; 98 bool installed; 99}; 100 101 102struct Service 103{ 104 Service(); 105 106 ~Service(); 107 108 Queue* 109 SelectedQueue(); 110 111 void 112 EmptyQueues(); 113 114 Printer * printer; 115 uint32_t ifi; 116 std::string type; 117 std::string domain; 118 119 // 120 // these are from the resolve 121 // 122 DNSServiceRef serviceRef; 123 CString hostname; 124 unsigned short portNumber; 125 CString protocol; 126 unsigned short qtotal; 127 128 // 129 // There will usually one be one of these, however 130 // this will handle printers that have multiple 131 // queues. These are ordered according to preference. 132 // 133 Queues queues; 134 135 // 136 // Reference count 137 // 138 unsigned refs; 139}; 140 141 142struct Queue 143{ 144 Queue(); 145 146 ~Queue(); 147 148 CString name; 149 uint32_t priority; 150 CString pdl; 151 CString usb_MFG; 152 CString usb_MDL; 153 CString description; 154 CString location; 155 CString product; 156}; 157 158 159struct Manufacturer 160{ 161 CString name; 162 Models models; 163 164 Model* 165 find( const CString & name ); 166}; 167 168 169struct Model 170{ 171 bool driverInstalled; 172 CString infFileName; 173 CString displayName; 174 CString name; 175}; 176 177 178inline 179Printer::Printer() 180 : 181 isCUPSPrinter( false ) 182{ 183} 184 185inline 186Printer::~Printer() 187{ 188 while ( services.size() > 0 ) 189 { 190 Service * service = services.front(); 191 services.pop_front(); 192 delete service; 193 } 194} 195 196inline Service* 197Printer::LookupService 198( 199 const std::string & type 200) 201{ 202 Services::iterator it; 203 204 for ( it = services.begin(); it != services.end(); it++ ) 205 { 206 Service * service = *it; 207 208 if ( strcmp(service->type.c_str(), type.c_str()) == 0 ) 209 { 210 return service; 211 } 212 } 213 214 return NULL; 215} 216 217inline 218Service::Service() 219 : 220 qtotal(kDefaultQTotal) 221{ 222} 223 224inline 225Service::~Service() 226{ 227 check( serviceRef == NULL ); 228 229 EmptyQueues(); 230} 231 232inline Queue* 233Service::SelectedQueue() 234{ 235 return queues.front(); 236} 237 238inline void 239Service::EmptyQueues() 240{ 241 while ( queues.size() > 0 ) 242 { 243 Queue * q = queues.front(); 244 queues.pop_front(); 245 delete q; 246 } 247} 248 249inline 250Queue::Queue() 251 : 252 priority(kDefaultPriority) 253{ 254} 255 256inline 257Queue::~Queue() 258{ 259} 260 261inline Model* 262Manufacturer::find( const CString & name ) 263{ 264 Models::iterator it; 265 266 for ( it = models.begin(); it != models.end(); it++ ) 267 { 268 Model * model = *it; 269 270 if ( model->name == name ) 271 { 272 return model; 273 } 274 } 275 276 return NULL; 277} 278} 279 280 281