00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _TYPECONTAINERH
00025 #define _TYPECONTAINERH
00026 #include <map>
00027
00028 #include "xmlpull/wsdlpull_export.h"
00029 #include "xmlpull/XmlUtils.h"
00030 #include "schemaparser/SchemaParser.h"
00031
00032
00033 namespace Schema {
00034 class TypeContainer;
00035
00036
00037 typedef struct{
00038 std::vector<TypeContainer *>tc;
00039 int count;
00040 int num;
00041 } Containers;
00042
00043 class WSDLPULL_EXPORT TypeContainer
00044 {
00045 public:
00046 TypeContainer(int typeId,const SchemaParser * sp);
00047 TypeContainer(ContentModel* cm,const SchemaParser * sp,int typeId);
00048
00049
00050 ~TypeContainer();
00051 TypeContainer *getAttributeContainer(std::string attName,
00052 bool create=false);
00053 TypeContainer *getBaseTypeContainer(bool create=false);
00054
00055 TypeContainer *getChildContainer(std::string elemName,
00056 bool create = false);
00057
00058 TypeContainer * getChildContainer(ContentModel* cm,
00059 bool create=false);
00060
00061
00062
00063 void *getValue();
00064
00065
00066
00067 void rewind();
00068
00069
00070
00071
00072 void * getValue(const std::string & name,Schema::Type & type);
00073
00074 const SchemaParser * schemaParser()const;
00075 bool isValueValid()const;
00076
00077
00078 int getTypeId()const;
00079
00080
00081 ContentModel* getContentModel()const;
00082
00083
00084 void setValue(const std::string & sValue,bool valid=true);
00085 void setValue(int iValue,bool valid=true);
00086 void setValue(char cValue,bool valid=true);
00087 void setValue(long lValue,bool valid=true);
00088 void setValue(unsigned long ulValue,bool valid=true);
00089 void setValue(float fValue,bool valid=true);
00090 void setValue(double dbValue,bool valid=true);
00091 void setValue(bool bValue,bool valid=true);
00092 void setValue(Qname & qnValue,bool valid=true);
00093
00094
00095 void setValAsString(const std::string &v);
00096 void print(std::ostream & os);
00097 friend std::ostream &operator<<(std::ostream &os, TypeContainer &tc);
00098 static bool printTypeNames_;
00099 friend class SchemaValidator;
00100 private:
00101
00102 Schema::Type typeId_;
00103 ContentModel* cm_;
00104 std::map < std::string, Containers *> particleContainers_;
00105 std::map<ContentModel*,TypeContainer* >cmContainers_;
00106 std::map < std::string, TypeContainer *> attributeContainers_;
00107 const SchemaParser *sParser_;
00108 TypeContainer * baseContainer_;
00109
00110 union
00111 {
00112 std::string *sValue;
00113 int *iValue;
00114 unsigned int *uiValue;
00115 long *lValue;
00116 unsigned long *ulValue;
00117 short *shValue;
00118 unsigned short *usValue;
00119 float *fValue;
00120 double *dbValue;
00121 bool *bValue;
00122 char *cValue;
00123
00124
00125
00126
00127 Qname *qnValue;
00128
00129
00130 } Value;
00131 bool isValueValid_;
00132 std::string strVal;
00133 std::vector<TypeContainer*> tcTable;
00134
00135 void deleteValue();
00136 void printComplexType (std::ostream & os);
00137 void printSimpleType (std::ostream & os);
00138 void printContentModel(std::ostream & os);
00139
00140
00141 void rewindParticleContainers(std::map < std::string, Containers *> &particleContainers);
00142 };
00143
00144 inline
00145 void
00146 TypeContainer::setValue(const std::string & sValue,bool valid)
00147 {
00148 deleteValue();
00149 Value.sValue = new std::string(sValue);
00150 isValueValid_=valid;
00151 }
00152
00153 inline
00154 void
00155 TypeContainer::setValue(int iValue,bool valid)
00156 {
00157 deleteValue();
00158 Value.iValue = new int (iValue);
00159 isValueValid_=valid;
00160 }
00161
00162 inline
00163 void
00164 TypeContainer::setValue(char cValue,bool valid)
00165 {
00166 deleteValue();
00167 Value.cValue = new char (cValue);
00168 isValueValid_=valid;
00169 }
00170
00171 inline
00172 void
00173 TypeContainer::setValue(long lValue,bool valid)
00174 {
00175 deleteValue();
00176 Value.lValue = new long (lValue);
00177 isValueValid_=valid;
00178 }
00179
00180 inline
00181 void
00182 TypeContainer::setValue(unsigned long ulValue,bool valid)
00183 {
00184 deleteValue();
00185 Value.ulValue = new unsigned long (ulValue);
00186 isValueValid_=valid;
00187 }
00188
00189 inline
00190 void
00191 TypeContainer::setValue(float fValue,bool valid)
00192 {
00193 deleteValue();
00194 Value.fValue = new float;
00195 *(Value.fValue) = fValue;
00196 isValueValid_=valid;
00197 }
00198
00199 inline
00200 void
00201 TypeContainer::setValue(double dbValue,bool valid)
00202 {
00203 deleteValue();
00204 Value.dbValue = new double;
00205 *(Value.dbValue) = dbValue;
00206 isValueValid_=valid;
00207 }
00208
00209 inline
00210 void
00211 TypeContainer::setValue(bool bValue,bool valid)
00212 {
00213 deleteValue();
00214 Value.bValue = new bool;
00215 *(Value.bValue) = bValue;
00216 isValueValid_=valid;
00217 }
00218
00219 inline
00220 void
00221 TypeContainer::setValue(Qname & qnValue,bool valid)
00222 {
00223 deleteValue();
00224 Value.qnValue = new Qname(qnValue);
00225 isValueValid_=valid;
00226 }
00227
00228 inline
00229 int
00230 TypeContainer::getTypeId()const
00231 {
00232 return typeId_;
00233 }
00234
00235 inline
00236 ContentModel*
00237 TypeContainer::getContentModel()const
00238 {
00239 return cm_;
00240 }
00241
00242 inline
00243 void
00244 TypeContainer::setValAsString(const std::string&v)
00245 {
00246 strVal=v;
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 inline
00259 bool
00260 TypeContainer::isValueValid()const
00261 {
00262 return isValueValid_;
00263 }
00264 }
00265 #endif