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 / src / genlib / client_table / client_table.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 * Purpose: This file defines the functions for clients. It defines 
34 * functions for adding and removing clients to and from the client table, 
35 * adding and accessing subscription and other attributes pertaining to the 
36 * client  
37 ************************************************************************/
38
39 #include "config.h"
40 #include "client_table.h"
41
42 /************************************************************************
43 *       Function :      copy_client_subscription
44 *
45 *       Parameters :
46 *               client_subscription * in ;      - source client subscription
47 *               client_subscription * out ;     - destination client subscription
48 *
49 *       Description :   Make a copy of the client subscription data
50 *
51 *       Return : int ;
52 *               UPNP_E_OUTOF_MEMORY - On Failure to allocate memory
53 *               HTTP_SUCCESS - On Success
54 *
55 *       Note :
56 ************************************************************************/
57 CLIENTONLY( int copy_client_subscription( client_subscription * in,
58                                           client_subscription * out ) {
59             int len = strlen( in->ActualSID ) + 1;
60             int len1 = strlen( in->EventURL ) + 1;
61             memcpy( out->sid, in->sid, SID_SIZE );
62             out->sid[SID_SIZE] = 0;
63             out->ActualSID = ( char * )malloc( len );
64             if( out->ActualSID == NULL )
65                 return UPNP_E_OUTOF_MEMORY;
66             out->EventURL = ( char * )malloc( len1 );
67             if( out->EventURL == NULL ) {
68                 free(out->ActualSID);
69                 return UPNP_E_OUTOF_MEMORY;
70             }
71             memcpy( out->ActualSID, in->ActualSID, len );
72             memcpy( out->EventURL, in->EventURL, len1 );
73             //copies do not get RenewEvent Ids or next
74             out->RenewEventId = -1; out->next = NULL; return HTTP_SUCCESS;}
75
76 /************************************************************************
77 *       Function :      free_client_subscription
78 *
79 *       Parameters :
80 *               client_subscription * sub ;     - Client subscription to be freed
81 *
82 *       Description :   Free memory allocated for client subscription data.
83 *               Remove timer thread associated with this subscription event.
84 *
85 *       Return : void ;
86 *
87 *       Note :
88 ************************************************************************/
89             void free_client_subscription( client_subscription * sub ) {
90             upnp_timeout * event; ThreadPoolJob tempJob; if( sub ) {
91             if( sub->ActualSID )
92             free( sub->ActualSID ); if( sub->EventURL )
93             free( sub->EventURL ); if( sub->RenewEventId != -1 )    //do not remove timer event of copy
94             //invalid timer event id
95             {
96             if( TimerThreadRemove
97                 ( &gTimerThread, sub->RenewEventId, &tempJob ) == 0 ) {
98             event = ( upnp_timeout * ) tempJob.arg;
99             free_upnp_timeout( event );}
100             }
101
102             sub->RenewEventId = -1;}
103             }
104
105 /************************************************************************
106 *       Function :      freeClientSubList
107 *
108 *       Parameters :
109 *               client_subscription * list ; Client subscription 
110 *
111 *       Description :   Free the client subscription table.
112 *
113 *       Return : void ;
114 *
115 *       Note :
116 ************************************************************************/
117             void freeClientSubList( client_subscription * list ) {
118             client_subscription * next; while( list ) {
119             free_client_subscription( list );
120             next = list->next; free( list ); list = next;}
121             }
122
123 /************************************************************************
124 *       Function :      RemoveClientSubClientSID
125 *
126 *       Parameters :
127 *               client_subscription **head ; Head of the subscription list      
128 *               const Upnp_SID sid ;             Subscription ID to be mactched
129 *
130 *       Description :   Remove the client subscription matching the 
131 *               subscritpion id represented by the const Upnp_SID sid parameter 
132 *               from the table and update the table.
133 *
134 *       Return : void ;
135 *
136 *       Note :
137 ************************************************************************/
138             void RemoveClientSubClientSID( client_subscription ** head,
139                                            const Upnp_SID sid ) {
140             client_subscription * finger = ( *head );
141             client_subscription * previous = NULL; while( finger ) {
142             if( !( strcmp( sid, finger->sid ) ) ) {
143             if( previous )
144             previous->next = finger->next;
145             else
146             ( *head ) = finger->next;
147             finger->next = NULL;
148             freeClientSubList( finger ); finger = NULL;}
149             else
150             {
151             previous = finger; finger = finger->next;}
152             }
153             }
154
155 /************************************************************************
156 *       Function :      GetClientSubClientSID
157 *
158 *       Parameters :
159 *               client_subscription *head ; Head of the subscription list       
160 *               const Upnp_SID sid ;            Subscription ID to be matched
161 *
162 *       Description :   Return the client subscription from the client table 
163 *               that matches const Upnp_SID sid subscrition id value. 
164 *
165 *       Return : client_subscription * ; The matching subscription
166 *
167 *       Note :
168 ************************************************************************/
169             client_subscription *
170             GetClientSubClientSID( client_subscription * head,
171                                    const Upnp_SID sid ) {
172             client_subscription * next = head; while( next ) {
173             if( !strcmp( next->sid, sid ) )
174             break;
175             else
176             {
177             next = next->next;}
178             }
179             return next;}
180
181 /************************************************************************
182 *       Function :      GetClientSubActualSID
183 *
184 *       Parameters :
185 *               client_subscription *head ;     Head of the subscription list           
186 *               token * sid ;                           Subscription ID to be matched
187 *
188 *       Description :   Returns the client subscription from the client 
189 *               subscription table that has the matching token * sid buffer
190 *               value.
191 *
192 *       Return : client_subscription * ; The matching subscription
193 *
194 *       Note :
195 ************************************************************************/
196             client_subscription *
197             GetClientSubActualSID( client_subscription * head,
198                                    token * sid ) {
199             client_subscription * next = head; while( next ) {
200
201             if( !memcmp( next->ActualSID, sid->buff, sid->size ) )
202             break;
203             else
204             {
205             next = next->next;}
206             }
207             return next;}
208
209  )