1/* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef __EXPLORER_BAR_WINDOW__
19#define __EXPLORER_BAR_WINDOW__
20
21#pragma once
22
23#include    "afxtempl.h"
24
25#include    "dns_sd.h"
26#include    <list>
27
28//===========================================================================================================================
29//	Structures
30//===========================================================================================================================
31
32// Forward Declarations
33
34struct  ServiceHandlerEntry;
35class ExplorerBarWindow;
36
37// ServiceInfo
38
39struct  ServiceInfo
40{
41    CString displayName;
42    char *                      name;
43    char *                      type;
44    char *                      domain;
45    uint32_t ifi;
46    HTREEITEM item;
47    ServiceHandlerEntry *       handler;
48    DWORD refs;
49
50    ServiceInfo( void )
51    {
52        item    = NULL;
53        type    = NULL;
54        domain  = NULL;
55        handler = NULL;
56    }
57
58    ~ServiceInfo( void )
59    {
60        if( name )
61        {
62            free( name );
63        }
64        if( type )
65        {
66            free( type );
67        }
68        if( domain )
69        {
70            free( domain );
71        }
72    }
73};
74
75typedef CArray < ServiceInfo *, ServiceInfo * >     ServiceInfoArray;
76
77// TextRecord
78
79struct  TextRecord
80{
81    uint8_t *       mData;
82    uint16_t mSize;
83
84    TextRecord( void )
85    {
86        mData = NULL;
87        mSize = 0;
88    }
89
90    ~TextRecord( void )
91    {
92        if( mData )
93        {
94            free( mData );
95        }
96    }
97
98    void    GetData( void *outData, uint16_t *outSize )
99    {
100        if( outData )
101        {
102            *( (void **) outData ) = mData;
103        }
104        if( outSize )
105        {
106            *outSize = mSize;
107        }
108    }
109
110    OSStatus    SetData( const void *inData, uint16_t inSize )
111    {
112        OSStatus err;
113        uint8_t *       newData;
114
115        newData = (uint8_t *) malloc( inSize );
116        require_action( newData, exit, err = kNoMemoryErr );
117        memcpy( newData, inData, inSize );
118
119        if( mData )
120        {
121            free( mData );
122        }
123        mData = newData;
124        mSize = inSize;
125        err  = kNoErr;
126
127exit:
128        return( err );
129    }
130};
131
132// ResolveInfo
133
134struct  ResolveInfo
135{
136    CString host;
137    uint16_t port;
138    uint32_t ifi;
139    TextRecord txt;
140    ServiceHandlerEntry *       handler;
141};
142
143// ServiceHandlerEntry
144
145struct  ServiceHandlerEntry
146{
147    const char *            type;
148    const char *            urlScheme;
149    DNSServiceRef ref;
150    ServiceInfoArray array;
151    ExplorerBarWindow *     obj;
152    bool needsLogin;
153
154    ServiceHandlerEntry( void )
155    {
156        type        = NULL;
157        urlScheme   = NULL;
158        ref         = NULL;
159        obj         = NULL;
160        needsLogin  = false;
161    }
162
163    ~ServiceHandlerEntry( void )
164    {
165        int i;
166        int n;
167
168        n = (int) array.GetSize();
169        for( i = 0; i < n; ++i )
170        {
171            delete array[ i ];
172        }
173    }
174};
175
176typedef CArray < ServiceHandlerEntry *, ServiceHandlerEntry * >     ServiceHandlerArray;
177
178//===========================================================================================================================
179//	ExplorerBarWindow
180//===========================================================================================================================
181
182class ExplorerBar;      // Forward Declaration
183
184class ExplorerBarWindow : public CWnd
185{
186protected:
187
188ExplorerBar *           mOwner;
189CTreeCtrl mTree;
190
191ServiceHandlerArray mServiceHandlers;
192DNSServiceRef mResolveServiceRef;
193
194public:
195
196ExplorerBarWindow( void );
197virtual ~ExplorerBarWindow( void );
198
199protected:
200
201// General
202
203afx_msg int     OnCreate( LPCREATESTRUCT inCreateStruct );
204afx_msg void    OnDestroy( void );
205afx_msg void    OnSize( UINT inType, int inX, int inY );
206afx_msg void    OnDoubleClick( NMHDR *inNMHDR, LRESULT *outResult );
207afx_msg LRESULT OnServiceEvent( WPARAM inWParam, LPARAM inLParam );
208
209// Browsing
210
211static void DNSSD_API
212BrowseCallBack(
213    DNSServiceRef inRef,
214    DNSServiceFlags inFlags,
215    uint32_t inInterfaceIndex,
216    DNSServiceErrorType inErrorCode,
217    const char *            inName,
218    const char *            inType,
219    const char *            inDomain,
220    void *                  inContext );
221LONG OnServiceAdd( ServiceInfo * service );
222LONG OnServiceRemove( ServiceInfo * service );
223
224// Resolving
225
226OSStatus    StartResolve( ServiceInfo *inService );
227void        StopResolve( void );
228
229
230void        Stop( DNSServiceRef ref );
231
232
233static void DNSSD_API
234ResolveCallBack(
235    DNSServiceRef inRef,
236    DNSServiceFlags inFlags,
237    uint32_t inInterfaceIndex,
238    DNSServiceErrorType inErrorCode,
239    const char *            inFullName,
240    const char *            inHostName,
241    uint16_t inPort,
242    uint16_t inTXTSize,
243    const char *            inTXT,
244    void *                  inContext );
245LONG OnResolve( ResolveInfo * resolve );
246
247// Accessors
248
249public:
250
251ExplorerBar *   GetOwner( void ) const { return( mOwner ); }
252void            SetOwner( ExplorerBar *inOwner )    { mOwner = inOwner; }
253
254DECLARE_MESSAGE_MAP()
255private:
256
257typedef std::list< DNSServiceRef >  ServiceRefList;
258
259HTREEITEM m_about;
260ServiceRefList m_serviceRefs;
261CImageList m_imageList;
262};
263
264#endif  // __EXPLORER_BAR_WINDOW__
265