1  /*
2   * Copyright (c) 2021-2024 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 OHOS_ABILITY_BASE_WANT_H
17  #define OHOS_ABILITY_BASE_WANT_H
18  
19  #include <string>
20  #include <vector>
21  #include <algorithm>
22  
23  #include "uri.h"
24  #include "want_params.h"
25  #include "element_name.h"
26  #include "operation.h"
27  #include "parcel.h"
28  #include "nlohmann/json.hpp"
29  
30  using Operation = OHOS::AAFwk::Operation;
31  
32  namespace OHOS {
33  namespace AAFwk {
34  class Want final : public Parcelable {
35  public:
36      /**
37       * Indicates the grant to perform read operations on the URI.
38       */
39      static constexpr unsigned int FLAG_AUTH_READ_URI_PERMISSION = 0x00000001;
40      /**
41       * Indicates the grant to perform write operations on the URI.
42       */
43      static constexpr unsigned int FLAG_AUTH_WRITE_URI_PERMISSION = 0x00000002;
44      /**
45       * Returns the result to the source ability.
46       */
47      static constexpr unsigned int FLAG_ABILITY_FORWARD_RESULT = 0x00000004;
48      /**
49       * Determines whether an ability on the local device can be migrated to a remote device.
50       */
51      static constexpr unsigned int FLAG_ABILITY_CONTINUATION = 0x00000008;
52      /**
53       * Specifies whether a component does not belong to OHOS.
54       */
55      static constexpr unsigned int FLAG_NOT_OHOS_COMPONENT = 0x00000010;
56      /**
57       * Specifies whether an ability is started.
58       */
59      static constexpr unsigned int FLAG_ABILITY_FORM_ENABLED = 0x00000020;
60      /**
61       * Indicates the grant for possible persisting on the URI.
62       */
63      static constexpr unsigned int FLAG_AUTH_PERSISTABLE_URI_PERMISSION = 0x00000040;
64      /**
65       * Returns the result to the source ability slice.
66       */
67      static constexpr unsigned int FLAG_AUTH_PREFIX_URI_PERMISSION = 0x00000080;
68      /**
69       * Supports multi-device startup in the distributed scheduling system.
70       */
71      static constexpr unsigned int FLAG_ABILITYSLICE_MULTI_DEVICE = 0x00000100;
72      /**
73       * Indicates that an ability using the Service template is started regardless of whether the host application has
74       * been started.
75       */
76      static constexpr unsigned int FLAG_START_FOREGROUND_ABILITY = 0x00000200;
77  
78      /**
79       * Indicates the continuation is reversible.
80       */
81      static constexpr unsigned int FLAG_ABILITY_CONTINUATION_REVERSIBLE = 0x00000400;
82  
83      /**
84       * Install the specified ability if it's not installed.
85       */
86      static constexpr unsigned int FLAG_INSTALL_ON_DEMAND = 0x00000800;
87      /**
88       * Indicates the continuation is quick start
89       */
90      static constexpr unsigned int FLAG_ABILITY_PREPARE_CONTINUATION = 0x00001000;
91      /**
92       * Returns the result to the source ability slice.
93       */
94      static constexpr unsigned int FLAG_ABILITYSLICE_FORWARD_RESULT = 0x04000000;
95      /**
96       * Install the specifiedi ability with background mode if it's not installed.
97       */
98      static constexpr unsigned int FLAG_INSTALL_WITH_BACKGROUND_MODE = 0x80000000;
99      /**
100       * Indicates the operation of clearing other missions.
101       */
102      static constexpr unsigned int FLAG_ABILITY_CLEAR_MISSION = 0x00008000;
103      /**
104       * Indicates the operation of creating a task on the historical mission stack.
105       */
106      static constexpr unsigned int FLAG_ABILITY_NEW_MISSION = 0x10000000;
107      /**
108       * Indicates that the existing instance of the ability to start will be reused if it is already at the top of
109       * the mission stack. Otherwise, a new ability instance will be created.
110       */
111      static constexpr unsigned int FLAG_ABILITY_MISSION_TOP = 0x20000000;
112      /**
113       * Indicates that if implicit start ability couldn't match any application, no tip dialog will be pulled up.
114       */
115      static constexpr unsigned int FLAG_START_WITHOUT_TIPS = 0x40000000;
116  
117      /**
118       * @description:  Default construcotr of Want class, which is used to initialzie flags and URI.
119       * @param None
120       * @return None
121       */
122      Want();
123  
124      /**
125       * @description: Default deconstructor of Want class
126       * @param None
127       * @return None
128       */
129      ~Want();
130  
131      /**
132       * @description: Copy construcotr of Want class, which is used to initialzie flags, URI, etc.
133       * @param want the source instance of Want.
134       * @return None
135       */
136      Want(const Want &want);
137      Want &operator=(const Want &want);
138  
139      /**
140       * @description: Sets a flag in a Want.
141       * @param flags Indicates the flag to set.
142       * @return Returns this Want object containing the flag.
143       */
144      Want &SetFlags(unsigned int flags);
145  
146      /**
147       * @description: Obtains the description of flags in a Want.
148       * @return Returns the flag description in the Want.
149       */
150      unsigned int GetFlags() const;
151  
152      /**
153       * @description: Adds a flag to a Want.
154       * @param flags Indicates the flag to add.
155       * @return Returns the Want object with the added flag.
156       */
157      Want &AddFlags(unsigned int flags);
158  
159      /**
160       * @description: Removes the description of a flag from a Want.
161       * @param flags Indicates the flag to remove.
162       * @return Removes the description of a flag from a Want.
163       */
164      void RemoveFlags(unsigned int flags);
165  
166      /**
167       * @description: Sets the bundleName and abilityName attributes for this Want object.
168       * @param bundleName Indicates the bundleName to set for the operation attribute in the Want.
169       * @param abilityName Indicates the abilityName to set for the operation attribute in the Want.
170       * @return Returns this Want object that contains the specified bundleName and abilityName attributes.
171       */
172      Want &SetElementName(const std::string &bundleName, const std::string &abilityName);
173  
174      /**
175       * @description: Sets the bundleName and abilityName attributes for this Want object.
176       * @param deviceId Indicates the deviceId to set for the operation attribute in the Want.
177       * @param bundleName Indicates the bundleName to set for the operation attribute in the Want.
178       * @param abilityName Indicates the abilityName to set for the operation attribute in the Want.
179       * @return Returns this Want object that contains the specified bundleName and abilityName attributes.
180       */
181      Want &SetElementName(const std::string &deviceId, const std::string &bundleName,
182          const std::string &abilityName, const std::string &moduleName = "");
183  
184      /**
185       * @description: Sets an ElementName object in a Want.
186       * @param element Indicates the ElementName description.
187       * @return Returns this Want object containing the ElementName
188       */
189      Want &SetElement(const OHOS::AppExecFwk::ElementName &element);
190  
191      /**
192       * @description: Obtains the description of the ElementName object in a Want.
193       * @return Returns the ElementName description in the Want.
194       */
195      OHOS::AppExecFwk::ElementName GetElement() const;
196  
197      /**
198       * @description: Creates a want with its corresponding attributes specified for starting the main ability of an
199       * application.
200       * @param ElementName  Indicates the ElementName object defining the deviceId, bundleName,
201       * and abilityName sub-attributes of the operation attribute in a want.
202       * @return Returns the want object used to start the main ability of an application.
203       */
204      static Want *MakeMainAbility(const OHOS::AppExecFwk::ElementName &elementName);
205  
206      /**
207       * @description: Creates a Want instance by using a given Uniform Resource Identifier (URI).
208       * This method parses the input URI and saves it in a Want object.
209       * @param uri Indicates the URI to parse.
210       * @return Returns a Want object containing the URI.
211       */
212      static Want *WantParseUri(const char *uri);
213  
214      /**
215       * @description: Creates a Want instance by using a given Uniform Resource Identifier (URI).
216       * This method parses the input URI and saves it in a Want object.
217       * @param uri Indicates the URI to parse.
218       * @return Returns a Want object containing the URI.
219       */
220      static Want *ParseUri(const std::string &uri);
221  
222      /**
223       * @description: Obtains the description of a URI in a Want.
224       * @return Returns the URI description in the Want.
225       */
226      Uri GetUri() const;
227  
228      /**
229       * @description: Obtains the string representation of the URI in this Want.
230       * @return Returns the string of the URI.
231       */
232      std::string GetUriString() const;
233  
234      /**
235       * @description: Sets the description of a URI in a Want.
236       * @param uri Indicates the URI description.
237       * @return Returns this Want object containing the URI.
238       */
239      Want &SetUri(const std::string &uri);
240  
241      /**
242       * @description: Sets the description of a URI in a Want.
243       * @param uri Indicates the URI description.
244       * @return Returns this Want object containing the URI.
245       */
246      Want &SetUri(const Uri &uri);
247  
248      /**
249       * @description: Sets the description of a URI and a type in this Want.
250       * @param uri Indicates the URI description.
251       * @param type Indicates the type description.
252       * @return Returns the Want object containing the URI and the type by setting.
253       */
254      Want &SetUriAndType(const Uri &uri, const std::string &type);
255  
256      /**
257       * @description: Converts a Want into a URI string containing a representation of it.
258       * @param want Indicates the want description.--Want.
259       * @return   Returns an encoding URI string describing the Want object.
260       */
261      std::string WantToUri(Want &want);
262  
263      /**
264       * @description: Converts parameter information in a Want into a URI string.
265       * @return Returns the URI string.
266       */
267      std::string ToUri() const;
268  
269      /**
270       * @description: Formats a specified URI.
271       * This method uses the Uri.getLowerCaseScheme() method to format a URI and then saves
272       * the formatted URI to this Want object.
273       * @param uri Indicates the string of URI to format.
274       * @return Returns this Want object that contains the formatted uri attribute.
275       */
276      Want &FormatUri(const std::string &uri);
277  
278      /**
279       * @description: Formats a specified URI.
280       * This method uses the Uri.getLowerCaseScheme() method to format a URI and then saves
281       * the formatted URI to this Want object.
282       * @param uri Indicates the URI to format.
283       * @return Returns this Want object that contains the formatted URI attribute.
284       */
285      Want &FormatUri(const Uri &uri);
286  
287      /**
288       * @description: Obtains the description of an action in a want.
289       * @return Returns a Want object that contains the action description.
290       */
291      std::string GetAction() const;
292  
293      /**
294       * @description: Sets the description of an action in a want.
295       * @param action Indicates the action description to set.
296       * @return Returns a Want object that contains the action description.
297       */
298      Want &SetAction(const std::string &action);
299  
300      /**
301       * @description: Obtains the name of the specified bundle in a Want.
302       * @return Returns the specified bundle name in the Want.
303       */
304      std::string GetBundle() const;
305  
306      /**
307       * @description: Sets a bundle name in this Want.
308       * If a bundle name is specified in a Want, the Want will match only
309       * the abilities in the specified bundle. You cannot use this method and
310       * setPicker(ohos.aafwk.content.Want) on the same Want.
311       * @param bundleName Indicates the bundle name to set.
312       * @return Returns a Want object containing the specified bundle name.
313       */
314      Want &SetBundle(const std::string &bundleName);
315  
316      /**
317       * @description: Obtains the description of all entities in a Want
318       * @return Returns a set of entities
319       */
320      const std::vector<std::string> &GetEntities() const;
321  
322      /**
323       * @description: Adds the description of an entity to a Want
324       * @param entity Indicates the entity description to add
325       * @return {Want} Returns this Want object containing the entity.
326       */
327      Want &AddEntity(const std::string &entity);
328  
329      /**
330       * @description: Removes the description of an entity from a Want
331       * @param entity Indicates the entity description to remove.
332       * @return void
333       */
334      void RemoveEntity(const std::string &entity);
335  
336      /**
337       * @description: Checks whether a Want contains the given entity
338       * @param entity Indicates the entity to check
339       * @return Returns true if the given entity is contained; returns false otherwise
340       */
341      bool HasEntity(const std::string &key) const;
342  
343      /**
344       * @description: Obtains the number of entities in a Want
345       * @return Returns the entity quantity
346       */
347      int CountEntities();
348  
349      /**
350       * @description: Obtains the description of the URI scheme in this want.
351       * @return Returns the URI scheme description in this want.
352       */
353      const std::string GetScheme() const;
354  
355      /**
356       * @description: Obtains the description of the type in this Want
357       * @return Returns the type description in this Want
358       */
359      std::string GetType() const;
360  
361      /**
362       * @description: Sets the description of a type in this Want
363       * @param type Indicates the type description
364       * @return Returns this Want object containing the type
365       */
366      Want &SetType(const std::string &type);
367  
368      /**
369       * @description: Formats a specified MIME type. This method uses
370       * the formatMimeType(java.lang.String) method to format a MIME type
371       * and then saves the formatted type to this Want object.
372       * @param type Indicates the MIME type to format
373       * @return Returns this Want object that contains the formatted type attribute
374       */
375      Want &FormatType(const std::string &type);
376  
377      /**
378       * @description: Formats a specified URI and MIME type.
379       * This method works in the same way as formatUri(ohos.utils.net.URI)
380       * and formatType(java.lang.String).
381       * @param uri Indicates the URI to format.
382       * @param type Indicates the MIME type to format.
383       * @return Returns this Want object that contains the formatted URI and type attributes.
384       */
385      Want &FormatUriAndType(const Uri &uri, const std::string &type);
386  
387      /**
388       * @description: This method formats data of a specified MIME type
389       * by removing spaces from the data and converting the data into
390       * lowercase letters. You can use this method to normalize
391       * the external data used to create Want information.
392       * @param type Indicates the MIME type to format
393       * @return Returns this Want object that contains the formatted type attribute
394       */
395      static std::string FormatMimeType(const std::string &mimeType);
396  
397      /**
398       * @description: clear the specific want object.
399       * @param want Indicates the want to clear
400       */
401      static void ClearWant(Want *want);
402  
403      /**
404       * @description: Obtains the description of the WantParams object in a Want
405       * @return Returns the WantParams description in the Want
406       */
407      const WantParams &GetParams() const;
408  
409      /**
410       * @description: Sets a wantParams object in a want.
411       * @param wantParams  Indicates the wantParams description.
412       * @return Returns this want object containing the wantParams.
413       */
414      Want &SetParams(const WantParams &wantParams);
415  
416      /**
417       * @description: Obtains a bool-type value matching the given key.
418       * @param key   Indicates the key of WantParams.
419       * @param defaultValue  Indicates the default bool-type value.
420       * @return Returns the bool-type value of the parameter matching the given key;
421       * returns the default value if the key does not exist.
422       */
423      bool GetBoolParam(const std::string &key, bool defaultValue) const;
424  
425      /**
426       * @description: Obtains a bool-type array matching the given key.
427       * @param key   Indicates the key of WantParams.
428       * @return Returns the bool-type array of the parameter matching the given key;
429       * returns null if the key does not exist.
430       */
431      std::vector<bool> GetBoolArrayParam(const std::string &key) const;
432  
433      /**
434       * @description: Sets a parameter value of the IRemoteObject type.
435       * @param key   Indicates the key matching the parameter.
436       * @param value Indicates the IRemoteObject value of the parameter.
437       * @return Returns this want object containing the parameter value.
438       */
439      Want& SetParam(const std::string& key, const sptr<IRemoteObject>& remoteObject);
440  
441      /**
442       * @description: Obtains a IRemoteObject-type value matching the given key.
443       * @param key   Indicates the key of WantParams.
444       * @param defaultValue  Indicates the default IRemoteObject-type value.
445       * @return Returns the IRemoteObject-type value of the parameter matching the given key;
446       * returns the nullptr if the key does not exist.
447       */
448      sptr<IRemoteObject> GetRemoteObject(const std::string &key) const;
449  
450      /**
451       * @description: Sets a parameter value of the boolean type.
452       * @param key   Indicates the key matching the parameter.
453       * @param value Indicates the boolean value of the parameter.
454       * @return Returns this want object containing the parameter value.
455       */
456      Want &SetParam(const std::string &key, bool value);
457  
458      /**
459       * @description: Sets a parameter value of the boolean array type.
460       * @param key   Indicates the key matching the parameter.
461       * @param value Indicates the boolean array of the parameter.
462       * @return Returns this want object containing the parameter value.
463       */
464      Want &SetParam(const std::string &key, const std::vector<bool> &value);
465  
466      /**
467       * @description: Obtains a byte-type value matching the given key.
468       * @param key   Indicates the key of WantParams.
469       * @param defaultValue  Indicates the default byte-type value.
470       * @return Returns the byte-type value of the parameter matching the given key;
471       * returns the default value if the key does not exist.
472       */
473      byte GetByteParam(const std::string &key, byte defaultValue) const;
474  
475      /**
476       * @description: Obtains a byte-type array matching the given key.
477       * @param key   Indicates the key of WantParams.
478       * @return Returns the byte-type array of the parameter matching the given key;
479       * returns null if the key does not exist.
480       */
481      std::vector<byte> GetByteArrayParam(const std::string &key) const;
482  
483      /**
484       * @description: Sets a parameter value of the byte type.
485       * @param key   Indicates the key matching the parameter.
486       * @param value Indicates the byte-type value of the parameter.
487       * @return Returns this Want object containing the parameter value.
488       */
489      Want &SetParam(const std::string &key, byte value);
490  
491      /**
492       * @description: Sets a parameter value of the byte array type.
493       * @param key   Indicates the key matching the parameter.
494       * @param value Indicates the byte array of the parameter.
495       * @return Returns this Want object containing the parameter value.
496       */
497      Want &SetParam(const std::string &key, const std::vector<byte> &value);
498  
499      /**
500       * @description: Obtains a char value matching the given key.
501       * @param key   Indicates the key of wnatParams.
502       * @param value Indicates the default char value.
503       * @return Returns the char value of the parameter matching the given key;
504       * returns the default value if the key does not exist.
505       */
506      zchar GetCharParam(const std::string &key, zchar defaultValue) const;
507  
508      /**
509       * @description: Obtains a char array matching the given key.
510       * @param key   Indicates the key of wantParams.
511       * @return Returns the char array of the parameter matching the given key;
512       * returns null if the key does not exist.
513       */
514      std::vector<zchar> GetCharArrayParam(const std::string &key) const;
515  
516      /**
517       * @description: Sets a parameter value of the char type.
518       * @param key   Indicates the key of wantParams.
519       * @param value Indicates the char value of the parameter.
520       * @return Returns this want object containing the parameter value.
521       */
522      Want &SetParam(const std::string &key, zchar value);
523  
524      /**
525       * @description: Sets a parameter value of the char array type.
526       * @param key   Indicates the key of wantParams.
527       * @param value Indicates the char array of the parameter.
528       * @return Returns this want object containing the parameter value.
529       */
530      Want &SetParam(const std::string &key, const std::vector<zchar> &value);
531  
532      /**
533       * @description: Obtains an int value matching the given key.
534       * @param key   Indicates the key of wantParams.
535       * @param value Indicates the default int value.
536       * @return Returns the int value of the parameter matching the given key;
537       * returns the default value if the key does not exist.
538       */
539      int GetIntParam(const std::string &key, int defaultValue) const;
540  
541      /**
542       * @description: Obtains an int array matching the given key.
543       * @param key   Indicates the key of wantParams.
544       * @return Returns the int array of the parameter matching the given key;
545       * returns null if the key does not exist.
546       */
547      std::vector<int> GetIntArrayParam(const std::string &key) const;
548  
549      /**
550       * @description: Sets a parameter value of the int type.
551       * @param key   Indicates the key matching the parameter.
552       * @param value Indicates the int value of the parameter.
553       * @return Returns this Want object containing the parameter value.
554       */
555      Want &SetParam(const std::string &key, int value);
556  
557      /**
558       * @description: Sets a parameter value of the int array type.
559       * @param key   Indicates the key matching the parameter.
560       * @param value Indicates the int array of the parameter.
561       * @return Returns this Want object containing the parameter value.
562       */
563      Want &SetParam(const std::string &key, const std::vector<int> &value);
564  
565      /**
566       * @description: Obtains a double value matching the given key.
567       * @param key   Indicates the key of wantParams.
568       * @param defaultValue  Indicates the default double value.
569       * @return Returns the double value of the parameter matching the given key;
570       * returns the default value if the key does not exist.
571       */
572      double GetDoubleParam(const std::string &key, double defaultValue) const;
573  
574      /**
575       * @description: Obtains a double array matching the given key.
576       * @param key   Indicates the key of WantParams.
577       * @return Returns the double array of the parameter matching the given key;
578       * returns null if the key does not exist.
579       */
580      std::vector<double> GetDoubleArrayParam(const std::string &key) const;
581  
582      /**
583       * @description: Sets a parameter value of the double type.
584       * @param key   Indicates the key matching the parameter.
585       * @param value Indicates the int value of the parameter.
586       * @return Returns this Want object containing the parameter value.
587       */
588      Want &SetParam(const std::string &key, double value);
589  
590      /**
591       * @description: Sets a parameter value of the double array type.
592       * @param key   Indicates the key matching the parameter.
593       * @param value Indicates the double array of the parameter.
594       * @return Returns this want object containing the parameter value.
595       */
596      Want &SetParam(const std::string &key, const std::vector<double> &value);
597  
598      /**
599       * @description: Obtains a float value matching the given key.
600       * @param key   Indicates the key of wnatParams.
601       * @param value Indicates the default float value.
602       * @return Returns the float value of the parameter matching the given key;
603       * returns the default value if the key does not exist.
604       */
605      float GetFloatParam(const std::string &key, float defaultValue) const;
606  
607      /**
608       * @description: Obtains a float array matching the given key.
609       * @param key Indicates the key of WantParams.
610       * @return Obtains a float array matching the given key.
611       */
612      std::vector<float> GetFloatArrayParam(const std::string &key) const;
613  
614      /**
615       * @description: Sets a parameter value of the float type.
616       * @param key Indicates the key matching the parameter.
617       * @param value Indicates the byte-type value of the parameter.
618       * @return Returns this Want object containing the parameter value.
619       */
620      Want &SetParam(const std::string &key, float value);
621  
622      /**
623       * @description: Sets a parameter value of the float array type.
624       * @param key Indicates the key matching the parameter.
625       * @param value Indicates the byte-type value of the parameter.
626       * @return Returns this Want object containing the parameter value.
627       */
628      Want &SetParam(const std::string &key, const std::vector<float> &value);
629  
630      /**
631       * @description: Obtains a long value matching the given key.
632       * @param key Indicates the key of wantParams.
633       * @param value Indicates the default long value.
634       * @return Returns the long value of the parameter matching the given key;
635       * returns the default value if the key does not exist.
636       */
637      long GetLongParam(const std::string &key, long defaultValue) const;
638  
639      /**
640       * @description: Obtains a long array matching the given key.
641       * @param key Indicates the key of wantParams.
642       * @return Returns the long array of the parameter matching the given key;
643       * returns null if the key does not exist.
644       */
645      std::vector<long> GetLongArrayParam(const std::string &key) const;
646  
647      Want &SetParam(const std::string &key, long long value);
648  
649      /**
650       * @description: Sets a parameter value of the long type.
651       * @param key Indicates the key matching the parameter.
652       * @param value Indicates the byte-type value of the parameter.
653       * @return Returns this Want object containing the parameter value.
654       */
655      Want &SetParam(const std::string &key, long value);
656  
657      /**
658       * @description: Sets a parameter value of the long array type.
659       * @param key Indicates the key matching the parameter.
660       * @param value Indicates the byte-type value of the parameter.
661       * @return Returns this Want object containing the parameter value.
662       */
663      Want &SetParam(const std::string &key, const std::vector<long> &value);
664  
665      /**
666       * @description: a short value matching the given key.
667       * @param key Indicates the key of wantParams.
668       * @param defaultValue Indicates the default short value.
669       * @return Returns the short value of the parameter matching the given key;
670       * returns the default value if the key does not exist.
671       */
672      short GetShortParam(const std::string &key, short defaultValue) const;
673  
674      /**
675       * @description: Obtains a short array matching the given key.
676       * @param key Indicates the key of wantParams.
677       * @return Returns the short array of the parameter matching the given key;
678       * returns null if the key does not exist.
679       */
680      std::vector<short> GetShortArrayParam(const std::string &key) const;
681  
682      /**
683       * @description: Sets a parameter value of the short type.
684       * @param key Indicates the key matching the parameter.
685       * @param value Indicates the byte-type value of the parameter.
686       * @return Returns this Want object containing the parameter value.
687       */
688      Want &SetParam(const std::string &key, short value);
689  
690      /**
691       * @description: Sets a parameter value of the short array type.
692       * @param key Indicates the key matching the parameter.
693       * @param value Indicates the byte-type value of the parameter.
694       * @return Returns this Want object containing the parameter value.
695       */
696      Want &SetParam(const std::string &key, const std::vector<short> &value);
697  
698      /**
699       * @description: Obtains a string value matching the given key.
700       * @param key Indicates the key of wantParams.
701       * @return Returns the string value of the parameter matching the given key;
702       * returns null if the key does not exist.
703       */
704      std::string GetStringParam(const std::string &key) const;
705  
706      /**
707       * @description: Obtains a string array matching the given key.
708       * @param key Indicates the key of wantParams.
709       * @return Returns the string array of the parameter matching the given key;
710       * returns null if the key does not exist.
711       */
712      std::vector<std::string> GetStringArrayParam(const std::string &key) const;
713  
714      /**
715       * @description: Sets a parameter value of the string type.
716       * @param key Indicates the key matching the parameter.
717       * @param value Indicates the byte-type value of the parameter.
718       * @return Returns this Want object containing the parameter value.
719       */
720      Want &SetParam(const std::string &key, const std::string &value);
721  
722      /**
723       * @description: Sets a parameter value of the string array type.
724       * @param key Indicates the key matching the parameter.
725       * @param value Indicates the byte-type value of the parameter.
726       * @return Returns this Want object containing the parameter value.
727       */
728      Want &SetParam(const std::string &key, const std::vector<std::string> &value);
729  
730      /**
731       * @description: Checks whether a Want contains the parameter matching a given key.
732       * @param key Indicates the key.
733       * @return Returns true if the Want contains the parameter; returns false otherwise.
734       */
735      bool HasParameter(const std::string &key) const;
736  
737      /**
738       * @description: Replaces parameters in this Want object with those in the given WantParams object.
739       * @param wantParams Indicates the WantParams object containing the new parameters.
740       * @return Returns this Want object containing the new parameters.
741       */
742      Want *ReplaceParams(WantParams &wantParams);
743  
744      /**
745       * @description: Replaces parameters in this Want object with those in the given Want object.
746       * @param want Indicates the Want object containing the new parameters.
747       * @return Returns this Want object containing the new parameters.
748       */
749      Want *ReplaceParams(Want &want);
750  
751      /**
752       * @description: Removes the parameter matching the given key.
753       * @param key Indicates the key matching the parameter to be removed.
754       */
755      void RemoveParam(const std::string &key);
756  
757      /**
758       * @description: Gets the description of an operation in a Want.
759       * @return Returns the operation included in this Want.
760       */
761      Operation GetOperation() const;
762  
763      /**
764       * @description: Sets the description of an operation in a Want.
765       * @param operation Indicates the operation description.
766       */
767      void SetOperation(const OHOS::AAFwk::Operation &operation);
768  
769      /**
770       * @description: Sets the description of an operation in a Want.
771       * @param want Indicates the Want object to compare.
772       * @return Returns true if the operation components of the two objects are equal; returns false otherwise.
773       */
774      bool OperationEquals(const Want &want);
775  
776      bool IsEquals(const Want &want);
777  
778      /**
779       * @description: Creates a Want object that contains only the operation component of this Want.
780       * @return Returns the created Want object.
781       */
782      Want *CloneOperation();
783  
784      /**
785       * @description: Marshals a Want into a Parcel.
786       * Fields in the Want are marshalled separately. If any field fails to be marshalled, false is returned.
787       * @param parcel Indicates the Parcel object for marshalling.
788       * @return Returns true if the marshalling is successful; returns false otherwise.
789       */
790      virtual bool Marshalling(Parcel &parcel) const;
791  
792      /**
793       * @description: Unmarshals a Want from a Parcel.
794       * Fields in the Want are unmarshalled separately. If any field fails to be unmarshalled, false is returned.
795       * @param parcel Indicates the Parcel object for unmarshalling.
796       * @return Returns true if the unmarshalling is successful; returns false otherwise.
797       */
798      static Want *Unmarshalling(Parcel &parcel);
799  
800      void DumpInfo(int level) const;
801  
802      std::string ToString() const;
803  
804      static Want *FromString(std::string &string);
805  
806      /**
807      * @description: Sets a device id in a Want.
808      * @param deviceId Indicates the device id to set.
809      * @return Returns this Want object containing the flag.
810      */
811      Want &SetDeviceId(const std::string &deviceId);
812  
813      std::string GetDeviceId() const;
814  
815      /**
816       * @description: Sets an ModuleName object in a Want.
817       * @param moduleName Indicates the ModuleName description.
818       * @return Returns this Want object containing the ModuleName.
819       */
820      Want &SetModuleName(const std::string &moduleName);
821  
822      /**
823       * @description: Obtains the description of the ModuleName object in a Want.
824       * @return Returns the ModuleName description in the Want.
825       */
826      std::string GetModuleName() const;
827  
828      void CloseAllFd();
829  
830      void RemoveAllFd();
831  
832      void DupAllFd();
833  
834      void SetEntities(const std::vector<std::string> &entities);
835  public:
836      // action definition
837      static const std::string ACTION_PLAY;
838      static const std::string ACTION_HOME;
839  
840      // entity definition
841      static const std::string ENTITY_HOME;
842      static const std::string ENTITY_VIDEO;
843      static const std::string FLAG_HOME_INTENT_FROM_SYSTEM;
844      static const std::string ENTITY_MUSIC;
845      static const std::string ENTITY_EMAIL;
846      static const std::string ENTITY_CONTACTS;
847      static const std::string ENTITY_MAPS;
848      static const std::string ENTITY_BROWSER;
849      static const std::string ENTITY_CALENDAR;
850      static const std::string ENTITY_MESSAGING;
851      static const std::string ENTITY_FILES;
852      static const std::string ENTITY_GALLERY;
853  
854      static constexpr int HEX_STRING_BUF_LEN = 36;
855      static constexpr int HEX_STRING_LEN = 10;
856  
857      // reserved param definition
858      static const std::string PARAM_RESV_WINDOW_MODE;
859      static const std::string PARAM_RESV_DISPLAY_ID;
860      static const std::string PARAM_RESV_WITH_ANIMATION;
861      static const std::string PARAM_RESV_WINDOW_FOCUSED;
862      static const std::string PARAM_RESV_WINDOW_LEFT;
863      static const std::string PARAM_RESV_WINDOW_TOP;
864      static const std::string PARAM_RESV_WINDOW_WIDTH;
865      static const std::string PARAM_RESV_WINDOW_HEIGHT;
866      static const std::string PARAM_RESV_CALLER_TOKEN;
867      static const std::string PARAM_RESV_CALLER_BUNDLE_NAME;
868      static const std::string PARAM_RESV_CALLER_ABILITY_NAME;
869      static const std::string PARAM_RESV_CALLER_NATIVE_NAME;
870      static const std::string PARAM_RESV_CALLER_APP_ID;
871      static const std::string PARAM_RESV_CALLER_APP_IDENTIFIER;
872      static const std::string PARAM_RESV_CALLER_UID;
873      static const std::string PARAM_RESV_CALLER_PID;
874      static const std::string PARAM_RESV_CALLER_APP_CLONE_INDEX;
875      static const std::string PARAM_RESV_FOR_RESULT;
876      static const std::string PARAM_RESV_CALL_TO_FOREGROUND;
877      static const std::string PARAM_RESV_START_RECENT;
878      static const std::string PARAM_RESV_REQUEST_PROC_CODE;
879      static const std::string PARAM_RESV_REQUEST_TOKEN_CODE;
880      static const std::string PARAM_RESV_ABILITY_INFO_CALLBACK;
881      static const std::string PARAM_RESV_START_TIME;
882      static const std::string PARAM_ABILITY_ACQUIRE_SHARE_DATA;
883      static const std::string PARAM_ABILITY_RECOVERY_RESTART;
884      static const std::string PARAM_ABILITY_URITYPES;
885      static const std::string PARAM_ABILITY_APPINFOS;
886      static const std::string PARAM_ASSERT_FAULT_SESSION_ID;
887      // module name string
888      static const std::string PARAM_MODULE_NAME;
889  
890      // parameter key
891      static const std::string PARAM_BACK_TO_OTHER_MISSION_STACK;
892  
893      // application auto startup launch reason
894      static const std::string PARAM_APP_AUTO_STARTUP_LAUNCH_REASON;
895  
896      // app clone index
897      static const std::string PARAM_APP_CLONE_INDEX_KEY;
898      static const std::string APP_INSTANCE_KEY;
899      static const std::string CREATE_APP_INSTANCE_KEY;
900  
901      static const std::string PARAM_ATOMIC_SERVICE_PAGE_PATH;
902      static const std::string PARAM_ATOMIC_SERVICE_ROUTER_NAME;
903      static const std::string PARAM_ATOMIC_SERVICE_PAGE_SOURCE_FILE;
904      static const std::string PARAM_ATOMIC_SERVICE_BUILD_FUNCTION;
905      static const std::string PARAM_ATOMIC_SERVICE_SUB_PACKAGE_NAME;
906  
907  private:
908      WantParams parameters_;
909      Operation operation_;
910  
911      static const std::string OCT_EQUALSTO;
912      static const std::string OCT_SEMICOLON;
913      static const std::string MIME_TYPE;
914      static const std::string WANT_HEADER;
915      static const std::string WANT_END;
916  
917      // no object in parcel
918      static constexpr int VALUE_NULL = -1;
919      // object exist in parcel
920      static constexpr int VALUE_OBJECT = 1;
921  
922  private:
923      static bool ParseFlag(const std::string &content, Want &want);
924      static std::string Decode(const std::string &str);
925      static std::string Encode(const std::string &str);
926      static bool ParseContent(const std::string &content, std::string &prop, std::string &value);
927      static bool ParseUriInternal(const std::string &content, OHOS::AppExecFwk::ElementName &element, Want &want);
928      static bool CheckUri(const std::string &uri);
929      bool ReadFromParcel(Parcel &parcel);
930      static bool CheckAndSetParameters(Want &want, const std::string &key, std::string &prop, const std::string &value);
931      Uri GetLowerCaseScheme(const Uri &uri);
932      void ToUriStringInner(std::string &uriString) const;
933      nlohmann::json ToJson() const;
934      bool ReadFromJson(nlohmann::json &wantJson);
935      void UriStringAppendParam(std::string &uriString) const;
936      bool WriteUri(Parcel &parcel) const;
937      bool WriteEntities(Parcel &parcel) const;
938      bool WriteElement(Parcel &parcel) const;
939      bool WriteParameters(Parcel &parcel) const;
940      bool ReadUri(Parcel &parcel);
941      bool ReadEntities(Parcel &parcel);
942      bool ReadElement(Parcel &parcel);
943      bool ReadParameters(Parcel &parcel);
944  };
945  }  // namespace AAFwk
946  }  // namespace OHOS
947  
948  #endif  // OHOS_ABILITY_BASE_WANT_H
949