From e2b930ac2989a0a1e304cc4a301a49b92cfc195c Mon Sep 17 00:00:00 2001 From: lovechinamo Date: Wed, 20 Apr 2022 20:44:00 +0800 Subject: [PATCH] Signed-off-by: lovechinamo Changes to be committed: --- README.md | 419 ++++++++++++++++++ figures/subsystem_architecture.png | Bin 0 -> 33325 bytes framework/innerkits/src/paste_data.cpp | 4 +- framework/innerkits/src/paste_data_record.cpp | 2 +- services/core/src/pasteboard_storage.cpp | 29 +- .../test/unittest/src/paste_service_test.cpp | 8 +- utils/mock/src/mock_permission.cpp | 3 +- .../native/include/pasteboard_sp_singleton.h | 11 +- 8 files changed, 453 insertions(+), 23 deletions(-) create mode 100644 README.md create mode 100644 figures/subsystem_architecture.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..70a8bdb --- /dev/null +++ b/README.md @@ -0,0 +1,419 @@ +# pasteBoardService + +## Introduction + +​ As a functional component of the stray subsystem, the clipboard service provides the ability to manage the system clipboard and supports the system copy and paste functions. The system clipboard supports package text, hypertext, URIs and other content operations. + +**picture 1** Subsystem Architecture Diagram +![](figures/subsystem_architecture.png "Subsystem architecture") + +​ The clipboard service provides functions that support application developers to use clipboard-related services conveniently and efficiently. Its main components include clipboard management client and clipboard service. The clipboard management client is responsible for clipboard interface management, providing clipboard northbound JS API to applications; creating clipboard data on the application framework side, requesting clipboard SA to perform clipboard creation, deletion, query, text conversion, configuration, etc. The clipboard service is responsible for clipboard event management, manages the life cycle of clipboard SA (startup, destruction, multi-user, etc.); executes application requests, notifies clipboard data management, and returns the results to the clipboard management client. + + + +## Directory Structure + +``` +/base/miscservices/time +├── etc # Configuration files for the processes contained in the component +├── figures # Framework diagram +├── framework # innerKit interface +├── interfaces # The interface code provided by the component externally +│ └── kits # Interface provided to the application +├── profile # Configuration files for system services contained in the component +├── services # clipboard service implementation +│ └── core # Core code implementation +│ └── test # native test code +│ └── zidl # Cross-process communication code implementation +├── utils # Tests or services use mocked data +└──README.md # Instructions for use +``` + +## illustrate + +### Interface Description + +**list 1** PasteBoard open main method + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

interface name

+

describe

+

createHtmlData(htmlText: string): PasteData;

+

Create a PasteData object of type MIMETYPE_TEXT_HTML for HTML type data

+

createWantData(want: Want): PasteData;

+

Create a PasteData object of type MIMETYPE_TEXT_WANT for data of type want

+

createPlainTextData(text: string): PasteData

+

Create a PasteData object of type MIMETYPE_TEXT_PLAIN for plain text data

+

createUriData(uri: string): PasteData;

+

Create a PasteData object of type MIMETYPE_TEXT_URI for data of type URI

+

createHtmlTextRecord(htmlText: string): PasteDataRecord;

+

Create a PasteDataRecord object of type RecordMIMETYPE_TEXT_HTML for hypertext type data

+

createWantRecord(want: Want): PasteDataRecord;

+

Create a PasteDataRecord object of type MIMETYPE_TEXT_WANT for data of type want

+

createPlainTextRecord(text: string): PasteDataRecord;

+

Create a PasteDataRecord object of type MIMETYPE_TEXT_PLAIN for plain text data

+

createUriRecord(uri: string): PasteDataRecord;

+

Create a PasteDataRecord object of type MIMETYPE_TEXT_URI for data of type URI

+

getSystemPasteboard(): SystemPasteboard

+

Get system clipboard

+
+ + + +**list 2** SystemPasteboard open main method + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

interface name

+

describe

+

on(type:'update', callback: () => void): void;

+

Callback called when the open pasteboard content changes

+

off(type: 'update', callback?: () => void): void

+

Callback called when the content of the pasteboard is closed

+

clear(callback: AsyncCallback): void

+

clear clipboard

+

clear(): Promise;

+

clear clipboard

+

getPasteData(callback: AsyncCallback<PasteData>): void

+

Get system clipboard data object

+

getPasteData():Promise<PasteData>

+

Get system clipboard data object

+

hasPasteData(callback: AsyncCallback<boolean>:void;

+

Check if there is content in the pasteboard

+

hasPasteData(): Promise<boolean>

+

Check if there is content in the pasteboard

+

setPasteData(data: PasteData, callback: AsyncCallback<void>:void;

+

Write PasteData to the pasteboard

+

setPasteData(data: PasteData): Promise<void>

+

Write PasteData to the pasteboard

+
+ + + +**list 3** PasteData open main method + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

interface name

+

describe

+

addHtmlRecord(htmlText: string): void;

+

Add the HTML text record to the PasteData object and update the MIME type to PasteData#MIMETYPE_TEXT_HTML in the DataProperty.

+

addWantRecord(want: Want): void;

+

Add want record to PasteData object and update MIME type to PasteData#MIMETYPE_TEXT_WANT in DataProperty

+

addRecord(record: PasteDataRecord): void;

+

Add PasteRecord to paste data object and update MIME type in data attribute

+

addTextRecord(text: string): void;;

+

Add plain text records to PasteData object and update MIME type to PasteData#MIMETYPE_TEXT_PLAIN in DataProperty

+

addUriRecord(uri: string): void;

+

Add URI record to PasteData object and update MIME type to PasteData#MIMETYPE_TEXT_URI in DataProperty

+

getMimeTypes(): Array<string>

+

MIME type of everything on the pasteboard

+

getPrimaryHtml(): string;

+

HTML text of the main record in the PasteData object

+

getPrimaryWant(): Want;

+

The want of the master record in the PasteData object

+

getPrimaryMimeType(): string;

+

The MIME type of the master record in the PasteData object

+

getPrimaryUri(): string;

+

URI of the master record in the PasteData object

+

getProperty(): PasteDataProperty;

+

Get the properties of the clipboard data object

+

getRecordAt(index: number): PasteDataRecord;

+

records based on the specified index

+

getRecordCount(): number;

+

Number of records in PasteData object

+

hasMimeType(mimeType: string): boolean;

+

Checks if data of the specified MIME type exists in the DataProperty

+

removeRecordAt(index: number): boolean;

+

Delete records based on specified index

+

replaceRecordAt(index: number, record: PasteDataRecord): boolean;

+

Replace the specified record with a new record

+
+ + + + + +**list 4** PasteDataRecord open main method + + + + + + + + + + + + +

interface name

+

describe

+

convertToText(callback: AsyncCallback<string>): void;

+

Convert PasteData to text content

+

convertToText(): Promise<void>

+

Convert PasteData to text content

+
+ + + +**list 5** PasteDataProperty Parameter Description + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name

+

type

+

illustrate

+

additions{[key:string]}

+

object

+

Additional property data key-value pair

+

mimeTypes

+

Array

+

Distinct MIME types for all records in PasteData

+

tag

+

string

+

User-defined labels for PasteData objects

+

timestamp

+

number

+

Timestamp indicating when the data was written to the system clipboard.

+

localOnly

+

boolean

+

Check if PasteData is set for local access only.

+
+ + +### Instructions for use + +Clipboard module usage example: + +``` +// import module +import pasteboard from '@ohos.pasteboard' +//text copy +console.log('Get SystemPasteboard') +var systemPasteboard = pasteboard.getSystemPasteboard() +systemPasteboard.clear() + +var textData = 'Hello World!' +console.log('createPlainTextData = ' + textData) +var pasteData = pasteboard.createPlainTextData(textData) + +console.log('Writes PasteData to the pasteboard') +systemPasteboard.setPasteData(pasteData) + +console.log('Checks there is content in the pasteboard') +assert.equal(systemPasteboard.hasPasteData(), true) + +console.log('Checks the number of records') +pasteData = systemPasteboard.getPasteData() +assert.equal(pasteData.getRecordCount(), 1) + +console.log('Checks the pasteboard content') +assert.equal(pasteData.getPrimaryText(), textData) + +console.log('Checks there is a MIMETYPE_TEXT_PLAIN MIME type of data') +assert.equal(pasteData.hasMimeType(MIMETYPE_TEXT_PLAIN), true) +assert.equal(pasteData.getPrimaryMimeType(), MIMETYPE_TEXT_PLAIN) + +//clipboard change listener +console.log('Off the content changes') +var systemPasteboard = pasteboard.getSystemPasteboard() +systemPasteboard.off(contentChanges) +systemPasteboard.clear() + +var textData = 'Hello World!' +console.log('createUriData = ' + textData) +var pasteData = pasteboard.createUriData(textData) + +console.log('Writes PasteData to the pasteboard') +systemPasteboard.setPasteData(pasteData) + +console.log('Checks there is content in the pasteboard') +assert.equal(systemPasteboard.hasPasteData(), true) + +console.log('Checks the number of records') +pasteData = systemPasteboard.getPasteData() +assert.equal(pasteData.getRecordCount(), 1) + +console.log('On the content changes') +systemPasteboard.on(contentChanges) + +console.log('Removes the Record') +assert.equal(pasteData.removeRecordAt(0), true) + +console.log('Writes PasteData to the pasteboard') +systemPasteboard.setPasteData(pasteData) + +console.log('Checks the number of records') +pasteData = systemPasteboard.getPasteData() +assert.equal(pasteData.getRecordCount(), 0) + +console.log('Checks there is no content in the pasteboard') +assert.equal(systemPasteboard.hasPasteData(), false) + +var textDataNew = 'Hello World!-New' +console.log('createUriData = ' + textDataNew) +var pasteData = pasteboard.createUriData(textDataNew) + +console.log('Writes PasteData to the pasteboard') +systemPasteboard.setPasteData(pasteData) + +console.log('Checks there is content in the pasteboard') +assert.equal(systemPasteboard.hasPasteData(), true) + +console.log('Checks the number of records') +pasteData = systemPasteboard.getPasteData() +assert.equal(pasteData.getRecordCount(), 1) + +console.log('Checks the pasteboard content') +assert.equal(pasteData.getRecordAt(0).plainText, textDataNew) + +``` + + + +## Related warehouse + +**Miscsoftware service subsystem** + +[miscservices\_paste](https://gitee.com/openharmony/miscservices_pasteboard) + diff --git a/figures/subsystem_architecture.png b/figures/subsystem_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..162c9939aa9856cf256a4925c9f523c4b4bc4b74 GIT binary patch literal 33325 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 literal 0 HcmV?d00001 diff --git a/framework/innerkits/src/paste_data.cpp b/framework/innerkits/src/paste_data.cpp index ddff147..d62c3e5 100644 --- a/framework/innerkits/src/paste_data.cpp +++ b/framework/innerkits/src/paste_data.cpp @@ -206,7 +206,7 @@ bool PasteData::Marshalling(Parcel &parcel) const { PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "start."); auto length = records_.size(); - PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "length: %{public}d.",static_cast(length)); + PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "length: %{public}zu.", length); // write length if (!parcel.WriteUint32(static_cast(length))) { PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "end."); @@ -229,7 +229,7 @@ bool PasteData::ReadFromParcel(Parcel &parcel) records_.clear(); // read vector length auto length = parcel.ReadUint32(); - PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "length: %{public}d.",static_cast(length)); + PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "length: %{public}u.", length); for (uint32_t i = 0; i < length; i++) { PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "for."); std::unique_ptr record(parcel.ReadParcelable()); diff --git a/framework/innerkits/src/paste_data_record.cpp b/framework/innerkits/src/paste_data_record.cpp index f77b7fc..e629ab6 100644 --- a/framework/innerkits/src/paste_data_record.cpp +++ b/framework/innerkits/src/paste_data_record.cpp @@ -20,7 +20,7 @@ namespace MiscServices { namespace { constexpr int MAX_TEXT_LEN = 500 * 1024; } -std::shared_ptr PasteDataRecord::NewHtmlRecord(const std::string &htmlText) +std::shared_ptr PasteDataRecord::NewHtmlRecord(const std::string &htmlText) { if (htmlText.length() >= MAX_TEXT_LEN) { return nullptr; diff --git a/services/core/src/pasteboard_storage.cpp b/services/core/src/pasteboard_storage.cpp index 8ff8fb6..664b302 100644 --- a/services/core/src/pasteboard_storage.cpp +++ b/services/core/src/pasteboard_storage.cpp @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include #include "pasteboard_storage.h" +#include #include "paste_data.h" namespace OHOS { @@ -21,14 +21,16 @@ namespace MiscServices { namespace nlohmann { template struct adl_serializer> { - static void to_json(json& j, const std::shared_ptr& ptr) { + static void to_json(json& j, const std::shared_ptr& ptr) + { if (ptr.get()) { j = *ptr; } else { j = nullptr; } } - static void from_json(const json& j, std::shared_ptr& ptr) { + static void from_json(const json& j, std::shared_ptr& ptr) + { if (j.is_null()) { ptr = nullptr; } else { @@ -38,7 +40,8 @@ template }; } -void to_json(nlohmann::json& j, const PasteDataRecord& r) { +void to_json(nlohmann::json& j, const PasteDataRecord& r) +{ j["mime_type"]= r.GetMimeType(); j["html_text"]= r.GetHtmlText(); j["plain_text"]= r.GetPlainText(); @@ -51,7 +54,8 @@ void to_json(nlohmann::json& j, const PasteDataRecord& r) { } } -void from_json(const nlohmann::json& j, PasteDataRecord& r) { +void from_json(const nlohmann::json& j, PasteDataRecord& r) +{ std::string mimeType = j.at("mime_type"); std::shared_ptr htmlText = j.at("html_text"); std::shared_ptr plainText = j.at("plain_text"); @@ -65,24 +69,28 @@ void from_json(const nlohmann::json& j, PasteDataRecord& r) { r = PasteDataRecord(mimeType, htmlText, want, plainText, uri); } -void to_json(nlohmann::json& j, const PasteData& p) { +void to_json(nlohmann::json& j, const PasteData& p) +{ j = p.AllRecords(); } -void from_json(const nlohmann::json& j, PasteData& p) { +void from_json(const nlohmann::json& j, PasteData& p) +{ auto records = j.get>>(); p = PasteData(records); } -std::shared_ptr PasteboardStorage::Create(const std::string &file) { +std::shared_ptr PasteboardStorage::Create(const std::string &file) +{ return std::shared_ptr(std::make_shared PasteboardStorage(file)); } PasteboardStorage::PasteboardStorage(std::string file) : file{std::move(file)} { } -void PasteboardStorage::SaveData(std::map> data) { +void PasteboardStorage::SaveData(std::map> data) +{ try { nlohmann::json jsonData = data; auto str = jsonData.dump(); @@ -95,7 +103,8 @@ void PasteboardStorage::SaveData(std::map> d } } -std::map> PasteboardStorage::LoadData() { +std::map> PasteboardStorage::LoadData() +{ std::map> data; try { std::ifstream instream(this->file); diff --git a/services/test/unittest/src/paste_service_test.cpp b/services/test/unittest/src/paste_service_test.cpp index cd9965f..2926918 100644 --- a/services/test/unittest/src/paste_service_test.cpp +++ b/services/test/unittest/src/paste_service_test.cpp @@ -149,7 +149,7 @@ HWTEST_F(PasteboardServiceTest, PasteDataTest001, TestSize.Level0) auto data = PasteboardClient::GetInstance()->CreateWantData(want); EXPECT_TRUE(data != nullptr); auto has = PasteboardClient::GetInstance()->HasPasteData(); - EXPECT_TRUE(has != true); + EXPECT_TRUE(has != true); PasteboardClient::GetInstance()->SetPasteData(*data); has = PasteboardClient::GetInstance()->HasPasteData(); EXPECT_TRUE(has == true); @@ -175,7 +175,7 @@ HWTEST_F(PasteboardServiceTest, PasteDataTest002, TestSize.Level0) EXPECT_TRUE(has != true); PasteboardClient::GetInstance()->SetPasteData(*data); has = PasteboardClient::GetInstance()->HasPasteData(); - EXPECT_TRUE(has == true); + EXPECT_TRUE(has == true); PasteData pasteData; auto ok = PasteboardClient::GetInstance()->GetPasteData(pasteData); EXPECT_TRUE(ok == true); @@ -195,7 +195,7 @@ HWTEST_F(PasteboardServiceTest, PasteDataTest003, TestSize.Level0) EXPECT_TRUE(data != nullptr); PasteboardClient::GetInstance()->Clear(); auto has = PasteboardClient::GetInstance()->HasPasteData(); - EXPECT_TRUE(has != true); + EXPECT_TRUE(has != true); PasteboardClient::GetInstance()->SetPasteData(*data); has = PasteboardClient::GetInstance()->HasPasteData(); EXPECT_TRUE(has == true); @@ -221,7 +221,7 @@ HWTEST_F(PasteboardServiceTest, PasteDataTest004, TestSize.Level0) EXPECT_TRUE(has != true); PasteboardClient::GetInstance()->SetPasteData(*data); has = PasteboardClient::GetInstance()->HasPasteData(); - EXPECT_TRUE(has == true); + EXPECT_TRUE(has == true); PasteData pasteData; auto ok = PasteboardClient::GetInstance()->GetPasteData(pasteData); EXPECT_TRUE(ok == true); diff --git a/utils/mock/src/mock_permission.cpp b/utils/mock/src/mock_permission.cpp index 8646051..d4528b4 100644 --- a/utils/mock/src/mock_permission.cpp +++ b/utils/mock/src/mock_permission.cpp @@ -18,7 +18,8 @@ namespace OHOS { namespace MiscServices { namespace MockPermission { -bool VerifyPermission(const std::string &bundleName, const std::string &permissionName, int userId) { +bool VerifyPermission(const std::string &bundleName, const std::string &permissionName, int userId) +{ return true; } } // OHOS diff --git a/utils/native/include/pasteboard_sp_singleton.h b/utils/native/include/pasteboard_sp_singleton.h index bfdf964..40cdc78 100644 --- a/utils/native/include/pasteboard_sp_singleton.h +++ b/utils/native/include/pasteboard_sp_singleton.h @@ -23,11 +23,12 @@ namespace OHOS { namespace MiscServices { -#define DECLARE_DELAYED_SP_SINGLETON(MyClass)\ -public:\ - ~MyClass();\ -private:\ - friend DelayedSpSingleton;\ +#define DECLARE_DELAYED_SP_SINGLETON(MyClass) \ +public: \ + ~MyClass(); \ + \ +private: \ + friend DelayedSpSingleton; \ MyClass(); template