macOS: Add missing array initialization
[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         _rendererItems = [NSMutableArray array];
69     }
70     return self;
71 }
72
73 - (void)dealloc
74 {
75     [self stopDiscovery];
76 }
77
78 - (bool)startDiscovery
79 {
80     struct vlc_renderer_discovery_owner owner =
81     {
82         (__bridge void *) self,
83         renderer_event_item_added,
84         renderer_event_item_removed,
85     };
86
87     p_intf = getIntf();
88
89     msg_Dbg(p_intf, "Starting renderer discovery service %s", _name.UTF8String);
90     // Create renderer object
91     p_rd = vlc_rd_new(VLC_OBJECT(p_intf), _name.UTF8String, &owner);
92
93     if (!p_rd) {
94         msg_Err(p_intf, "Could not create '%s' renderer discovery service", _name.UTF8String);
95         return false;
96     }
97
98     return true;
99 }
100
101 - (void)stopDiscovery
102 {
103     if (p_rd != NULL) {
104         vlc_rd_release(p_rd);
105         p_rd = NULL;
106     }
107 }
108
109 - (void)handleItemAdded:(const vlc_renderer_item_t *)base_item
110 {
111     VLCRendererItem *item = [[VLCRendererItem alloc] initWithRendererItem:base_item];
112     [_rendererItems addObject:item];
113     if (_delegate)
114         [_delegate addedRendererItem:item from:self];
115 }
116
117 - (void)handleItemRemoved:(const vlc_renderer_item_t *)base_item
118 {
119     VLCRendererItem *result_item = nil;
120     for (VLCRendererItem *item in _rendererItems) {
121         if (item.rendererItem == base_item) {
122             result_item = item;
123             return;
124         }
125     }
126     if (result_item) {
127         [_rendererItems removeObject:result_item];
128         if (_delegate)
129             [_delegate removedRendererItem:result_item from:self];
130     } else {
131         msg_Err(p_intf, "VLCRendererDiscovery could not find item to remove!");
132     }
133 }
134
135 @end