bool ConfigManager::ReadTag(std::istream& in, std::string &tagName, NodeTypeEnum &tagType, int &tagLength, bool &tagIsReturnTag) { // Read strings. stringVector sv = ReadStringVector(in, '>'); std::string tagTypeStr(""); tagName = ""; tagType = INTERNAL_NODE; tagLength = 0; for(size_t i = 0; i < sv.size(); ++i) { std::string::size_type pos = sv[i].find('=') + 1; std::string token(sv[i].substr(0, pos)); std::string tokenValue; if(pos != std::string::npos && token.size() > 0) tokenValue = sv[i].substr(pos + 1, sv[i].size() - pos - 2); if(sv[i][0] == '/') { tagIsReturnTag = true; return true; } else if(token == "type=") { tagTypeStr = tokenValue; } else if(token == "name=") { tagName = tokenValue; } else if(token == "length=") { int len; if(sscanf(tokenValue.c_str(), "%d", &len) == 1) { tagLength = (len > 0) ? len : tagLength; } } else if(token == "childObjects=") { // Skip this tag, it is obsolete. } else tagTypeStr = sv[i]; } // Get the NodeTypeEnum from the tag's type name. tagType = GetNodeType(tagTypeStr.c_str()); return sv.size() > 0; }
bool ConfigManager::ReadObjectHelper(std::istream &in, DataNode *parentNode, bool &te) { bool keepReading = true; bool tagIsEndTag = false; std::string tagName; NodeTypeEnum tagType = INTERNAL_NODE; int tagLength = 0; // Read the opening tag. keepReading = ReadTag(in, tagName, tagType, tagLength, tagIsEndTag); if(tagIsEndTag && keepReading) { te = true; return keepReading; } if(tagType == INTERNAL_NODE) { DataNode *node = new DataNode(tagName); parentNode->AddNode(node); while(keepReading && !tagIsEndTag) { keepReading = ReadObjectHelper(in, node, tagIsEndTag); } if(tagIsEndTag) return keepReading; } else keepReading = ReadField(in, parentNode, tagName, tagType, tagLength); // Read the ending tag. stringVector sv = ReadStringVector(in,'>'); keepReading = sv.size() > 0; te = false; return keepReading; }
DataNode * ConfigManager::ReadFieldData(std::istream& in, const std::string &tagName, NodeTypeEnum type, int tagLength) { DataNode *retval = 0; int i; char cval; unsigned char uval; int ival; long lval; float fval; double dval; bool bval; // Read strings until we get a '<' character. stringVector sv = ReadStringVector(in, '<'); int minSize = (tagLength == 0) ? (int)sv.size() : ((tagLength < (int)sv.size()) ? tagLength : (int)sv.size()); // All 20, or whatever, cases. switch(type) { case CHAR_NODE: // Read a character. if(minSize > 0) { retval = new DataNode(tagName, sv[0][0]); } break; case UNSIGNED_CHAR_NODE: // Read an int and turn it into an unsigned character. if(minSize > 0) { sscanf(sv[0].c_str(), "%d", &ival); uval = (unsigned char)ival; retval = new DataNode(tagName, uval); } break; case INT_NODE: // Read an int. if(minSize > 0) { sscanf(sv[0].c_str(), "%d", &ival); retval = new DataNode(tagName, ival); } break; case LONG_NODE: // Read a long. if(minSize > 0) { sscanf(sv[0].c_str(), "%ld", &lval); retval = new DataNode(tagName, lval); } break; case FLOAT_NODE: // Read a float. if(minSize > 0) { sscanf(sv[0].c_str(), "%g", &fval); retval = new DataNode(tagName, fval); } break; case DOUBLE_NODE: // Read a double. if(minSize > 0) { sscanf(sv[0].c_str(), "%lg", &dval); retval = new DataNode(tagName, dval); } break; case STRING_NODE: { // new scope RemoveLeadAndTailQuotes(sv); std::string temp; for(i = 0; i < minSize; ++i) { temp += sv[i]; if(i < (minSize - 1)) temp += " "; } retval = new DataNode(tagName, temp); } break; case BOOL_NODE: { // new scope bval = false; if(minSize > 0) { bval = (sv[0] == "true"); } retval = new DataNode(tagName, bval); } break; case CHAR_ARRAY_NODE: { // new scope char *cvalArray = 0; if(minSize > 0) { cvalArray = new char[minSize]; for(i = 0; i < minSize; ++i) sscanf(sv[i].c_str(), "%c", &cvalArray[i]); retval = new DataNode(tagName, cvalArray, minSize); } if(cvalArray != 0) delete [] cvalArray; } break; case UNSIGNED_CHAR_ARRAY_NODE: { // new scope unsigned char *uvalArray = 0; if(minSize > 0) { uvalArray = new unsigned char[minSize]; for(i = 0; i < minSize; ++i) { sscanf(sv[i].c_str(), "%d", &ival); uvalArray[i] = (unsigned char)ival; } retval = new DataNode(tagName, uvalArray, minSize); } if(uvalArray != 0) delete [] uvalArray; } break; case INT_ARRAY_NODE: { // new scope int *ivalArray = 0; if(minSize > 0) { ivalArray = new int[minSize]; for(i = 0; i < minSize; ++i) sscanf(sv[i].c_str(), "%d", &ivalArray[i]); retval = new DataNode(tagName, ivalArray, minSize); } if(ivalArray != 0) delete [] ivalArray; } break; case LONG_ARRAY_NODE: { // new scope long *lvalArray = 0; if(minSize > 0) { lvalArray = new long[minSize]; for(i = 0; i < minSize; ++i) sscanf(sv[i].c_str(), "%ld", &lvalArray[i]); retval = new DataNode(tagName, lvalArray, minSize); } if(lvalArray != 0) delete [] lvalArray; } break; case FLOAT_ARRAY_NODE: { // new scope float *fvalArray = 0; if(minSize > 0) { fvalArray = new float[minSize]; for(i = 0; i < minSize; ++i) sscanf(sv[i].c_str(), "%g", &fvalArray[i]); retval = new DataNode(tagName, fvalArray, minSize); } if(fvalArray != 0) delete [] fvalArray; } break; case DOUBLE_ARRAY_NODE: { // new scope double *dvalArray = 0; if(minSize > 0) { dvalArray = new double[minSize]; for(i = 0; i < minSize; ++i) sscanf(sv[i].c_str(), "%lg", &dvalArray[i]); retval = new DataNode(tagName, dvalArray, minSize); } if(dvalArray != 0) delete [] dvalArray; } break; case STRING_ARRAY_NODE: { // new scope std::string *svalArray = 0; if(minSize > 0) { RemoveLeadAndTailQuotes(sv); svalArray = new std::string[minSize]; for(i = 0; i < minSize; ++i) svalArray[i] = sv[i]; retval = new DataNode(tagName, svalArray, minSize); } if(svalArray != 0) delete [] svalArray; } break; case BOOL_ARRAY_NODE: { // new scope bool *bvalArray = 0; if(minSize > 0) { bvalArray = new bool[minSize]; for(i = 0; i < minSize; ++i) bvalArray[i] = (sv[i] == "true"); retval = new DataNode(tagName, bvalArray, minSize); } if(bvalArray != 0) delete [] bvalArray; } break; case CHAR_VECTOR_NODE: { // new scope charVector temp; if(minSize > 0) { for(i = 0; i < minSize; ++i) { sscanf(sv[i].c_str(), "%c", &cval); temp.push_back(cval); } retval = new DataNode(tagName, temp); } } break; case UNSIGNED_CHAR_VECTOR_NODE: { // new scope unsignedCharVector temp; if(minSize > 0) { for(i = 0; i < minSize; ++i) { sscanf(sv[i].c_str(), "%d", &ival); uval = (unsigned char)ival; temp.push_back(uval); } retval = new DataNode(tagName, temp); } } break; case INT_VECTOR_NODE: { // new scope intVector temp; if(minSize > 0) { for(i = 0; i < minSize; ++i) { sscanf(sv[i].c_str(), "%d", &ival); temp.push_back(ival); } retval = new DataNode(tagName, temp); } } break; case LONG_VECTOR_NODE: { // new scope longVector temp; if(minSize > 0) { for(i = 0; i < minSize; ++i) { sscanf(sv[i].c_str(), "%ld", &lval); temp.push_back(lval); } retval = new DataNode(tagName, temp); } } break; case FLOAT_VECTOR_NODE: { // new scope floatVector temp; if(minSize > 0) { for(i = 0; i < minSize; ++i) { sscanf(sv[i].c_str(), "%g", &fval); temp.push_back(fval); } retval = new DataNode(tagName, temp); } } break; case DOUBLE_VECTOR_NODE: { // new scope doubleVector temp; if(minSize > 0) { for(i = 0; i < minSize; ++i) { sscanf(sv[i].c_str(), "%lg", &dval); temp.push_back(dval); } retval = new DataNode(tagName, temp); } } break; case STRING_VECTOR_NODE: if(minSize > 0) { RemoveLeadAndTailQuotes(sv); retval = new DataNode(tagName, sv); } break; default: break; } return retval; }
Variant Deserializer::ReadVariant(VariantType type) { switch (type) { case VAR_INT: return Variant(ReadInt()); case VAR_BOOL: return Variant(ReadBool()); case VAR_FLOAT: return Variant(ReadFloat()); case VAR_VECTOR2: return Variant(ReadVector2()); case VAR_VECTOR3: return Variant(ReadVector3()); case VAR_VECTOR4: return Variant(ReadVector4()); case VAR_QUATERNION: return Variant(ReadQuaternion()); case VAR_COLOR: return Variant(ReadColor()); case VAR_STRING: return Variant(ReadString()); case VAR_BUFFER: return Variant(ReadBuffer()); // Deserializing pointers is not supported. Return null case VAR_VOIDPTR: case VAR_PTR: ReadUInt(); return Variant((void*)0); case VAR_RESOURCEREF: return Variant(ReadResourceRef()); case VAR_RESOURCEREFLIST: return Variant(ReadResourceRefList()); case VAR_VARIANTVECTOR: return Variant(ReadVariantVector()); case VAR_STRINGVECTOR: return Variant(ReadStringVector()); case VAR_VARIANTMAP: return Variant(ReadVariantMap()); case VAR_INTRECT: return Variant(ReadIntRect()); case VAR_INTVECTOR2: return Variant(ReadIntVector2()); case VAR_MATRIX3: return Variant(ReadMatrix3()); case VAR_MATRIX3X4: return Variant(ReadMatrix3x4()); case VAR_MATRIX4: return Variant(ReadMatrix4()); case VAR_DOUBLE: return Variant(ReadDouble()); default: return Variant(); } }