2a4cfba03a1f2256b263e35be832e2925bd5b9c8
[vlc.git] / modules / gui / macosx / VLCRendererDiscovery.m
1 /*****************************************************************************
2  * VLCRendererDiscovery.m: Wrapper class for vlc_renderer_discovery_t
3  *****************************************************************************
4  * Copyright (C) 2016 VLC authors and VideoLAN
5  * $Id$
6  *
7  * Authors: Marvin Scholz <epirat07 at gmail dot com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 #import "VLCRendererDiscovery.h"
25
26 #import "VLCMain.h"
27
28 #include <vlc_common.h>
29 #include <vlc_renderer_discovery.h>
30
31 @interface VLCRendererDiscovery ()
32 {
33     intf_thread_t               *p_intf;
34     vlc_renderer_discovery_t    *p_rd;
35 }
36
37 - (void)handleItemAdded:(const vlc_renderer_item_t *)item;
38 - (void)handleItemRemoved:(const vlc_renderer_item_t *)item;
39 @end
40
41 // C callback event handler functions
42 static void renderer_event_item_added(vlc_renderer_discovery_t *rd,
43                                       vlc_renderer_item_t *item)
44 {
45     VLCRendererDiscovery *target = (__bridge VLCRendererDiscovery*)rd->owner.sys;
46     [target handleItemAdded:item];
47 }
48
49 static void renderer_event_item_removed(vlc_renderer_discovery_t *rd,
50                                         vlc_renderer_item_t *item)
51 {
52     VLCRendererDiscovery *target = (__bridge VLCRendererDiscovery*)rd->owner.sys;
53     [target handleItemRemoved:item];
54 }
55
56 @implementation VLCRendererDiscovery
57
58 - (instancetype)initWithName:(const char*)name andLongname:(const char*)longname
59 {
60     self = [super init];
61
62     if (self) {
63         if (!name)
64             [NSException raise:NSInvalidArgumentException
65                         format:@"name must not be nil"];
66         _name = [NSString stringWithUTF8String:name];
67         _longName = (!longname) ? nil : [NSString stringWithUTF8String:longname];
68     }
69     return self;
70 }
71
72 - (void)dealloc
73 {
74     [self stopDiscovery];
75 }
76
77 - (bool)startDiscovery
78 {
79     struct vlc_renderer_discovery_owner owner =
80     {
81         (__bridge void *) self,
82         renderer_event_item_added,
83         renderer_event_item_removed,
84     };
85
86     p_intf = getIntf();
87
88     msg_Dbg(p_intf, "Starting renderer discovery service %s", _name.UTF8String);
89     // Create renderer object
90     p_rd = vlc_rd_new(VLC_OBJECT(p_intf), _name.UTF8String, &owner);
91
92     if (!p_rd) {
93         msg_Err(p_intf, "Could not create '%s' renderer discovery service", _name.UTF8String);
94         return false;
95     }
96
97     return true;
98 }
99
100 - (void)stopDiscovery
101 {
102     if (p_rd != NULL) {
103         vlc_rd_release(p_rd);
104         p_rd = NULL;
105     }
106 }
107
108 - (void)handleItemAdded:(const vlc_renderer_item_t *)base_item
109 {
110     VLCRendererItem *item = [[VLCRendererItem alloc] initWithRendererItem:base_item];
111     [_rendererItems addObject:item];
112     if (_delegate)
113         [_delegate addedRendererItem:item from:self];
114 }
115
116 - (void)handleItemRemoved:(const vlc_renderer_item_t *)base_item
117 {
118     VLCRendererItem *result_item = nil;
119     for (VLCRendererItem *item in _rendererItems) {
120         if (item.rendererItem == base_item) {
121             result_item = item;
122             return;
123         }
124     }
125     if (result_item) {
126         [_rendererItems removeObject:result_item];
127         if (_delegate)
128             [_delegate removedRendererItem:result_item from:self];
129     } else {
130         msg_Err(p_intf, "VLCRendererDiscovery could not find item to remove!");
131     }
132 }
133
134 @end