static int downgrade(struct request *rq, struct mem_obj *obj) { int res = 0; char *transfer_encoding = NULL; #if defined(HAVE_ZLIB) char *content_encoding = NULL; #endif /* HAVE_ZLIB */ if ( (rq->http_major < obj->httpv_major) || (rq->http_minor < obj->httpv_minor) ) { res |= DOWNGRADE_ANSWER; if ( obj->headers ) transfer_encoding = attr_value(obj->headers, "Transfer-Encoding"); if ( transfer_encoding && !strncasecmp("chunked", transfer_encoding, 7)) { my_xlog(OOPS_LOG_HTTP|OOPS_LOG_DBG, "downgrade(): Turn on Chunked Gateway.\n"); res |= UNCHUNK_ANSWER; } } #if defined(HAVE_ZLIB) content_encoding = attr_value(obj->headers, "Content-Encoding"); if ( content_encoding && !strncasecmp(content_encoding, "gzip", 4) ) { /* we ungzip if useragent won't accept gzip */ char *ua_accept = attr_value(rq->av_pairs, "accept-encoding"); if ( !ua_accept || !(strstr(ua_accept, "gzip")) ) res |= UNGZIP_ANSWER; } #endif return(res); }
void xml_log_formatter::test_unit_skipped( std::ostream& ostr, test_unit const& tu ) { ostr << "<" << tu_type_name( tu ) << " name" << attr_value() << tu.p_name.get() << " skipped" << attr_value() << "yes" << "/>"; }
void xml_log_formatter::log_entry_start( std::ostream& ostr, log_entry_data const& entry_data, log_entry_types let ) { static literal_string xml_tags[] = { "Info", "Message", "Warning", "Error", "FatalError" }; m_curr_tag = xml_tags[let]; ostr << '<' << m_curr_tag << " file" << attr_value() << entry_data.m_file_name << " line" << attr_value() << entry_data.m_line_num << ">"; }
void xml_log_formatter::log_build_info( std::ostream& ostr ) { ostr << "<BuildInfo" << " platform" << attr_value() << BOOST_PLATFORM << " compiler" << attr_value() << BOOST_COMPILER << " stl" << attr_value() << BOOST_STDLIB << " boost=\"" << BOOST_VERSION/100000 << "." << BOOST_VERSION/100 % 1000 << "." << BOOST_VERSION % 100 << '\"' << "/>"; }
void xml_log_formatter::log_exception( std::ostream& ostr, log_checkpoint_data const& checkpoint_data, const_string explanation ) { ostr << "<Exception name" << attr_value() << framework::current_test_case().p_name.get() << ">" << pcdata() << explanation; if( !checkpoint_data.m_file_name.is_empty() ) { ostr << "<LastCheckpoint file" << attr_value() << checkpoint_data.m_file_name << " line" << attr_value() << checkpoint_data.m_line_num << ">" << pcdata() << checkpoint_data.m_message << "</LastCheckpoint>"; } ostr << "</Exception>"; }
void CGUI::Xeromyces_ReadEffects(XMBElement Element, CXeromyces* pFile, SGUIImageEffects &effects) { XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name (pFile->GetAttributeString(attr.Name)); CStrW attr_value (attr.Value.FromUTF8()); if (attr_name == "add_color") { CColor color; if (!GUI<int>::ParseColor(attr_value, color, 0.f)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else effects.m_AddColor = color; } else if (attr_name == "grayscale") { effects.m_Greyscale = true; } else { debug_warn(L"Invalid data - DTD shouldn't allow this"); } } }
void CGUI::Xeromyces_ReadTooltip(XMBElement Element, CXeromyces* pFile) { // Read the tooltip, and store it as a specially-named object IGUIObject* object = new CTooltip; XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name (pFile->GetAttributeString(attr.Name)); CStr attr_value (attr.Value); if (attr_name == "name") { object->SetName("__tooltip_" + attr_value); } else { object->SetSetting(attr_name, attr_value.FromUTF8()); } } AddObject(object); }
/* change content of object, actually not send it */ MODULE_STATIC int output(int so, struct output_object *obj, struct request *rq, int *flags) { char *content_type, *agent = NULL, *p, *charset_name, *new_conttype; struct charset *cs = NULL; struct av *ct_av = NULL; if ( !rq || !obj || !obj->body || !obj->headers ) return(MOD_CODE_OK); ct_av = lookup_av_by_attr(obj->headers, "Content-Type"); if ( !ct_av ) return(MOD_CODE_OK); content_type = ct_av->val; if ( !content_type ) return(MOD_CODE_OK); p = content_type; while( *p && IS_SPACE(*p) ) p++; if ( strncasecmp(p, "text/html", 9) && strncasecmp(p, "text/plain", 10) ) return(MOD_CODE_OK); /* parse parameters and return if charset is already here */ while ( (p = strchr(p, ';')) ) { p++; while( *p && IS_SPACE(*p) ) p++; if ( !strncasecmp(p, "charset=", 8) ) return(MOD_CODE_OK); } if ( rq->av_pairs ) agent = attr_value(rq->av_pairs, "User-Agent"); if ( !agent ) return(MOD_CODE_OK); RDLOCK_LANG_CONFIG ; if ( agent && charsets ) cs = lookup_charset_by_Agent(charsets, agent); if ( cs ) charset_name = cs->Name; else charset_name = default_charset; if ( !charset_name || !*charset_name ) { UNLOCK_LANG_CONFIG ; return(MOD_CODE_OK); } /* set up charset */ new_conttype = malloc(10+strlen(content_type)+strlen(charset_name)+1); if ( new_conttype ) { sprintf(new_conttype,"%s; charset=%s", content_type, charset_name); xfree(ct_av->val); ct_av->val = new_conttype; if ( cs ) { recode_buff(obj->body, cs); } } UNLOCK_LANG_CONFIG ; return(MOD_CODE_OK); }
//acquire all NOT NULL attributes of a node void SXmlNode::GetAttributeList(std::map<std::string, std::string>& attr_list){ if(!_node) return; xmlAttr* attribute = _node->properties; while(attribute && attribute->name && attribute->children) { xmlChar* value = xmlNodeListGetString(_node->doc, attribute->children, 1); std::string attr_name((const char*) attribute->name); std::string attr_value((const char*) value); if(!attr_name.empty() && !attr_value.empty()) attr_list[attr_name] = attr_value; xmlFree(value); attribute = attribute->next; } }
void CGUI::Xeromyces_ReadIcon(XMBElement Element, CXeromyces* pFile) { // Icon we're adding SGUIIcon icon; CStr name; XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name (pFile->GetAttributeString(attr.Name)); CStr attr_value (attr.Value); if (attr_value == "null") continue; if (attr_name == "name") name = attr_value; else if (attr_name == "sprite") icon.m_SpriteName = attr_value; else if (attr_name == "size") { CSize size; if (!GUI<CSize>::ParseString(attr_value.FromUTF8(), size)) LOGERROR(L"Error parsing '%hs' (\"%hs\") inside <icon>.", attr_name.c_str(), attr_value.c_str()); else icon.m_Size = size; } else if (attr_name == "cell_id") { int cell_id; if (!GUI<int>::ParseString(attr_value.FromUTF8(), cell_id)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\") inside <icon>.", attr_name.c_str(), attr_value.c_str()); else icon.m_CellID = cell_id; } else { debug_warn(L"Invalid data - DTD shouldn't allow this"); } } m_Icons[name] = icon; }
void CGUI::Xeromyces_ReadTooltip(XMBElement Element, CXeromyces* pFile) { IGUIObject* object = new CTooltip; for (XMBAttribute attr : Element.GetAttributes()) { CStr attr_name(pFile->GetAttributeString(attr.Name)); CStr attr_value(attr.Value); if (attr_name == "name") object->SetName("__tooltip_" + attr_value); else object->SetSetting(attr_name, attr_value.FromUTF8()); } AddObject(object); }
void CGUI::Xeromyces_ReadEffects(XMBElement Element, CXeromyces* pFile, SGUIImageEffects& effects) { for (XMBAttribute attr : Element.GetAttributes()) { CStr attr_name(pFile->GetAttributeString(attr.Name)); CStrW attr_value(attr.Value.FromUTF8()); if (attr_name == "add_color") { CColor color; if (!GUI<int>::ParseColor(attr_value, color, 0)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else effects.m_AddColor = color; } else if (attr_name == "grayscale") effects.m_Greyscale = true; else debug_warn(L"Invalid data - DTD shouldn't allow this"); } }
std::string XAttrManager::get_attribute_value(const std::string& attr_name) throw (XAttrManagerException) { int size = 30; char* buffer = new char[size]; std::string qualified_attr_name = "user." + attr_name; int length_buffer = getxattr (_filename.c_str(), qualified_attr_name.c_str(), buffer, size); while ((length_buffer == -1) && (errno == ERANGE)) { delete[] buffer; size = size*2; buffer = new char[size]; length_buffer = getxattr (_filename.c_str(), qualified_attr_name.c_str(), buffer, size); } if (length_buffer == -1) { delete[] buffer; throw XAttrManagerException(Glib::locale_to_utf8(strerror(errno))); } char* new_buffer = new char[length_buffer + 1]; new_buffer[length_buffer] = '\0'; for (int i = 0; i < length_buffer; i++) { new_buffer[i] = buffer[i]; } std::string attr_value(new_buffer); delete[] new_buffer; delete[] buffer; return attr_value; }
void CGUI::Xeromyces_ReadIcon(XMBElement Element, CXeromyces* pFile) { SGUIIcon icon; CStr name; for (XMBAttribute attr : Element.GetAttributes()) { CStr attr_name(pFile->GetAttributeString(attr.Name)); CStr attr_value(attr.Value); if (attr_value == "null") continue; if (attr_name == "name") name = attr_value; else if (attr_name == "sprite") icon.m_SpriteName = attr_value; else if (attr_name == "size") { CSize size; if (!GUI<CSize>::ParseString(attr_value.FromUTF8(), size)) LOGERROR("Error parsing '%s' (\"%s\") inside <icon>.", attr_name, attr_value); else icon.m_Size = size; } else if (attr_name == "cell_id") { int cell_id; if (!GUI<int>::ParseString(attr_value.FromUTF8(), cell_id)) LOGERROR("GUI: Error parsing '%s' (\"%s\") inside <icon>.", attr_name, attr_value); else icon.m_CellID = cell_id; } else debug_warn(L"Invalid data - DTD shouldn't allow this"); } m_Icons[name] = icon; }
int check_server_headers(struct server_answ *a, struct mem_obj *obj, const char *b,int len, struct request *rq) { char *start, *beg, *end, *p; char holder, its_here = 0, off = 2; char *p1 = NULL; a->http_result=0; assert(a); assert(obj); assert(b); assert(rq); sscanf(b,"%*s %d",&a->http_result); // if ( !b || !b->data ) return(0); beg =(char *) b; end = (char *)b + len; if ( end - beg > MAX_DOC_HDR_SIZE ) { /* Header is too large */ return(1); } go: if ( a->state & GOT_HDR ) return(0); start = beg + a->checked; if ( !a->checked ) { p = (char *)memchr(beg, '\n', end-beg); holder = '\n'; if ( !p ) { p = (char *)memchr(beg, '\r', end-beg); holder = '\r'; } if ( !p ) return(0); if ( *p == '\n' ) { if ( *(p-1) == '\r' ) { p1 = p-1; *p1 = 0; } } *p = 0; a->checked = strlen(start); /* this is HTTP XXX yyy "header", which we will never rewrite */ analyze_header(start, a); if ( add_header_av(start, obj) ) { *p = holder; if ( p1 ) { *p1 = '\r'; p1=NULL; } return(-1); } *p = holder; if ( p1 ) { *p1 = '\r'; p1=NULL; } goto go; } if ( (end - start >= 2) && !memcmp(start, "\n\n", 2) ) { its_here = 1; off = 2; } if ( (end - start >= 3) && !memcmp(start, "\r\n\n", 3) ) { its_here = 1; off = 3; } if ( (end - start >= 3) && !memcmp(start, "\n\r\n", 3) ) { its_here = 1; off = 3; } if ( (end - start >= 4) && !memcmp(start, "\r\n\r\n", 4) ) { its_here = 1; off = 4; } if ( its_here ) { struct buff *body; int all_siz; obj->insertion_point = start-beg; obj->tail_length = off; a->state |= GOT_HDR ; obj->httpv_major = a->httpv_major; obj->httpv_minor = a->httpv_minor; obj->content_length = a->content_len; // b->used = ( start + off ) - beg; /* trunc first buf to header siz */ /* if requested don't cache documents without "Last-Modified" */ /* allocate data storage */ if ( a->content_len ) { if ( a->content_len > maxresident ) { /* - This object will not be stored, we will receive it in - small parts, in syncronous mode - allocate as much as we need now... */ all_siz = ROUND_CHUNKS(end-start-off); /* - mark object as 'not for store' and 'don't expand container' */ a->flags |= (ANSW_NO_STORE | ANSW_SHORT_CONTAINER); } else {/* obj is not too large */ all_siz = MIN(a->content_len, 8192); } } else { /* no Content-Len: */ char *transfer_encoding = NULL; all_siz = ROUND_CHUNKS(end-start-off); transfer_encoding = attr_value(obj->headers, "Transfer-Encoding"); if ((transfer_encoding && !strncasecmp("chunked", transfer_encoding, 7)) ) { a->flags |= (ANSW_NO_STORE | ANSW_SHORT_CONTAINER); } } body = alloc_buff(all_siz); if ( !body ) { return(-1); } // b->next = body; obj->container=obj->hot_buff = body; attach_data(start+off, end-start-off, obj->hot_buff); return(0); } p = start; while( (p < end) && ( *p == '\r' || *p == '\n' ) ) p++; if ( p < end && *p ) { char *t = (char *)memchr(p, '\n', end-p); char *tmp, *saved_tmp; holder = '\n'; if ( !t ) { t = (char *)memchr(p, '\r', end-p); holder = '\r'; } if ( !t ) return(0); if ( *t == '\n' ) { if ( *(t-1) == '\r' ) { p1 = t-1; *p1 = 0; } } *t = 0; saved_tmp = tmp = strdup(p); if ( !tmp ) return(-1); // do_redir_rewrite_header(&tmp, rq, NULL); analyze_header(tmp, a); if ( add_header_av(tmp, obj) ) { free(tmp); return(-1); } if ( saved_tmp != tmp ) { /* header was changed */ if ( obj ) SET(obj->flags, ANSW_HDR_CHANGED); } free(tmp); *t = holder; if ( p1 ) { *p1 = '\r'; t=p1; p1 = NULL; } a->checked = t - beg; goto go; } return(0); }
int XMLFile::LoadFromXmlReader(IXmlReader *reader) { XmlNodeType type; int depth = 0; LPCWSTR text, value; HRESULT hr; list<XMLNode*> stack; stack.push_back(root); while (reader->Read(&type) == NOERROR) { switch (type) { case XmlNodeType_Element: { BOOL is_empty = reader->IsEmptyElement(); XMLNode *parent = stack.back(); XMLNode *current = new XMLNode(); stack.push_back(current); // add a new node parent->AddNode(current); hr = reader->GetLocalName(&text, NULL); if (FAILED(hr)) return hr; current->name = CString(text); // load attributes while (true) { hr = reader->MoveToNextAttribute(); if (hr != NOERROR) break; // read attribute name and value name hr = reader->GetLocalName(&text, NULL); if (FAILED(hr)) return hr; hr = reader->GetValue(&value, NULL); if (FAILED(hr)) return hr; CString attr_name(text); CString attr_value(value); current->AddField(attr_name, attr_value); } if (is_empty) { stack.pop_back(); } } break; case XmlNodeType_EndElement: { stack.pop_back(); } break; } } return 0; }
const char* xml_node::operator[](const char* name) const { return attr_value(name); }
void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite &parent) { // Image object we're adding SGUIImage* Image = new SGUIImage; // Set defaults to "0 0 100% 100%" Image->m_TextureSize = CClientArea(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100)); Image->m_Size = CClientArea(CRect(0, 0, 0, 0), CRect(0, 0, 100, 100)); // TODO Gee: Setup defaults here (or maybe they are in the SGUIImage ctor) // // Read Attributes // // Now we can iterate all attributes and store XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name (pFile->GetAttributeString(attr.Name)); CStrW attr_value (attr.Value.FromUTF8()); if (attr_name == "texture") { Image->m_TextureName = VfsPath("art/textures/ui") / attr_value; } else if (attr_name == "size") { CClientArea ca; if (!GUI<CClientArea>::ParseString(attr_value, ca)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_Size = ca; } else if (attr_name == "texture_size") { CClientArea ca; if (!GUI<CClientArea>::ParseString(attr_value, ca)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_TextureSize = ca; } else if (attr_name == "real_texture_placement") { CRect rect; if (!GUI<CRect>::ParseString(attr_value, rect)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_TexturePlacementInFile = rect; } else if (attr_name == "cell_size") { CSize size; if (!GUI<CSize>::ParseString(attr_value, size)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_CellSize = size; } else if (attr_name == "fixed_h_aspect_ratio") { float val; if (!GUI<float>::ParseString(attr_value, val)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_FixedHAspectRatio = val; } else if (attr_name == "round_coordinates") { bool b; if (!GUI<bool>::ParseString(attr_value, b)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_RoundCoordinates = b; } else if (attr_name == "wrap_mode") { if (attr_value == L"repeat") Image->m_WrapMode = GL_REPEAT; else if (attr_value == L"mirrored_repeat") Image->m_WrapMode = GL_MIRRORED_REPEAT; else if (attr_value == L"clamp_to_edge") Image->m_WrapMode = GL_CLAMP_TO_EDGE; else LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); } else if (attr_name == "z_level") { float z_level; if (!GUI<float>::ParseString(attr_value, z_level)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_DeltaZ = z_level/100.f; } else if (attr_name == "backcolor") { CColor color; if (!GUI<CColor>::ParseString(attr_value, color)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_BackColor = color; } else if (attr_name == "bordercolor") { CColor color; if (!GUI<CColor>::ParseString(attr_value, color)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_BorderColor = color; } else if (attr_name == "border") { bool b; if (!GUI<bool>::ParseString(attr_value, b)) LOGERROR(L"GUI: Error parsing '%hs' (\"%ls\")", attr_name.c_str(), attr_value.c_str()); else Image->m_Border = b; } else { debug_warn(L"Invalid data - DTD shouldn't allow this"); } } // Look for effects XMBElementList children = Element.GetChildNodes(); for (int i=0; i<children.Count; ++i) { XMBElement child = children.Item(i); CStr ElementName (pFile->GetElementString(child.GetNodeName())); if (ElementName == "effect") { if (Image->m_Effects) { LOGERROR(L"GUI <image> must not have more than one <effect>"); } else { Image->m_Effects = new SGUIImageEffects; Xeromyces_ReadEffects(child, pFile, *Image->m_Effects); } } else { debug_warn(L"Invalid data - DTD shouldn't allow this"); } } // // Input // parent.AddImage(Image); }
void CGUI::Xeromyces_ReadScrollBarStyle(XMBElement Element, CXeromyces* pFile) { // style object we're adding SGUIScrollBarStyle scrollbar; CStr name; // // Read Attributes // // Now we can iterate all attributes and store XMBAttributeList attributes = Element.GetAttributes(); for (int i=0; i<attributes.Count; ++i) { XMBAttribute attr = attributes.Item(i); CStr attr_name = pFile->GetAttributeString(attr.Name); CStr attr_value (attr.Value); if (attr_value == "null") continue; if (attr_name == "name") name = attr_value; else if (attr_name == "show_edge_buttons") { bool b; if (!GUI<bool>::ParseString(attr_value.FromUTF8(), b)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\")", attr_name.c_str(), attr_value.c_str()); else scrollbar.m_UseEdgeButtons = b; } if (attr_name == "width") { float f; if (!GUI<float>::ParseString(attr_value.FromUTF8(), f)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\")", attr_name.c_str(), attr_value.c_str()); else scrollbar.m_Width = f; } else if (attr_name == "minimum_bar_size") { float f; if (!GUI<float>::ParseString(attr_value.FromUTF8(), f)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\")", attr_name.c_str(), attr_value.c_str()); else scrollbar.m_MinimumBarSize = f; } else if (attr_name == "maximum_bar_size") { float f; if (!GUI<float>::ParseString(attr_value.FromUTF8(), f)) LOGERROR(L"GUI: Error parsing '%hs' (\"%hs\")", attr_name.c_str(), attr_value.c_str()); else scrollbar.m_MaximumBarSize = f; } else if (attr_name == "sprite_button_top") scrollbar.m_SpriteButtonTop = attr_value; else if (attr_name == "sprite_button_top_pressed") scrollbar.m_SpriteButtonTopPressed = attr_value; else if (attr_name == "sprite_button_top_disabled") scrollbar.m_SpriteButtonTopDisabled = attr_value; else if (attr_name == "sprite_button_top_over") scrollbar.m_SpriteButtonTopOver = attr_value; else if (attr_name == "sprite_button_bottom") scrollbar.m_SpriteButtonBottom = attr_value; else if (attr_name == "sprite_button_bottom_pressed") scrollbar.m_SpriteButtonBottomPressed = attr_value; else if (attr_name == "sprite_button_bottom_disabled") scrollbar.m_SpriteButtonBottomDisabled = attr_value; else if (attr_name == "sprite_button_bottom_over") scrollbar.m_SpriteButtonBottomOver = attr_value; else if (attr_name == "sprite_back_vertical") scrollbar.m_SpriteBackVertical = attr_value; else if (attr_name == "sprite_bar_vertical") scrollbar.m_SpriteBarVertical = attr_value; else if (attr_name == "sprite_bar_vertical_over") scrollbar.m_SpriteBarVerticalOver = attr_value; else if (attr_name == "sprite_bar_vertical_pressed") scrollbar.m_SpriteBarVerticalPressed = attr_value; } // // Add to CGUI // m_ScrollBarStyles[name] = scrollbar; }
void CGUI::Xeromyces_ReadScrollBarStyle(XMBElement Element, CXeromyces* pFile) { SGUIScrollBarStyle scrollbar; CStr name; // Setup some defaults. scrollbar.m_MinimumBarSize = 0.f; // Using 1.0e10 as a substitute for infinity scrollbar.m_MaximumBarSize = 1.0e10; scrollbar.m_UseEdgeButtons = false; for (XMBAttribute attr : Element.GetAttributes()) { CStr attr_name = pFile->GetAttributeString(attr.Name); CStr attr_value(attr.Value); if (attr_value == "null") continue; if (attr_name == "name") name = attr_value; else if (attr_name == "show_edge_buttons") { bool b; if (!GUI<bool>::ParseString(attr_value.FromUTF8(), b)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, attr_value); else scrollbar.m_UseEdgeButtons = b; } else if (attr_name == "width") { float f; if (!GUI<float>::ParseString(attr_value.FromUTF8(), f)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, attr_value); else scrollbar.m_Width = f; } else if (attr_name == "minimum_bar_size") { float f; if (!GUI<float>::ParseString(attr_value.FromUTF8(), f)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, attr_value); else scrollbar.m_MinimumBarSize = f; } else if (attr_name == "maximum_bar_size") { float f; if (!GUI<float>::ParseString(attr_value.FromUTF8(), f)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, attr_value); else scrollbar.m_MaximumBarSize = f; } else if (attr_name == "sprite_button_top") scrollbar.m_SpriteButtonTop = attr_value; else if (attr_name == "sprite_button_top_pressed") scrollbar.m_SpriteButtonTopPressed = attr_value; else if (attr_name == "sprite_button_top_disabled") scrollbar.m_SpriteButtonTopDisabled = attr_value; else if (attr_name == "sprite_button_top_over") scrollbar.m_SpriteButtonTopOver = attr_value; else if (attr_name == "sprite_button_bottom") scrollbar.m_SpriteButtonBottom = attr_value; else if (attr_name == "sprite_button_bottom_pressed") scrollbar.m_SpriteButtonBottomPressed = attr_value; else if (attr_name == "sprite_button_bottom_disabled") scrollbar.m_SpriteButtonBottomDisabled = attr_value; else if (attr_name == "sprite_button_bottom_over") scrollbar.m_SpriteButtonBottomOver = attr_value; else if (attr_name == "sprite_back_vertical") scrollbar.m_SpriteBackVertical = attr_value; else if (attr_name == "sprite_bar_vertical") scrollbar.m_SpriteBarVertical = attr_value; else if (attr_name == "sprite_bar_vertical_over") scrollbar.m_SpriteBarVerticalOver = attr_value; else if (attr_name == "sprite_bar_vertical_pressed") scrollbar.m_SpriteBarVerticalPressed = attr_value; } m_ScrollBarStyles[name] = scrollbar; }
/** Parse the 'detailed' Anime fields from HTML * * */ std::shared_ptr<Anime> AnimeSerializer::deserialize_details(const std::string& xml) const { typedef std::unique_ptr<xmlChar, XmlCharDeleter> xmlStringUPtr; auto res = std::make_shared<Anime>(); std::unique_ptr<char[]> cstr(new char[xml.size()]); std::memcpy(cstr.get(), xml.c_str(), xml.size()); std::unique_ptr<xmlDoc, XmlDocDeleter> doc(htmlReadMemory(cstr.get(), xml.size(), "http://myanimelist.net/", nullptr, HTML_PARSE_RECOVER | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET)); std::unique_ptr<xmlTextReader, xmlTextReaderDeleter> reader(xmlReaderWalker(doc.get())); if (!reader) { std::cerr << "Error: Couldn't create XML reader" << std::endl; std::cerr << "XML follows: " << xml << std::endl; return nullptr; } enum { PRIORITY, STORAGE, REWATCHVALUE, DISCUSS, SELECTOR_NONE } selector = SELECTOR_NONE; enum { TAGS, COMMENTS, NONE } textarea = NONE; std::string textbuf; int ret = 1; for( ret = xmlTextReaderRead(reader.get()); ret == 1; ret = xmlTextReaderRead(reader.get()) ) { const std::string name = xmlchar_to_str(xmlTextReaderConstName (reader.get())); if (name == "input") { xmlStringUPtr type(xmlTextReaderGetAttribute(reader.get(), "type"_xml)); xmlStringUPtr attr_name(xmlTextReaderGetAttribute(reader.get(), "name"_xml)); xmlStringUPtr attr_value(xmlTextReaderGetAttribute(reader.get(), "value"_xml)); if (type) { if (xmlStrEqual(type.get(), "text"_xml) || xmlStrEqual(type.get(), "checkbox"_xml)) { if (xmlStrEqual(attr_name.get(), "fansub_group"_xml)) res->set_fansub_group(xmlchar_to_str(attr_value.get())); else if (xmlStrEqual(attr_name.get(), "list_downloaded_eps"_xml)) res->set_downloaded_items(xmlchar_to_str(attr_value.get())); else if (xmlStrEqual(attr_name.get(), "list_times_watched"_xml)) res->set_times_consumed(xmlchar_to_str(attr_value.get())); else if (xmlStrEqual(attr_name.get(), "storageVal"_xml)) res->set_storage_value(xmlchar_to_str(attr_value.get())); } } } else if (name == "textarea" && xmlTextReaderNodeType(reader.get()) == XML_READER_TYPE_ELEMENT) { xmlStringUPtr attr_name(xmlTextReaderGetAttribute(reader.get(), "name"_xml)); if (xmlStrEqual(attr_name.get(), "tags"_xml)) textarea = TAGS; else if (xmlStrEqual(attr_name.get(), "list_comments"_xml)) textarea = COMMENTS; else textarea = NONE; textbuf.clear(); } else if (name == "textarea" && xmlTextReaderNodeType(reader.get()) == XML_READER_TYPE_END_ELEMENT) { if (textarea != NONE) { switch (textarea) { case TAGS: /* Not a 'detailed' field */ break; case COMMENTS: res->set_comments(std::string(textbuf)); break; case NONE: default: break; } textarea = NONE; } } else if (name == "#text" && textarea != NONE) { textbuf.append(xmlchar_to_str(xmlTextReaderConstValue(reader.get()))); } else if (name == "select" && xmlTextReaderNodeType(reader.get()) == XML_READER_TYPE_ELEMENT) { xmlStringUPtr attr_name(xmlTextReaderGetAttribute(reader.get(), "name"_xml)); if (xmlStrEqual(attr_name.get(), "priority"_xml)) selector = PRIORITY; if (xmlStrEqual(attr_name.get(), "storage"_xml)) selector = STORAGE; if (xmlStrEqual(attr_name.get(), "list_rewatch_value"_xml)) selector = REWATCHVALUE; if (xmlStrEqual(attr_name.get(), "discuss"_xml)) selector = DISCUSS; } else if (name == "select" && xmlTextReaderNodeType(reader.get()) == XML_READER_TYPE_END_ELEMENT) { selector = SELECTOR_NONE; } else if (name == "option" && xmlTextReaderNodeType(reader.get()) == XML_READER_TYPE_ELEMENT) { xmlStringUPtr value(xmlTextReaderGetAttribute(reader.get(), "value"_xml)); if (xmlTextReaderMoveToAttribute(reader.get(), "selected"_xml) == 1) { switch (selector) { case PRIORITY: res->set_priority(xmlchar_to_str(value.get())); break; case STORAGE: res->set_storage_value(xmlchar_to_str(value.get())); break; case REWATCHVALUE: res->set_reconsume_value(xmlchar_to_str(value.get())); break; case DISCUSS: res->set_enable_discussion(xmlchar_to_str(value.get())); break; case SELECTOR_NONE: default: break; } } } } if (ret != 0) return nullptr; // Some sort of parsing error return res; }