+// -------------------------------------------------------
+// LoadGenericPrintDriverDefs
+//
+// This function is responsible for loading polymorphic
+// generic print drivers defs. The UI will read
+// something like "Generic / Postscript" and we can map
+// that to any print driver we want.
+// -------------------------------------------------------
+OSStatus
+CThirdPage::LoadGenericPrintDriverDefs( Manufacturers & manufacturers )
+{
+ Manufacturer * manufacturer;
+ Model * model;
+ Manufacturers::iterator iter;
+ CString psDriverName;
+ CString pclDriverName;
+ OSStatus err = 0;
+
+ // <rdar://problem/4030388> Generic drivers don't do color
+
+ // First try and find our generic driver names
+
+ iter = m_manufacturers.find(L"HP");
+ require_action( iter != m_manufacturers.end(), exit, err = kUnknownErr );
+ manufacturer = iter->second;
+
+ // Look for Postscript
+
+ model = manufacturer->find( kGenericPSColorDriver );
+
+ if ( !model )
+ {
+ model = manufacturer->find( kGenericPSDriver );
+ }
+
+ if ( model )
+ {
+ psDriverName = model->name;
+ }
+
+ // Look for PCL
+
+ model = manufacturer->find( kGenericPCLColorDriver );
+
+ if ( !model )
+ {
+ model = manufacturer->find( kGenericPCLDriver );
+ }
+
+ if ( model )
+ {
+ pclDriverName = model->name;
+ }
+
+ // If we found either a generic PS driver, or a generic PCL driver,
+ // then add them to the list
+
+ if ( psDriverName.GetLength() || pclDriverName.GetLength() )
+ {
+ // Try and find generic manufacturer if there is one
+
+ iter = manufacturers.find(L"Generic");
+
+ if (iter != manufacturers.end())
+ {
+ manufacturer = iter->second;
+ }
+ else
+ {
+ try
+ {
+ manufacturer = new Manufacturer;
+ }
+ catch (...)
+ {
+ manufacturer = NULL;
+ }
+
+ require_action( manufacturer, exit, err = kNoMemoryErr );
+
+ manufacturer->name = "Generic";
+ manufacturers[manufacturer->name] = manufacturer;
+ }
+
+ if ( psDriverName.GetLength() > 0 )
+ {
+ try
+ {
+ m_genericPostscript = new Model;
+ }
+ catch (...)
+ {
+ m_genericPostscript = NULL;
+ }
+
+ require_action( m_genericPostscript, exit, err = kNoMemoryErr );
+
+ m_genericPostscript->displayName = kGenericPostscript;
+ m_genericPostscript->name = psDriverName;
+ m_genericPostscript->driverInstalled = false;
+
+ manufacturer->models.push_back( m_genericPostscript );
+ }
+
+ if ( pclDriverName.GetLength() > 0 )
+ {
+ try
+ {
+ m_genericPCL = new Model;
+ }
+ catch (...)
+ {
+ m_genericPCL = NULL;
+ }
+
+ require_action( m_genericPCL, exit, err = kNoMemoryErr );
+
+ m_genericPCL->displayName = kGenericPCL;
+ m_genericPCL->name = pclDriverName;
+ m_genericPCL->driverInstalled = false;
+
+ manufacturer->models.push_back( m_genericPCL );
+ }
+ }
+
+exit:
+
+ return err;
+}