001    package com.github.sarxos.webcam.ds.ipcam;
002    
003    import java.net.MalformedURLException;
004    import java.net.URL;
005    import java.util.ArrayList;
006    import java.util.Collections;
007    import java.util.Iterator;
008    import java.util.List;
009    
010    import com.github.sarxos.webcam.Webcam;
011    import com.github.sarxos.webcam.WebcamDevice;
012    import com.github.sarxos.webcam.WebcamException;
013    
014    
015    /**
016     * Class used to register IP camera devices.
017     * 
018     * @author Bartosz Firyn (SarXos)
019     */
020    public class IpCamDeviceRegistry {
021    
022            /**
023             * Contains IP cameras.
024             */
025            private static final List<IpCamDevice> DEVICES = new ArrayList<IpCamDevice>();
026    
027            /**
028             * Register IP camera.
029             * 
030             * @param ipcam the IP camera to be register
031             */
032            public static IpCamDevice register(IpCamDevice ipcam) {
033    
034                    for (WebcamDevice d : DEVICES) {
035                            String name = ipcam.getName();
036                            if (d.getName().equals(name)) {
037                                    throw new WebcamException(String.format("Webcam with name '%s' is already registered", name));
038                            }
039                    }
040    
041                    DEVICES.add(ipcam);
042    
043                    // run discovery service once to trigger new webcam discovery event
044                    // and keep webcams list up-to-date
045    
046                    Webcam.getDiscoveryService().scan();
047    
048                    return ipcam;
049            }
050    
051            public static IpCamDevice register(String name, String url, IpCamMode mode) throws MalformedURLException {
052                    return register(new IpCamDevice(name, url, mode));
053            }
054    
055            public static IpCamDevice register(String name, URL url, IpCamMode mode) {
056                    return register(new IpCamDevice(name, url, mode));
057            }
058    
059            public static IpCamDevice register(String name, String url, IpCamMode mode, IpCamAuth auth) throws MalformedURLException {
060                    return register(new IpCamDevice(name, url, mode, auth));
061            }
062    
063            public static IpCamDevice register(String name, URL url, IpCamMode mode, IpCamAuth auth) {
064                    return register(new IpCamDevice(name, url, mode, auth));
065            }
066    
067            public static boolean isRegistered(IpCamDevice ipcam) {
068                    Iterator<IpCamDevice> di = DEVICES.iterator();
069                    while (di.hasNext()) {
070                            if (di.next().getName().equals(ipcam.getName())) {
071                                    return true;
072                            }
073                    }
074                    return false;
075            }
076    
077            public static boolean isRegistered(String name) {
078                    Iterator<IpCamDevice> di = DEVICES.iterator();
079                    while (di.hasNext()) {
080                            if (di.next().equals(name)) {
081                                    return true;
082                            }
083                    }
084                    return false;
085            }
086    
087            public static boolean isRegistered(URL url) {
088                    for (IpCamDevice d : DEVICES) {
089                            if (d.getURL().equals(url)) {
090                                    return true;
091                            }
092                    }
093                    return false;
094            }
095    
096            /**
097             * Unregister IP camera.
098             * 
099             * @param ipcam the IP camera to be unregister
100             */
101            public static boolean unregister(IpCamDevice ipcam) {
102                    boolean removed = DEVICES.remove(ipcam);
103    
104                    // run discovery service once if device has been removed to
105                    // trigger disconnected webcam discovery event and keep webcams
106                    // list up-to-date
107    
108                    if (removed) {
109                            Webcam.getDiscoveryService().scan();
110                    }
111    
112                    return removed;
113            }
114    
115            /**
116             * Unregister IP camera with given name.
117             * 
118             * @param ipcam the IP camera to be unregister
119             */
120            public static boolean unregister(String name) {
121                    Iterator<IpCamDevice> di = DEVICES.iterator();
122                    while (di.hasNext()) {
123                            IpCamDevice d = di.next();
124                            if (d.getName().equals(name)) {
125                                    di.remove();
126                                    Webcam.getDiscoveryService().scan();
127                                    return true;
128                            }
129                    }
130                    return false;
131            }
132    
133            /**
134             * Get all registered IP cameras.
135             * 
136             * @return Collection of registered IP cameras
137             */
138            public static List<IpCamDevice> getIpCameras() {
139                    return Collections.unmodifiableList(DEVICES);
140            }
141    }