/* -*- Mode: C; tab-width: 4 -*- * * Copyright (c) 2009 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 "resource.h" // main symbols #include "DLLX.h" #include "DNSSDEventManager.h" #include #include #include #include #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA) #error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms." #endif // CDNSSDService class ATL_NO_VTABLE CDNSSDService : public CComObjectRootEx, public CComCoClass, public IDispatchImpl { public: typedef CComObjectRootEx Super; CDNSSDService() : m_isPrimary( FALSE ), m_eventManager( NULL ), m_stopped( FALSE ), m_primary( NULL ), m_subord( NULL ) { } DECLARE_REGISTRY_RESOURCEID(IDR_DNSSDSERVICE) BEGIN_COM_MAP(CDNSSDService) COM_INTERFACE_ENTRY(IDNSSDService) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct(); void FinalRelease(); public: inline DNSServiceRef GetPrimaryRef() { return m_primary; } inline void SetPrimaryRef( DNSServiceRef primary ) { m_primary = primary; } inline DNSServiceRef GetSubordRef() { return m_subord; } inline void SetSubordRef( DNSServiceRef subord ) { m_subord = subord; } inline CDNSSDEventManager* GetEventManager() { return m_eventManager; } inline void SetEventManager( IDNSSDEventManager * eventManager ) { if ( m_eventManager ) { m_eventManager->Release(); m_eventManager = NULL; } if ( eventManager ) { m_eventManager = dynamic_cast< CDNSSDEventManager* >( eventManager ); check( m_eventManager ); m_eventManager->AddRef(); } } inline BOOL Stopped() { return m_stopped; } private: static void DNSSD_API DomainEnumReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *replyDomain, void *context ); static void DNSSD_API BrowseReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, const char *replyDomain, void *context ); static void DNSSD_API ResolveReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget, uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context ); static void DNSSD_API RegisterReply ( DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context ); static void DNSSD_API QueryRecordReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context ); static void DNSSD_API GetAddrInfoReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *hostname, const struct sockaddr *address, uint32_t ttl, void *context ); static void DNSSD_API NATPortMappingReply ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, uint32_t externalAddress, /* four byte IPv4 address in network byte order */ DNSServiceProtocol protocol, uint16_t internalPort, uint16_t externalPort, /* may be different than the requested port */ uint32_t ttl, /* may be different than the requested ttl */ void *context ); static void DNSSD_API RegisterRecordReply ( DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, void *context ); inline BOOL ShouldHandleReply( DNSServiceErrorType errorCode, CDNSSDEventManager *& eventManager ); static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); typedef std::map< SOCKET, CDNSSDService* > SocketMap; static BOOL m_registeredWindowClass; static HWND m_hiddenWindow; static SocketMap m_socketMap; CDNSSDEventManager * m_eventManager; BOOL m_stopped; BOOL m_isPrimary; DNSServiceRef m_primary; DNSServiceRef m_subord; public: STDMETHOD(EnumerateDomains)(DNSSDFlags flags, ULONG ifIndex, IDNSSDEventManager *eventManager, IDNSSDService **service); STDMETHOD(Browse)(DNSSDFlags flags, ULONG interfaceIndex, BSTR regtype, BSTR domain, IDNSSDEventManager* eventManager, IDNSSDService** sdref); STDMETHOD(Resolve)(DNSSDFlags flags, ULONG ifIndex, BSTR serviceName, BSTR regType, BSTR domain, IDNSSDEventManager* eventManager, IDNSSDService** service); STDMETHOD(Register)(DNSSDFlags flags, ULONG ifIndex, BSTR name, BSTR regType, BSTR domain, BSTR host, USHORT port, ITXTRecord *record, IDNSSDEventManager *eventManager, IDNSSDService **service); STDMETHOD(QueryRecord)(DNSSDFlags flags, ULONG ifIndex, BSTR fullname, DNSSDRRType rrtype, DNSSDRRClass rrclass, IDNSSDEventManager *eventManager, IDNSSDService **service); STDMETHOD(RegisterRecord)(DNSSDFlags flags, ULONG ifIndex, BSTR fullname, DNSSDRRType rrtype, DNSSDRRClass rrclass, VARIANT rdata, ULONG ttl, IDNSSDEventManager* eventManager, IDNSSDRecord** record); STDMETHOD(AddRecord)(DNSSDFlags flags, DNSSDRRType rrtype, VARIANT rdata, ULONG ttl, IDNSSDRecord ** record); STDMETHOD(ReconfirmRecord)(DNSSDFlags flags, ULONG ifIndex, BSTR fullname, DNSSDRRType rrtype, DNSSDRRClass rrclass, VARIANT rdata); STDMETHOD(GetProperty)(BSTR prop, VARIANT * value); STDMETHOD(GetAddrInfo)(DNSSDFlags flags, ULONG ifIndex, DNSSDAddressFamily addressFamily, BSTR hostname, IDNSSDEventManager *eventManager, IDNSSDService **service); STDMETHOD(NATPortMappingCreate)(DNSSDFlags flags, ULONG ifIndex, DNSSDAddressFamily addressFamily, DNSSDProtocol protocol, USHORT internalPort, USHORT externalPort, ULONG ttl, IDNSSDEventManager *eventManager, IDNSSDService **service); STDMETHOD(Stop)(void); }; OBJECT_ENTRY_AUTO(__uuidof(DNSSDService), CDNSSDService)