Merged from linuxport rev21200:21590. Updated.
[xbmc:xbmc-antiquated.git] / XBMC / xbmc / lib / libUPnP / Platinum / Source / Tests / FileMediaServer / FileMediaServerTest.cpp
1 /*****************************************************************
2 |
3 |   Platinum - Test UPnP A/V MediaServer
4 |
5 |
6 | Copyright (c) 2004-2008, Plutinosoft, LLC.
7 | All rights reserved.
8 | http://www.plutinosoft.com
9 |
10 | This program is free software; you can redistribute it and/or
11 | modify it under the terms of the GNU General Public License
12 | as published by the Free Software Foundation; either version 2
13 | of the License, or (at your option) any later version.
14 |
15 | OEMs, ISVs, VARs and other distributors that combine and 
16 | distribute commercially licensed software with Platinum software
17 | and do not wish to distribute the source code for the commercially
18 | licensed software under version 2, or (at your option) any later
19 | version, of the GNU General Public License (the "GPL") must enter
20 | into a commercial license agreement with Plutinosoft, LLC.
21
22 | This program is distributed in the hope that it will be useful,
23 | but WITHOUT ANY WARRANTY; without even the implied warranty of
24 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 | GNU General Public License for more details.
26 |
27 | You should have received a copy of the GNU General Public License
28 | along with this program; see the file LICENSE.txt. If not, write to
29 | the Free Software Foundation, Inc., 
30 | 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
31 | http://www.gnu.org/licenses/gpl-2.0.html
32 |
33 ****************************************************************/
34
35 /*----------------------------------------------------------------------
36 |   includes
37 +---------------------------------------------------------------------*/
38 #include "PltUPnP.h"
39 #include "PltFileMediaServer.h"
40
41 #include <stdlib.h>
42
43 NPT_SET_LOCAL_LOGGER("platinum.media.server.file.test")
44
45 //#define BROADCAST_TEST 1
46
47 /*----------------------------------------------------------------------
48 |   globals
49 +---------------------------------------------------------------------*/
50 struct Options {
51     const char* path;
52     const char* friendly_name;
53     bool        broadcast;
54     NPT_UInt32  port;
55 } Options;
56
57 /*----------------------------------------------------------------------
58 |   PrintUsageAndExit
59 +---------------------------------------------------------------------*/
60 static void
61 PrintUsageAndExit()
62 {
63     fprintf(stderr, "usage: FileMediaServerTest [-f <friendly_name>] [-p <port>] [-b] <path>\n");
64     fprintf(stderr, "-f : optional upnp device friendly name\n");
65     fprintf(stderr, "-b : optional upnp device broadcast mode\n");
66     fprintf(stderr, "-p : optional http port\n");
67     fprintf(stderr, "<path> : local path to serve\n");
68     exit(1);
69 }
70
71 /*----------------------------------------------------------------------
72 |   ParseCommandLine
73 +---------------------------------------------------------------------*/
74 static void
75 ParseCommandLine(char** args)
76 {
77     const char* arg;
78
79     /* default values */
80     Options.path     = NULL;
81     Options.friendly_name = NULL;
82     Options.broadcast = false;
83     Options.port = 0;
84
85     while ((arg = *args++)) {
86         if (!strcmp(arg, "-f")) {
87             Options.friendly_name = *args++;
88         } else if (!strcmp(arg, "-p")) {
89             if (NPT_FAILED(NPT_ParseInteger32(*args++, Options.port))) {
90                 fprintf(stderr, "ERROR: invalid argument\n");
91                 PrintUsageAndExit();
92             }
93         } else if (!strcmp(arg, "-b")) {
94             Options.broadcast = true;
95         } else if (Options.path == NULL) {
96             Options.path = arg;
97         } else {
98             fprintf(stderr, "ERROR: too many arguments\n");
99             PrintUsageAndExit();
100         }
101     }
102
103     /* check args */
104     if (Options.path == NULL) {
105         fprintf(stderr, "ERROR: path missing\n");
106         PrintUsageAndExit();
107     }
108 }
109
110 /*----------------------------------------------------------------------
111 |   main
112 +---------------------------------------------------------------------*/
113 int
114 main(int /* argc */, char** argv)
115 {
116     /* parse command line */
117     ParseCommandLine(argv+1);
118     
119     PLT_UPnP upnp(1900, !Options.broadcast);
120
121     PLT_DeviceHostReference device(
122         new PLT_FileMediaServer(
123             Options.path, 
124             Options.friendly_name?Options.friendly_name:"Platinum UPnP Media Server",
125             false,
126             "SAMEDEVICEGUID",
127             (NPT_UInt16)Options.port)
128             );
129
130     NPT_List<NPT_IpAddress> list;
131     NPT_CHECK_SEVERE(PLT_UPnPMessageHelper::GetIPAddresses(list));
132     NPT_String ip = list.GetFirstItem()->ToString();
133
134     device->m_ModelDescription = "Platinum File Media Server";
135     device->m_ModelURL = "http://www.plutinosoft.com/";
136     device->m_ModelNumber = "1.0";
137     device->m_ModelName = "Platinum File Media Server";
138     device->m_Manufacturer = "Plutinosoft";
139     device->m_ManufacturerURL = "http://www.plutinosoft.com/";
140
141     if (Options.broadcast) device->SetBroadcast(true);
142
143     upnp.AddDevice(device);
144     NPT_String uuid = device->GetUUID();
145
146     NPT_CHECK_SEVERE(upnp.Start());
147     NPT_LOG_INFO("Press 'q' to quit.");
148
149     char buf[256];
150     while (gets(buf)) {
151         if (*buf == 'q')
152             break;
153     }
154
155     upnp.Stop();
156
157     return 0;
158 }