blob: 45110434b1638a4fe60a5d2017db14acb2ee555d [file] [log] [blame]
/* -*- 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 <stdexcept>
#include <map>
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 <cups/http.h>
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<CString> PrinterNames;
typedef std::list<DNSServiceRef> 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."