pupnp (libupnp) snapshot from SourceForge: git clone git://pupnp.git.sourceforge...
[igd2-for-linux:pandonghui1211s-igd2-for-linux.git] / pupnp_branch-1.6.x / upnp / sample / tvdevice / linux / upnp_tv_device_main.c
1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2000-2003 Intel Corporation 
4 // All rights reserved. 
5 //
6 // Redistribution and use in source and binary forms, with or without 
7 // modification, are permitted provided that the following conditions are met: 
8 //
9 // * Redistributions of source code must retain the above copyright notice, 
10 // this list of conditions and the following disclaimer. 
11 // * Redistributions in binary form must reproduce the above copyright notice, 
12 // this list of conditions and the following disclaimer in the documentation 
13 // and/or other materials provided with the distribution. 
14 // * Neither name of Intel Corporation nor the names of its contributors 
15 // may be used to endorse or promote products derived from this software 
16 // without specific prior written permission.
17 // 
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR 
22 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
23 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
25 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
26 // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
28 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 ///////////////////////////////////////////////////////////////////////////
31
32
33 #include "sample_util.h"
34 #include "upnp_tv_device.h"
35
36
37 #include <stdio.h>
38
39
40 /******************************************************************************
41  * linux_print
42  *
43  * Description: 
44  *       Prints a string to standard out.
45  *
46  * Parameters:
47  *    None
48  *
49  *****************************************************************************/
50 void
51 linux_print( const char *string )
52 {
53     printf( "%s", string );
54 }
55
56 /******************************************************************************
57  * TvDeviceCommandLoop
58  *
59  * Description: 
60  *       Function that receives commands from the user at the command prompt
61  *       during the lifetime of the device, and calls the appropriate
62  *       functions for those commands. Only one command, exit, is currently
63  *       defined.
64  *
65  * Parameters:
66  *    None
67  *
68  *****************************************************************************/
69 void *
70 TvDeviceCommandLoop( void *args )
71 {
72     int stoploop = 0;
73     char cmdline[100];
74     char cmd[100];
75
76     while( !stoploop ) {
77         sprintf( cmdline, " " );
78         sprintf( cmd, " " );
79
80         SampleUtil_Print( "\n>> " );
81
82         // Get a command line
83         fgets( cmdline, 100, stdin );
84
85         sscanf( cmdline, "%s", cmd );
86
87         if( strcasecmp( cmd, "exit" ) == 0 ) {
88             SampleUtil_Print( "Shutting down...\n" );
89             TvDeviceStop();
90             exit( 0 );
91         } else {
92             SampleUtil_Print( "\n   Unknown command: %s\n\n", cmd );
93             SampleUtil_Print( "   Valid Commands:\n" );
94             SampleUtil_Print( "     Exit\n\n" );
95         }
96
97     }
98
99     return NULL;
100 }
101
102 /******************************************************************************
103  * main
104  *
105  * Description: 
106  *       Main entry point for tv device application.
107  *       Initializes and registers with the sdk.
108  *       Initializes the state stables of the service.
109  *       Starts the command loop.
110  *
111  * Parameters:
112  *    int argc  - count of arguments
113  *    char ** argv -arguments. The application 
114  *                  accepts the following optional arguments:
115  *
116  *                  -ip ipaddress 
117  *                  -port port
118  *                  -desc desc_doc_name 
119  *                  -webdir web_dir_path"
120  *                  -help 
121  *                 
122  *
123  *****************************************************************************/
124 int main( IN int argc, IN char **argv )
125 {
126
127     unsigned int portTemp = 0;
128     char *ip_address = NULL,
129      *desc_doc_name = NULL,
130      *web_dir_path = NULL;
131     int rc;
132     ithread_t cmdloop_thread;
133 #ifndef WIN32
134     int sig;
135     sigset_t sigs_to_catch;
136 #endif
137     int code;
138     unsigned int port = 0;
139     int i = 0;
140
141     SampleUtil_Initialize( linux_print );
142
143     // Parse options
144     for( i = 1; i < argc; i++ ) {
145         if( strcmp( argv[i], "-ip" ) == 0 ) {
146             ip_address = argv[++i];
147         } else if( strcmp( argv[i], "-port" ) == 0 ) {
148             sscanf( argv[++i], "%u", &portTemp );
149         } else if( strcmp( argv[i], "-desc" ) == 0 ) {
150             desc_doc_name = argv[++i];
151         } else if( strcmp( argv[i], "-webdir" ) == 0 ) {
152             web_dir_path = argv[++i];
153         } else if( strcmp( argv[i], "-help" ) == 0 ) {
154             SampleUtil_Print( "Usage: %s -ip ipaddress -port port"
155                               " -desc desc_doc_name -webdir web_dir_path"
156                               " -help (this message)\n", argv[0] );
157             SampleUtil_Print( "\tipaddress:     IP address of the device"
158                               " (must match desc. doc)\n" );
159             SampleUtil_Print( "\t\te.g.: 192.168.0.4\n" );
160             SampleUtil_Print( "\tport:          Port number to use for "
161                               "receiving UPnP messages (must match desc. doc)\n" );
162             SampleUtil_Print( "\t\te.g.: 5431\n" );
163             SampleUtil_Print
164                 ( "\tdesc_doc_name: name of device description document\n" );
165             SampleUtil_Print( "\t\te.g.: tvdevicedesc.xml\n" );
166             SampleUtil_Print
167                 ( "\tweb_dir_path: Filesystem path where web files "
168                   "related to the device are stored\n" );
169             SampleUtil_Print( "\t\te.g.: /upnp/sample/tvdevice/web\n" );
170             return 1;
171         }
172     }
173
174     port = ( unsigned short )portTemp;
175
176     TvDeviceStart( ip_address, port, desc_doc_name, web_dir_path, linux_print );
177
178     /* start a command loop thread */
179     code = ithread_create( &cmdloop_thread, NULL, TvDeviceCommandLoop, NULL );
180
181 #ifndef WIN32
182     /*
183        Catch Ctrl-C and properly shutdown 
184      */
185     sigemptyset( &sigs_to_catch );
186     sigaddset( &sigs_to_catch, SIGINT );
187     sigwait( &sigs_to_catch, &sig );
188
189     SampleUtil_Print( "Shutting down on signal %d...\n", sig );
190 #else
191         ithread_join(cmdloop_thread, NULL);
192 #endif
193     rc = TvDeviceStop();
194     
195     return rc;
196 }
197