reSIProcate/stack  9694
testSipFrag.cxx
Go to the documentation of this file.
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  */