From 63fe1fa7b12549e15bb31c7f07ef1311a7551da2 Mon Sep 17 00:00:00 2001 From: yangbo Date: Fri, 24 Feb 2023 06:07:27 +0000 Subject: [PATCH] fix picker errCode Signed-off-by: yangbo --- interfaces/kits/napi/picker/picker.js | 225 +++++++++++++++++++------- 1 file changed, 163 insertions(+), 62 deletions(-) diff --git a/interfaces/kits/napi/picker/picker.js b/interfaces/kits/napi/picker/picker.js index 1ab6191a..02d5a8a6 100644 --- a/interfaces/kits/napi/picker/picker.js +++ b/interfaces/kits/napi/picker/picker.js @@ -13,16 +13,66 @@ * limitations under the License. */ +const PhotoViewMIMETypes = { + IMAGE_TYPE: "image/*", + VIDEO_TYPE: "video/*", + IMAGE_VIDEO_TYPE: "*/*", + INVALID_TYPE: "" +} + +const ErrCode = { + INVALID_ARGS: 13900020, + RESULT_ERROR: 13900042, +} + +const ERRCODE_MAP = new Map([ + [ErrCode.INVALID_ARGS, "Invalid argument"], + [ErrCode.RESULT_ERROR, "Unknown error"], +]); + const PHOTO_VIEW_MIME_TYPE_MAP = new Map([ - ["image/*", "FILTER_MEDIA_TYPE_IMAGE"], - ["video/*", "FILTER_MEDIA_TYPE_VIDEO"], - ["*/*", "FILTER_MEDIA_TYPE_ALL"], + [PhotoViewMIMETypes.IMAGE_TYPE, "FILTER_MEDIA_TYPE_IMAGE"], + [PhotoViewMIMETypes.VIDEO_TYPE, "FILTER_MEDIA_TYPE_VIDEO"], + [PhotoViewMIMETypes.IMAGE_VIDEO_TYPE, "FILTER_MEDIA_TYPE_ALL"], ]); +const CREATE_FILE_NAME_LENGTH_LIMIT = 256; + +function checkArguments(args) { + if (args.length == 2 && typeof args[1] != "function") { + return false; + } + + if (args.length > 0 && typeof args[0] == 'object') { + let option = args[0]; + if (option.maxSelectNumber != undefined) { + if (option.maxSelectNumber.toString().indexOf(".") != -1) { + return false; + } + } + + if (option.newFileNames != undefined && option.newFileNames.length > 0) { + for (let i = 0; i < option.newFileNames.length; i++) { + let value = option.newFileNames[i]; + if ((value.indexOf(".") == -1) || (value.length > CREATE_FILE_NAME_LENGTH_LIMIT)) { + console.log("[picker] checkArguments Invalid name: " + value); + return false; + } + } + } + } + + return true; +} + +function getErr(errCode) { + return {code: errCode, message: ERRCODE_MAP.get(errCode)}; +} + async function photoPickerSelect() { - if (arguments.length == 2 && typeof arguments[1] != "function") { - console.log("[picker] photoPickerSelect callback invalid"); - throw Error("invalid callback"); + if (!checkArguments(arguments)) { + console.log("[picker] Invalid argument"); + throw Error(getErr(ErrCode.INVALID_ARGS)); } let config = { @@ -34,43 +84,49 @@ async function photoPickerSelect() { } if (arguments.length > 0 && typeof arguments[0] == 'object') { let option = arguments[0]; - if (option.maxSelectNumber != undefined) { + if (option.maxSelectNumber > 0) { config.parameters.uri = (option.maxSelectNumber == 1) ? "singleselect" : "multipleselect"; config.parameters.maxSelectCount = option.maxSelectNumber; } - if (option.MIMEType != undefined && PHOTO_VIEW_MIME_TYPE_MAP.has(option.MIMEType)) { + if (option.MIMEType.length > 0 && PHOTO_VIEW_MIME_TYPE_MAP.has(option.MIMEType)) { config.parameters.filterMediaType = PHOTO_VIEW_MIME_TYPE_MAP.get(option.MIMEType); } } - console.log("[picker] photoPickerSelect config: " + JSON.stringify(config)); - + console.log("[picker] config: " + JSON.stringify(config)); + try { let result = await globalThis.abilityContext.startAbilityForResult(config, {windowMode: 1}); - console.log("[picker] photoPickerSelect result: " + JSON.stringify(result)); - let uri = result.want.parameters["select-item-list"]; + console.log("[picker] result: " + JSON.stringify(result)); + let uris = result.want.parameters["select-item-list"]; let isOrigin = result.want.parameters["isOriginal"]; + if (result.resultCode == -1) { + result.resultCode = 0; + uris = []; + } + let err = (result.resultCode == 0) ? null : getErr(ErrCode.RESULT_ERROR); + let selectResult = (result.resultCode == 0) ? new PhotoSelectResult(uris, isOrigin) : null; if (arguments.length == 2 && typeof arguments[1] == "function") { - return arguments[1](uri, isOrigin); + return arguments[1](err, selectResult); } else if (arguments.length == 1 && typeof arguments[0] == "function") { - return arguments[0](uri, isOrigin); + return arguments[0](err, selectResult); } return new Promise((resolve, reject) => { if (result.resultCode == 0) { - resolve({photoUris: uri, isOriginalPhoto: isOrigin}); + resolve(selectResult); } else { - console.log("[picker] photoPickerSelect err: " + result.resultCode); + console.log("[picker] err: " + result.resultCode); reject(result.resultCode); } }) } catch (error) { - console.log("[picker] photoPickerSelect error: " + error); + console.log("[picker] error: " + error); } } async function documentPickerSelect() { - if (arguments.length == 2 && typeof arguments[1] != "function") { - console.log("[picker] documentPickerSelect callback invalid"); - throw Error("invalid callback"); + if (!checkArguments(arguments)) { + console.log("[picker] Invalid argument"); + throw Error(getErr(ErrCode.INVALID_ARGS)); } let config = { @@ -79,34 +135,40 @@ async function documentPickerSelect() { 'startMode': 'choose', } } - console.log("[picker] documentPickerSelect config: " + JSON.stringify(config)); - + console.log("[picker] config: " + JSON.stringify(config)); + try { let result = await globalThis.abilityContext.startAbilityForResult(config, {windowMode: 1}); - console.log("[picker] documentPickerSelect result: " + JSON.stringify(result)); - let uri = result.want.parameters.select_item_list; + console.log("[picker] result: " + JSON.stringify(result)); + let uris = result.want.parameters.select_item_list; + if (result.resultCode == -1) { + result.resultCode = 0; + uris = []; + } + let err = (result.resultCode == 0) ? null : getErr(ErrCode.RESULT_ERROR); + let uriResult = (result.resultCode == 0) ? uris : null; if (arguments.length == 2 && typeof arguments[1] == "function") { - return arguments[1](uri); + return arguments[1](err, uriResult); } else if (arguments.length == 1 && typeof arguments[0] == "function") { - return arguments[0](uri); + return arguments[0](err, uriResult); } return new Promise((resolve, reject) => { if (result.resultCode == 0) { - resolve(uri); + resolve(uris); } else { - console.log("[picker] documentPickerSelect err: " + result.resultCode); + console.log("[picker] err: " + result.resultCode); reject(result.resultCode); } }) } catch (error) { - console.log("[picker] documentPickerSelect error: " + error); + console.log("[picker] error: " + error); } } async function documentPickerSave() { - if (arguments.length == 2 && typeof arguments[1] != "function") { - console.log("[picker] documentPickerSave callback invalid"); - throw Error("invalid callback"); + if (!checkArguments(arguments)) { + console.log("[picker] Invalid argument"); + throw Error({code: 13900020, message: "Invalid argument"}); } let config = { @@ -117,83 +179,114 @@ async function documentPickerSave() { } if (arguments.length > 0 && typeof arguments[0] == 'object') { let option = arguments[0]; - if (option.newFileNames != undefined) { + if (option.newFileNames.length > 0) { config.parameters.key_pick_file_name = JSON.stringify(option.newFileNames); config.parameters.saveFile = option.newFileNames[0]; } } - console.log("[picker] documentPickerSave config: " + JSON.stringify(config)); - + console.log("[picker] config: " + JSON.stringify(config)); + try { let result = await globalThis.abilityContext.startAbilityForResult(config, {windowMode: 1}); - console.log("[picker] documentPickerSave result: " + JSON.stringify(result)); - let uri = result.want["parameters"].pick_path_return; + console.log("[picker] result: " + JSON.stringify(result)); + let uris = result.want["parameters"].pick_path_return; + if (result.resultCode == -1) { + result.resultCode = 0; + uris = []; + } + let err = (result.resultCode == 0) ? null : getErr(ErrCode.RESULT_ERROR); + let uriResult = (result.resultCode == 0) ? uris : null; if (arguments.length == 2 && typeof arguments[1] == "function") { - return arguments[1](uri); + return arguments[1](err, uriResult); } else if (arguments.length == 1 && typeof arguments[0] == "function") { - return arguments[0](uri); + return arguments[0](err, uriResult); } return new Promise((resolve, reject) => { if (result.resultCode == 0) { - resolve(uri); + resolve(uris); } else { - console.log("[picker] documentPickerSave err: " + result.resultCode); + console.log("[picker] err: " + result.resultCode); reject(result.resultCode); } }) } catch (error) { - console.log("[picker] documentPickerSave error: " + error); + console.log("[picker] error: " + error); } } async function audioPickerSelect() { - if (arguments.length == 2 && typeof arguments[1] != "function") { - console.log("[picker] audioPickerSelect callback invalid"); - throw Error("invalid callback"); + if (!checkArguments(arguments)) { + console.log("[picker] Invalid argument"); + throw Error({code: 13900020, message: "Invalid argument"}); } let config = { action: "ohos.want.action.OPEN_FILE", parameters: { 'startMode': 'choose', - 'key_pick_location': JSON.stringify([0]), - } - } - if (arguments.length > 0 && typeof arguments[0] == 'object') { - let option = arguments[0]; - if (option.maxSelectNumber != undefined) { - config.parameters.key_pick_num = option.maxSelectNumber; } } - console.log("[picker] audioPickerSelect config: " + JSON.stringify(config)); - + console.log("[picker] config: " + JSON.stringify(config)); + try { let result = await globalThis.abilityContext.startAbilityForResult(config, {windowMode: 1}); - console.log("[picker] audioPickerSelect result: " + JSON.stringify(result)); - let uri = result.want.parameters.select_item_list; + console.log("[picker] result: " + JSON.stringify(result)); + let uris = result.want.parameters.select_item_list; + if (result.resultCode == -1) { + result.resultCode = 0; + uris = []; + } + let err = (result.resultCode == 0) ? null : getErr(ErrCode.RESULT_ERROR); + let uriResult = (result.resultCode == 0) ? uris : null; if (arguments.length == 2 && typeof arguments[1] == "function") { - return arguments[1](uri); + return arguments[1](err, uriResult); } else if (arguments.length == 1 && typeof arguments[0] == "function") { - return arguments[0](uri); + return arguments[0](err, uriResult); } return new Promise((resolve, reject) => { if (result.resultCode == 0) { - resolve(uri); + resolve(uris); } else { - console.log("[picker] audioPickerSelect err: " + result.resultCode); + console.log("[picker] err: " + result.resultCode); reject(result.resultCode); } }) } catch (error) { - console.log("[picker] audioPickerSelect error: " + error); + console.log("[picker] error: " + error); } } +function PhotoSelectOptions() { + this.MIMEType = PhotoViewMIMETypes.INVALID_TYPE; + this.maxSelectNumber = -1; +} + +function PhotoSelectResult(uris, isOriginalPhoto) { + this.photoUris = uris; + this.isOriginalPhoto = isOriginalPhoto; +} + +function PhotoSaveOptions() { + this.newFileNames = []; +} + +function DocumentSelectOptions() {} + +function DocumentSaveOptions() { + this.newFileNames = []; +} + +function AudioSelectOptions() {} + +function AudioSaveOptions() { + this.newFileNames = []; +} + function PhotoViewPicker() { this.select = photoPickerSelect; this.save = documentPickerSave; } - + function DocumentViewPicker() { this.select = documentPickerSelect; this.save = documentPickerSave; @@ -205,6 +298,14 @@ function AudioViewPicker() { } export default { + PhotoViewMIMETypes : PhotoViewMIMETypes, + PhotoSelectOptions : PhotoSelectOptions, + PhotoSelectResult : PhotoSelectResult, + PhotoSaveOptions : PhotoSaveOptions, + DocumentSelectOptions : DocumentSelectOptions, + DocumentSaveOptions : DocumentSaveOptions, + AudioSelectOptions : AudioSelectOptions, + AudioSaveOptions : AudioSaveOptions, PhotoViewPicker : PhotoViewPicker, DocumentViewPicker: DocumentViewPicker, AudioViewPicker : AudioViewPicker, -- Gitee