| /* -*- Mode: C; tab-width: 4 -*- |
| * |
| * Copyright (c) 2003-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. |
| */ |
| |
| #ifndef __EXPLORER_BAR_WINDOW__ |
| #define __EXPLORER_BAR_WINDOW__ |
| |
| #pragma once |
| |
| #include "afxtempl.h" |
| |
| #include "dns_sd.h" |
| #include <list> |
| |
| //=========================================================================================================================== |
| // Structures |
| //=========================================================================================================================== |
| |
| // Forward Declarations |
| |
| struct ServiceHandlerEntry; |
| class ExplorerBarWindow; |
| |
| // ServiceInfo |
| |
| struct ServiceInfo |
| { |
| CString displayName; |
| char * name; |
| char * type; |
| char * domain; |
| uint32_t ifi; |
| HTREEITEM item; |
| ServiceHandlerEntry * handler; |
| DWORD refs; |
| |
| ServiceInfo( void ) |
| { |
| item = NULL; |
| type = NULL; |
| domain = NULL; |
| handler = NULL; |
| } |
| |
| ~ServiceInfo( void ) |
| { |
| if( name ) |
| { |
| free( name ); |
| } |
| if( type ) |
| { |
| free( type ); |
| } |
| if( domain ) |
| { |
| free( domain ); |
| } |
| } |
| }; |
| |
| typedef CArray < ServiceInfo *, ServiceInfo * > ServiceInfoArray; |
| |
| // TextRecord |
| |
| struct TextRecord |
| { |
| uint8_t * mData; |
| uint16_t mSize; |
| |
| TextRecord( void ) |
| { |
| mData = NULL; |
| mSize = 0; |
| } |
| |
| ~TextRecord( void ) |
| { |
| if( mData ) |
| { |
| free( mData ); |
| } |
| } |
| |
| void GetData( void *outData, uint16_t *outSize ) |
| { |
| if( outData ) |
| { |
| *( (void **) outData ) = mData; |
| } |
| if( outSize ) |
| { |
| *outSize = mSize; |
| } |
| } |
| |
| OSStatus SetData( const void *inData, uint16_t inSize ) |
| { |
| OSStatus err; |
| uint8_t * newData; |
| |
| newData = (uint8_t *) malloc( inSize ); |
| require_action( newData, exit, err = kNoMemoryErr ); |
| memcpy( newData, inData, inSize ); |
| |
| if( mData ) |
| { |
| free( mData ); |
| } |
| mData = newData; |
| mSize = inSize; |
| err = kNoErr; |
| |
| exit: |
| return( err ); |
| } |
| }; |
| |
| // ResolveInfo |
| |
| struct ResolveInfo |
| { |
| CString host; |
| uint16_t port; |
| uint32_t ifi; |
| TextRecord txt; |
| ServiceHandlerEntry * handler; |
| }; |
| |
| // ServiceHandlerEntry |
| |
| struct ServiceHandlerEntry |
| { |
| const char * type; |
| const char * urlScheme; |
| DNSServiceRef ref; |
| ServiceInfoArray array; |
| ExplorerBarWindow * obj; |
| bool needsLogin; |
| |
| ServiceHandlerEntry( void ) |
| { |
| type = NULL; |
| urlScheme = NULL; |
| ref = NULL; |
| obj = NULL; |
| needsLogin = false; |
| } |
| |
| ~ServiceHandlerEntry( void ) |
| { |
| int i; |
| int n; |
| |
| n = (int) array.GetSize(); |
| for( i = 0; i < n; ++i ) |
| { |
| delete array[ i ]; |
| } |
| } |
| }; |
| |
| typedef CArray < ServiceHandlerEntry *, ServiceHandlerEntry * > ServiceHandlerArray; |
| |
| //=========================================================================================================================== |
| // ExplorerBarWindow |
| //=========================================================================================================================== |
| |
| class ExplorerBar; // Forward Declaration |
| |
| class ExplorerBarWindow : public CWnd |
| { |
| protected: |
| |
| ExplorerBar * mOwner; |
| CTreeCtrl mTree; |
| |
| ServiceHandlerArray mServiceHandlers; |
| DNSServiceRef mResolveServiceRef; |
| |
| public: |
| |
| ExplorerBarWindow( void ); |
| virtual ~ExplorerBarWindow( void ); |
| |
| protected: |
| |
| // General |
| |
| afx_msg int OnCreate( LPCREATESTRUCT inCreateStruct ); |
| afx_msg void OnDestroy( void ); |
| afx_msg void OnSize( UINT inType, int inX, int inY ); |
| afx_msg void OnDoubleClick( NMHDR *inNMHDR, LRESULT *outResult ); |
| afx_msg LRESULT OnServiceEvent( WPARAM inWParam, LPARAM inLParam ); |
| |
| // Browsing |
| |
| static void DNSSD_API |
| BrowseCallBack( |
| DNSServiceRef inRef, |
| DNSServiceFlags inFlags, |
| uint32_t inInterfaceIndex, |
| DNSServiceErrorType inErrorCode, |
| const char * inName, |
| const char * inType, |
| const char * inDomain, |
| void * inContext ); |
| LONG OnServiceAdd( ServiceInfo * service ); |
| LONG OnServiceRemove( ServiceInfo * service ); |
| |
| // Resolving |
| |
| OSStatus StartResolve( ServiceInfo *inService ); |
| void StopResolve( void ); |
| |
| |
| void Stop( DNSServiceRef ref ); |
| |
| |
| static void DNSSD_API |
| ResolveCallBack( |
| 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 ); |
| LONG OnResolve( ResolveInfo * resolve ); |
| |
| // Accessors |
| |
| public: |
| |
| ExplorerBar * GetOwner( void ) const { return( mOwner ); } |
| void SetOwner( ExplorerBar *inOwner ) { mOwner = inOwner; } |
| |
| DECLARE_MESSAGE_MAP() |
| private: |
| |
| typedef std::list< DNSServiceRef > ServiceRefList; |
| |
| HTREEITEM m_about; |
| ServiceRefList m_serviceRefs; |
| CImageList m_imageList; |
| }; |
| |
| #endif // __EXPLORER_BAR_WINDOW__ |