/** * gs_appstream_refine_add_screenshots: */ static void gs_appstream_refine_add_screenshots (GsApp *app, AsApp *item) { AsScreenshot *ss; GPtrArray *images_as; GPtrArray *screenshots_as; guint i; /* do we have any to add */ screenshots_as = as_app_get_screenshots (item); if (screenshots_as->len == 0) return; /* does the app already have some */ gs_app_add_kudo (app, GS_APP_KUDO_HAS_SCREENSHOTS); if (gs_app_get_screenshots(app)->len > 0) return; /* add any we know */ for (i = 0; i < screenshots_as->len && i < GS_APPSTREAM_MAX_SCREENSHOTS; i++) { ss = g_ptr_array_index (screenshots_as, i); images_as = as_screenshot_get_images (ss); if (images_as->len == 0) continue; if (as_screenshot_get_kind (ss) == AS_SCREENSHOT_KIND_UNKNOWN) continue; gs_app_add_screenshot (app, ss); } }
/** * as_app_validate_screenshots: **/ static void as_app_validate_screenshots (AsApp *app, AsAppValidateHelper *helper) { AsScreenshot *ss; GPtrArray *screenshots; gboolean screenshot_has_default = FALSE; guint number_screenshots_max = 5; guint number_screenshots_min = 1; guint i; /* relax the requirements a bit */ if ((helper->flags & AS_APP_VALIDATE_FLAG_RELAX) > 0) { number_screenshots_max = 10; number_screenshots_min = 0; } /* metainfo doesn't require any screenshots */ if (as_app_get_source_kind (app) == AS_APP_SOURCE_KIND_METAINFO) number_screenshots_min = 0; /* only for AppData and AppStream */ if (as_app_get_source_kind (app) == AS_APP_SOURCE_KIND_DESKTOP) return; screenshots = as_app_get_screenshots (app); if (screenshots->len < number_screenshots_min) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_STYLE_INCORRECT, "Not enough <screenshot> tags"); } if (screenshots->len > number_screenshots_max) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_STYLE_INCORRECT, "Too many <screenshot> tags"); } for (i = 0; i < screenshots->len; i++) { ss = g_ptr_array_index (screenshots, i); as_app_validate_screenshot (ss, helper); if (as_screenshot_get_kind (ss) == AS_SCREENSHOT_KIND_DEFAULT) { if (screenshot_has_default) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_MARKUP_INVALID, "<screenshot> has more than one default"); } screenshot_has_default = TRUE; continue; } } if (screenshots->len > 0 && !screenshot_has_default) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_MARKUP_INVALID, "<screenshots> has no default <screenshot>"); } }
/** * as_app_validate_screenshot: **/ static void as_app_validate_screenshot (AsScreenshot *ss, AsAppValidateHelper *helper) { AsImage *im; GPtrArray *images; guint i; if (as_screenshot_get_kind (ss) == AS_SCREENSHOT_KIND_UNKNOWN) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_ATTRIBUTE_INVALID, "<screenshot> has unknown type"); } images = as_screenshot_get_images (ss); for (i = 0; i < images->len; i++) { im = g_ptr_array_index (images, i); as_app_validate_image (im, helper); } }
static void as_app_validate_screenshots (AsApp *app, AsAppValidateHelper *helper) { AsFormat *format; AsScreenshot *ss; GPtrArray *screenshots; gboolean screenshot_has_default = FALSE; guint number_screenshots_max = 25; guint number_screenshots_min = 1; guint i; /* relax the requirements a bit */ if ((helper->flags & AS_APP_VALIDATE_FLAG_RELAX) > 0) { number_screenshots_max = 10; number_screenshots_min = 0; } /* firmware does not need screenshots */ if (as_app_get_kind (app) == AS_APP_KIND_FIRMWARE || as_app_get_kind (app) == AS_APP_KIND_DRIVER || as_app_get_kind (app) == AS_APP_KIND_RUNTIME || as_app_get_kind (app) == AS_APP_KIND_ADDON || as_app_get_kind (app) == AS_APP_KIND_LOCALIZATION) number_screenshots_min = 0; /* metainfo and inf do not require any screenshots */ format = as_app_get_format_default (app); if (as_format_get_kind (format) == AS_FORMAT_KIND_METAINFO) number_screenshots_min = 0; /* only for AppData and AppStream */ if (as_format_get_kind (format) == AS_FORMAT_KIND_DESKTOP) return; screenshots = as_app_get_screenshots (app); if (screenshots->len < number_screenshots_min) { ai_app_validate_add (helper, AS_PROBLEM_KIND_STYLE_INCORRECT, "Not enough <screenshot> tags, minimum is %u", number_screenshots_min); } if (screenshots->len > number_screenshots_max) { ai_app_validate_add (helper, AS_PROBLEM_KIND_STYLE_INCORRECT, "Too many <screenshot> tags, maximum is %u", number_screenshots_max); } for (i = 0; i < screenshots->len; i++) { ss = g_ptr_array_index (screenshots, i); as_app_validate_screenshot (ss, helper); if (as_screenshot_get_kind (ss) == AS_SCREENSHOT_KIND_DEFAULT) { if (screenshot_has_default) { ai_app_validate_add (helper, AS_PROBLEM_KIND_MARKUP_INVALID, "<screenshot> has more than one default"); } screenshot_has_default = TRUE; continue; } } if (screenshots->len > 0 && !screenshot_has_default) { ai_app_validate_add (helper, AS_PROBLEM_KIND_MARKUP_INVALID, "<screenshots> has no default <screenshot>"); } }
static void as_app_validate_screenshot (AsScreenshot *ss, AsAppValidateHelper *helper) { AsImage *im; GPtrArray *images; const gchar *tmp; gboolean require_sentence_case = TRUE; guint i; guint length_caption_max = 50; guint length_caption_min = 10; guint str_len; /* relax the requirements a bit */ if ((helper->flags & AS_APP_VALIDATE_FLAG_RELAX) > 0) { length_caption_max = 100; length_caption_min = 5; require_sentence_case = FALSE; } if (as_screenshot_get_kind (ss) == AS_SCREENSHOT_KIND_UNKNOWN) { ai_app_validate_add (helper, AS_PROBLEM_KIND_ATTRIBUTE_INVALID, "<screenshot> has unknown type"); } images = as_screenshot_get_images (ss); for (i = 0; i < images->len; i++) { im = g_ptr_array_index (images, i); as_app_validate_image (im, helper); } tmp = as_screenshot_get_caption (ss, NULL); if (tmp != NULL) { str_len = (guint) strlen (tmp); if (str_len < length_caption_min) { ai_app_validate_add (helper, AS_PROBLEM_KIND_STYLE_INCORRECT, "<caption> is too short [%s];" "shortest allowed is %u chars", tmp, length_caption_min); } if (str_len > length_caption_max) { ai_app_validate_add (helper, AS_PROBLEM_KIND_STYLE_INCORRECT, "<caption> is too long [%s];" "longest allowed is %u chars", tmp, length_caption_max); } if (ai_app_validate_fullstop_ending (tmp)) { ai_app_validate_add (helper, AS_PROBLEM_KIND_STYLE_INCORRECT, "<caption> cannot end in '.' [%s]", tmp); } if (as_app_validate_has_hyperlink (tmp)) { ai_app_validate_add (helper, AS_PROBLEM_KIND_STYLE_INCORRECT, "<caption> cannot contain a hyperlink [%s]", tmp); } if (require_sentence_case && !as_app_validate_has_first_word_capital (helper, tmp)) { ai_app_validate_add (helper, AS_PROBLEM_KIND_STYLE_INCORRECT, "<caption> requires sentence case [%s]", tmp); } } }