Home | History | Annotate | Download | only in src
      1 // Copyright 2007, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software 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 THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 
     30 // This header file defines a canonicalizer output method class for STL
     31 // strings. Because the canonicalizer tries not to be dependent on the STL,
     32 // we have segregated it here.
     33 
     34 #ifndef GOOGLEURL_SRC_URL_CANON_STDSTRING_H__
     35 #define GOOGLEURL_SRC_URL_CANON_STDSTRING_H__
     36 
     37 #include <string>
     38 #include "googleurl/src/url_canon.h"
     39 
     40 namespace url_canon {
     41 
     42 // Write into a std::string given in the constructor. This object does not own
     43 // the string itself, and the user must ensure that the string stays alive
     44 // throughout the lifetime of this object.
     45 //
     46 // The given string will be appended to; any existing data in the string will
     47 // be preserved. The caller should reserve() the amount of data in the string
     48 // they expect to be written. We will resize if necessary, but that's slow.
     49 //
     50 // Note that when canonicalization is complete, the string will likely have
     51 // unused space at the end because we make the string very big to start out
     52 // with (by |initial_size|). This ends up being important because resize
     53 // operations are slow, and because the base class needs to write directly
     54 // into the buffer.
     55 //
     56 // Therefore, the user should call Complete() before using the string that
     57 // this class wrote into.
     58 class StdStringCanonOutput : public CanonOutput {
     59  public:
     60   StdStringCanonOutput(std::string* str)
     61       : CanonOutput(),
     62         str_(str) {
     63     cur_len_ = static_cast<int>(str_->size());  // Append to existing data.
     64     str_->resize(str_->capacity());
     65     buffer_ = &(*str_)[0];
     66     buffer_len_ = static_cast<int>(str_->size());
     67   }
     68   virtual ~StdStringCanonOutput() {
     69     // Nothing to do, we don't own the string.
     70   }
     71 
     72   // Must be called after writing has completed but before the string is used.
     73   void Complete() {
     74     str_->resize(cur_len_);
     75     buffer_len_ = cur_len_;
     76   }
     77 
     78   virtual void Resize(int sz) {
     79     str_->resize(sz);
     80     buffer_ = &(*str_)[0];
     81     buffer_len_ = sz;
     82   }
     83 
     84  protected:
     85   std::string* str_;
     86 };
     87 
     88 // An extension of the Replacements class that allows the setters to use
     89 // standard strings.
     90 //
     91 // The strings passed as arguments are not copied and must remain valid until
     92 // this class goes out of scope.
     93 template<typename STR>
     94 class StdStringReplacements :
     95     public url_canon::Replacements<typename STR::value_type> {
     96  public:
     97   void SetSchemeStr(const STR& s) {
     98     this->SetScheme(s.data(),
     99                     url_parse::Component(0, static_cast<int>(s.length())));
    100   }
    101   void SetUsernameStr(const STR& s) {
    102     this->SetUsername(s.data(),
    103                       url_parse::Component(0, static_cast<int>(s.length())));
    104   }
    105   void SetPasswordStr(const STR& s) {
    106     this->SetPassword(s.data(),
    107                       url_parse::Component(0, static_cast<int>(s.length())));
    108   }
    109   void SetHostStr(const STR& s) {
    110     this->SetHost(s.data(),
    111                   url_parse::Component(0, static_cast<int>(s.length())));
    112   }
    113   void SetPortStr(const STR& s) {
    114     this->SetPort(s.data(),
    115                   url_parse::Component(0, static_cast<int>(s.length())));
    116   }
    117   void SetPathStr(const STR& s) {
    118     this->SetPath(s.data(),
    119                   url_parse::Component(0, static_cast<int>(s.length())));
    120   }
    121   void SetQueryStr(const STR& s) {
    122     this->SetQuery(s.data(),
    123                    url_parse::Component(0, static_cast<int>(s.length())));
    124   }
    125   void SetRefStr(const STR& s) {
    126     this->SetRef(s.data(),
    127                  url_parse::Component(0, static_cast<int>(s.length())));
    128   }
    129 };
    130 
    131 }  // namespace url_canon
    132 
    133 #endif  // GOOGLEURL_SRC_URL_CANON_STDSTRING_H__
    134 
    135