/*- * Copyright 2007 Guram Dukashvili * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ //--------------------------------------------------------------------------- #ifndef cgiH #define cgiH //--------------------------------------------------------------------------- namespace ksys { //--------------------------------------------------------------------------- ///////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- enum CGIMethod { cgiInit, cgiNone, cgiPOST, cgiGET, cgiHEAD }; //--------------------------------------------------------------------------- class CGI { public: ~CGI(); CGI(); void initialize(); CGI & print(const utf8::String & s){ out_ << s; return *this; } CGIMethod method() const; CGI & operator << (const utf8::String & s){ out_ << s; return *this; } utf8::String paramAsString(const utf8::String & name,const utf8::String & defValue = utf8::String()); utf8::String paramAsString(uintptr_t i,const utf8::String & defValue = utf8::String()); Mutant paramAsMutant(const utf8::String & name,const Mutant & defValue = Mutant()); Mutant paramAsMutant(uintptr_t i,const Mutant & defValue = Mutant()); intptr_t paramIndex(const utf8::String & name,bool noThrow = true); utf8::String paramName(uintptr_t i); uintptr_t paramCount(); static utf8::String uudecode(const utf8::String & string); bool isCGI() const { return method() != cgiNone; } protected: AsyncFile out_; mutable utf8::String queryString_; mutable CGIMethod method_; class Param { friend class CGI; public: ~Param() {} Param(const utf8::String & name = utf8::String(),const utf8::String & value = utf8::String()) : name_(name), value_(value) {} protected: static EmbeddedHashNode & ehNLT(const uintptr_t & link,Array * & param){ return keyNode((*param)[link - 1]); } static uintptr_t ehLTN(const EmbeddedHashNode & node,Array * & param){ return &keyNodeObject(node,NULL) - &(*param)[0] + 1; } static EmbeddedHashNode & keyNode(const Param & object){ return object.keyNode_; } static Param & keyNodeObject(const EmbeddedHashNode & node,Param * p){ return node.object(p->keyNode_); } static uintptr_t keyNodeHash(const Param & object){ return object.name_.hash(false); } static bool keyHashNodeEqu(const Param & object1,const Param & object2){ return object1.name_.strcasecmp(object2.name_) == 0; } mutable EmbeddedHashNode keyNode_; utf8::String name_; utf8::String value_; private: }; typedef EmbeddedHash< Param, uintptr_t, Array *, Param::ehNLT, Param::ehLTN, Param::keyNode, Param::keyNodeObject, Param::keyNodeHash, Param::keyHashNodeEqu > Params; Params paramsHash_; Array params_; void initalizeByMethodPOST(); void initalizeByMethodGET(); private: CGI(const CGI &); void operator = (const CGI &); }; //--------------------------------------------------------------------------- } // namespace ksys //--------------------------------------------------------------------------- #endif //---------------------------------------------------------------------------