1 /*
2  * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef UNIFIED_META_H
17 #define UNIFIED_META_H
18 
19 #include <array>
20 #include <cstdint>
21 #include <map>
22 #include <memory>
23 #include <string>
24 #include <unordered_map>
25 #include <variant>
26 #include <vector>
27 #include "visibility.h"
28 #include "pixel_map.h"
29 #include "string_ex.h"
30 #include "want.h"
31 
32 namespace OHOS {
33 namespace UDMF {
34 constexpr const char* UNIFORM_DATA_TYPE = "uniformDataType";
35 constexpr const char* CONTENT = "textContent";
36 constexpr const char* ABSTRACT = "abstract";
37 constexpr const char* URL = "url";
38 constexpr const char* DESCRIPTION = "description";
39 constexpr const char* HTML_CONTENT = "htmlContent";
40 constexpr const char* PLAIN_CONTENT = "plainContent";
41 constexpr const char* APP_ID = "appId";
42 constexpr const char* APP_NAME = "appName";
43 constexpr const char* APP_ICON_ID = "appIconId";
44 constexpr const char* APP_LABEL_ID = "appLabelId";
45 constexpr const char* BUNDLE_NAME = "bundleName";
46 constexpr const char* ABILITY_NAME = "abilityName";
47 constexpr const char* FILE_URI_PARAM = "oriUri";
48 constexpr const char* FILE_TYPE = "fileType";
49 constexpr const char* PIXEL_MAP = "pixelMap";
50 constexpr const char* ARRAY_BUFFER = "arrayBuffer";
51 constexpr const char* ARRAY_BUFFER_LENGTH = "arrayBufferLen";
52 constexpr const char *FORMID = "formId";
53 constexpr const char *FORMNAME = "formName";
54 constexpr const char *MODULE = "module";
55 constexpr const char *ORI_URI = "oriUri";
56 constexpr const char *REMOTE_URI = "remoteUri";
57 constexpr const char *APPLICATION_DEFINED_TYPE = "applicationDefinedType";
58 constexpr const char *RAW_DATA = "rawData";
59 constexpr const char *DETAILS = "details";
60 constexpr const char *VALUE_TYPE = "VALUE_TYPE";
61 constexpr const char *THUMB_DATA = "thumbData";
62 constexpr const char *THUMB_DATA_LENGTH = "thumbDataLen";
63 constexpr const char *TITLE = "title";
64 constexpr const char* APP_ICON = "appIcon";
65 constexpr const char* APP_ICON_LENGTH = "appIconLen";
66 constexpr const char* LINK_URL = "linkUrl";
67 
68 enum UDType : int32_t {
69     ENTITY = 0,
70     OBJECT,
71     COMPOSITE_OBJECT,
72     TEXT,
73     PLAIN_TEXT,
74     HTML,
75     HYPERLINK,
76     XML,
77     SOURCE_CODE,
78     SCRIPT,
79     SHELL_SCRIPT,
80     CSH_SCRIPT,
81     PERL_SCRIPT,
82     PHP_SCRIPT,
83     PYTHON_SCRIPT,
84     RUBY_SCRIPT,
85     TYPE_SCRIPT,
86     JAVA_SCRIPT,
87     C_HEADER,
88     C_SOURCE,
89     C_PLUS_PLUS_HEADER,
90     C_PLUS_PLUS_SOURCE,
91     JAVA_SOURCE,
92     EBOOK,
93     EPUB,
94     AZW,
95     AZW3,
96     KFX,
97     MOBI,
98     MEDIA,
99     IMAGE,
100     JPEG,
101     PNG,
102     RAW_IMAGE,
103     TIFF,
104     BMP,
105     ICO,
106     PHOTOSHOP_IMAGE,
107     AI_IMAGE,
108     WORD_DOC,
109     EXCEL,
110     PPT,
111     PDF,
112     POSTSCRIPT,
113     ENCAPSULATED_POSTSCRIPT,
114     VIDEO,
115     AVI,
116     MPEG,
117     MPEG4,
118     VIDEO_3GPP,
119     VIDEO_3GPP2,
120     WINDOWS_MEDIA_WM,
121     WINDOWS_MEDIA_WMV,
122     WINDOWS_MEDIA_WMP,
123     AUDIO,
124     AAC,
125     AIFF,
126     ALAC,
127     FLAC,
128     MP3,
129     OGG,
130     PCM,
131     WINDOWS_MEDIA_WMA,
132     WAVEFORM_AUDIO,
133     WINDOWS_MEDIA_WMX,
134     WINDOWS_MEDIA_WVX,
135     WINDOWS_MEDIA_WAX,
136     FILE,
137     DIRECTORY,
138     FOLDER,
139     SYMLINK,
140     ARCHIVE,
141     BZ2_ARCHIVE,
142     DISK_IMAGE,
143     TAR_ARCHIVE,
144     ZIP_ARCHIVE,
145     JAVA_ARCHIVE,
146     GNU_TAR_ARCHIVE,
147     GNU_ZIP_ARCHIVE,
148     GNU_ZIP_TAR_ARCHIVE,
149     CALENDAR,
150     CONTACT,
151     DATABASE,
152     MESSAGE,
153     VCARD,
154     NAVIGATION,
155     LOCATION,
156     SYSTEM_DEFINED_FORM,
157     SYSTEM_DEFINED_RECORD,
158     SYSTEM_DEFINED_APP_ITEM,
159     SYSTEM_DEFINED_PIXEL_MAP,
160     OPENHARMONY_ATOMIC_SERVICE,
161     APPLICATION_DEFINED_RECORD,
162     OPENHARMONY_PACKAGE,
163     OPENHARMONY_HAP,
164     SMIL,
165     MARKDOWN,
166     FAX,
167     JFX_FAX,
168     EFX_FAX,
169     XBITMAP_IMAGE,
170     TGA_IMAGE,
171     SGI_IMAGE,
172     OPENEXR_IMAGE,
173     FLASHPIX_IMAGE,
174     REALMEDIA,
175     AU_AUDIO,
176     AIFC_AUDIO,
177     SD2_AUDIO,
178     REALAUDIO,
179     OPENXML,
180     WORDPROCESSINGML_DOCUMENT,
181     SPREADSHEETML_SHEET,
182     PRESENTATIONML_PRESENTATION,
183     OPENDOCUMENT,
184     OPENDOCUMENT_TEXT,
185     OPENDOCUMENT_SPREADSHEET,
186     OPENDOCUMENT_PRESENTATION,
187     OPENDOCUMENT_GRAPHICS,
188     OPENDOCUMENT_FORMULA,
189     STUFFIT_ARCHIVE,
190     VCS,
191     ICS,
192     EXECUTABLE,
193     PORTABLE_EXECUTABLE,
194     SUN_JAVA_CLASS,
195     FONT,
196     TRUETYPE_FONT,
197     TRUETYPE_COLLECTION_FONT,
198     OPENTYPE_FONT,
199     POSTSCRIPT_FONT,
200     POSTSCRIPT_PFB_FONT,
201     POSTSCRIPT_PFA_FONT,
202     OPENHARMONY_HDOC,
203     OPENHARMONY_HINOTE,
204     OPENHARMONY_STYLED_STRING,
205     OPENHARMONY_WANT,
206     OFD,
207     OPG,
208     TEX,
209     CSS,
210     VOB,
211     DIF_VIDEO,
212     DV_VIDEO,
213     FLC_ANIMATION,
214     MNG,
215     MPEGURL_VIDEO,
216     TS,
217     AMR,
218     AMR_WB,
219     GMS,
220     IMY,
221     KAR,
222     MPEGURL_AUDIO,
223     MPEG_4_AUDIO,
224     MIDI_AUDIO,
225     MP2,
226     MPEG_AUDIO,
227     MXMF,
228     OTA,
229     PLS,
230     RTTTL,
231     PSID,
232     ULAW_AUDIO,
233     XMF,
234     GIF,
235     DJVU_IMAGE,
236     JNG_IMAGE,
237     PCX_IMAGE,
238     PBM_IMAGE,
239     PGM_IMAGE,
240     PNM_IMAGE,
241     PPM_IMAGE,
242     RGB_IMAGE,
243     SVG_IMAGE,
244     WBMP_IMAGE,
245     XPIXMP_IMAGE,
246     XWINDOWDUMP_IMAGE,
247     HEIF,
248     HEIC,
249     VIRTUAL_CD,
250     BOO_SOURCE,
251     D_SOURCE,
252     HTML_COMPONENT,
253     PASCAL_SOURCE,
254     HASKELL_SCRIPT,
255     LITERATE_HASKELL_SCRIPT,
256     TCL_SCRIPT,
257     ASC_TEXT,
258     PORTABLE_OBJECT,
259     RICH_TEXT,
260     DELIMITED_VALUES_TEXT,
261     COMMA_SEPARATED_VALUES_TEXT,
262     DIFF,
263     SETEXT,
264     GCD,
265     TAB_SEPARATED_VALUES_TEXT,
266     P7R,
267     PEM,
268     CHESS_PGN,
269     LHA_ARCHIVE,
270     LZH_ARCHIVE,
271     LZX_ARCHIVE,
272     TAZ_ARCHIVE,
273     SHAR_ARCHIVE,
274     CPIO_ARCHIVE,
275     WEB_ARCHIVE,
276     USTAR,
277     MATHML,
278     XHTML,
279     RSS,
280     RDF,
281     IGES,
282     CAD,
283     OCTET_STREAM,
284     ISO,
285     MESH_MODEL,
286     CERTIFICATE,
287     C_OBJECT,
288     DVI,
289     CER_CERTIFICATE,
290     CRT_CERTIFICATE,
291     CRL_CERTIFICATE,
292     PRN,
293     OPENDOCUMENT_CHART,
294     OPENDOCUMENT_TEXT_MASTER,
295     OPENDOCUMENT_TEXT_WEB,
296     OPENDOCUMENT_DATABASE,
297     OPENDOCUMENT_IMAGE,
298     OPENDOCUMENT_FORMULA_TEMPLATE,
299     OPENDOCUMENT_CHART_TEMPLATE,
300     OPENDOCUMENT_PRESENTATION_TEMPLATE,
301     OPENDOCUMENT_IMAGE_TEMPLATE,
302     OPENDOCUMENT_GRAPHICS_TEMPLATE,
303     OPENDOCUMENT_SPREADSHEET_TEMPLATE,
304     OPENDOCUMENT_TEXT_TEMPLATE,
305     WORD_DOT,
306     POWERPOINT_PPS,
307     POWERPOINT_POT,
308     EXCEL_XLT,
309     VISIO_VSD,
310     DRAWINGML_VISIO,
311     DRAWINGML_TEMPLATE,
312     DRAWINGML_VISIO_MACROENABLED,
313     DRAWINGML_TEMPLATE_MACROENABLED,
314     WORDPROCESSINGML_TEMPLATE,
315     PRESENTATIONML_TEMPLATE,
316     PRESENTATIONML_SLIDESHOW,
317     SPREADSHEETML_TEMPLATE,
318     WORDPROCESSINGML_DOCUMENT_MACROENABLED,
319     WORDPROCESSINGML_TEMPLATE_MACROENABLED,
320     SPREADSHEETML_TEMPLATE_MACROENABLED,
321     SPREADSHEETML_ADDIN_MACROENABLED,
322     SPREADSHEETML_BINARY_MACROENABLED,
323     SPREADSHEETML_SHEET_MACROENABLED,
324     PRESENTATIONALML_ADDIN_MACROENABLED,
325     PRESENTATIONALML_PRESENTATION_MACROENABLED,
326     PRESENTATIONALML_SLIDESHOW_MACROENABLED,
327     PRESENTATIONALML_TEMPLATE_MACROENABLED,
328     OPENOFFICE,
329     OPENOFFICE_CALC,
330     OPENOFFICE_DRAW,
331     OPENOFFICE_WRITER_GLOBAL,
332     OPENOFFICE_IMPRESS,
333     OPENOFFICE_MATH,
334     OPENOFFICE_WRITER,
335     OPENOFFICE_CALC_TEMPLATE,
336     OPENOFFICE_DRAW_TEMPLATE,
337     OPENOFFICE_IMPRESS_TEMPLATE,
338     OPENOFFICE_WRITER_TEMPLATE,
339     STAROFFICE,
340     STAROFFICE_DRAW,
341     STAROFFICE_CALC,
342     STAROFFICE_IMPRESS,
343     STAROFFICE_WRITER,
344     STAROFFICE_CHART,
345     STAROFFICE_MAIL,
346     STAROFFICE_WRITER_GLOBAL,
347     STAROFFICE_MATH,
348     STAROFFICE_TEMPLATE,
349     TUG_BIB,
350     TUG_CLS,
351     TUG_STY,
352     TUG_TEX,
353     LATEX,
354     ADVANCED_SYSTEMS_FORMAT,
355     ADVANCED_STREAM_REDIRECTOR,
356     MATROSKA_VIDEO,
357     MATROSKA_AUDIO,
358     SGI_MOVIE,
359     APPLE_M4V,
360     WEBM,
361     QUICKTIME_MOVIE,
362     CORELDRAW_CDR,
363     CORELDRAW_CDT,
364     CORELDRAW_CPT,
365     CORELDRAW_PAT,
366     MICROSOFT_CUR,
367     SUN_RASTER,
368     GOOGLE_WEBP,
369     KOAN_AUDIO,
370     QT_MOC,
371     GHOSTSCRIPT_FONT,
372     X_PCF_FONT,
373     WINDOWS_MEDIA_WMD,
374     WINDOWS_MEDIA_WMZ,
375     WINDOWS_INSTALLER,
376     PUBLISHER_PUB,
377     WINDOWS_MEDIA_PLAYLIST,
378     ACCESS_MDB,
379     STEREOLITHOGRAPHY,
380     APPLE_MEDIA_PLAYLIST,
381     ABISOURCE_WORD,
382     ADOBE_FRAMEMAKER,
383     WOLFRAM_CDF,
384     CINDERELLA_CDY,
385     ADOBE_DCR,
386     ADOBE_DIR,
387     ADOBE_DXR,
388     GNUMERIC_SPREADSHEET,
389     HDFGROUP_HDF,
390     BINHEX_ARCHIVE,
391     MICROSOFT_HTA,
392     INTERNET_INS,
393     INTERNET_ISP,
394     TROFF,
395     ADOBE_MIF,
396     FREEMIND,
397     YAMAHA_SMAF,
398     MATHEMATICA_NOTEBOOK,
399     XIPH_OGG,
400     PROXY_AUTOCONFIG,
401     PKCS_12,
402     PGP_SIGNATURE,
403     QUICKTIME_LINK,
404     RAR_ARCHIVE,
405     SEVEN_ZIP_ARCHIVE,
406     RED_BEAN_SGF,
407     SIT_ARCHIVE,
408     FUTURESPLASH,
409     FLASH,
410     TEXINFO,
411     TORRENT,
412     DOOM,
413     APPLE_WEBARCHIVE,
414     ANDROID_WEBARCHIVE,
415     GIMP_XCF,
416     EDRWMAX,
417     EDRWMIND,
418     CNKI_CAJ,
419     DBASE_DBF,
420     AUTODESK_DWG,
421     AUTODESK_DXF,
422     AUTODESK_DWS,
423     AUTODESK_DWT,
424     AUTODESK_DWF,
425     AUTODESK_DWFX,
426     AUTODESK_SHP,
427     AUTODESK_SHX,
428     AUTODESK_SLIDE_LIB,
429     AUTODESK_LINE,
430     AUTODESK_PLOTTER,
431     HP_GRAPHICS_LANG,
432     MICROSOFT_METAFILE,
433     ACIS_SAT,
434     AVIF_IMAGE,
435     MICROSOFT_DDS,
436     IFF_ILBM,
437     CR2_RAW_IMAGE,
438     CR3_RAW_IMAGE,
439     CRW_RAW_IMAGE,
440     DNG_RAW_IMAGE,
441     ARW_RAW_IMAGE,
442     NEF_RAW_IMAGE,
443     MINDMANAGER_MMAP,
444     MICROSOFT_EMAIL,
445     MICROSOFT_MESSAGE,
446     MICROSOFT_PST,
447     KINGSOFT_OFFICE,
448     KINGSOFT_WRITER_WPS,
449     KINGSOFT_WRITER_WPT,
450     KINGSOFT_PRESENTATION_DPS,
451     KINGSOFT_PRESENTATION_TEMPLATE,
452     KINGSOFT_SPREADSHEETS_ET,
453     KINGSOFT_SPREADSHEETS_TEMPLATE,
454     MICROSOFT_INI,
455     JSON,
456     YAML,
457     LOG,
458     URI,
459     FILE_URI,
460     TEXT_LST,
461     ANDROID_APK,
462     BZ_ARCHIVE,
463     TBZ_ARCHIVE,
464     TBZ2_ARCHIVE,
465     XZ_ARCHIVE,
466     TXZ_ARCHIVE,
467     XAR_ARCHIVE,
468     CAB_ARCHIVE,
469     RPM_ARCHIVE,
470     TPZ_ARCHIVE,
471     LZA_ARCHIVE,
472     ARJ_ARCHIVE,
473     ZIPX_ARCHIVE,
474     LZMA_ARCHIVE,
475     LZMA86_ARCHIVE,
476     XPI_ARCHIVE,
477     HFS_DISK_IMAGE,
478     IMG_DISK_IMAGE,
479     ISZ_DISK_IMAGE,
480     WIM_DISK_IMAGE,
481     SWM_DISK_IMAGE,
482     KINGSOFT_SPREADSHEETS_ETX,
483     KINGSOFT_SPREADSHEETS_ETTX,
484     EXCEL_DIF,
485     OPENHARMONY_APP,
486     HMOS_WIFI,
487     TEL,
488     ETS,
489     JSON5,
490     APE_AUDIO,
491     OPUS_AUDIO,
492     CONF,
493     MICROSOFT_DOS_BATCH,
494     MICROSOFT_VBSCRIPT,
495     ION,
496     MICROSOFT_REGISTRY,
497     MICROSOFT_CATALOG,
498     MICROSOFT_POWERSHELL_SCRIPT,
499     W3_WOFF,
500     SQLITE_DATABASE,
501     MICROSOFT_SYS,
502     MICROSOFT_INF,
503     MICROSOFT_PDB,
504     MICROSOFT_TLB,
505     MICROSOFT_SCCD,
506     ADOBE_F4V,
507     MP2T,
508     YOUTUBE_VIDEO,
509     WEBEX_VIDEO,
510     MPEG2,
511     MPEG1,
512     REALMEDIA_VBR,
513     REAL_REALVIDEO,
514     DIVX_VIDEO,
515     CSIRO_ANNODEX,
516     OGV,
517     LSF_VIDEO,
518     H264_VIDEO,
519     JPEG2000,
520     RAF_RAW_IMAGE,
521     NRW_RAW_IMAGE,
522     RW2_RAW_IMAGE,
523     PEF_RAW_IMAGE,
524     SRW_RAW_IMAGE,
525     ERF_RAW_IMAGE,
526     ORF_RAW_IMAGE,
527     IEF_IMAGE,
528     ART_IMAGE,
529     CONTENT_FORM,
530     M4P_AUDIO,
531     AC3_AUDIO,
532     OPENHARMONY_HSP,
533     OPENHARMONY_HAR,
534     OPENHARMONY_GOPAINT,
535     OPENHARMONY_GOBRUSH,
536     OPENHARMONY_GOBRUSHES,
537     OPENHARMONY_GOCOLOR,
538     UD_BUTT
539 };
540 
541 struct UtdType {
542     int32_t UtdEnum;
543     const char *UtdEnumName;
544     const char *UtdId;
545 };
546 
547 namespace UtdUtils {
548     bool API_EXPORT IsValidUtdId(const std::string &utdId);
549     int32_t API_EXPORT GetUtdEnumFromUtdId(const std::string &utdId);
550     std::string API_EXPORT GetUtdIdFromUtdEnum(int32_t utdType);
551     std::vector<UtdType> API_EXPORT GetUtdTypes();
552 } // namespace UtdUtils
553 
554 /*
555  * UnifiedData variant definitions.
556  */
557 using UDVariant = std::variant<int32_t, int64_t, bool, double, std::string, std::vector<uint8_t>>;
558 using UDDetails = std::map<std::string, UDVariant>;
559 /*
560  * UnifiedData Intention.
561  */
562 enum Intention : int32_t {
563     UD_INTENTION_BASE = 0,
564     UD_INTENTION_DRAG,
565     UD_INTENTION_DATA_HUB,
566     UD_INTENTION_BUTT,
567 };
568 
569 static const std::unordered_map<int32_t, std::string> UD_INTENTION_MAP {
570     { UD_INTENTION_DRAG, "drag" },
571     { UD_INTENTION_DATA_HUB, "DataHub" },
572 };
573 
574 static const std::unordered_map<int32_t, std::string> UD_SYSTEM_INTENTION_MAP {
575     { UD_INTENTION_DRAG, "Drag" },
576 };
577 
578 static const std::unordered_map<int32_t, std::string> JS_UD_INTENTION_NAME_MAP {
579     { UD_INTENTION_DATA_HUB, "DATA_HUB" },
580     { UD_INTENTION_DRAG, "DRAG" },
581 };
582 
583 enum ShareOptions : int32_t {
584     IN_APP,
585     CROSS_APP,
586     CROSS_DEVICE,
587     SHARE_OPTIONS_BUTT,
588 };
589 
590 struct AppShareOption {
591     int32_t enumNum;
592     const char *enumStr;
593 };
594 
595 namespace ShareOptionsUtil {
596     bool API_EXPORT IsValid(int32_t shareOption);
597     int32_t API_EXPORT GetEnumNum(const std::string &shareOption);
598     std::string API_EXPORT GetEnumStr(int32_t shareOption);
599 } // namespace ShareOptionsUtil
600 
601 class API_EXPORT UnifiedDataUtils {
602 public:
603     static bool IsValidType(int32_t value);
604     static bool IsValidIntention(int32_t value);
605     static size_t GetVariantSize(UDVariant &variant);
606     static size_t GetDetailsSize(UDDetails &details);
607     static bool IsPersist(const Intention &intention);
608     static bool IsPersist(const std::string &intention);
609     static Intention GetIntentionByString(const std::string &intention);
610     static bool IsValidOptions(const std::string &key, std::string &intention);
611 };
612 
613 struct Object;
614 using ValueType = std::variant<std::monostate, int32_t, int64_t, double, bool, std::string, std::vector<uint8_t>,
615     std::shared_ptr<OHOS::AAFwk::Want>, std::shared_ptr<OHOS::Media::PixelMap>, std::shared_ptr<Object>, nullptr_t>;
616 
617 struct API_EXPORT Object {
618     template<typename T>
GetValueObject619     bool GetValue(const std::string &key, T &value)
620     {
621         auto it = value_.find(key);
622         if (it != value_.end() && std::holds_alternative<T>(it->second)) {
623             value = std::get<T>(it->second);
624             return true;
625         }
626         return false;
627     }
628 
629     std::map<std::string, ValueType> value_;
630 };
631 
632 namespace ObjectUtils {
633     std::shared_ptr<Object> ConvertToObject(UDDetails &details);
634     UDDetails ConvertToUDDetails(std::shared_ptr<Object> object);
635 
636     template<typename T, typename... Types>
ConvertVariant(T && input,std::variant<Types...> & output)637     bool ConvertVariant(T &&input, std::variant<Types...> &output)
638     {
639         bool converted = false;
640         std::visit(
641             [&output, &converted](auto &&val) {
642               using BasicType = std::decay_t<decltype(val)>;
643               if constexpr ((std::is_same_v<BasicType, Types> || ...)) {
644                 output = std::variant<Types...>(std::move(val));
645                 converted = true;
646               }
647             },
648             input);
649         return converted;
650     }
651 } // namespace ObjectUtils
652 } // namespace UDMF
653 } // namespace OHOS
654 #endif // UNIFIED_META_H
655