/* -*- 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 "secondpage.h" #include "thirdpage.h" #include "fourthpage.h" #include "UtilTypes.h" #include "Logger.h" #include "dns_sd.h" #include #include using namespace PrinterSetupWizard; // CPrinterSetupWizardSheet class CPrinterSetupWizardSheet : public CPropertySheet { DECLARE_DYNAMIC(CPrinterSetupWizardSheet) public: struct WizardException { CString text; CString caption; }; public: CPrinterSetupWizardSheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0); virtual ~CPrinterSetupWizardSheet(); CPropertyPage* GetLastPage(); void SetLastPage(CPropertyPage * page ); void SetSelectedPrinter(Printer * printer); Printer* GetSelectedPrinter(); OSStatus LoadPrinterDriver(const CString & filename); HCURSOR GetCursor(); // // handles end of process event // virtual LRESULT OnProcessEvent(WPARAM inWParam, LPARAM inLParam); virtual LRESULT OnSocketEvent(WPARAM inWParam, LPARAM inLParam); virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam); virtual BOOL OnInitDialog(); virtual BOOL OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message); virtual void OnContextMenu(CWnd * pWnd, CPoint pos); afx_msg void OnOK(); OSStatus StartResolve( Printer * printer ); OSStatus StopResolve( Printer * printer ); Printers m_printers; HCURSOR m_active; HCURSOR m_arrow; HCURSOR m_wait; protected: DECLARE_MESSAGE_MAP() CSecondPage m_pgSecond; CThirdPage m_pgThird; CFourthPage m_pgFourth; void OnServiceResolved( Service * service); void Init(void); private: // This is from typedef enum http_encryption_e /**** HTTP encryption values ****/ { HTTP_ENCRYPT_IF_REQUESTED, /* Encrypt if requested (TLS upgrade) */ HTTP_ENCRYPT_NEVER, /* Never encrypt */ HTTP_ENCRYPT_REQUIRED, /* Encryption is required (TLS upgrade) */ HTTP_ENCRYPT_ALWAYS /* Always encrypt (SSL) */ } http_encryption_t; typedef void* ( *httpConnectEncryptFunc )( const char* host, int port, http_encryption_t encryption ); typedef http_encryption_t ( *cupsEncryptionFunc )( void ); typedef void ( *cupsSetEncryptionFunc )( http_encryption_t e ); typedef char* ( *cupsAdminCreateWindowsPPDFunc )( void * http, const char *dest, char *buffer, int bufsize ); class CUPSLibrary { public: CUPSLibrary() : httpConnectEncrypt( NULL ), cupsEncryption( NULL ), cupsSetEncryption( NULL ), cupsAdminCreateWindowsPPD( NULL ), library( NULL ) { #if defined( LIBCUPS_ENABLED ) if ( ( library = LoadLibrary( TEXT( "libcups2.dll" ) ) ) != NULL ) { httpConnectEncrypt = ( httpConnectEncryptFunc ) GetProcAddress( library, "httpConnectEncrypt" ); cupsEncryption = ( cupsEncryptionFunc ) GetProcAddress( library, "cupsEncryption" ); cupsSetEncryption = ( cupsSetEncryptionFunc ) GetProcAddress( library, "cupsSetEncryption" ); cupsAdminCreateWindowsPPD = ( cupsAdminCreateWindowsPPDFunc ) GetProcAddress( library, "cupsAdminCreateWindowsPPD" ); } #endif } ~CUPSLibrary() { if ( library ) { FreeLibrary( library ); library = NULL; } } BOOL IsInstalled() { return ( ( httpConnectEncrypt != NULL ) && ( cupsEncryption != NULL ) && ( cupsSetEncryption != NULL ) && ( cupsAdminCreateWindowsPPD != NULL ) ); } httpConnectEncryptFunc httpConnectEncrypt; cupsEncryptionFunc cupsEncryption; cupsSetEncryptionFunc cupsSetEncryption; cupsAdminCreateWindowsPPDFunc cupsAdminCreateWindowsPPD; private: HMODULE library; }; static void DNSSD_API OnBrowse( DNSServiceRef inRef, DNSServiceFlags inFlags, uint32_t inInterfaceIndex, DNSServiceErrorType inErrorCode, const char * inName, const char * inType, const char * inDomain, void * inContext ); static void DNSSD_API 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 ); static void DNSSD_API 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); Printer* OnAddPrinter( uint32_t inInterfaceIndex, const char * inName, const char * inType, const char * inDomain, bool moreComing); OSStatus OnRemovePrinter( Printer * printer, bool moreComing); OSStatus OnAddService( Printer * printer, uint32_t inInterfaceIndex, const char * inName, const char * inType, const char * inDomain); OSStatus OnRemoveService( Service * service); void OnResolveService( Service * service ); static bool OrderServiceFunc( const Service * a, const Service * b ); static bool OrderQueueFunc( const Queue * q1, const Queue * q2 ); OSStatus StartOperation( DNSServiceRef ref ); OSStatus StopOperation( DNSServiceRef & ref ); OSStatus StartBrowse(); OSStatus StopBrowse(); OSStatus StartResolve( Service * service ); OSStatus StopResolve( Service * service ); OSStatus ParseTextRecord( Service * service, Queue * q, uint16_t inTXTSize, const char * inTXT ); OSStatus LoadPrinterNames(); Printer* Lookup( const char * name ); OSStatus InstallPrinter(Printer * printer); OSStatus InstallPrinterPort( Printer * printer, Service * service, DWORD protocol, Logger & log ); OSStatus InstallPrinterPDLAndLPR(Printer * printer, Service * service, Logger & log); OSStatus InstallPrinterIPP(Printer * printer, Service * service, Logger & log); OSStatus InstallPrinterCUPS( Printer * printer, Service * service, CUPSLibrary & cupsLib ); OSStatus InstallPrinterCUPS(Printer * printer, Service * service, CUPSLibrary & cupsLib, TCHAR * env ); static unsigned WINAPI InstallDriverThread( LPVOID inParam ); typedef std::list PrinterNames; typedef std::list ServiceRefList; static CPrinterSetupWizardSheet * m_self; PrinterNames m_printerNames; Printer * m_selectedPrinter; bool m_driverThreadFinished; DWORD m_driverThreadExitCode; ServiceRefList m_serviceRefList; DNSServiceRef m_pdlBrowser; DNSServiceRef m_lprBrowser; DNSServiceRef m_ippBrowser; DNSServiceRef m_resolver; CPropertyPage * m_lastPage; }; inline Printer* CPrinterSetupWizardSheet::GetSelectedPrinter() { return m_selectedPrinter; } inline HCURSOR CPrinterSetupWizardSheet::GetCursor() { return m_active; } inline CPropertyPage* CPrinterSetupWizardSheet::GetLastPage() { return m_lastPage; } inline void CPrinterSetupWizardSheet::SetLastPage(CPropertyPage * lastPage) { m_lastPage = lastPage; } // Service Types #define kPDLServiceType "_pdl-datastream._tcp." #define kLPRServiceType "_printer._tcp." #define kIPPServiceType "_ipp._tcp."