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