bool makeSurePath(XString& s) { if(s.empty()) return false; std::replace(s.begin(),s.end(),'\\','/'); Trim(s); TrimLeftChar(s,'/'); if(s.empty()) return false; while('/' != *s.rbegin()) s += '/'; return !s.empty(); }
void TrimRight(XString& str) { if(str.empty()) return; for (XString::iterator i = str.end()-1;i!=str.begin();--i) { if(!isspace(*i)) { str.erase(i+1,str.end()); return; } } }
XIRef<XTimeZone> XSimpleTimeZone::FromXML(XIRef<XDomParserNode> node) { const XString utcOffsetStr = node->GetMetaData("utcOffset"); const XString dstOffsetStr = node->GetMetaData("dstOffset"); if(node->GetTagName() != "XSimpleTimeZone" || utcOffsetStr.empty() || (!verifyDigit(utcOffsetStr[0]) && utcOffsetStr[0] != '-') || count_if(utcOffsetStr.begin() + 1, utcOffsetStr.end(), verifyDigit) != (int)utcOffsetStr.size() - 1 || dstOffsetStr.empty() || (!verifyDigit(dstOffsetStr[0]) && dstOffsetStr[0] != '-') || count_if(dstOffsetStr.begin() + 1, dstOffsetStr.end(), verifyDigit) != (int)dstOffsetStr.size() - 1) { return 0; } const int utcOffset = utcOffsetStr.ToInt(); const int dstOffset = dstOffsetStr.ToInt(); return new XSimpleTimeZone(utcOffset, dstOffset); }
XIRef<XTimeZone> XSimpleTimeZone::FromISOString(const XString& isoString) { if(isoString[0] != '-' && isoString[0] != '+') X_THROW(("Invalid ISO Extended String: %s", isoString.c_str())); const int sign = isoString[0] == '-' ? -1 : 1; const XString str = isoString.substr(1); if(str.empty()) X_THROW(("Invalid ISO Extended String: %s", isoString.c_str())); const size_t colonDex = str.find(':'); XString hoursStr; XString minutesStr; if(colonDex != string::npos) { hoursStr = str.substr(0, colonDex); minutesStr = str.substr(colonDex + 1); if(minutesStr.size() != 2) X_THROW(("Invalid ISO Extended String: %s", isoString.c_str())); } else hoursStr = str; if(count_if(hoursStr.begin(), hoursStr.end(), verifyDigit) != (int)hoursStr.size() || count_if(minutesStr.begin(), minutesStr.end(), verifyDigit) != (int)minutesStr.size()) { X_THROW(("Invalid ISO Extended String: %s", isoString.c_str())); } const int hours = hoursStr.ToInt(); const int minutes = minutesStr.empty() ? 0 : minutesStr.ToInt(); return new XSimpleTimeZone(sign * (int)(convert(HOURS, MINUTES, hours) + minutes)); }
XIRef<XDomParserNode> SoapArgs::_GetNode( const XString& path, XIRef<XDomParserNode> parent ) { const size_t dot = path.find('.'); XString front = path.substr(0, dot); XString rest = dot == string::npos ? "" : path.substr(dot + 1); const list<XIRef<XDomParserNode> >::const_iterator end = parent->GetChildren().end(); list<XIRef<XDomParserNode> >::const_iterator found = end; for(list<XIRef<XDomParserNode> >::const_iterator iter = parent->GetChildren().begin(); iter != end; ++iter) { if((*iter)->GetTagName() == front) { found = iter; break; } } if(found != end) return rest.empty() ? *found : _GetNode(rest, *found); XIRef<XDomParserNode> node(new XDomParserNode(XString::Format("<%s>", front.c_str()))); parent->AppendChild(node); if(!rest.empty()) return _GetNode(rest, node); return node; /* // Key - "foo.bar.alpha" // In this case, foo and bar are CONTAINER_TYPE and alpha is a VALUE_TYPE SoapArgs* existingNode = current->Find( path); if(existingNode) { } vector<XString> parts; key.Split( ".", parts ); XHash<SoapArgsNode>* current = &_complex; if( !parts.empty() ) { XString currPath = parts[0]; size_t limit = parts.size() - 1; // Loop over all the CONTAINER_TYPE parts of the path... for( size_t i = 0; i < limit; ++i ) { SoapArgsNode* found = current->Find( currPath ); if( found ) { current = &found->_children; } else { SoapArgsNode node; node._nodeType = CONTAINER_TYPE; node._name = parts[i]; current->Add( currPath, node ); SoapArgsNode* foundNode = current->Find( currPath ); current = &foundNode->_children; } currPath += "." + parts[i]; } SoapArgsNode* found == current->Find( path ); if(found) { SoapArgs node = *found; current->Remove( parts[i] ); return found; } } SoapArgsNode node; node._nodeType = VALUE_TYPE; node._name = !parts.empty() ? parts[i] : key; */ }