1# Using the Pasteboard to Copy and Paste (C/C++)
2
3## When to Use
4
5The pasteboard allows you to copy and paste data of the plain text, hypertext, and URI.
6
7## Basic Concepts
8
9- **OH_PasteboardObserver**: pasteboard observer object, which is used to listen for data changes on the pasteboard.
10- **OH_Pasteboard**: pasteboard object, which is used to query and write.
11- **OH_UdmfData**: unified data object. For details, see [UDMF Development (C/C++)](../../database/native-unified-data-management-framework-guidelines.md).
12
13## Constraints
14
15- The size of data written to the pasteboard at a time cannot exceed 128 MB.
16- To ensure the accuracy of the pasteboard data, only one copy can be performed at a time.
17- Currently, supported data types include **OH_UdsPlainText** (plain text), **OH_UdsHtml** (hypertext markup language), **OH_UdsFileUri** (file URI). **OH_UdsPixelMap** (pixel map), **OH_UdsHyperlink** (hyperlink), **OH_UdsAppItem** (application icon), and custom type.
18- When you copy and paste data of a custom type, the specified type name cannot be the same as an existing one.
19- Since API version 12, [permission control](get-pastedata-permission-guidelines.md) is added to the pasteboard reading API to enhance user privacy protection.
20- The copy and paste APIs, [setUnifiedData](../../reference/apis-basic-services-kit/js-apis-pasteboard.md#setunifieddata12) and [getUnifiedData](../../reference/apis-basic-services-kit/js-apis-pasteboard.md#getunifieddata12), added in API version 12 are independent of the **OH_Pasteboard_SetData** and **OH_Pasteboard_GetData** APIs mentioned in this topic. Use the corresponding APIs when writing and reading data.
21
22## Available APIs
23
24For details about more APIs and their usage, see [Pasteboard](../../reference/apis-basic-services-kit/_pasteboard.md).
25
26| API                                                    | Description                                                   |
27| ------------------------------------------------------------ | ------------------------------------------------------- |
28| OH_PasteboardObserver* OH_PasteboardObserver_Create()        | Creates a pasteboard observer object.                     |
29| OH_PasteboardObserver_Destroy(OH_PasteboardObserver* observer) | Destroys the pasteboard observer object.                         |
30| int OH_PasteboardObserver_SetData(OH_PasteboardObserver* observer, void* context, const Pasteboard_Notify callback, const Pasteboard_Finalize finalize) | Sets the callback used to return data changes to the pasteboard observer object. |
31| OH_Pasteboard* OH_Pasteboard_Create()                        | Creates a pasteboard instance.                                   |
32| void OH_Pasteboard_Destroy(OH_Pasteboard* pasteboard)        | Destroys the pasteboard instance.                                       |
33| int OH_Pasteboard_Subscribe(OH_Pasteboard* pasteboard, int type, const OH_PasteboardObserver* observer) | Subscribes to the pasteboard observer.                                 |
34| int OH_Pasteboard_Unsubscribe(OH_Pasteboard* pasteboard, int type, const OH_PasteboardObserver* observer) | Unsubscribes from the pasteboard observer.                           |
35| bool OH_Pasteboard_IsRemoteData(OH_Pasteboard* pasteboard)   | Checks whether the pasteboard data comes from remote devices.                   |
36| int OH_Pasteboard_GetDataSource(OH_Pasteboard* pasteboard, char* source, unsigned int len) | Obtains the pasteboard data source.                             |
37| bool OH_Pasteboard_HasType(OH_Pasteboard* pasteboard, const char* type) | Checks whether the pasteboard contains data of the specified type.                     |
38| bool OH_Pasteboard_HasData(OH_Pasteboard* pasteboard)        | Checks whether the pasteboard contains data.                               |
39| OH_UdmfData* OH_Pasteboard_GetData(OH_Pasteboard* pasteboard, int* status) | Obtains data from the pasteboard.                                   |
40| int OH_Pasteboard_SetData(OH_Pasteboard* pasteboard, OH_UdmfData* data) | Writes data to the pasteboard.                                   |
41| int OH_Pasteboard_ClearData(OH_Pasteboard* pasteboard)       | Clears data from the pasteboard.                                   |
42| void (\*Pasteboard_Notify)(void\* context, Pasteboard_NotifyType type) | Notifies data changes in the pasteboard.                             |
43| void (\*Pasteboard_Finalize)(void\* context)                 | Releases context resources when the pasteboard observer object is destroyed.|
44
45## How to Develop
46
471. Add dynamic link libraries.
48
49   ```CMake
50   # Add the following libraries to **CMakeLists.txt**.
51   libudmf.so
52   libpasteboard.so
53   ```
54
552. Include header files.
56
57   ```c
58   #include <cstdio>
59   #include <database/pasteboard/oh_pasteboard.h>
60   #include <database/udmf/udmf.h>
61   #include <database/udmf/uds.h>
62   ```
63
643. Define the callback for listening for pasteboard data changes.
65
66   ```c
67   // Define the callback for notifying data changes in the pasteboard.
68   static void Pasteboard_Notify_impl2(void* context, Pasteboard_NotifyType type)
69   {
70     printf("Pasteboard_NotifyType, type: %d", type);
71   }
72   // Define the callback for notifying when the pasteboard observer object is destroyed.
73   static void Pasteboard_Finalize_impl2(void* context)
74   {
75     printf("callback: Pasteboard_Finalize");
76   }
77   ```
78
794. Subscribe to the pasteboard observer.
80
81   ```c
82   // 1. Create a pasteboard instance.
83   OH_Pasteboard* pasteboard = OH_Pasteboard_Create();
84   // 2. Create a pasteboard observer instance.
85   OH_PasteboardObserver* observer = OH_PasteboardObserver_Create();
86   // 3. Set two callbacks to the pasteboard observer instance.
87   OH_PasteboardObserver_SetData(observer, (void* )pasteboard, Pasteboard_Notify_impl2, Pasteboard_Finalize_impl2);
88   // 4. Subscribe to local data changes on the pasteboard.
89   OH_Pasteboard_Subscribe(pasteboard, NOTIFY_LOCAL_DATA_CHANGE, observer);
90   ```
91
925. Write data to the pasteboard.
93
94   ```c
95   // 1. Create a pasteboard instance.
96   OH_Pasteboard* pasteboard = OH_Pasteboard_Create();
97
98   // 2. Create an OH_UdmfRecord object and add text data to it.
99   OH_UdsPlainText* plainText = OH_UdsPlainText_Create();
100   OH_UdsPlainText_SetContent(plainText, "Hello world!");
101   OH_UdmfRecord* record = OH_UdmfRecord_Create();
102   OH_UdmfRecord_AddPlainText(record, plainText);
103
104   // 3. Create an OH_UdmfData object and add OH_UdmfRecord to it.
105   OH_UdmfData* data = OH_UdmfData_Create();
106   OH_UdmfData_AddRecord(data, record);
107
108   // 4. Write data to the pasteboard.
109   OH_Pasteboard_SetData(pasteboard, data);
110
111   // 5. Destroy the pointer when the object is no longer required.
112   OH_UdsPlainText_Destroy(plainText);
113   OH_UdmfRecord_Destroy(record);
114   OH_UdmfData_Destroy(data);
115   OH_Pasteboard_Destroy(pasteboard);
116   ```
117
1186. Read data from the pasteboard.
119
120   ```c
121   // 1. Create a pasteboard instance.
122   OH_Pasteboard* pasteboard = OH_Pasteboard_Create();
123   // 2. Check whether the pasteboard contains text data.
124   bool hasPlainTextData = OH_Pasteboard_HasType(pasteboard, "text/plain");
125   if (hasPlainTextData) {
126     // 3. Obtain the unified data OH_UdmfData from the pasteboard.
127     int ret = 0;
128     OH_UdmfData* udmfData = OH_Pasteboard_GetData(pasteboard, &ret);
129     // 4. Obtain the first data record from OH_UdmfData.
130     OH_UdmfRecord* record = OH_UdmfData_GetRecord(udmfData, 0);
131     // 5. Obtain the text data from the data record.
132     OH_UdsPlainText* plainText = OH_UdsPlainText_Create();
133     OH_UdmfRecord_GetPlainText(record, plainText);
134     const char* content = OH_UdsPlainText_GetContent(plainText);
135     printf("Get plain text success. content: %s", content);
136     // 5. Destroy the pointer when the object is no longer required.
137     OH_UdsPlainText_Destroy(plainText);
138     OH_UdmfData_Destroy(udmfData);
139   }
140   OH_Pasteboard_Destroy(pasteboard);
141   ```
142