/** Get values of all "controls" contained inside the DOM element. * Function will gather values of elements having name attribute defined * and recognized by get_ctl_type() function. * \param[in] el \b dom::element&, The element. * \param[out] all \b named_values&, Collection. * \return \b bool, \c true if there are any value was harvested. **/ inline bool get_values(const dom::element& el, named_values& all ) { selected_cb selected; el.find_all(&selected, "[name]" ); // select all elements having name attribute for( unsigned int n = 0; n < selected.elements.size(); ++n ) { const dom::element& t = selected.elements[n]; //if( !t.get_style_attribute("behavior") ) // continue; - commented out to support input type="hidden" that does not have behavior assigned const wchar_t* pn = t.get_attribute("name"); if( !pn ) { assert(false); // how come? continue; } std::wstring name = pn; if( all.find(name) != all.end()) continue; // element with this name is already there, // checkboxes and radios are groups in fact, // we are returning here only cumulative group value int ctl_type = get_ctl_type(t); if( ctl_type == CTL_NO/*|| ctl_type == CTL_BUTTON*/) continue; all[name] = get_value(selected.elements[n]); } return all.size() != 0; }
/** Get value of the DOM element. Returns value for elements recognized by get_ctl_type() function. * \param[in] el \b const dom::element&, The element. * \return \b value_t, value of the element. **/ inline value_t get_value(dom::element& el ) { switch(get_ctl_type(el)) { case CTL_EDIT: case CTL_DECIMAL: case CTL_CURRENCY: case CTL_PASSWORD: case CTL_NUMERIC: case CTL_PROGRESS: case CTL_SLIDER: case CTL_SELECT_SINGLE: case CTL_SELECT_MULTIPLE: case CTL_DD_SELECT: case CTL_TEXTAREA: case CTL_DATE: case CTL_CALENDAR: default: return el.get_value(); // special cases: case CTL_UNKNOWN: if( !aux::wcseq(el.get_attribute("type"),L"hidden")) break; //else fall below if it is hidden case CTL_BUTTON: return value_t(el.get_attribute("value")); case CTL_CHECKBOX: return get_checkbox_bits(el); case CTL_RADIO: return get_radio_index(el); case CTL_HTMLAREA: return value_t(el.get_html(false/*inner*/)); } return value_t(); }
/** Set value of the DOM element. Sets value for elements recognized by get_ctl_type() function. * \param[in] el \b const dom::element&, The element. * \param[in] v \b const value_t&, The value. **/ inline void set_value(dom::element& el, const value_t& v ) { switch(get_ctl_type(el)) { case CTL_UNKNOWN: break; case CTL_EDIT: case CTL_DECIMAL: case CTL_CURRENCY: case CTL_PASSWORD: case CTL_NUMERIC: case CTL_PROGRESS: case CTL_SLIDER: case CTL_SELECT_SINGLE: case CTL_SELECT_MULTIPLE: case CTL_DD_SELECT: case CTL_TEXTAREA: case CTL_DATE: case CTL_CALENDAR: case CTL_HIDDEN: default: el.set_value(v); break; // special cases: case CTL_BUTTON: break; case CTL_CHECKBOX: set_checkbox_bits(el,v); break; case CTL_RADIO: set_radio_index(el,v); break; case CTL_HTMLAREA: { utf8::ostream os; os << v.get( L"" ); el.set_html( os.data(), os.length() ); el.update(); } break; case CTL_NO: assert(false); break; } }
/** Set value of the DOM element. Sets value for elements recognized by get_ctl_type() function. * \param[in] el \b const dom::element&, The element. * \param[in] v \b const json::value&, The value. **/ inline void set_value(dom::element& el, const json::value& v ) { switch(get_ctl_type(el)) { case CTL_UNKNOWN: break; case CTL_EDIT: case CTL_DECIMAL: case CTL_CURRENCY: case CTL_PASSWORD: case CTL_NUMERIC: case CTL_PROGRESS: case CTL_SLIDER: case CTL_SELECT_SINGLE: case CTL_SELECT_MULTIPLE: case CTL_DD_SELECT: case CTL_TEXTAREA: case CTL_DATE: case CTL_CALENDAR: case CTL_HIDDEN: default: el.set_value(v); break; // special cases: case CTL_BUTTON: break; case CTL_CHECKBOX: set_checkbox_bits(el,v); break; case CTL_RADIO: set_radio_index(el,v); break; case CTL_HTMLAREA: { aux::w2utf utf8(static_cast<const wchar_t*>(v.get( L"" ))); el.set_html( utf8, utf8.length() ); //el.update(); } break; case CTL_NO: assert(false); break; } }
static inline int _snd_ioctl32_ctl_elem_value(unsigned int fd, unsigned int cmd, unsigned long arg, struct file *file, unsigned int native_ctl) { struct snd_ctl_elem_value *data; struct snd_ctl_elem_value32 *data32; int err, i; int type; mm_segment_t oldseg; /* FIXME: check the sane ioctl.. */ data = kmalloc(sizeof(*data), GFP_KERNEL); data32 = kmalloc(sizeof(*data32), GFP_KERNEL); if (data == NULL || data32 == NULL) { err = -ENOMEM; goto __end; } if (copy_from_user(data32, (void __user *)arg, sizeof(*data32))) { err = -EFAULT; goto __end; } memset(data, 0, sizeof(*data)); data->id = data32->id; data->indirect = data32->indirect; if (data->indirect) /* FIXME: this is not correct for long arrays */ data->value.integer.value_ptr = compat_ptr(data32->value.integer.value_ptr); type = get_ctl_type(file, &data->id); if (type < 0) { err = type; goto __end; } if (! data->indirect) { switch (type) { case SNDRV_CTL_ELEM_TYPE_BOOLEAN: case SNDRV_CTL_ELEM_TYPE_INTEGER: for (i = 0; i < 128; i++) data->value.integer.value[i] = data32->value.integer.value[i]; break; case SNDRV_CTL_ELEM_TYPE_INTEGER64: for (i = 0; i < 64; i++) data->value.integer64.value[i] = data32->value.integer64.value[i]; break; case SNDRV_CTL_ELEM_TYPE_ENUMERATED: for (i = 0; i < 128; i++) data->value.enumerated.item[i] = data32->value.enumerated.item[i]; break; case SNDRV_CTL_ELEM_TYPE_BYTES: memcpy(data->value.bytes.data, data32->value.bytes.data, sizeof(data->value.bytes.data)); break; case SNDRV_CTL_ELEM_TYPE_IEC958: data->value.iec958 = data32->value.iec958; break; default: printk("unknown type %d\n", type); break; } } oldseg = get_fs(); set_fs(KERNEL_DS); err = file->f_op->ioctl(file->f_dentry->d_inode, file, native_ctl, (unsigned long)data); set_fs(oldseg); if (err < 0) goto __end; /* restore info to 32bit */ if (! data->indirect) { switch (type) { case SNDRV_CTL_ELEM_TYPE_BOOLEAN: case SNDRV_CTL_ELEM_TYPE_INTEGER: for (i = 0; i < 128; i++) data32->value.integer.value[i] = data->value.integer.value[i]; break; case SNDRV_CTL_ELEM_TYPE_INTEGER64: for (i = 0; i < 64; i++) data32->value.integer64.value[i] = data->value.integer64.value[i]; break; case SNDRV_CTL_ELEM_TYPE_ENUMERATED: for (i = 0; i < 128; i++) data32->value.enumerated.item[i] = data->value.enumerated.item[i]; break; case SNDRV_CTL_ELEM_TYPE_BYTES: memcpy(data32->value.bytes.data, data->value.bytes.data, sizeof(data->value.bytes.data)); break; case SNDRV_CTL_ELEM_TYPE_IEC958: data32->value.iec958 = data->value.iec958; break; default: break; } } err = 0; if (copy_to_user((void __user *)arg, data32, sizeof(*data32))) err = -EFAULT; __end: if (data32) kfree(data32); if (data) kfree(data); return err; }