|
reSIProcate/stack
9694
|
00001 00002 #include <iostream> 00003 #include <memory> 00004 #include <list> 00005 00006 #include "rutil/DataStream.hxx" 00007 00008 #include "resip/stack/SipMessage.hxx" 00009 #include "resip/stack/Helper.hxx" 00010 #include "resip/stack/Uri.hxx" 00011 #include "resip/stack/SipFrag.hxx" 00012 #include "resip/stack/MultipartMixedContents.hxx" 00013 #include "resip/stack/Pidf.hxx" 00014 #include "TestSupport.hxx" 00015 #include "rutil/Logger.hxx" 00016 #include "resip/stack/test/tassert.h" 00017 00018 using namespace resip; 00019 using namespace std; 00020 00021 #define CRLF "\r\n" 00022 00023 #define RESIPROCATE_SUBSYSTEM Subsystem::TEST 00024 00025 int 00026 main(int argc, char* argv[]) 00027 { 00028 tassert_init(5); 00029 00030 Log::initialize(Log::Cout, Log::Info, argv[0]); 00031 00032 { 00033 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00034 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00035 "To: Bob <sip:bob@biloxi.com>\r\n" 00036 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00037 "Call-ID: a84b4c76e66710\r\n" 00038 "CSeq: 314159 INVITE\r\n" 00039 "Max-Forwards: 70\r\n" 00040 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00041 "Content-Type: message/sipfrag\r\n" 00042 "Content-Length: 59\r\n" 00043 "\r\n" 00044 "Content-Type: text/plain\r\n" 00045 "Content-Length: 11\r\n" 00046 "\r\n" 00047 "Hi There!\r\n"); 00048 00049 try 00050 { 00051 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00052 Contents* body = msg->getContents(); 00053 00054 assert(body != 0); 00055 SipFrag* frag = dynamic_cast<SipFrag*>(body); 00056 assert(frag != 0); 00057 assert(frag->message().header(h_ContentType) == Mime("text", "plain")); 00058 assert(frag->message().header(h_ContentLength).value() == 11); 00059 assert(!(frag->message().isRequest() ||frag->message().isResponse())); 00060 } 00061 catch (BaseException& e) 00062 { 00063 assert(false); 00064 } 00065 } 00066 00067 // test from RFC3420 00068 { 00069 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00070 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00071 "To: Bob <sip:bob@biloxi.com>\r\n" 00072 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00073 "Call-ID: a84b4c76e66710\r\n" 00074 "CSeq: 314159 INVITE\r\n" 00075 "Max-Forwards: 70\r\n" 00076 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00077 "Content-Type: message/sipfrag\r\n" 00078 "Content-Length: 38\r\n" 00079 "\r\n" 00080 "INVITE sip:alice@atlanta.com SIP/2.0\r\n"); 00081 00082 try 00083 { 00084 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00085 } 00086 catch (BaseException& e) 00087 { 00088 assert(false); 00089 } 00090 } 00091 00092 { 00093 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00094 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00095 "To: Bob <sip:bob@biloxi.com>\r\n" 00096 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00097 "Call-ID: a84b4c76e66710\r\n" 00098 "CSeq: 314159 INVITE\r\n" 00099 "Max-Forwards: 70\r\n" 00100 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00101 "Content-Type: message/sipfrag\r\n" 00102 "Content-Length: 22\r\n" 00103 "\r\n" 00104 "SIP/2.0 603 Declined\r\n"); 00105 00106 try 00107 { 00108 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00109 } 00110 catch (BaseException& e) 00111 { 00112 assert(false); 00113 } 00114 } 00115 00116 { 00117 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00118 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00119 "To: Bob <sip:bob@biloxi.com>\r\n" 00120 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00121 "Call-ID: a84b4c76e66710\r\n" 00122 "CSeq: 314159 INVITE\r\n" 00123 "Max-Forwards: 70\r\n" 00124 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00125 "Content-Type: message/sipfrag\r\n" 00126 "Content-Length: 150\r\n" 00127 "\r\n" 00128 "REGISTER sip:atlanta.com SIP/2.0\r\n" 00129 "To: sip:alice@atlanta.com\r\n" 00130 "Contact: <sip:alicepc@atlanta.com>;q=0.9,\r\n" 00131 " <sip:alicemobile@atlanta.com>;q=0.1\r\n"); 00132 00133 try 00134 { 00135 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00136 } 00137 catch (BaseException& e) 00138 { 00139 assert(false); 00140 } 00141 } 00142 00143 { 00144 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00145 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00146 "To: Bob <sip:bob@biloxi.com>\r\n" 00147 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00148 "Call-ID: a84b4c76e66710\r\n" 00149 "CSeq: 314159 INVITE\r\n" 00150 "Max-Forwards: 70\r\n" 00151 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00152 "Content-Type: message/sipfrag\r\n" 00153 "Content-Length: 89\r\n" 00154 "\r\n" 00155 "SIP/2.0 400 Bad Request\r\n" 00156 "Warning: 399 atlanta.com Your Event header field was malformed\r\n"); 00157 00158 try 00159 { 00160 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00161 } 00162 catch (BaseException& e) 00163 { 00164 assert(false); 00165 } 00166 } 00167 00168 { 00169 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00170 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00171 "To: Bob <sip:bob@biloxi.com>\r\n" 00172 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00173 "Call-ID: a84b4c76e66710\r\n" 00174 "CSeq: 314159 INVITE\r\n" 00175 "Max-Forwards: 70\r\n" 00176 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00177 "Content-Type: message/sipfrag\r\n" 00178 "Content-Length: 259\r\n" 00179 "\r\n" 00180 "From: Alice <sip:alice@atlanta.com>\r\n" 00181 "To: Bob <sip:bob@biloxi.com>\r\n" 00182 "Contact: <sip:alice@pc33.atlanta.com>>href=mailto:<sip:alice@pc33.atlanta.com>><sip:alice@pc33.atlanta.com>\r\n" 00183 "Date: Thu, 21 Feb 2002 13:02:03 GMT\r\n" 00184 "Call-ID: a84b4c76e66710\r\n" 00185 "Cseq: 314159 INVITE\r\n"); 00186 00187 try 00188 { 00189 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00190 } 00191 catch (BaseException& e) 00192 { 00193 assert(false); 00194 } 00195 } 00196 00197 { 00198 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00199 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00200 "To: Bob <sip:bob@biloxi.com>\r\n" 00201 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00202 "Call-ID: a84b4c76e66710\r\n" 00203 "CSeq: 314159 INVITE\r\n" 00204 "Max-Forwards: 70\r\n" 00205 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00206 "Content-Type: message/sipfrag\r\n" 00207 "Content-Length: 150\r\n" 00208 "\r\n" 00209 "SIP/2.0 200 OK\r\n" 00210 "Content-Type: application/sdp\r\n" 00211 "Content-Length: 314\r\n" 00212 "\r\n" 00213 "v=0\r\n" 00214 "o=alice 2890844526 2890844526 IN IP4 host.anywhere.com\r\n" 00215 "s=\r\n" 00216 "c=IN IP4 host.anywhere.com\r\n" 00217 "t=0 0\r\n" 00218 "m=audio 49170 RTP/AVP 0\r\n" 00219 "a=rtpmap:0 PCMU/8000\r\n" 00220 "m=video 51372 RTP/AVP 31\r\n" 00221 "a=rtpmap:31 H261/90000\r\n" 00222 "m=video 53000 RTP/AVP 32\r\n" 00223 "a=rtpmap:32 MPV/90000"); 00224 try 00225 { 00226 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00227 } 00228 catch (BaseException& e) 00229 { 00230 assert(false); 00231 } 00232 } 00233 00234 00235 { 00236 // !ah! This test doesn't work with the MsgHeaderScanner -- works w/ preparser. 00237 00238 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00239 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00240 "To: Bob <sip:bob@biloxi.com>\r\n" 00241 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00242 "Call-ID: a84b4c76e66710\r\n" 00243 "CSeq: 314159 INVITE\r\n" 00244 "Max-Forwards: 70\r\n" 00245 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00246 "Content-Type: message/sipfrag\r\n" 00247 "Content-Length: 35\r\n" 00248 "\r\n" 00249 "INVITE sip:bob@biloxi.com SIP/2.0\r\n"); 00250 std::cout << "hiya " << std::endl; 00251 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00252 00253 Contents* body = msg->getContents(); 00254 00255 tassert(body != 0); 00256 SipFrag* frag = dynamic_cast<SipFrag*>(body); 00257 tassert(frag != 0); 00258 00259 cout << "!! "; 00260 frag->encode(resipCout); 00261 00262 tassert(frag->message().header(h_RequestLine).uri().user() == "bob"); 00263 msg->encode(resipCout); 00264 tassert_verify(1); 00265 } 00266 00267 { 00268 tassert_reset(); 00269 // tests end of message problem (MsgHeaderScanner?) 00270 Data txt("NOTIFY sip:proxy@66.7.238.210:5060 SIP/2.0" CRLF 00271 "Via: SIP/2.0/UDP 66.7.238.211:5060" CRLF 00272 "From: <sip:4155540578@66.7.238.211>;tag=525CEC-12FE" CRLF 00273 "To: <sip:4082401918@larry.gloo.net>;tag=1fd9ba58" CRLF 00274 "Date: Tue, 23 Sep 2003 05:18:21 GMT" CRLF 00275 "Call-ID: 2A599BF9-ECBC11D7-8026C991-401DDB71@66.7.238.211" CRLF 00276 "User-Agent: Cisco-SIPGateway/IOS-12.x" CRLF 00277 "Max-Forwards: 6" CRLF 00278 "Route: <sip:AUTO@larry.gloo.net:5200>" CRLF 00279 "Timestamp: 1064294301" CRLF 00280 "CSeq: 102 NOTIFY" CRLF 00281 "Event: refer" CRLF 00282 "Contact: <sip:4155540578@66.7.238.211:5060>" CRLF 00283 "Content-Length: 35" CRLF 00284 "Content-Type: message/sipfrag" CRLF 00285 CRLF 00286 "SIP/2.0 503 Service Unavailable" CRLF " " 00287 00288 // space causes MsgHeaderScanner to claim not at end of message 00289 // .dlb. this is correct: message-header is terminated with CRLF. 00290 00291 CRLF); 00292 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00293 00294 Contents* body = msg->getContents(); 00295 00296 tassert(body != 0); 00297 SipFrag* frag = dynamic_cast<SipFrag*>(body); 00298 tassert(frag != 0); 00299 00300 tassert(frag->message().header(h_StatusLine).responseCode() == 503); 00301 msg->encode(resipCout); 00302 tassert_verify(2); 00303 } 00304 00305 { 00306 tassert_reset(); 00307 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00308 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00309 "To: Bob <sip:bob@biloxi.com>\r\n" 00310 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00311 "Call-ID: a84b4c76e66710\r\n" 00312 "CSeq: 314159 INVITE\r\n" 00313 "Max-Forwards: 70\r\n" 00314 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00315 "Content-Type: message/sipfrag\r\n" 00316 "\r\n" 00317 "INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00318 "From: Alice <sip:alice@atlanta.com>\r\n" 00319 "To: Bob <sip:bob@biloxi.com>\r\n" 00320 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00321 "Date: Thu, 21 Feb 2002 13:02:03 GMT\r\n" 00322 "Call-ID: a84b4c76e66710\r\n" 00323 "Cseq: 314159 INVITE"); 00324 00325 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00326 00327 Contents* body = msg->getContents(); 00328 00329 tassert(body != 0); 00330 SipFrag* frag = dynamic_cast<SipFrag*>(body); 00331 tassert(frag != 0); 00332 00333 cout << "!! "; 00334 frag->encode(resipCout); 00335 00336 tassert(frag->message().exists(h_From)); 00337 tassert(frag->message().header(h_From).uri().user() == "alice"); 00338 00339 tassert(frag->message().exists(h_CSeq)); 00340 tassert(frag->message().header(h_CSeq).sequence() == 314159); 00341 00342 msg->encode(resipCout); 00343 tassert_verify(3); 00344 } 00345 { 00346 tassert_reset(); 00347 Data txt("INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00348 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00349 "To: Bob <sip:bob@biloxi.com>\r\n" 00350 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00351 "Call-ID: a84b4c76e66710\r\n" 00352 "CSeq: 314159 INVITE\r\n" 00353 "Max-Forwards: 70\r\n" 00354 "Contact: <sip:alice@pc33.atlanta.com>\r\n" 00355 "Content-Type: message/sipfrag\r\n" 00356 "\r\n" 00357 "INVITE sip:bob@biloxi.com SIP/2.0" 00358 ); 00359 00360 auto_ptr<SipMessage> msg(TestSupport::makeMessage(txt.c_str())); 00361 00362 Contents* body = msg->getContents(); 00363 00364 tassert(body != 0); 00365 SipFrag* frag = dynamic_cast<SipFrag*>(body); 00366 tassert(frag != 0); 00367 00368 cout << "!! "; 00369 frag->encode(resipCout); 00370 00371 tassert(frag->message().header(h_RequestLine).getMethod() == INVITE); 00372 tassert(frag->message().header(h_RequestLine).getSipVersion() == "SIP/2.0"); 00373 00374 msg->encode(resipCout); 00375 00376 Contents* body2 = msg->getContents(); 00377 tassert(body2); 00378 SipFrag* f2 = dynamic_cast<SipFrag*>(body); 00379 tassert(f2); 00380 00381 { 00382 Data d; 00383 DataStream ds(d); 00384 f2->encode(ds); 00385 ds.flush(); 00386 00387 cout << "SipFrag without contents encoded:" << endl; 00388 f2->encode(resipCout); 00389 00390 00391 tassert(d.find("Content-Length") == Data::npos); 00392 00393 } 00394 tassert_verify(4); 00395 } 00396 00397 { 00398 Data contents( 00399 "--ncpq7w94hfb\r\n" 00400 "Content-ID: <foo@example.com>\r\n" 00401 "Content-Type: message/sipfrag\r\n" 00402 "Content-Transfer-Encoding: binary\r\n" 00403 "\r\n" 00404 "SIP/2.0 200 OK\r\n" 00405 "Via: SIP/2.0/UDP pc3.atlanta.com;branch=z9hG4bKmc0q\r\n" 00406 "To: Joe <sip:joe@biloxi.com>\r\n" 00407 "From: Alice <sip:alice@atlanta.com>;tag=87125645\r\n" 00408 "Call-ID: nbc9w84wbcalkj\r\n" 00409 "CSeq: -87235\r\n" 00410 "--ncpq7w94hfb\r\n" 00411 "Content-Transfer-Encoding: binary\r\n" 00412 "Content-ID: <bUZBsM@pres.example.com>\r\n" 00413 "Content-Type: application/pidf+xml;charset=\"UTF-8\"\r\n" 00414 "\r\n" 00415 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" 00416 "<presence xmlns=\"urn:ietf:params:xml:ns:pidf\"\r\n" 00417 " entity=\"sip:bob@example.com\">\r\n" 00418 " <tuple id=\"sg89ae\">\r\n" 00419 " <status>\r\n" 00420 " <basic>open</basic>\r\n" 00421 " </status>\r\n" 00422 " <contact priority=\"1.0\">sip:bob@example.com</contact>\r\n" 00423 " </tuple>\r\n" 00424 "</presence>\r\n" 00425 "\r\n" 00426 "--ncpq7w94hfb--\r\n"); 00427 00428 Data msg; 00429 msg += Data()+"INVITE sip:bob@biloxi.com SIP/2.0\r\n" 00430 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\r\n" 00431 "To: Bob <sip:bob@biloxi.com>\r\n" 00432 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n" 00433 "Call-ID: a84b4c76e66710\r\n" 00434 "CSeq: 314159 INVITE\r\n" 00435 "Max-Forwards: 70\r\n" 00436 "Content-Type: multipart/mixed;type=\"message/sipfrag\";\r\n" 00437 " start=\"<foo@example.com>\";boundary=\"ncpq7w94hfb\"\r\n" 00438 "Content-Length: " + Data(contents.size()) + "\r\n" 00439 "\r\n" + contents; 00440 00441 auto_ptr<SipMessage> message(TestSupport::makeMessage(msg.c_str())); 00442 00443 SipMessage* copy=0; 00444 { 00445 Contents* body = message->getContents(); 00446 00447 tassert(body != 0); 00448 MultipartMixedContents* mmixed = dynamic_cast<MultipartMixedContents*>(body); 00449 tassert(mmixed != 0); 00450 00451 00452 cout << "!! "; 00453 mmixed->encode(resipCout); 00454 00455 MultipartMixedContents::Parts& parts=mmixed->parts(); 00456 00457 copy = new SipMessage(*message); 00458 00459 tassert(parts.size()==2); 00460 00461 SipFrag* frag=dynamic_cast<SipFrag*>(parts.front()); 00462 tassert(frag); 00463 if(frag) 00464 { 00465 frag->encode(resipCout); 00466 } 00467 00468 Pidf* pidf=dynamic_cast<Pidf*>(parts.back()); 00469 tassert(pidf); 00470 if(pidf) 00471 { 00472 pidf->encode(resipCout); 00473 } 00474 00475 message->encode(resipCout); 00476 } 00477 00478 { 00479 Contents* body = copy->getContents(); 00480 00481 tassert(body != 0); 00482 MultipartMixedContents* mmixed = dynamic_cast<MultipartMixedContents*>(body); 00483 tassert(mmixed != 0); 00484 00485 00486 cout << "!! "; 00487 mmixed->encode(resipCout); 00488 00489 MultipartMixedContents::Parts& parts=mmixed->parts(); 00490 00491 00492 tassert(parts.size()==2); 00493 00494 SipFrag* frag=dynamic_cast<SipFrag*>(parts.front()); 00495 tassert(frag); 00496 if(frag) 00497 { 00498 frag->encode(resipCout); 00499 } 00500 00501 Pidf* pidf=dynamic_cast<Pidf*>(parts.back()); 00502 tassert(pidf); 00503 if(pidf) 00504 { 00505 pidf->encode(resipCout); 00506 } 00507 00508 copy->encode(resipCout); 00509 } 00510 00511 delete copy; 00512 00513 tassert_verify(5); 00514 00515 00516 } 00517 00518 tassert_report(); 00519 00520 return 0; 00521 } 00522 00523 /* ==================================================================== 00524 * The Vovida Software License, Version 1.0 00525 * 00526 * Copyright (c) 2000 Vovida Networks, Inc. All rights reserved. 00527 * 00528 * Redistribution and use in source and binary forms, with or without 00529 * modification, are permitted provided that the following conditions 00530 * are met: 00531 * 00532 * 1. Redistributions of source code must retain the above copyright 00533 * notice, this list of conditions and the following disclaimer. 00534 * 00535 * 2. Redistributions in binary form must reproduce the above copyright 00536 * notice, this list of conditions and the following disclaimer in 00537 * the documentation and/or other materials provided with the 00538 * distribution. 00539 * 00540 * 3. The names "VOCAL", "Vovida Open Communication Application Library", 00541 * and "Vovida Open Communication Application Library (VOCAL)" must 00542 * not be used to endorse or promote products derived from this 00543 * software without prior written permission. For written 00544 * permission, please contact vocal@vovida.org. 00545 * 00546 * 4. Products derived from this software may not be called "VOCAL", nor 00547 * may "VOCAL" appear in their name, without prior written 00548 * permission of Vovida Networks, Inc. 00549 * 00550 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 00551 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00552 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND 00553 * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA 00554 * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES 00555 * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, 00556 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00557 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00558 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 00559 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00560 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 00561 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 00562 * DAMAGE. 00563 * 00564 * ==================================================================== 00565 * 00566 * This software consists of voluntary contributions made by Vovida 00567 * Networks, Inc. and many individuals on behalf of Vovida Networks, 00568 * Inc. For more information on Vovida Networks, Inc., please see 00569 * <http://www.vovida.org/>. 00570 * 00571 */
1.7.5.1