void CGUIDialogPVRGuideSearch::ReadDateTime(const std::string &strDate, const std::string &strTime, CDateTime &dateTime) const { int iHours, iMinutes; sscanf(strTime.c_str(), "%d:%d", &iHours, &iMinutes); dateTime.SetFromDBDate(strDate); dateTime.SetDateTime(dateTime.GetYear(), dateTime.GetMonth(), dateTime.GetDay(), iHours, iMinutes, 0); }
void CGUIDialogNumeric::SetMode(INPUT_MODE mode, const std::string &initial) { m_mode = mode; m_block = 0; m_lastblock = 0; if (m_mode == INPUT_TIME || m_mode == INPUT_TIME_SECONDS || m_mode == INPUT_DATE) { CDateTime dateTime; if (m_mode == INPUT_TIME || m_mode == INPUT_TIME_SECONDS) { // check if we have a pure number if (initial.find_first_not_of("0123456789") == std::string::npos) { long seconds = strtol(initial.c_str(), nullptr, 10); dateTime = seconds; } else { std::string tmp = initial; // if we are handling seconds and if the string only contains // "mm:ss" we need to add dummy "hh:" to get "hh:mm:ss" if (m_mode == INPUT_TIME_SECONDS && tmp.length() <= 5) tmp = "00:" + tmp; dateTime.SetFromDBTime(tmp); } } else if (m_mode == INPUT_DATE) { std::string tmp = initial; StringUtils::Replace(tmp, '/', '.'); dateTime.SetFromDBDate(tmp); } if (!dateTime.IsValid()) return; dateTime.GetAsSystemTime(m_datetime); m_lastblock = (m_mode == INPUT_DATE) ? 2 : 1; } else if (m_mode == INPUT_IP_ADDRESS) { m_lastblock = 3; auto blocks = StringUtils::Split(initial, '.'); if (blocks.size() != 4) return; for (size_t i = 0; i < blocks.size(); ++i) { if (blocks[i].length() > 3) return; m_ip[i] = static_cast<uint8_t>(atoi(blocks[i].c_str())); } } else if (m_mode == INPUT_NUMBER || m_mode == INPUT_PASSWORD) m_number = initial; }
void CGUIEditControl::OnClick() { // we received a click - it's not from the keyboard, so pop up the virtual keyboard, unless // that is where we reside! if (GetParentID() == WINDOW_DIALOG_KEYBOARD) return; CStdString utf8; g_charsetConverter.wToUTF8(m_text2, utf8); bool textChanged = false; CStdString heading = g_localizeStrings.Get(m_inputHeading ? m_inputHeading : 16028); switch (m_inputType) { case INPUT_TYPE_NUMBER: textChanged = CGUIDialogNumeric::ShowAndGetNumber(utf8, heading); break; case INPUT_TYPE_SECONDS: textChanged = CGUIDialogNumeric::ShowAndGetSeconds(utf8, g_localizeStrings.Get(21420)); break; case INPUT_TYPE_DATE: { CDateTime dateTime; dateTime.SetFromDBDate(utf8); if (dateTime < CDateTime(2000,1, 1, 0, 0, 0)) dateTime = CDateTime(2000, 1, 1, 0, 0, 0); SYSTEMTIME date; dateTime.GetAsSystemTime(date); if (CGUIDialogNumeric::ShowAndGetDate(date, g_localizeStrings.Get(21420))) { dateTime = CDateTime(date); utf8 = dateTime.GetAsDBDate(); textChanged = true; } break; } case INPUT_TYPE_IPADDRESS: textChanged = CGUIDialogNumeric::ShowAndGetIPAddress(utf8, heading); break; case INPUT_TYPE_SEARCH: textChanged = CGUIDialogKeyboard::ShowAndGetFilter(utf8, true); break; case INPUT_TYPE_FILTER: textChanged = CGUIDialogKeyboard::ShowAndGetFilter(utf8, false); break; case INPUT_TYPE_TEXT: default: textChanged = CGUIDialogKeyboard::ShowAndGetInput(utf8, heading, true, m_inputType == INPUT_TYPE_PASSWORD); break; } if (textChanged) { g_charsetConverter.utf8ToW(utf8, m_text2, false); m_cursorPos = m_text2.size(); UpdateText(); m_cursorPos = m_text2.size(); } }
bool XMLUtils::GetDate(const TiXmlNode* pRootNode, const char* strTag, CDateTime& date) { CStdString strDate; if (GetString(pRootNode, strTag, strDate) && !strDate.empty()) { date.SetFromDBDate(strDate); return true; } return false; }
void CGUIDialogNumeric::SetMode(INPUT_MODE mode, const CStdString &initial) { m_mode = mode; m_block = 0; m_lastblock = 0; if (m_mode == INPUT_TIME || m_mode == INPUT_TIME_SECONDS || m_mode == INPUT_DATE) { CDateTime dateTime; if (m_mode == INPUT_TIME || m_mode == INPUT_TIME_SECONDS) { // check if we have a pure number if (initial.find_first_not_of("0123456789") == std::string::npos) { long seconds = strtol(initial.c_str(), NULL, 10); dateTime = seconds; } else { CStdString tmp = initial; // if we are handling seconds and if the string only contains // "mm:ss" we need to add dummy "hh:" to get "hh:mm:ss" if (m_mode == INPUT_TIME_SECONDS && tmp.size() <= 5) tmp = "00:" + tmp; dateTime.SetFromDBTime(tmp); } } else if (m_mode == INPUT_DATE) { CStdString tmp = initial; StringUtils::Replace(tmp, '/', '.'); dateTime.SetFromDBDate(tmp); } if (!dateTime.IsValid()) return; dateTime.GetAsSystemTime(m_datetime); m_lastblock = (m_mode == INPUT_DATE) ? 2 : 1; } else SetMode(mode, (void*)&initial); }
void CVideoInfoTag::SetPremieredFromDBDate(std::string premieredString) { CDateTime premiered; premiered.SetFromDBDate(premieredString); SetPremiered(premiered); }
bool DatabaseUtils::GetDatabaseResults(const MediaType &mediaType, const FieldList &fields, const std::unique_ptr<dbiplus::Dataset> &dataset, DatabaseResults &results) { if (dataset->num_rows() == 0) return true; const dbiplus::result_set &resultSet = dataset->get_result_set(); unsigned int offset = results.size(); if (fields.empty()) { DatabaseResult result; for (unsigned int index = 0; index < resultSet.records.size(); index++) { result[FieldRow] = index + offset; results.push_back(result); } return true; } if (resultSet.record_header.size() < fields.size()) return false; std::vector<int> fieldIndexLookup; fieldIndexLookup.reserve(fields.size()); for (FieldList::const_iterator it = fields.begin(); it != fields.end(); ++it) fieldIndexLookup.push_back(GetFieldIndex(*it, mediaType)); results.reserve(resultSet.records.size() + offset); for (unsigned int index = 0; index < resultSet.records.size(); index++) { DatabaseResult result; result[FieldRow] = index + offset; unsigned int lookupIndex = 0; for (FieldList::const_iterator it = fields.begin(); it != fields.end(); ++it) { int fieldIndex = fieldIndexLookup[lookupIndex++]; if (fieldIndex < 0) return false; std::pair<Field, CVariant> value; value.first = *it; if (!GetFieldValue(resultSet.records[index]->at(fieldIndex), value.second)) CLog::Log(LOGWARNING, "GetDatabaseResults: unable to retrieve value of field %s", resultSet.record_header[fieldIndex].name.c_str()); if (value.first == FieldYear && (mediaType == MediaTypeTvShow || mediaType == MediaTypeEpisode)) { CDateTime dateTime; dateTime.SetFromDBDate(value.second.asString()); if (dateTime.IsValid()) { value.second.clear(); value.second = dateTime.GetYear(); } } result.insert(value); } result[FieldMediaType] = mediaType; if (mediaType == MediaTypeMovie || mediaType == MediaTypeVideoCollection || mediaType == MediaTypeTvShow || mediaType == MediaTypeMusicVideo) result[FieldLabel] = result.at(FieldTitle).asString(); else if (mediaType == MediaTypeEpisode) { std::ostringstream label; label << (int)(result.at(FieldSeason).asInteger() * 100 + result.at(FieldEpisodeNumber).asInteger()); label << ". "; label << result.at(FieldTitle).asString(); result[FieldLabel] = label.str(); } else if (mediaType == MediaTypeAlbum) result[FieldLabel] = result.at(FieldAlbum).asString(); else if (mediaType == MediaTypeSong) { std::ostringstream label; label << (int)result.at(FieldTrackNumber).asInteger(); label << ". "; label << result.at(FieldTitle).asString(); result[FieldLabel] = label.str(); } else if (mediaType == MediaTypeArtist) result[FieldLabel] = result.at(FieldArtist).asString(); results.push_back(result); } return true; }
void CGUIEditControl::OnClick() { // we received a click - it's not from the keyboard, so pop up the virtual keyboard, unless // that is where we reside! if (GetParentID() == WINDOW_DIALOG_KEYBOARD) return; std::string utf8; g_charsetConverter.wToUTF8(m_text2, utf8); bool textChanged = false; std::string heading = g_localizeStrings.Get(m_inputHeading ? m_inputHeading : 16028); switch (m_inputType) { case INPUT_TYPE_READONLY: textChanged = false; break; case INPUT_TYPE_NUMBER: textChanged = CGUIDialogNumeric::ShowAndGetNumber(utf8, heading); break; case INPUT_TYPE_SECONDS: textChanged = CGUIDialogNumeric::ShowAndGetSeconds(utf8, g_localizeStrings.Get(21420)); break; case INPUT_TYPE_TIME: { CDateTime dateTime; dateTime.SetFromDBTime(utf8); SYSTEMTIME time; dateTime.GetAsSystemTime(time); if (CGUIDialogNumeric::ShowAndGetTime(time, !heading.empty() ? heading : g_localizeStrings.Get(21420))) { dateTime = CDateTime(time); utf8 = dateTime.GetAsLocalizedTime("", false); textChanged = true; } break; } case INPUT_TYPE_DATE: { CDateTime dateTime; dateTime.SetFromDBDate(utf8); if (dateTime < CDateTime(2000,1, 1, 0, 0, 0)) dateTime = CDateTime(2000, 1, 1, 0, 0, 0); SYSTEMTIME date; dateTime.GetAsSystemTime(date); if (CGUIDialogNumeric::ShowAndGetDate(date, !heading.empty() ? heading : g_localizeStrings.Get(21420))) { dateTime = CDateTime(date); utf8 = dateTime.GetAsDBDate(); textChanged = true; } break; } case INPUT_TYPE_IPADDRESS: textChanged = CGUIDialogNumeric::ShowAndGetIPAddress(utf8, heading); break; case INPUT_TYPE_SEARCH: textChanged = CGUIKeyboardFactory::ShowAndGetFilter(utf8, true); break; case INPUT_TYPE_FILTER: textChanged = CGUIKeyboardFactory::ShowAndGetFilter(utf8, false); break; case INPUT_TYPE_PASSWORD_NUMBER_VERIFY_NEW: textChanged = CGUIDialogNumeric::ShowAndVerifyNewPassword(utf8); break; case INPUT_TYPE_PASSWORD_MD5: utf8 = ""; // TODO: Ideally we'd send this to the keyboard and tell the keyboard we have this type of input // fallthrough case INPUT_TYPE_TEXT: default: textChanged = CGUIKeyboardFactory::ShowAndGetInput(utf8, heading, true, m_inputType == INPUT_TYPE_PASSWORD || m_inputType == INPUT_TYPE_PASSWORD_MD5); break; } if (textChanged) { ClearMD5(); m_edit.clear(); g_charsetConverter.utf8ToW(utf8, m_text2); m_cursorPos = m_text2.size(); UpdateText(); m_cursorPos = m_text2.size(); } }
void CGUIDialogPVRGuideSearch::OnSearch() { CGUISpinControlEx *pSpin; CGUIEditControl *pEdit; CGUIRadioButtonControl *pRadioButton; CDateTime dateTime; if (!m_searchfilter) return; pEdit = (CGUIEditControl *)GetControl(CONTROL_EDIT_SEARCH); if (pEdit) m_searchfilter->m_strSearchTerm = pEdit->GetLabel2(); pRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_BTN_INC_DESC); if (pRadioButton) m_searchfilter->m_bSearchInDescription = pRadioButton->IsSelected(); pRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_BTN_CASE_SENS); if (pRadioButton) m_searchfilter->m_bIsCaseSensitive = pRadioButton->IsSelected(); pRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_BTN_FTA_ONLY); if (pRadioButton) m_searchfilter->m_bFTAOnly = pRadioButton->IsSelected(); pRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_BTN_UNK_GENRE); if (pRadioButton) m_searchfilter->m_bIncludeUnknownGenres = pRadioButton->IsSelected(); pRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_BTN_IGNORE_REC); if (pRadioButton) m_searchfilter->m_bIgnorePresentRecordings = pRadioButton->IsSelected(); pRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_BTN_IGNORE_TMR); if (pRadioButton) m_searchfilter->m_bIgnorePresentTimers = pRadioButton->IsSelected(); pRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_SPIN_NO_REPEATS); if (pRadioButton) m_searchfilter->m_bPreventRepeats = pRadioButton->IsSelected(); pSpin = (CGUISpinControlEx *)GetControl(CONTROL_SPIN_GENRE); if (pSpin) m_searchfilter->m_iGenreType = pSpin->GetValue(); pSpin = (CGUISpinControlEx *)GetControl(CONTROL_SPIN_MIN_DURATION); if (pSpin) m_searchfilter->m_iMinimumDuration = pSpin->GetValue(); pSpin = (CGUISpinControlEx *)GetControl(CONTROL_SPIN_MAX_DURATION); if (pSpin) m_searchfilter->m_iMaximumDuration = pSpin->GetValue(); pSpin = (CGUISpinControlEx *)GetControl(CONTROL_SPIN_CHANNELS); if (pSpin) m_searchfilter->m_iChannelNumber = pSpin->GetValue(); pSpin = (CGUISpinControlEx *)GetControl(CONTROL_SPIN_GROUPS); if (pSpin) m_searchfilter->m_iChannelGroup = pSpin->GetValue(); pEdit = (CGUIEditControl *)GetControl(CONTROL_EDIT_START_TIME); if (pEdit) { dateTime.SetFromDBTime(pEdit->GetLabel2()); dateTime.GetAsSystemTime(m_searchfilter->m_startTime); } pEdit = (CGUIEditControl *)GetControl(CONTROL_EDIT_STOP_TIME); if (pEdit) { dateTime.SetFromDBTime(pEdit->GetLabel2()); dateTime.GetAsSystemTime(m_searchfilter->m_endTime); } pEdit = (CGUIEditControl *)GetControl(CONTROL_EDIT_START_DATE); if (pEdit) { dateTime.SetFromDBDate(pEdit->GetLabel2()); dateTime.GetAsSystemTime(m_searchfilter->m_startDate); } pEdit = (CGUIEditControl *)GetControl(CONTROL_EDIT_STOP_DATE); if (pEdit) { dateTime.SetFromDBDate(pEdit->GetLabel2()); dateTime.GetAsSystemTime(m_searchfilter->m_endDate); } m_bConfirmed = true; }
bool CGUIDialogAddonSettings::ShowVirtualKeyboard(int iControl) { int controlId = CONTROL_START_SETTING; bool bCloseDialog = false; const TiXmlElement *setting = GetFirstSetting(); while (setting) { if (controlId == iControl) { const CGUIControl* control = GetControl(controlId); const std::string id = XMLUtils::GetAttribute(setting, "id"); const std::string type = XMLUtils::GetAttribute(setting, "type"); //Special handling for actions: does not require id attribute. TODO: refactor me. if (control && control->GetControlType() == CGUIControl::GUICONTROL_BUTTON && type == "action") { const char *option = setting->Attribute("option"); std::string action = XMLUtils::GetAttribute(setting, "action"); if (!action.empty()) { // replace $CWD with the url of plugin/script StringUtils::Replace(action, "$CWD", m_addon->Path()); StringUtils::Replace(action, "$ID", m_addon->ID()); if (option) bCloseDialog = (strcmpi(option, "close") == 0); CApplicationMessenger::Get().ExecBuiltIn(action); } break; } if (control && control->GetControlType() == CGUIControl::GUICONTROL_BUTTON && !id.empty() && !type.empty()) { const char *option = setting->Attribute("option"); const char *source = setting->Attribute("source"); std::string value = m_buttonValues[id]; std::string label = GetString(setting->Attribute("label")); if (type == "text") { // get any options bool bHidden = false; bool bEncoded = false; if (option) { bHidden = (strstr(option, "hidden") != NULL); bEncoded = (strstr(option, "urlencoded") != NULL); } if (bEncoded) value = CURL::Decode(value); if (CGUIKeyboardFactory::ShowAndGetInput(value, label, true, bHidden)) { // if hidden hide input if (bHidden) { std::string hiddenText; hiddenText.append(value.size(), L'*'); ((CGUIButtonControl *)control)->SetLabel2(hiddenText); } else ((CGUIButtonControl*) control)->SetLabel2(value); if (bEncoded) value = CURL::Encode(value); } } else if (type == "number" && CGUIDialogNumeric::ShowAndGetNumber(value, label)) { ((CGUIButtonControl*) control)->SetLabel2(value); } else if (type == "ipaddress" && CGUIDialogNumeric::ShowAndGetIPAddress(value, label)) { ((CGUIButtonControl*) control)->SetLabel2(value); } else if (type == "select") { CGUIDialogSelect *pDlg = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); if (pDlg) { pDlg->SetHeading(label.c_str()); pDlg->Reset(); int selected = -1; vector<std::string> valuesVec; if (setting->Attribute("values")) StringUtils::Tokenize(setting->Attribute("values"), valuesVec, "|"); else if (setting->Attribute("lvalues")) { // localize StringUtils::Tokenize(setting->Attribute("lvalues"), valuesVec, "|"); for (unsigned int i = 0; i < valuesVec.size(); i++) { if (i == (unsigned int)atoi(value.c_str())) selected = i; std::string localized = m_addon->GetString(atoi(valuesVec[i].c_str())); if (localized.empty()) localized = g_localizeStrings.Get(atoi(valuesVec[i].c_str())); valuesVec[i] = localized; } } else if (source) { valuesVec = GetFileEnumValues(source, XMLUtils::GetAttribute(setting, "mask"), XMLUtils::GetAttribute(setting, "option")); } for (unsigned int i = 0; i < valuesVec.size(); i++) { pDlg->Add(valuesVec[i]); if (selected == (int)i || (selected < 0 && StringUtils::EqualsNoCase(valuesVec[i], value))) pDlg->SetSelected(i); // FIXME: the SetSelected() does not select "i", it always defaults to the first position } pDlg->DoModal(); int iSelected = pDlg->GetSelectedLabel(); if (iSelected >= 0) { if (setting->Attribute("lvalues")) value = StringUtils::Format("%i", iSelected); else value = valuesVec[iSelected]; ((CGUIButtonControl*) control)->SetLabel2(valuesVec[iSelected]); } } } else if (type == "audio" || type == "video" || type == "image" || type == "executable" || type == "file" || type == "folder") { // setup the shares VECSOURCES *shares = NULL; if (source && strcmpi(source, "") != 0) shares = CMediaSourceSettings::Get().GetSources(source); VECSOURCES localShares; if (!shares) { g_mediaManager.GetLocalDrives(localShares); if (!source || strcmpi(source, "local") != 0) g_mediaManager.GetNetworkLocations(localShares); } else // always append local drives { localShares = *shares; g_mediaManager.GetLocalDrives(localShares); } if (type == "folder") { // get any options bool bWriteOnly = false; if (option) bWriteOnly = (strcmpi(option, "writeable") == 0); if (CGUIDialogFileBrowser::ShowAndGetDirectory(localShares, label, value, bWriteOnly)) ((CGUIButtonControl*) control)->SetLabel2(value); } else if (type == "image") { if (CGUIDialogFileBrowser::ShowAndGetImage(localShares, label, value)) ((CGUIButtonControl*) control)->SetLabel2(value); } else { // set the proper mask std::string strMask; if (setting->Attribute("mask")) { strMask = setting->Attribute("mask"); // convert mask qualifiers StringUtils::Replace(strMask, "$AUDIO", g_advancedSettings.GetMusicExtensions()); StringUtils::Replace(strMask, "$VIDEO", g_advancedSettings.m_videoExtensions); StringUtils::Replace(strMask, "$IMAGE", g_advancedSettings.m_pictureExtensions); #if defined(_WIN32_WINNT) StringUtils::Replace(strMask, "$EXECUTABLE", ".exe|.bat|.cmd|.py"); #else StringUtils::Replace(strMask, "$EXECUTABLE", ""); #endif } else { if (type == "video") strMask = g_advancedSettings.m_videoExtensions; else if (type == "audio") strMask = g_advancedSettings.GetMusicExtensions(); else if (type == "executable") #if defined(_WIN32_WINNT) strMask = ".exe|.bat|.cmd|.py"; #else strMask = ""; #endif } // get any options bool bUseThumbs = false; bool bUseFileDirectories = false; if (option) { vector<string> options = StringUtils::Split(option, '|'); bUseThumbs = find(options.begin(), options.end(), "usethumbs") != options.end(); bUseFileDirectories = find(options.begin(), options.end(), "treatasfolder") != options.end(); } if (CGUIDialogFileBrowser::ShowAndGetFile(localShares, strMask, label, value, bUseThumbs, bUseFileDirectories)) ((CGUIButtonControl*) control)->SetLabel2(value); } } else if (type == "date") { CDateTime date; if (!value.empty()) date.SetFromDBDate(value); SYSTEMTIME timedate; date.GetAsSystemTime(timedate); if(CGUIDialogNumeric::ShowAndGetDate(timedate, label)) { date = timedate; value = date.GetAsDBDate(); ((CGUIButtonControl*) control)->SetLabel2(value); } } else if (type == "time") { SYSTEMTIME timedate; if (value.size() >= 5) { // assumes HH:MM timedate.wHour = atoi(value.substr(0, 2).c_str()); timedate.wMinute = atoi(value.substr(3, 2).c_str()); } if (CGUIDialogNumeric::ShowAndGetTime(timedate, label)) { value = StringUtils::Format("%02d:%02d", timedate.wHour, timedate.wMinute); ((CGUIButtonControl*) control)->SetLabel2(value); } } else if (type == "addon") { const char *strType = setting->Attribute("addontype"); if (strType) { vector<string> addonTypes = StringUtils::Split(strType, ','); vector<ADDON::TYPE> types; for (vector<string>::iterator i = addonTypes.begin(); i != addonTypes.end(); ++i) { StringUtils::Trim(*i); ADDON::TYPE type = TranslateType(*i); if (type != ADDON_UNKNOWN) types.push_back(type); } if (types.size() > 0) { const char *strMultiselect = setting->Attribute("multiselect"); bool multiSelect = strMultiselect && strcmpi(strMultiselect, "true") == 0; if (multiSelect) { // construct vector of addon IDs (IDs are comma seperated in single string) vector<string> addonIDs = StringUtils::Split(value, ','); if (CGUIWindowAddonBrowser::SelectAddonID(types, addonIDs, false) == 1) { value = StringUtils::Join(addonIDs, ","); ((CGUIButtonControl*) control)->SetLabel2(GetAddonNames(value)); } } else // no need of string splitting/joining if we select only 1 addon if (CGUIWindowAddonBrowser::SelectAddonID(types, value, false) == 1) ((CGUIButtonControl*) control)->SetLabel2(GetAddonNames(value)); } } } m_buttonValues[id] = value; break; } } setting = setting->NextSiblingElement("setting"); controlId++; } EnableControls(); return bCloseDialog; }