]> git.saurik.com Git - apple/mdnsresponder.git/blobdiff - mDNSWindows/Applications/ExplorerPlugin/ExplorerBarWindow.h
mDNSResponder-66.3.tar.gz
[apple/mdnsresponder.git] / mDNSWindows / Applications / ExplorerPlugin / ExplorerBarWindow.h
diff --git a/mDNSWindows/Applications/ExplorerPlugin/ExplorerBarWindow.h b/mDNSWindows/Applications/ExplorerPlugin/ExplorerBarWindow.h
new file mode 100644 (file)
index 0000000..ac234f5
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+
+    Change History (most recent first):
+    
+$Log: ExplorerBarWindow.h,v $
+Revision 1.3  2004/04/15 01:00:05  bradley
+Removed support for automatically querying for A/AAAA records when resolving names. Platforms
+without .local name resolving support will need to manually query for A/AAAA records as needed.
+
+Revision 1.2  2004/04/08 09:43:43  bradley
+Changed callback calling conventions to __stdcall so they can be used with C# delegates.
+
+Revision 1.1  2004/01/30 03:01:56  bradley
+Explorer Plugin to browse for Rendezvous-enabled Web and FTP servers from within Internet Explorer.
+
+*/
+
+#ifndef        __EXPLORER_BAR_WINDOW__
+#define        __EXPLORER_BAR_WINDOW__
+
+#pragma once
+
+#include       "afxtempl.h"
+
+#include       "DNSSD.h"
+
+//===========================================================================================================================
+//     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;
+       
+       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;
+       size_t                  mSize;
+       
+       TextRecord( void )
+       {
+               mData = NULL;
+               mSize = 0;
+       }
+       
+       ~TextRecord( void )
+       {
+               if( mData )
+               {
+                       free( mData );
+               }
+       }
+       
+       void    GetData( void *outData, size_t *outSize )
+       {
+               if( outData )
+               {
+                       *( (void **) outData ) = mData;
+               }
+               if( outSize )
+               {
+                       *outSize = mSize;
+               }
+       }
+       
+       OSStatus        SetData( const void *inData, size_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;
+       HTREEITEM                               treeItem;
+       bool                                    treeFirst;
+       ExplorerBarWindow *             obj;
+       bool                                    needsLogin;
+       
+       ServiceHandlerEntry( void )
+       {
+               type            = NULL;
+               urlScheme       = NULL;
+               ref             = NULL;
+               treeItem        = NULL;
+               treeFirst       = true;
+               obj                     = NULL;
+               needsLogin      = false;
+       }
+       
+       ~ServiceHandlerEntry( void )
+       {
+               if( ref )
+               {
+                       DNSServiceRefDeallocate( ref );
+               }
+               
+               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 );
+               
+               // Browsing
+               
+               static void CALLBACK_COMPAT
+                       BrowseCallBack(
+                               DNSServiceRef                   inRef,
+                               DNSServiceFlags                 inFlags,
+                               uint32_t                                inInterfaceIndex,
+                               DNSServiceErrorType     inErrorCode,
+                               const char *                    inName, 
+                               const char *                    inType, 
+                               const char *                    inDomain,       
+                               void *                                  inContext );
+               afx_msg LONG OnServiceAdd( WPARAM inWParam, LPARAM inLParam );
+               afx_msg LONG OnServiceRemove( WPARAM inWParam, LPARAM inLParam );
+               
+               // Resolving
+               
+               OSStatus        StartResolve( ServiceInfo *inService );
+               void            StopResolve( void );
+
+               static void CALLBACK_COMPAT
+                       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 );
+               afx_msg LONG OnResolve( WPARAM inWParam, LPARAM inLParam );             
+                               
+               // Accessors
+       
+       public:
+       
+               ExplorerBar *   GetOwner( void ) const                          { return( mOwner ); }
+               void                    SetOwner( ExplorerBar *inOwner )        { mOwner = inOwner; }
+               
+               DECLARE_MESSAGE_MAP()
+};
+
+#endif // __EXPLORER_BAR_WINDOW__