blob: 5e2306b0534fd5a89f791e8bfa9d4b333a3fe1fc [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.
Change History (most recent first):
$Log: PrinterSetupWizardSheet.h,v $
Revision 1.14 2009/06/11 22:27:16 herscher
<rdar://problem/4458913> Add comprehensive logging during printer installation process.
Revision 1.13 2009/03/30 19:18:49 herscher
<rdar://problem/5925472> Current Bonjour code does not compile on Windows
<rdar://problem/5187308> Move build train to Visual Studio 2005
Revision 1.12 2006/08/14 23:24:09 cheshire
Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0
Revision 1.11 2005/10/05 17:32:51 herscher
<rdar://problem/4141221> Use a case insensitive compare operation to check whether a printer with the same name has already been installed.
Revision 1.10 2005/07/07 17:53:19 shersche
Fix problems associated with the CUPS printer workaround fix.
Revision 1.9 2005/04/13 17:46:22 shersche
<rdar://problem/4082122> Generic PCL not selected when printers advertise multiple text records
Revision 1.8 2005/02/08 18:53:33 shersche
Remove qtotalDefined parameter from ParseTextRecord()
Revision 1.7 2005/01/31 23:54:29 shersche
<rdar://problem/3947508> Start browsing when printer wizard starts. Move browsing logic from CSecondPage object to CPrinterSetupWizardSheet object.
Revision 1.6 2005/01/03 19:05:01 shersche
Store pointer to instance of wizard sheet so that print driver install thread sends a window message to the correct window
Revision 1.5 2004/12/29 18:53:38 shersche
<rdar://problem/3725106>
<rdar://problem/3737413> Added support for LPR and IPP protocols as well as support for obtaining multiple text records. Reorganized and simplified codebase.
Bug #: 3725106, 3737413
Revision 1.4 2004/07/13 21:24:23 rpantos
Fix for <rdar://problem/3701120>.
Revision 1.3 2004/06/28 00:51:47 shersche
Move call to EnumPrinters out of browse callback into standalone function
Revision 1.2 2004/06/24 20:12:07 shersche
Clean up source code
Submitted by: herscher
Revision 1.1 2004/06/18 04:36:57 rpantos
First checked in
*/
#pragma once
#include "firstpage.h"
#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()
CFirstPage m_pgFirst;
CSecondPage m_pgSecond;
CThirdPage m_pgThird;
CFourthPage m_pgFourth;
void
OnServiceResolved(
Service * service);
void Init(void);
private:
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
InstallPrinterPDLAndLPR(Printer * printer, Service * service, DWORD protocol, Logger & log);
OSStatus
InstallPrinterIPP(Printer * printer, Service * service, Logger & log);
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."